aboutsummaryrefslogtreecommitdiff
path: root/opcode.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1996-05-28 18:07:32 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1996-05-28 18:07:32 -0300
commit9863223fbf512d903a1677c861e4beb4f8feda4d (patch)
tree964f1b36a5a7c9aff238d454fa4bffe88dacbe2d /opcode.c
parent9a1948e67d940d988260e738f2a251087835a318 (diff)
downloadlua-9863223fbf512d903a1677c861e4beb4f8feda4d.tar.gz
lua-9863223fbf512d903a1677c861e4beb4f8feda4d.tar.bz2
lua-9863223fbf512d903a1677c861e4beb4f8feda4d.zip
first version of vararg facility (plus new function "call").
Diffstat (limited to 'opcode.c')
-rw-r--r--opcode.c140
1 files changed, 89 insertions, 51 deletions
diff --git a/opcode.c b/opcode.c
index 13d476f4..237be758 100644
--- a/opcode.c
+++ b/opcode.c
@@ -3,7 +3,7 @@
3** TecCGraf - PUC-Rio 3** TecCGraf - PUC-Rio
4*/ 4*/
5 5
6char *rcs_opcode="$Id: opcode.c,v 3.67 1996/04/22 18:00:37 roberto Exp roberto $"; 6char *rcs_opcode="$Id: opcode.c,v 3.68 1996/04/25 14:10:00 roberto Exp roberto $";
7 7
8#include <setjmp.h> 8#include <setjmp.h>
9#include <stdio.h> 9#include <stdio.h>
@@ -117,7 +117,7 @@ static void growstack (void)
117*/ 117*/
118static char *lua_strconc (char *l, char *r) 118static char *lua_strconc (char *l, char *r)
119{ 119{
120 int nl = strlen(l); 120 size_t nl = strlen(l);
121 char *buffer = luaI_buffer(nl+strlen(r)+1); 121 char *buffer = luaI_buffer(nl+strlen(r)+1);
122 strcpy(buffer, l); 122 strcpy(buffer, l);
123 strcpy(buffer+nl, r); 123 strcpy(buffer+nl, r);
@@ -886,6 +886,40 @@ static void comparison (lua_Type tag_less, lua_Type tag_equal,
886} 886}
887 887
888 888
889void luaI_packarg (Object *firstelem, Object *arg)
890{
891 int nvararg = (firstelem != NULL) ? top-firstelem : 0;
892 int i;
893 if (nvararg < 0) nvararg = 0;
894 avalue(arg) = lua_createarray(nvararg+1); /* +1 for field 'n' */
895 tag(arg) = LUA_T_ARRAY;
896 for (i=0; i<nvararg; i++)
897 {
898 Object index;
899 tag(&index) = LUA_T_NUMBER;
900 nvalue(&index) = i+1;
901 *(lua_hashdefine(avalue(arg), &index)) = *(firstelem+i);
902 }
903 /* store counter in field "n" */
904 {
905 Object index, extra;
906 tag(&index) = LUA_T_STRING;
907 tsvalue(&index) = lua_createstring("n");
908 tag(&extra) = LUA_T_NUMBER;
909 nvalue(&extra) = nvararg;
910 *(lua_hashdefine(avalue(arg), &index)) = extra;
911 }
912}
913
914
915static void adjust_varargs (StkId first_extra_arg)
916{
917 Object arg;
918 luaI_packarg(stack+first_extra_arg, &arg);
919 adjust_top(first_extra_arg);
920 *top = arg; incr_top;
921}
922
889 923
890/* 924/*
891** Execute the given opcode, until a RET. Parameters are between 925** Execute the given opcode, until a RET. Parameters are between
@@ -914,38 +948,38 @@ static StkId lua_execute (Byte *pc, StkId base)
914 948
915 case PUSHWORD: 949 case PUSHWORD:
916 { 950 {
917 CodeWord code; 951 Word w;
918 get_word(code,pc); 952 get_word(w,pc);
919 tag(top) = LUA_T_NUMBER; nvalue(top) = code.w; 953 tag(top) = LUA_T_NUMBER; nvalue(top) = w;
920 incr_top; 954 incr_top;
921 } 955 }
922 break; 956 break;
923 957
924 case PUSHFLOAT: 958 case PUSHFLOAT:
925 { 959 {
926 CodeFloat code; 960 real num;
927 get_float(code,pc); 961 get_float(num,pc);
928 tag(top) = LUA_T_NUMBER; nvalue(top) = code.f; 962 tag(top) = LUA_T_NUMBER; nvalue(top) = num;
929 incr_top; 963 incr_top;
930 } 964 }
931 break; 965 break;
932 966
933 case PUSHSTRING: 967 case PUSHSTRING:
934 { 968 {
935 CodeWord code; 969 Word w;
936 get_word(code,pc); 970 get_word(w,pc);
937 tag(top) = LUA_T_STRING; tsvalue(top) = lua_constant[code.w]; 971 tag(top) = LUA_T_STRING; tsvalue(top) = lua_constant[w];
938 incr_top; 972 incr_top;
939 } 973 }
940 break; 974 break;
941 975
942 case PUSHFUNCTION: 976 case PUSHFUNCTION:
943 { 977 {
944 CodeCode code; 978 TFunc *f;
945 get_code(code,pc); 979 get_code(f,pc);
946 luaI_insertfunction(code.tf); /* may take part in GC */ 980 luaI_insertfunction(f); /* may take part in GC */
947 top->tag = LUA_T_FUNCTION; 981 top->tag = LUA_T_FUNCTION;
948 top->value.tf = code.tf; 982 top->value.tf = f;
949 incr_top; 983 incr_top;
950 } 984 }
951 break; 985 break;
@@ -960,9 +994,9 @@ static StkId lua_execute (Byte *pc, StkId base)
960 994
961 case PUSHGLOBAL: 995 case PUSHGLOBAL:
962 { 996 {
963 CodeWord code; 997 Word w;
964 get_word(code,pc); 998 get_word(w,pc);
965 getglobal(code.w); 999 getglobal(w);
966 } 1000 }
967 break; 1001 break;
968 1002
@@ -973,9 +1007,9 @@ static StkId lua_execute (Byte *pc, StkId base)
973 case PUSHSELF: 1007 case PUSHSELF:
974 { 1008 {
975 Object receiver = *(top-1); 1009 Object receiver = *(top-1);
976 CodeWord code; 1010 Word w;
977 get_word(code,pc); 1011 get_word(w,pc);
978 tag(top) = LUA_T_STRING; tsvalue(top) = lua_constant[code.w]; 1012 tag(top) = LUA_T_STRING; tsvalue(top) = lua_constant[w];
979 incr_top; 1013 incr_top;
980 pushsubscript(); 1014 pushsubscript();
981 *top = receiver; 1015 *top = receiver;
@@ -994,9 +1028,9 @@ static StkId lua_execute (Byte *pc, StkId base)
994 1028
995 case STOREGLOBAL: 1029 case STOREGLOBAL:
996 { 1030 {
997 CodeWord code; 1031 Word w;
998 get_word(code,pc); 1032 get_word(w,pc);
999 s_object(code.w) = *(--top); 1033 s_object(w) = *(--top);
1000 } 1034 }
1001 break; 1035 break;
1002 1036
@@ -1050,9 +1084,9 @@ static StkId lua_execute (Byte *pc, StkId base)
1050 Object *arr = top-n-1; 1084 Object *arr = top-n-1;
1051 while (n) 1085 while (n)
1052 { 1086 {
1053 CodeWord code; 1087 Word w;
1054 get_word(code,pc); 1088 get_word(w,pc);
1055 tag(top) = LUA_T_STRING; tsvalue(top) = lua_constant[code.w]; 1089 tag(top) = LUA_T_STRING; tsvalue(top) = lua_constant[w];
1056 *(lua_hashdefine (avalue(arr), top)) = *(top-1); 1090 *(lua_hashdefine (avalue(arr), top)) = *(top-1);
1057 top--; 1091 top--;
1058 n--; 1092 n--;
@@ -1068,11 +1102,15 @@ static StkId lua_execute (Byte *pc, StkId base)
1068 adjust_top(base + *(pc++)); 1102 adjust_top(base + *(pc++));
1069 break; 1103 break;
1070 1104
1105 case VARARGS:
1106 adjust_varargs(base + *(pc++));
1107 break;
1108
1071 case CREATEARRAY: 1109 case CREATEARRAY:
1072 { 1110 {
1073 CodeWord size; 1111 Word size;
1074 get_word(size,pc); 1112 get_word(size,pc);
1075 avalue(top) = lua_createarray(size.w); 1113 avalue(top) = lua_createarray(size);
1076 tag(top) = LUA_T_ARRAY; 1114 tag(top) = LUA_T_ARRAY;
1077 incr_top; 1115 incr_top;
1078 } 1116 }
@@ -1195,51 +1233,51 @@ static StkId lua_execute (Byte *pc, StkId base)
1195 1233
1196 case ONTJMP: 1234 case ONTJMP:
1197 { 1235 {
1198 CodeWord code; 1236 Word w;
1199 get_word(code,pc); 1237 get_word(w,pc);
1200 if (tag(top-1) != LUA_T_NIL) pc += code.w; 1238 if (tag(top-1) != LUA_T_NIL) pc += w;
1201 } 1239 }
1202 break; 1240 break;
1203 1241
1204 case ONFJMP: 1242 case ONFJMP:
1205 { 1243 {
1206 CodeWord code; 1244 Word w;
1207 get_word(code,pc); 1245 get_word(w,pc);
1208 if (tag(top-1) == LUA_T_NIL) pc += code.w; 1246 if (tag(top-1) == LUA_T_NIL) pc += w;
1209 } 1247 }
1210 break; 1248 break;
1211 1249
1212 case JMP: 1250 case JMP:
1213 { 1251 {
1214 CodeWord code; 1252 Word w;
1215 get_word(code,pc); 1253 get_word(w,pc);
1216 pc += code.w; 1254 pc += w;
1217 } 1255 }
1218 break; 1256 break;
1219 1257
1220 case UPJMP: 1258 case UPJMP:
1221 { 1259 {
1222 CodeWord code; 1260 Word w;
1223 get_word(code,pc); 1261 get_word(w,pc);
1224 pc -= code.w; 1262 pc -= w;
1225 } 1263 }
1226 break; 1264 break;
1227 1265
1228 case IFFJMP: 1266 case IFFJMP:
1229 { 1267 {
1230 CodeWord code; 1268 Word w;
1231 get_word(code,pc); 1269 get_word(w,pc);
1232 top--; 1270 top--;
1233 if (tag(top) == LUA_T_NIL) pc += code.w; 1271 if (tag(top) == LUA_T_NIL) pc += w;
1234 } 1272 }
1235 break; 1273 break;
1236 1274
1237 case IFFUPJMP: 1275 case IFFUPJMP:
1238 { 1276 {
1239 CodeWord code; 1277 Word w;
1240 get_word(code,pc); 1278 get_word(w,pc);
1241 top--; 1279 top--;
1242 if (tag(top) == LUA_T_NIL) pc -= code.w; 1280 if (tag(top) == LUA_T_NIL) pc -= w;
1243 } 1281 }
1244 break; 1282 break;
1245 1283
@@ -1262,8 +1300,8 @@ static StkId lua_execute (Byte *pc, StkId base)
1262 1300
1263 case SETLINE: 1301 case SETLINE:
1264 { 1302 {
1265 CodeWord code; 1303 Word line;
1266 get_word(code,pc); 1304 get_word(line,pc);
1267 if ((stack+base-1)->tag != LUA_T_LINE) 1305 if ((stack+base-1)->tag != LUA_T_LINE)
1268 { 1306 {
1269 /* open space for LINE value */ 1307 /* open space for LINE value */
@@ -1271,9 +1309,9 @@ static StkId lua_execute (Byte *pc, StkId base)
1271 base++; 1309 base++;
1272 (stack+base-1)->tag = LUA_T_LINE; 1310 (stack+base-1)->tag = LUA_T_LINE;
1273 } 1311 }
1274 (stack+base-1)->value.i = code.w; 1312 (stack+base-1)->value.i = line;
1275 if (lua_linehook) 1313 if (lua_linehook)
1276 lineHook (code.w); 1314 lineHook (line);
1277 break; 1315 break;
1278 } 1316 }
1279 1317