aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c44
1 files changed, 24 insertions, 20 deletions
diff --git a/lvm.c b/lvm.c
index 26477c2c..f177ce6a 100644
--- a/lvm.c
+++ b/lvm.c
@@ -515,8 +515,11 @@ int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2) {
515 } 515 }
516 if (tm == NULL) /* no TM? */ 516 if (tm == NULL) /* no TM? */
517 return 0; /* objects are different */ 517 return 0; /* objects are different */
518 luaT_callTMres(L, tm, t1, t2, L->top); /* call TM */ 518 else {
519 return !l_isfalse(s2v(L->top)); 519 L->top = L->ci->top;
520 luaT_callTMres(L, tm, t1, t2, L->top); /* call TM */
521 return !l_isfalse(s2v(L->top));
522 }
520} 523}
521 524
522 525
@@ -548,7 +551,7 @@ void luaV_concat (lua_State *L, int total) {
548 int n = 2; /* number of elements handled in this pass (at least 2) */ 551 int n = 2; /* number of elements handled in this pass (at least 2) */
549 if (!(ttisstring(s2v(top - 2)) || cvt2str(s2v(top - 2))) || 552 if (!(ttisstring(s2v(top - 2)) || cvt2str(s2v(top - 2))) ||
550 !tostring(L, s2v(top - 1))) 553 !tostring(L, s2v(top - 1)))
551 luaT_trybinTM(L, s2v(top - 2), s2v(top - 1), top - 2, TM_CONCAT); 554 luaT_tryconcatTM(L);
552 else if (isemptystr(s2v(top - 1))) /* second operand is empty? */ 555 else if (isemptystr(s2v(top - 1))) /* second operand is empty? */
553 cast_void(tostring(L, s2v(top - 2))); /* result is first operand */ 556 cast_void(tostring(L, s2v(top - 2))); /* result is first operand */
554 else if (isemptystr(s2v(top - 2))) { /* first operand is empty string? */ 557 else if (isemptystr(s2v(top - 2))) { /* first operand is empty string? */
@@ -747,7 +750,7 @@ void luaV_finishOp (lua_State *L) {
747 break; 750 break;
748 } 751 }
749 case OP_CONCAT: { 752 case OP_CONCAT: {
750 StkId top = L->top - 1; /* top when 'luaT_trybinTM' was called */ 753 StkId top = L->top - 1; /* top when 'luaT_tryconcatTM' was called */
751 int a = GETARG_A(inst); /* first element to concatenate */ 754 int a = GETARG_A(inst); /* first element to concatenate */
752 int total = cast_int(top - 1 - (base + a)); /* yet to concatenate */ 755 int total = cast_int(top - 1 - (base + a)); /* yet to concatenate */
753 setobjs2s(L, top - 2, top); /* put TM result in proper position */ 756 setobjs2s(L, top - 2, top); /* put TM result in proper position */
@@ -801,7 +804,7 @@ void luaV_finishOp (lua_State *L) {
801 setfltvalue(s2v(ra), fop(L, nb, fimm)); \ 804 setfltvalue(s2v(ra), fop(L, nb, fimm)); \
802 } \ 805 } \
803 else \ 806 else \
804 Protect(luaT_trybiniTM(L, v1, imm, flip, ra, tm)); } 807 ProtectNT(luaT_trybiniTM(L, v1, imm, flip, ra, tm)); }
805 808
806 809
807/* 810/*
@@ -836,7 +839,7 @@ void luaV_finishOp (lua_State *L) {
836 setfltvalue(s2v(ra), fop(L, n1, n2)); \ 839 setfltvalue(s2v(ra), fop(L, n1, n2)); \
837 } \ 840 } \
838 else \ 841 else \
839 Protect(luaT_trybinTM(L, v1, v2, ra, tm)); } 842 ProtectNT(luaT_trybinTM(L, v1, v2, ra, tm)); }
840 843
841 844
842/* 845/*
@@ -877,7 +880,7 @@ void luaV_finishOp (lua_State *L) {
877 setfltvalue(s2v(ra), fop(L, n1, n2)); \ 880 setfltvalue(s2v(ra), fop(L, n1, n2)); \
878 } \ 881 } \
879 else \ 882 else \
880 Protect(luaT_trybinassocTM(L, v1, v2, ra, flip, tm)); } } 883 ProtectNT(luaT_trybinassocTM(L, v1, v2, ra, flip, tm)); } }
881 884
882 885
883/* 886/*
@@ -891,7 +894,7 @@ void luaV_finishOp (lua_State *L) {
891 setfltvalue(s2v(ra), fop(L, n1, n2)); \ 894 setfltvalue(s2v(ra), fop(L, n1, n2)); \
892 } \ 895 } \
893 else \ 896 else \
894 Protect(luaT_trybinTM(L, v1, v2, ra, tm)); } 897 ProtectNT(luaT_trybinTM(L, v1, v2, ra, tm)); }
895 898
896 899
897/* 900/*
@@ -906,7 +909,7 @@ void luaV_finishOp (lua_State *L) {
906 setivalue(s2v(ra), op(L, i1, i2)); \ 909 setivalue(s2v(ra), op(L, i1, i2)); \
907 } \ 910 } \
908 else \ 911 else \
909 Protect(luaT_trybiniTM(L, v1, i2, TESTARG_k(i), ra, tm)); } 912 ProtectNT(luaT_trybiniTM(L, v1, i2, TESTARG_k(i), ra, tm)); }
910 913
911 914
912/* 915/*
@@ -920,7 +923,7 @@ void luaV_finishOp (lua_State *L) {
920 setivalue(s2v(ra), op(L, i1, i2)); \ 923 setivalue(s2v(ra), op(L, i1, i2)); \
921 } \ 924 } \
922 else \ 925 else \
923 Protect(luaT_trybinTM(L, v1, v2, ra, tm)); } 926 ProtectNT(luaT_trybinTM(L, v1, v2, ra, tm)); }
924 927
925 928
926/* 929/*
@@ -937,7 +940,7 @@ void luaV_finishOp (lua_State *L) {
937 else if (ttisnumber(s2v(ra)) && ttisnumber(rb)) \ 940 else if (ttisnumber(s2v(ra)) && ttisnumber(rb)) \
938 cond = opf(s2v(ra), rb); \ 941 cond = opf(s2v(ra), rb); \
939 else \ 942 else \
940 Protect(cond = other(L, s2v(ra), rb)); \ 943 ProtectNT(cond = other(L, s2v(ra), rb)); \
941 docondjump(); } 944 docondjump(); }
942 945
943 946
@@ -956,7 +959,7 @@ void luaV_finishOp (lua_State *L) {
956 } \ 959 } \
957 else { \ 960 else { \
958 int isf = GETARG_C(i); \ 961 int isf = GETARG_C(i); \
959 Protect(cond = luaT_callorderiTM(L, s2v(ra), im, inv, isf, tm)); \ 962 ProtectNT(cond = luaT_callorderiTM(L, s2v(ra), im, inv, isf, tm)); \
960 } \ 963 } \
961 docondjump(); } 964 docondjump(); }
962 965
@@ -1094,7 +1097,8 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
1094 vmfetch(); 1097 vmfetch();
1095 lua_assert(base == ci->func + 1); 1098 lua_assert(base == ci->func + 1);
1096 lua_assert(base <= L->top && L->top < L->stack + L->stacksize); 1099 lua_assert(base <= L->top && L->top < L->stack + L->stacksize);
1097 lua_assert(ci->top < L->stack + L->stacksize); 1100 /* invalidate top for instructions not expecting it */
1101 lua_assert(isIT(i) || (L->top = base));
1098 vmdispatch (GET_OPCODE(i)) { 1102 vmdispatch (GET_OPCODE(i)) {
1099 vmcase(OP_MOVE) { 1103 vmcase(OP_MOVE) {
1100 setobjs2s(L, ra, RB(i)); 1104 setobjs2s(L, ra, RB(i));
@@ -1359,7 +1363,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
1359 if (TESTARG_k(i)) { 1363 if (TESTARG_k(i)) {
1360 ic = -ic; ev = TM_SHL; 1364 ic = -ic; ev = TM_SHL;
1361 } 1365 }
1362 Protect(luaT_trybiniTM(L, rb, ic, 0, ra, ev)); 1366 ProtectNT(luaT_trybiniTM(L, rb, ic, 0, ra, ev));
1363 } 1367 }
1364 vmbreak; 1368 vmbreak;
1365 } 1369 }
@@ -1371,7 +1375,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
1371 setivalue(s2v(ra), luaV_shiftl(ic, ib)); 1375 setivalue(s2v(ra), luaV_shiftl(ic, ib));
1372 } 1376 }
1373 else 1377 else
1374 Protect(luaT_trybiniTM(L, rb, ic, 1, ra, TM_SHL)); 1378 ProtectNT(luaT_trybiniTM(L, rb, ic, 1, ra, TM_SHL));
1375 vmbreak; 1379 vmbreak;
1376 } 1380 }
1377 vmcase(OP_ADD) { 1381 vmcase(OP_ADD) {
@@ -1422,7 +1426,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
1422 setivalue(s2v(ra), luaV_shiftl(ib, -ic)); 1426 setivalue(s2v(ra), luaV_shiftl(ib, -ic));
1423 } 1427 }
1424 else 1428 else
1425 Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHR)); 1429 ProtectNT(luaT_trybinTM(L, rb, rc, ra, TM_SHR));
1426 vmbreak; 1430 vmbreak;
1427 } 1431 }
1428 vmcase(OP_SHL) { 1432 vmcase(OP_SHL) {
@@ -1433,7 +1437,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
1433 setivalue(s2v(ra), luaV_shiftl(ib, ic)); 1437 setivalue(s2v(ra), luaV_shiftl(ib, ic));
1434 } 1438 }
1435 else 1439 else
1436 Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHL)); 1440 ProtectNT(luaT_trybinTM(L, rb, rc, ra, TM_SHL));
1437 vmbreak; 1441 vmbreak;
1438 } 1442 }
1439 vmcase(OP_UNM) { 1443 vmcase(OP_UNM) {
@@ -1447,7 +1451,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
1447 setfltvalue(s2v(ra), luai_numunm(L, nb)); 1451 setfltvalue(s2v(ra), luai_numunm(L, nb));
1448 } 1452 }
1449 else 1453 else
1450 Protect(luaT_trybinTM(L, rb, rb, ra, TM_UNM)); 1454 ProtectNT(luaT_trybinTM(L, rb, rb, ra, TM_UNM));
1451 vmbreak; 1455 vmbreak;
1452 } 1456 }
1453 vmcase(OP_BNOT) { 1457 vmcase(OP_BNOT) {
@@ -1457,7 +1461,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
1457 setivalue(s2v(ra), intop(^, ~l_castS2U(0), ib)); 1461 setivalue(s2v(ra), intop(^, ~l_castS2U(0), ib));
1458 } 1462 }
1459 else 1463 else
1460 Protect(luaT_trybinTM(L, rb, rb, ra, TM_BNOT)); 1464 ProtectNT(luaT_trybinTM(L, rb, rb, ra, TM_BNOT));
1461 vmbreak; 1465 vmbreak;
1462 } 1466 }
1463 vmcase(OP_NOT) { 1467 vmcase(OP_NOT) {
@@ -1493,7 +1497,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
1493 vmcase(OP_EQ) { 1497 vmcase(OP_EQ) {
1494 int cond; 1498 int cond;
1495 TValue *rb = vRB(i); 1499 TValue *rb = vRB(i);
1496 Protect(cond = luaV_equalobj(L, s2v(ra), rb)); 1500 ProtectNT(cond = luaV_equalobj(L, s2v(ra), rb));
1497 docondjump(); 1501 docondjump();
1498 vmbreak; 1502 vmbreak;
1499 } 1503 }