diff options
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 23 |
1 files changed, 12 insertions, 11 deletions
@@ -1654,11 +1654,11 @@ void luaV_execute (lua_State *L, CallInfo *ci) { | |||
1654 | vmbreak; | 1654 | vmbreak; |
1655 | } | 1655 | } |
1656 | vmcase(OP_TFORPREP) { | 1656 | vmcase(OP_TFORPREP) { |
1657 | /* is 'state' a function or has a '__close' metamethod? */ | 1657 | /* is 'toclose' a function or has a '__close' metamethod? */ |
1658 | if (ttisfunction(s2v(ra + 1)) || | 1658 | if (ttisfunction(s2v(ra + 3)) || |
1659 | !ttisnil(luaT_gettmbyobj(L, s2v(ra + 1), TM_CLOSE))) { | 1659 | !ttisnil(luaT_gettmbyobj(L, s2v(ra + 3), TM_CLOSE))) { |
1660 | /* create to-be-closed upvalue for it */ | 1660 | /* create to-be-closed upvalue for it */ |
1661 | halfProtect(luaF_newtbcupval(L, ra + 1)); | 1661 | halfProtect(luaF_newtbcupval(L, ra + 3)); |
1662 | } | 1662 | } |
1663 | pc += GETARG_Bx(i); | 1663 | pc += GETARG_Bx(i); |
1664 | i = *(pc++); /* go to next instruction */ | 1664 | i = *(pc++); /* go to next instruction */ |
@@ -1668,13 +1668,14 @@ void luaV_execute (lua_State *L, CallInfo *ci) { | |||
1668 | vmcase(OP_TFORCALL) { | 1668 | vmcase(OP_TFORCALL) { |
1669 | l_tforcall: | 1669 | l_tforcall: |
1670 | /* 'ra' has the iterator function, 'ra + 1' has the state, | 1670 | /* 'ra' has the iterator function, 'ra + 1' has the state, |
1671 | and 'ra + 2' has the control variable. The call will use | 1671 | 'ra + 2' has the control variable, and 'ra + 3' has the |
1672 | the stack after these values (starting at 'ra + 3') | 1672 | to-be-closed variable. The call will use the stack after |
1673 | these values (starting at 'ra + 4') | ||
1673 | */ | 1674 | */ |
1674 | /* push function, state, and control variable */ | 1675 | /* push function, state, and control variable */ |
1675 | memcpy(ra + 3, ra, 3 * sizeof(*ra)); | 1676 | memcpy(ra + 4, ra, 3 * sizeof(*ra)); |
1676 | L->top = ra + 6; | 1677 | L->top = ra + 4 + 3; |
1677 | Protect(luaD_call(L, ra + 3, GETARG_C(i))); /* do the call */ | 1678 | Protect(luaD_call(L, ra + 4, GETARG_C(i))); /* do the call */ |
1678 | if (trap) { /* stack may have changed? */ | 1679 | if (trap) { /* stack may have changed? */ |
1679 | updatebase(ci); /* keep 'base' correct */ | 1680 | updatebase(ci); /* keep 'base' correct */ |
1680 | ra = RA(i); /* keep 'ra' correct for next instruction */ | 1681 | ra = RA(i); /* keep 'ra' correct for next instruction */ |
@@ -1686,8 +1687,8 @@ void luaV_execute (lua_State *L, CallInfo *ci) { | |||
1686 | } | 1687 | } |
1687 | vmcase(OP_TFORLOOP) { | 1688 | vmcase(OP_TFORLOOP) { |
1688 | l_tforloop: | 1689 | l_tforloop: |
1689 | if (!ttisnil(s2v(ra + 1))) { /* continue loop? */ | 1690 | if (!ttisnil(s2v(ra + 2))) { /* continue loop? */ |
1690 | setobjs2s(L, ra, ra + 1); /* save control variable */ | 1691 | setobjs2s(L, ra, ra + 2); /* save control variable */ |
1691 | pc -= GETARG_Bx(i); /* jump back */ | 1692 | pc -= GETARG_Bx(i); /* jump back */ |
1692 | } | 1693 | } |
1693 | vmbreak; | 1694 | vmbreak; |