aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2017-12-20 12:58:05 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2017-12-20 12:58:05 -0200
commit1d5b885437286a307a77b5d12756d73d374efd54 (patch)
treeb2daefb8d44be37af3b61816eb1f966c94d44393 /lvm.c
parent4dc0be950ad67e4385400aacd25e10325a2a6e59 (diff)
downloadlua-1d5b885437286a307a77b5d12756d73d374efd54.tar.gz
lua-1d5b885437286a307a77b5d12756d73d374efd54.tar.bz2
lua-1d5b885437286a307a77b5d12756d73d374efd54.zip
when running Lua code, there is no need to keep 'L->top' "correct";
set it only when needed.
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c26
1 files changed, 6 insertions, 20 deletions
diff --git a/lvm.c b/lvm.c
index 29c6e373..8039770e 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 2.326 2017/12/18 17:53:50 roberto Exp roberto $ 2** $Id: lvm.c,v 2.327 2017/12/19 16:18:04 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*/
@@ -464,6 +464,8 @@ int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2) {
464 } 464 }
465 if (tm == NULL) /* no TM? */ 465 if (tm == NULL) /* no TM? */
466 return 0; /* objects are different */ 466 return 0; /* objects are different */
467 if (isLuacode(L->ci))
468 L->top = L->ci->top; /* prepare top */
467 luaT_callTMres(L, tm, t1, t2, L->top); /* call TM */ 469 luaT_callTMres(L, tm, t1, t2, L->top); /* call TM */
468 return !l_isfalse(s2v(L->top)); 470 return !l_isfalse(s2v(L->top));
469} 471}
@@ -726,20 +728,10 @@ void luaV_finishOp (lua_State *L) {
726 } 728 }
727 /* move final result to final position */ 729 /* move final result to final position */
728 setobjs2s(L, ci->func + 1 + GETARG_A(inst), L->top - 1); 730 setobjs2s(L, ci->func + 1 + GETARG_A(inst), L->top - 1);
729 L->top = ci->top; /* restore top */
730 break; 731 break;
731 } 732 }
732 case OP_TFORCALL: { 733 case OP_TFORCALL: case OP_CALL: case OP_TAILCALL:
733 lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_TFORLOOP); 734 case OP_SETTABUP: case OP_SETTABLE:
734 L->top = ci->top; /* correct top */
735 break;
736 }
737 case OP_CALL: {
738 if (GETARG_C(inst) - 1 >= 0) /* nresults >= 0? */
739 L->top = ci->top; /* adjust results */
740 break;
741 }
742 case OP_TAILCALL: case OP_SETTABUP: case OP_SETTABLE:
743 case OP_SETI: case OP_SETFIELD: 735 case OP_SETI: case OP_SETFIELD:
744 break; 736 break;
745 default: lua_assert(0); 737 default: lua_assert(0);
@@ -808,7 +800,7 @@ void luaV_finishOp (lua_State *L) {
808 800
809#define checkGC(L,c) \ 801#define checkGC(L,c) \
810 { luaC_condGC(L, L->top = (c), /* limit of live values */ \ 802 { luaC_condGC(L, L->top = (c), /* limit of live values */ \
811 (L->top = ci->top, updatetrap(ci))); /* restore top */ \ 803 updatetrap(ci)); \
812 luai_threadyield(L); } 804 luai_threadyield(L); }
813 805
814 806
@@ -1387,7 +1379,6 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
1387 rb = base + b; 1379 rb = base + b;
1388 setobjs2s(L, ra, rb); 1380 setobjs2s(L, ra, rb);
1389 checkGC(L, (ra >= rb ? ra + 1 : rb)); 1381 checkGC(L, (ra >= rb ? ra + 1 : rb));
1390 L->top = ci->top; /* restore top */
1391 vmbreak; 1382 vmbreak;
1392 } 1383 }
1393 vmcase(OP_CLOSE) { 1384 vmcase(OP_CLOSE) {
@@ -1491,9 +1482,6 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
1491 L->top = ra + b; /* top signals number of arguments */ 1482 L->top = ra + b; /* top signals number of arguments */
1492 /* else previous instruction set top */ 1483 /* else previous instruction set top */
1493 Protect(luaD_call(L, ra, nresults)); 1484 Protect(luaD_call(L, ra, nresults));
1494 if (nresults >= 0) /* fixed number of results? */
1495 L->top = ci->top; /* correct top */
1496 /* else leave top for next instruction */
1497 vmbreak; 1485 vmbreak;
1498 } 1486 }
1499 vmcase(OP_TAILCALL) { 1487 vmcase(OP_TAILCALL) {
@@ -1651,7 +1639,6 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
1651 setobjs2s(L, cb, ra); 1639 setobjs2s(L, cb, ra);
1652 L->top = cb + 3; /* func. + 2 args (state and index) */ 1640 L->top = cb + 3; /* func. + 2 args (state and index) */
1653 Protect(luaD_call(L, cb, GETARG_C(i))); 1641 Protect(luaD_call(L, cb, GETARG_C(i)));
1654 L->top = ci->top;
1655 if (trap) /* keep 'base' correct for next instruction */ 1642 if (trap) /* keep 'base' correct for next instruction */
1656 updatebase(ci); 1643 updatebase(ci);
1657 i = *(pc++); /* go to next instruction */ 1644 i = *(pc++); /* go to next instruction */
@@ -1686,7 +1673,6 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
1686 last--; 1673 last--;
1687 luaC_barrierback(L, h, val); 1674 luaC_barrierback(L, h, val);
1688 } 1675 }
1689 L->top = ci->top; /* correct top (in case of previous open call) */
1690 vmbreak; 1676 vmbreak;
1691 } 1677 }
1692 vmcase(OP_CLOSURE) { 1678 vmcase(OP_CLOSURE) {