diff options
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 44 |
1 files changed, 24 insertions, 20 deletions
@@ -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 | } |