aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2017-11-28 12:51:00 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2017-11-28 12:51:00 -0200
commit1a5e8c1014a5416108032042d57f06595553d2bd (patch)
treebafd4c086839196ded55d17bcb409c03fb4093ed /lvm.c
parentff5fe5104413cf2a5156f86479d4b9b130bad7a6 (diff)
downloadlua-1a5e8c1014a5416108032042d57f06595553d2bd.tar.gz
lua-1a5e8c1014a5416108032042d57f06595553d2bd.tar.bz2
lua-1a5e8c1014a5416108032042d57f06595553d2bd.zip
conditional jumps unified in label "condjump' + new variable 'vra'
to avoid excessive use of macro 's2v'
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c234
1 files changed, 106 insertions, 128 deletions
diff --git a/lvm.c b/lvm.c
index 7e6ad2a6..63e65675 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 2.318 2017/11/27 17:44:31 roberto Exp roberto $ 2** $Id: lvm.c,v 2.319 2017/11/28 12:58:18 roberto Exp roberto $
3** Lua virtual machine 3** Lua virtual machine
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -815,6 +815,7 @@ void luaV_finishOp (lua_State *L) {
815 updatebase(ci); /* the trap may be just for that */ \ 815 updatebase(ci); /* the trap may be just for that */ \
816 } \ 816 } \
817 ra = RA(i); /* WARNING: any stack reallocation invalidates 'ra' */ \ 817 ra = RA(i); /* WARNING: any stack reallocation invalidates 'ra' */ \
818 vra = s2v(ra); \
818} 819}
819 820
820#define vmdispatch(o) switch(o) 821#define vmdispatch(o) switch(o)
@@ -831,8 +832,10 @@ void luaV_execute (lua_State *L) {
831 const Instruction *pc = ci->u.l.savedpc; 832 const Instruction *pc = ci->u.l.savedpc;
832 /* main loop of interpreter */ 833 /* main loop of interpreter */
833 for (;;) { 834 for (;;) {
834 Instruction i; 835 int cond; /* flag for conditional jumps */
835 StkId ra; 836 Instruction i; /* instruction being executed */
837 StkId ra; /* instruction's A register */
838 TValue *vra; /* corresponding value */
836 vmfetch(); 839 vmfetch();
837 lua_assert(base == ci->func + 1); 840 lua_assert(base == ci->func + 1);
838 lua_assert(base <= L->top && L->top < L->stack + L->stacksize); 841 lua_assert(base <= L->top && L->top < L->stack + L->stacksize);
@@ -848,12 +851,12 @@ void luaV_execute (lua_State *L) {
848 } 851 }
849 vmcase(OP_LOADI) { 852 vmcase(OP_LOADI) {
850 lua_Integer b = GETARG_sBx(i); 853 lua_Integer b = GETARG_sBx(i);
851 setivalue(s2v(ra), b); 854 setivalue(vra, b);
852 vmbreak; 855 vmbreak;
853 } 856 }
854 vmcase(OP_LOADF) { 857 vmcase(OP_LOADF) {
855 int b = GETARG_sBx(i); 858 int b = GETARG_sBx(i);
856 setfltvalue(s2v(ra), cast_num(b)); 859 setfltvalue(vra, cast_num(b));
857 vmbreak; 860 vmbreak;
858 } 861 }
859 vmcase(OP_LOADKX) { 862 vmcase(OP_LOADKX) {
@@ -863,7 +866,7 @@ void luaV_execute (lua_State *L) {
863 vmbreak; 866 vmbreak;
864 } 867 }
865 vmcase(OP_LOADBOOL) { 868 vmcase(OP_LOADBOOL) {
866 setbvalue(s2v(ra), GETARG_B(i)); 869 setbvalue(vra, GETARG_B(i));
867 if (GETARG_C(i)) pc++; /* skip next instruction (if C) */ 870 if (GETARG_C(i)) pc++; /* skip next instruction (if C) */
868 vmbreak; 871 vmbreak;
869 } 872 }
@@ -881,8 +884,8 @@ void luaV_execute (lua_State *L) {
881 } 884 }
882 vmcase(OP_SETUPVAL) { 885 vmcase(OP_SETUPVAL) {
883 UpVal *uv = cl->upvals[GETARG_B(i)]; 886 UpVal *uv = cl->upvals[GETARG_B(i)];
884 setobj(L, uv->v, s2v(ra)); 887 setobj(L, uv->v, vra);
885 luaC_barrier(L, uv, s2v(ra)); 888 luaC_barrier(L, uv, vra);
886 vmbreak; 889 vmbreak;
887 } 890 }
888 vmcase(OP_GETTABUP) { 891 vmcase(OP_GETTABUP) {
@@ -956,25 +959,25 @@ void luaV_execute (lua_State *L) {
956 TValue *rc = RKC(i); /* value */ 959 TValue *rc = RKC(i); /* value */
957 lua_Unsigned n; 960 lua_Unsigned n;
958 if (ttisinteger(rb) /* fast track for integers? */ 961 if (ttisinteger(rb) /* fast track for integers? */
959 ? (n = ivalue(rb), luaV_fastgeti(L, s2v(ra), n, slot)) 962 ? (n = ivalue(rb), luaV_fastgeti(L, vra, n, slot))
960 : luaV_fastget(L, s2v(ra), rb, slot, luaH_get)) { 963 : luaV_fastget(L, vra, rb, slot, luaH_get)) {
961 luaV_finishfastset(L, s2v(ra), slot, rc); 964 luaV_finishfastset(L, vra, slot, rc);
962 } 965 }
963 else 966 else
964 Protect(luaV_finishset(L, s2v(ra), rb, rc, slot)); 967 Protect(luaV_finishset(L, vra, rb, rc, slot));
965 vmbreak; 968 vmbreak;
966 } 969 }
967 vmcase(OP_SETI) { 970 vmcase(OP_SETI) {
968 const TValue *slot; 971 const TValue *slot;
969 int c = GETARG_B(i); 972 int c = GETARG_B(i);
970 TValue *rc = RKC(i); 973 TValue *rc = RKC(i);
971 if (luaV_fastgeti(L, s2v(ra), c, slot)) { 974 if (luaV_fastgeti(L, vra, c, slot)) {
972 luaV_finishfastset(L, s2v(ra), slot, rc); 975 luaV_finishfastset(L, vra, slot, rc);
973 } 976 }
974 else { 977 else {
975 TValue key; 978 TValue key;
976 setivalue(&key, c); 979 setivalue(&key, c);
977 Protect(luaV_finishset(L, s2v(ra), &key, rc, slot)); 980 Protect(luaV_finishset(L, vra, &key, rc, slot));
978 } 981 }
979 vmbreak; 982 vmbreak;
980 } 983 }
@@ -983,11 +986,11 @@ void luaV_execute (lua_State *L) {
983 TValue *rb = KB(i); 986 TValue *rb = KB(i);
984 TValue *rc = RKC(i); 987 TValue *rc = RKC(i);
985 TString *key = tsvalue(rb); /* key must be a string */ 988 TString *key = tsvalue(rb); /* key must be a string */
986 if (luaV_fastget(L, s2v(ra), key, slot, luaH_getshortstr)) { 989 if (luaV_fastget(L, vra, key, slot, luaH_getshortstr)) {
987 luaV_finishfastset(L, s2v(ra), slot, rc); 990 luaV_finishfastset(L, vra, slot, rc);
988 } 991 }
989 else 992 else
990 Protect(luaV_finishset(L, s2v(ra), rb, rc, slot)); 993 Protect(luaV_finishset(L, vra, rb, rc, slot));
991 vmbreak; 994 vmbreak;
992 } 995 }
993 vmcase(OP_NEWTABLE) { 996 vmcase(OP_NEWTABLE) {
@@ -1020,10 +1023,10 @@ void luaV_execute (lua_State *L) {
1020 int ic = GETARG_sC(i); 1023 int ic = GETARG_sC(i);
1021 lua_Number nb; 1024 lua_Number nb;
1022 if (ttisinteger(rb)) { 1025 if (ttisinteger(rb)) {
1023 setivalue(s2v(ra), intop(+, ivalue(rb), ic)); 1026 setivalue(vra, intop(+, ivalue(rb), ic));
1024 } 1027 }
1025 else if (tonumberns(rb, nb)) { 1028 else if (tonumberns(rb, nb)) {
1026 setfltvalue(s2v(ra), luai_numadd(L, nb, cast_num(ic))); 1029 setfltvalue(vra, luai_numadd(L, nb, cast_num(ic)));
1027 } 1030 }
1028 else 1031 else
1029 Protect(luaT_trybiniTM(L, rb, ic, GETARG_k(i), ra, TM_ADD)); 1032 Protect(luaT_trybiniTM(L, rb, ic, GETARG_k(i), ra, TM_ADD));
@@ -1034,10 +1037,10 @@ void luaV_execute (lua_State *L) {
1034 int ic = GETARG_sC(i); 1037 int ic = GETARG_sC(i);
1035 lua_Number nb; 1038 lua_Number nb;
1036 if (ttisinteger(rb)) { 1039 if (ttisinteger(rb)) {
1037 setivalue(s2v(ra), intop(-, ivalue(rb), ic)); 1040 setivalue(vra, intop(-, ivalue(rb), ic));
1038 } 1041 }
1039 else if (tonumberns(rb, nb)) { 1042 else if (tonumberns(rb, nb)) {
1040 setfltvalue(s2v(ra), luai_numsub(L, nb, cast_num(ic))); 1043 setfltvalue(vra, luai_numsub(L, nb, cast_num(ic)));
1041 } 1044 }
1042 else 1045 else
1043 Protect(luaT_trybiniTM(L, rb, ic, 0, ra, TM_SUB)); 1046 Protect(luaT_trybiniTM(L, rb, ic, 0, ra, TM_SUB));
@@ -1048,10 +1051,10 @@ void luaV_execute (lua_State *L) {
1048 int ic = GETARG_sC(i); 1051 int ic = GETARG_sC(i);
1049 lua_Number nb; 1052 lua_Number nb;
1050 if (ttisinteger(rb)) { 1053 if (ttisinteger(rb)) {
1051 setivalue(s2v(ra), intop(*, ivalue(rb), ic)); 1054 setivalue(vra, intop(*, ivalue(rb), ic));
1052 } 1055 }
1053 else if (tonumberns(rb, nb)) { 1056 else if (tonumberns(rb, nb)) {
1054 setfltvalue(s2v(ra), luai_nummul(L, nb, cast_num(ic))); 1057 setfltvalue(vra, luai_nummul(L, nb, cast_num(ic)));
1055 } 1058 }
1056 else 1059 else
1057 Protect(luaT_trybiniTM(L, rb, ic, GETARG_k(i), ra, TM_MUL)); 1060 Protect(luaT_trybiniTM(L, rb, ic, GETARG_k(i), ra, TM_MUL));
@@ -1062,13 +1065,13 @@ void luaV_execute (lua_State *L) {
1062 int ic = GETARG_sC(i); 1065 int ic = GETARG_sC(i);
1063 lua_Number nb; 1066 lua_Number nb;
1064 if (ttisinteger(rb)) { 1067 if (ttisinteger(rb)) {
1065 setivalue(s2v(ra), luaV_mod(L, ivalue(rb), ic)); 1068 setivalue(vra, luaV_mod(L, ivalue(rb), ic));
1066 } 1069 }
1067 else if (tonumberns(rb, nb)) { 1070 else if (tonumberns(rb, nb)) {
1068 lua_Number m; 1071 lua_Number m;
1069 lua_Number nc = cast_num(ic); 1072 lua_Number nc = cast_num(ic);
1070 luai_nummod(L, nb, nc, m); 1073 luai_nummod(L, nb, nc, m);
1071 setfltvalue(s2v(ra), m); 1074 setfltvalue(vra, m);
1072 } 1075 }
1073 else 1076 else
1074 Protect(luaT_trybiniTM(L, rb, ic, 0, ra, TM_MOD)); 1077 Protect(luaT_trybiniTM(L, rb, ic, 0, ra, TM_MOD));
@@ -1080,7 +1083,7 @@ void luaV_execute (lua_State *L) {
1080 lua_Number nb; 1083 lua_Number nb;
1081 if (tonumberns(rb, nb)) { 1084 if (tonumberns(rb, nb)) {
1082 lua_Number nc = cast_num(ic); 1085 lua_Number nc = cast_num(ic);
1083 setfltvalue(s2v(ra), luai_numpow(L, nb, nc)); 1086 setfltvalue(vra, luai_numpow(L, nb, nc));
1084 } 1087 }
1085 else 1088 else
1086 Protect(luaT_trybiniTM(L, rb, ic, 0, ra, TM_POW)); 1089 Protect(luaT_trybiniTM(L, rb, ic, 0, ra, TM_POW));
@@ -1092,7 +1095,7 @@ void luaV_execute (lua_State *L) {
1092 lua_Number nb; 1095 lua_Number nb;
1093 if (tonumberns(rb, nb)) { 1096 if (tonumberns(rb, nb)) {
1094 lua_Number nc = cast_num(ic); 1097 lua_Number nc = cast_num(ic);
1095 setfltvalue(s2v(ra), luai_numdiv(L, nb, nc)); 1098 setfltvalue(vra, luai_numdiv(L, nb, nc));
1096 } 1099 }
1097 else 1100 else
1098 Protect(luaT_trybiniTM(L, rb, ic, 0, ra, TM_DIV)); 1101 Protect(luaT_trybiniTM(L, rb, ic, 0, ra, TM_DIV));
@@ -1103,11 +1106,11 @@ void luaV_execute (lua_State *L) {
1103 int ic = GETARG_sC(i); 1106 int ic = GETARG_sC(i);
1104 lua_Number nb; 1107 lua_Number nb;
1105 if (ttisinteger(rb)) { 1108 if (ttisinteger(rb)) {
1106 setivalue(s2v(ra), luaV_div(L, ivalue(rb), ic)); 1109 setivalue(vra, luaV_div(L, ivalue(rb), ic));
1107 } 1110 }
1108 else if (tonumberns(rb, nb)) { 1111 else if (tonumberns(rb, nb)) {
1109 lua_Number nc = cast_num(ic); 1112 lua_Number nc = cast_num(ic);
1110 setfltvalue(s2v(ra), luai_numdiv(L, nb, nc)); 1113 setfltvalue(vra, luai_numdiv(L, nb, nc));
1111 } 1114 }
1112 else 1115 else
1113 Protect(luaT_trybiniTM(L, rb, ic, 0, ra, TM_IDIV)); 1116 Protect(luaT_trybiniTM(L, rb, ic, 0, ra, TM_IDIV));
@@ -1119,10 +1122,10 @@ void luaV_execute (lua_State *L) {
1119 lua_Number nb; lua_Number nc; 1122 lua_Number nb; lua_Number nc;
1120 if (ttisinteger(rb) && ttisinteger(rc)) { 1123 if (ttisinteger(rb) && ttisinteger(rc)) {
1121 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); 1124 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
1122 setivalue(s2v(ra), intop(+, ib, ic)); 1125 setivalue(vra, intop(+, ib, ic));
1123 } 1126 }
1124 else if (tonumberns(rb, nb) && tonumberns(rc, nc)) { 1127 else if (tonumberns(rb, nb) && tonumberns(rc, nc)) {
1125 setfltvalue(s2v(ra), luai_numadd(L, nb, nc)); 1128 setfltvalue(vra, luai_numadd(L, nb, nc));
1126 } 1129 }
1127 else 1130 else
1128 Protect(luaT_trybinTM(L, rb, rc, ra, TM_ADD)); 1131 Protect(luaT_trybinTM(L, rb, rc, ra, TM_ADD));
@@ -1134,10 +1137,10 @@ void luaV_execute (lua_State *L) {
1134 lua_Number nb; lua_Number nc; 1137 lua_Number nb; lua_Number nc;
1135 if (ttisinteger(rb) && ttisinteger(rc)) { 1138 if (ttisinteger(rb) && ttisinteger(rc)) {
1136 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); 1139 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
1137 setivalue(s2v(ra), intop(-, ib, ic)); 1140 setivalue(vra, intop(-, ib, ic));
1138 } 1141 }
1139 else if (tonumberns(rb, nb) && tonumberns(rc, nc)) { 1142 else if (tonumberns(rb, nb) && tonumberns(rc, nc)) {
1140 setfltvalue(s2v(ra), luai_numsub(L, nb, nc)); 1143 setfltvalue(vra, luai_numsub(L, nb, nc));
1141 } 1144 }
1142 else 1145 else
1143 Protect(luaT_trybinTM(L, rb, rc, ra, TM_SUB)); 1146 Protect(luaT_trybinTM(L, rb, rc, ra, TM_SUB));
@@ -1149,10 +1152,10 @@ void luaV_execute (lua_State *L) {
1149 lua_Number nb; lua_Number nc; 1152 lua_Number nb; lua_Number nc;
1150 if (ttisinteger(rb) && ttisinteger(rc)) { 1153 if (ttisinteger(rb) && ttisinteger(rc)) {
1151 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); 1154 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
1152 setivalue(s2v(ra), intop(*, ib, ic)); 1155 setivalue(vra, intop(*, ib, ic));
1153 } 1156 }
1154 else if (tonumberns(rb, nb) && tonumberns(rc, nc)) { 1157 else if (tonumberns(rb, nb) && tonumberns(rc, nc)) {
1155 setfltvalue(s2v(ra), luai_nummul(L, nb, nc)); 1158 setfltvalue(vra, luai_nummul(L, nb, nc));
1156 } 1159 }
1157 else 1160 else
1158 Protect(luaT_trybinTM(L, rb, rc, ra, TM_MUL)); 1161 Protect(luaT_trybinTM(L, rb, rc, ra, TM_MUL));
@@ -1163,7 +1166,7 @@ void luaV_execute (lua_State *L) {
1163 TValue *rc = vRC(i); 1166 TValue *rc = vRC(i);
1164 lua_Number nb; lua_Number nc; 1167 lua_Number nb; lua_Number nc;
1165 if (tonumberns(rb, nb) && tonumberns(rc, nc)) { 1168 if (tonumberns(rb, nb) && tonumberns(rc, nc)) {
1166 setfltvalue(s2v(ra), luai_numdiv(L, nb, nc)); 1169 setfltvalue(vra, luai_numdiv(L, nb, nc));
1167 } 1170 }
1168 else 1171 else
1169 Protect(luaT_trybinTM(L, rb, rc, ra, TM_DIV)); 1172 Protect(luaT_trybinTM(L, rb, rc, ra, TM_DIV));
@@ -1174,7 +1177,7 @@ void luaV_execute (lua_State *L) {
1174 TValue *rc = vRC(i); 1177 TValue *rc = vRC(i);
1175 lua_Integer ib; lua_Integer ic; 1178 lua_Integer ib; lua_Integer ic;
1176 if (tointegerns(rb, &ib) && tointegerns(rc, &ic)) { 1179 if (tointegerns(rb, &ib) && tointegerns(rc, &ic)) {
1177 setivalue(s2v(ra), intop(&, ib, ic)); 1180 setivalue(vra, intop(&, ib, ic));
1178 } 1181 }
1179 else 1182 else
1180 Protect(luaT_trybinTM(L, rb, rc, ra, TM_BAND)); 1183 Protect(luaT_trybinTM(L, rb, rc, ra, TM_BAND));
@@ -1185,7 +1188,7 @@ void luaV_execute (lua_State *L) {
1185 TValue *rc = vRC(i); 1188 TValue *rc = vRC(i);
1186 lua_Integer ib; lua_Integer ic; 1189 lua_Integer ib; lua_Integer ic;
1187 if (tointegerns(rb, &ib) && tointegerns(rc, &ic)) { 1190 if (tointegerns(rb, &ib) && tointegerns(rc, &ic)) {
1188 setivalue(s2v(ra), intop(|, ib, ic)); 1191 setivalue(vra, intop(|, ib, ic));
1189 } 1192 }
1190 else 1193 else
1191 Protect(luaT_trybinTM(L, rb, rc, ra, TM_BOR)); 1194 Protect(luaT_trybinTM(L, rb, rc, ra, TM_BOR));
@@ -1196,7 +1199,7 @@ void luaV_execute (lua_State *L) {
1196 TValue *rc = vRC(i); 1199 TValue *rc = vRC(i);
1197 lua_Integer ib; lua_Integer ic; 1200 lua_Integer ib; lua_Integer ic;
1198 if (tointegerns(rb, &ib) && tointegerns(rc, &ic)) { 1201 if (tointegerns(rb, &ib) && tointegerns(rc, &ic)) {
1199 setivalue(s2v(ra), intop(^, ib, ic)); 1202 setivalue(vra, intop(^, ib, ic));
1200 } 1203 }
1201 else 1204 else
1202 Protect(luaT_trybinTM(L, rb, rc, ra, TM_BXOR)); 1205 Protect(luaT_trybinTM(L, rb, rc, ra, TM_BXOR));
@@ -1207,7 +1210,7 @@ void luaV_execute (lua_State *L) {
1207 TValue *rc = vRC(i); 1210 TValue *rc = vRC(i);
1208 lua_Integer ib; lua_Integer ic; 1211 lua_Integer ib; lua_Integer ic;
1209 if (tointegerns(rb, &ib) && tointegerns(rc, &ic)) { 1212 if (tointegerns(rb, &ib) && tointegerns(rc, &ic)) {
1210 setivalue(s2v(ra), luaV_shiftl(ib, ic)); 1213 setivalue(vra, luaV_shiftl(ib, ic));
1211 } 1214 }
1212 else 1215 else
1213 Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHL)); 1216 Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHL));
@@ -1218,7 +1221,7 @@ void luaV_execute (lua_State *L) {
1218 TValue *rc = vRC(i); 1221 TValue *rc = vRC(i);
1219 lua_Integer ib; lua_Integer ic; 1222 lua_Integer ib; lua_Integer ic;
1220 if (tointegerns(rb, &ib) && tointegerns(rc, &ic)) { 1223 if (tointegerns(rb, &ib) && tointegerns(rc, &ic)) {
1221 setivalue(s2v(ra), luaV_shiftl(ib, -ic)); 1224 setivalue(vra, luaV_shiftl(ib, -ic));
1222 } 1225 }
1223 else 1226 else
1224 Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHR)); 1227 Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHR));
@@ -1230,12 +1233,12 @@ void luaV_execute (lua_State *L) {
1230 lua_Number nb; lua_Number nc; 1233 lua_Number nb; lua_Number nc;
1231 if (ttisinteger(rb) && ttisinteger(rc)) { 1234 if (ttisinteger(rb) && ttisinteger(rc)) {
1232 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); 1235 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
1233 setivalue(s2v(ra), luaV_mod(L, ib, ic)); 1236 setivalue(vra, luaV_mod(L, ib, ic));
1234 } 1237 }
1235 else if (tonumberns(rb, nb) && tonumberns(rc, nc)) { 1238 else if (tonumberns(rb, nb) && tonumberns(rc, nc)) {
1236 lua_Number m; 1239 lua_Number m;
1237 luai_nummod(L, nb, nc, m); 1240 luai_nummod(L, nb, nc, m);
1238 setfltvalue(s2v(ra), m); 1241 setfltvalue(vra, m);
1239 } 1242 }
1240 else 1243 else
1241 Protect(luaT_trybinTM(L, rb, rc, ra, TM_MOD)); 1244 Protect(luaT_trybinTM(L, rb, rc, ra, TM_MOD));
@@ -1247,10 +1250,10 @@ void luaV_execute (lua_State *L) {
1247 lua_Number nb; lua_Number nc; 1250 lua_Number nb; lua_Number nc;
1248 if (ttisinteger(rb) && ttisinteger(rc)) { 1251 if (ttisinteger(rb) && ttisinteger(rc)) {
1249 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); 1252 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
1250 setivalue(s2v(ra), luaV_div(L, ib, ic)); 1253 setivalue(vra, luaV_div(L, ib, ic));
1251 } 1254 }
1252 else if (tonumberns(rb, nb) && tonumberns(rc, nc)) { 1255 else if (tonumberns(rb, nb) && tonumberns(rc, nc)) {
1253 setfltvalue(s2v(ra), luai_numidiv(L, nb, nc)); 1256 setfltvalue(vra, luai_numidiv(L, nb, nc));
1254 } 1257 }
1255 else 1258 else
1256 Protect(luaT_trybinTM(L, rb, rc, ra, TM_IDIV)); 1259 Protect(luaT_trybinTM(L, rb, rc, ra, TM_IDIV));
@@ -1261,7 +1264,7 @@ void luaV_execute (lua_State *L) {
1261 TValue *rc = vRC(i); 1264 TValue *rc = vRC(i);
1262 lua_Number nb; lua_Number nc; 1265 lua_Number nb; lua_Number nc;
1263 if (tonumberns(rb, nb) && tonumberns(rc, nc)) { 1266 if (tonumberns(rb, nb) && tonumberns(rc, nc)) {
1264 setfltvalue(s2v(ra), luai_numpow(L, nb, nc)); 1267 setfltvalue(vra, luai_numpow(L, nb, nc));
1265 } 1268 }
1266 else 1269 else
1267 Protect(luaT_trybinTM(L, rb, rc, ra, TM_POW)); 1270 Protect(luaT_trybinTM(L, rb, rc, ra, TM_POW));
@@ -1272,10 +1275,10 @@ void luaV_execute (lua_State *L) {
1272 lua_Number nb; 1275 lua_Number nb;
1273 if (ttisinteger(rb)) { 1276 if (ttisinteger(rb)) {
1274 lua_Integer ib = ivalue(rb); 1277 lua_Integer ib = ivalue(rb);
1275 setivalue(s2v(ra), intop(-, 0, ib)); 1278 setivalue(vra, intop(-, 0, ib));
1276 } 1279 }
1277 else if (tonumberns(rb, nb)) { 1280 else if (tonumberns(rb, nb)) {
1278 setfltvalue(s2v(ra), luai_numunm(L, nb)); 1281 setfltvalue(vra, luai_numunm(L, nb));
1279 } 1282 }
1280 else 1283 else
1281 Protect(luaT_trybinTM(L, rb, rb, ra, TM_UNM)); 1284 Protect(luaT_trybinTM(L, rb, rb, ra, TM_UNM));
@@ -1285,7 +1288,7 @@ void luaV_execute (lua_State *L) {
1285 TValue *rb = vRB(i); 1288 TValue *rb = vRB(i);
1286 lua_Integer ib; 1289 lua_Integer ib;
1287 if (tointegerns(rb, &ib)) { 1290 if (tointegerns(rb, &ib)) {
1288 setivalue(s2v(ra), intop(^, ~l_castS2U(0), ib)); 1291 setivalue(vra, intop(^, ~l_castS2U(0), ib));
1289 } 1292 }
1290 else 1293 else
1291 Protect(luaT_trybinTM(L, rb, rb, ra, TM_BNOT)); 1294 Protect(luaT_trybinTM(L, rb, rb, ra, TM_BNOT));
@@ -1293,8 +1296,8 @@ void luaV_execute (lua_State *L) {
1293 } 1296 }
1294 vmcase(OP_NOT) { 1297 vmcase(OP_NOT) {
1295 TValue *rb = vRB(i); 1298 TValue *rb = vRB(i);
1296 int res = l_isfalse(rb); /* next assignment may change this value */ 1299 int nrb = l_isfalse(rb); /* next assignment may change this value */
1297 setbvalue(s2v(ra), res); 1300 setbvalue(vra, nrb);
1298 vmbreak; 1301 vmbreak;
1299 } 1302 }
1300 vmcase(OP_LEN) { 1303 vmcase(OP_LEN) {
@@ -1327,105 +1330,79 @@ void luaV_execute (lua_State *L) {
1327 } 1330 }
1328 vmcase(OP_EQ) { 1331 vmcase(OP_EQ) {
1329 TValue *rb = vRB(i); 1332 TValue *rb = vRB(i);
1330 int res; 1333 Protect(cond = luaV_equalobj(L, vra, rb));
1331 Protect(res = luaV_equalobj(L, s2v(ra), rb)); 1334 condjump:
1332 if (res != GETARG_k(i)) 1335 if (cond != GETARG_k(i))
1333 pc++; 1336 pc++; /* skip next jump */
1334 else 1337 else
1335 donextjump(ci); 1338 donextjump(ci);
1336 vmbreak; 1339 vmbreak;
1337 } 1340 }
1338 vmcase(OP_LT) { 1341 vmcase(OP_LT) {
1339 TValue *rb = vRB(i); 1342 TValue *rb = vRB(i);
1340 int res; 1343 if (ttisinteger(vra) && ttisinteger(rb))
1341 if (ttisinteger(s2v(ra)) && ttisinteger(rb)) 1344 cond = (ivalue(vra) < ivalue(rb));
1342 res = (ivalue(s2v(ra)) < ivalue(rb)); 1345 else if (ttisnumber(vra) && ttisnumber(rb))
1343 else if (ttisnumber(s2v(ra)) && ttisnumber(rb)) 1346 cond = LTnum(vra, rb);
1344 res = LTnum(s2v(ra), rb);
1345 else
1346 Protect(res = lessthanothers(L, s2v(ra), rb));
1347 if (res != GETARG_k(i))
1348 pc++;
1349 else 1347 else
1350 donextjump(ci); 1348 Protect(cond = lessthanothers(L, vra, rb));
1351 vmbreak; 1349 goto condjump;
1352 } 1350 }
1353 vmcase(OP_LE) { 1351 vmcase(OP_LE) {
1354 TValue *rb = vRB(i); 1352 TValue *rb = vRB(i);
1355 int res; 1353 if (ttisinteger(vra) && ttisinteger(rb))
1356 if (ttisinteger(s2v(ra)) && ttisinteger(rb)) 1354 cond = (ivalue(vra) <= ivalue(rb));
1357 res = (ivalue(s2v(ra)) <= ivalue(rb)); 1355 else if (ttisnumber(vra) && ttisnumber(rb))
1358 else if (ttisnumber(s2v(ra)) && ttisnumber(rb)) 1356 cond = LEnum(vra, rb);
1359 res = LEnum(s2v(ra), rb);
1360 else
1361 Protect(res = lessequalothers(L, s2v(ra), rb));
1362 if (res != GETARG_k(i))
1363 pc++;
1364 else 1357 else
1365 donextjump(ci); 1358 Protect(cond = lessequalothers(L, vra, rb));
1366 vmbreak; 1359 goto condjump;
1367 } 1360 }
1368 vmcase(OP_EQK) { 1361 vmcase(OP_EQK) {
1369 TValue *rb = KB(i); 1362 TValue *rb = KB(i);
1370 /* basic types do not use '__eq'; we can use raw equality */ 1363 /* basic types do not use '__eq'; we can use raw equality */
1371 if (luaV_equalobj(NULL, s2v(ra), rb) != GETARG_k(i)) 1364 cond = luaV_equalobj(NULL, vra, rb);
1372 pc++; 1365 goto condjump;
1373 else
1374 donextjump(ci);
1375 vmbreak;
1376 } 1366 }
1377 vmcase(OP_EQI) { 1367 vmcase(OP_EQI) {
1378 int im = GETARG_sB(i); 1368 int im = GETARG_sB(i);
1379 if ((ttisinteger(s2v(ra)) ? (ivalue(s2v(ra)) == im) 1369 if (ttisinteger(vra))
1380 :ttisfloat(s2v(ra)) ? luai_numeq(fltvalue(s2v(ra)), cast_num(im)) 1370 cond = (ivalue(vra) == im);
1381 : 0) != GETARG_k(i)) 1371 else if (ttisfloat(vra))
1382 pc++; 1372 cond = luai_numeq(fltvalue(vra), cast_num(im));
1383 else 1373 else
1384 donextjump(ci); 1374 cond = 0; /* other types cannot be equal to a number */
1385 vmbreak; 1375 goto condjump;
1386 } 1376 }
1387 vmcase(OP_LTI) { 1377 vmcase(OP_LTI) {
1388 int res;
1389 int im = GETARG_sB(i); 1378 int im = GETARG_sB(i);
1390 if (ttisinteger(s2v(ra))) 1379 if (ttisinteger(vra))
1391 res = (ivalue(s2v(ra)) < im); 1380 cond = (ivalue(vra) < im);
1392 else if (ttisfloat(s2v(ra))) { 1381 else if (ttisfloat(vra)) {
1393 lua_Number f = fltvalue(s2v(ra)); 1382 lua_Number f = fltvalue(vra);
1394 res = (!luai_numisnan(f)) ? luai_numlt(f, cast_num(im)) 1383 cond = (!luai_numisnan(f)) ? luai_numlt(f, cast_num(im))
1395 : GETARG_C(i); /* NaN? */ 1384 : GETARG_C(i); /* NaN */
1396 } 1385 }
1397 else 1386 else
1398 Protect(res = luaT_callorderiTM(L, s2v(ra), im, GETARG_C(i), TM_LT)); 1387 Protect(cond = luaT_callorderiTM(L, vra, im, GETARG_C(i), TM_LT));
1399 if (res != GETARG_k(i)) 1388 goto condjump;
1400 pc++;
1401 else
1402 donextjump(ci);
1403 vmbreak;
1404 } 1389 }
1405 vmcase(OP_LEI) { 1390 vmcase(OP_LEI) {
1406 int res;
1407 int im = GETARG_sB(i); 1391 int im = GETARG_sB(i);
1408 if (ttisinteger(s2v(ra))) 1392 if (ttisinteger(vra))
1409 res = (ivalue(s2v(ra)) <= im); 1393 cond = (ivalue(vra) <= im);
1410 else if (ttisfloat(s2v(ra))) { 1394 else if (ttisfloat(vra)) {
1411 lua_Number f = fltvalue(s2v(ra)); 1395 lua_Number f = fltvalue(vra);
1412 res = (!luai_numisnan(f)) ? luai_numle(f, cast_num(im)) 1396 cond = (!luai_numisnan(f)) ? luai_numle(f, cast_num(im))
1413 : GETARG_C(i); /* NaN? */ 1397 : GETARG_C(i); /* NaN? */
1414 } 1398 }
1415 else 1399 else
1416 Protect(res = luaT_callorderiTM(L, s2v(ra), im, GETARG_C(i), TM_LE)); 1400 Protect(cond = luaT_callorderiTM(L, vra, im, GETARG_C(i), TM_LE));
1417 if (res != GETARG_k(i)) 1401 goto condjump;
1418 pc++;
1419 else
1420 donextjump(ci);
1421 vmbreak;
1422 } 1402 }
1423 vmcase(OP_TEST) { 1403 vmcase(OP_TEST) {
1424 if (l_isfalse(s2v(ra)) == GETARG_k(i)) 1404 cond = !l_isfalse(vra);
1425 pc++; 1405 goto condjump;
1426 else
1427 donextjump(ci);
1428 vmbreak;
1429 } 1406 }
1430 vmcase(OP_TESTSET) { 1407 vmcase(OP_TESTSET) {
1431 TValue *rb = vRB(i); 1408 TValue *rb = vRB(i);
@@ -1456,12 +1433,13 @@ void luaV_execute (lua_State *L) {
1456 else /* previous instruction set top */ 1433 else /* previous instruction set top */
1457 b = L->top - ra; 1434 b = L->top - ra;
1458 lua_assert(GETARG_C(i) - 1 == LUA_MULTRET); 1435 lua_assert(GETARG_C(i) - 1 == LUA_MULTRET);
1459 if (!ttisfunction(s2v(ra))) { /* not a function? */ 1436 if (!ttisfunction(vra)) { /* not a function? */
1460 /* try to get '__call' metamethod */ 1437 /* try to get '__call' metamethod */
1461 Protect(ra = luaD_tryfuncTM(L, ra)); 1438 Protect(ra = luaD_tryfuncTM(L, ra));
1439 vra = s2v(ra);
1462 b++; /* there is now one extra argument */ 1440 b++; /* there is now one extra argument */
1463 } 1441 }
1464 if (!ttisLclosure(s2v(ra))) /* C function? */ 1442 if (!ttisLclosure(vra)) /* C function? */
1465 Protect(luaD_call(L, ra, LUA_MULTRET)); /* call it */ 1443 Protect(luaD_call(L, ra, LUA_MULTRET)); /* call it */
1466 else { /* tail call */ 1444 else { /* tail call */
1467 if (cl->p->sizep > 0) /* close upvalues from previous call */ 1445 if (cl->p->sizep > 0) /* close upvalues from previous call */
@@ -1483,25 +1461,25 @@ void luaV_execute (lua_State *L) {
1483 return; /* external invocation: return */ 1461 return; /* external invocation: return */
1484 } 1462 }
1485 vmcase(OP_FORLOOP) { 1463 vmcase(OP_FORLOOP) {
1486 if (ttisinteger(s2v(ra))) { /* integer loop? */ 1464 if (ttisinteger(vra)) { /* integer loop? */
1487 lua_Integer step = ivalue(s2v(ra + 2)); 1465 lua_Integer step = ivalue(s2v(ra + 2));
1488 lua_Integer idx = intop(+, ivalue(s2v(ra)), step); /* increment index */ 1466 lua_Integer idx = intop(+, ivalue(vra), step); /* increment index */
1489 lua_Integer limit = ivalue(s2v(ra + 1)); 1467 lua_Integer limit = ivalue(s2v(ra + 1));
1490 if ((0 < step) ? (idx <= limit) : (limit <= idx)) { 1468 if ((0 < step) ? (idx <= limit) : (limit <= idx)) {
1491 pc -= GETARG_Bx(i); /* jump back */ 1469 pc -= GETARG_Bx(i); /* jump back */
1492 chgivalue(s2v(ra), idx); /* update internal index... */ 1470 chgivalue(vra, idx); /* update internal index... */
1493 setivalue(s2v(ra + 3), idx); /* ...and external index */ 1471 setivalue(s2v(ra + 3), idx); /* ...and external index */
1494 } 1472 }
1495 } 1473 }
1496 else { /* floating loop */ 1474 else { /* floating loop */
1497 lua_Number step = fltvalue(s2v(ra + 2)); 1475 lua_Number step = fltvalue(s2v(ra + 2));
1498 lua_Number limit = fltvalue(s2v(ra + 1)); 1476 lua_Number limit = fltvalue(s2v(ra + 1));
1499 lua_Number idx = fltvalue(s2v(ra)); 1477 lua_Number idx = fltvalue(vra);
1500 idx = luai_numadd(L, idx, step); /* inc. index */ 1478 idx = luai_numadd(L, idx, step); /* inc. index */
1501 if (luai_numlt(0, step) ? luai_numle(idx, limit) 1479 if (luai_numlt(0, step) ? luai_numle(idx, limit)
1502 : luai_numle(limit, idx)) { 1480 : luai_numle(limit, idx)) {
1503 pc -= GETARG_Bx(i); /* jump back */ 1481 pc -= GETARG_Bx(i); /* jump back */
1504 chgfltvalue(s2v(ra), idx); /* update internal index... */ 1482 chgfltvalue(vra, idx); /* update internal index... */
1505 setfltvalue(s2v(ra + 3), idx); /* ...and external index */ 1483 setfltvalue(s2v(ra + 3), idx); /* ...and external index */
1506 } 1484 }
1507 } 1485 }
@@ -1509,7 +1487,7 @@ void luaV_execute (lua_State *L) {
1509 vmbreak; 1487 vmbreak;
1510 } 1488 }
1511 vmcase(OP_FORPREP) { 1489 vmcase(OP_FORPREP) {
1512 TValue *init = s2v(ra); 1490 TValue *init = vra;
1513 TValue *plimit = s2v(ra + 1); 1491 TValue *plimit = s2v(ra + 1);
1514 TValue *pstep = s2v(ra + 2); 1492 TValue *pstep = s2v(ra + 2);
1515 lua_Integer ilimit; 1493 lua_Integer ilimit;
@@ -1569,7 +1547,7 @@ void luaV_execute (lua_State *L) {
1569 if (c == 0) { 1547 if (c == 0) {
1570 c = GETARG_Ax(*pc); pc++; 1548 c = GETARG_Ax(*pc); pc++;
1571 } 1549 }
1572 h = hvalue(s2v(ra)); 1550 h = hvalue(vra);
1573 last = ((c-1)*LFIELDS_PER_FLUSH) + n; 1551 last = ((c-1)*LFIELDS_PER_FLUSH) + n;
1574 savepc(L); /* in case of allocation errors */ 1552 savepc(L); /* in case of allocation errors */
1575 if (last > h->sizearray) /* needs more space? */ 1553 if (last > h->sizearray) /* needs more space? */