aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2008-10-30 13:39:30 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2008-10-30 13:39:30 -0200
commit84b3daebbd09b334db0fa125700ffdb1d326c4f6 (patch)
treedc99189c46297759609894ac71f75d4a57c854fa /lvm.c
parentf6978173e03fdbe5536887b08beb53884f7c1a18 (diff)
downloadlua-84b3daebbd09b334db0fa125700ffdb1d326c4f6.tar.gz
lua-84b3daebbd09b334db0fa125700ffdb1d326c4f6.tar.bz2
lua-84b3daebbd09b334db0fa125700ffdb1d326c4f6.zip
generic for coded as two dedicated instructions to simplify resumption
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/lvm.c b/lvm.c
index 65afc4a9..f7ad8f12 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 2.77 2008/09/09 13:53:02 roberto Exp roberto $ 2** $Id: lvm.c,v 2.78 2008/10/28 16:53:16 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*/
@@ -404,7 +404,7 @@ void luaV_execute (lua_State *L) {
404 k = cl->p->k; 404 k = cl->p->k;
405 /* main loop of interpreter */ 405 /* main loop of interpreter */
406 for (;;) { 406 for (;;) {
407 const Instruction i = *(L->savedpc++); 407 Instruction i = *(L->savedpc++);
408 StkId ra; 408 StkId ra;
409 if ((L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) && 409 if ((L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) &&
410 (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) { 410 (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) {
@@ -667,22 +667,26 @@ void luaV_execute (lua_State *L) {
667 dojump(L, GETARG_sBx(i)); 667 dojump(L, GETARG_sBx(i));
668 continue; 668 continue;
669 } 669 }
670 case OP_TFORLOOP: { 670 case OP_TFORCALL: {
671 StkId cb = ra + 3; /* call base */ 671 StkId cb = ra + 3; /* call base */
672 setobjs2s(L, cb+2, ra+2); 672 setobjs2s(L, cb+2, ra+2);
673 setobjs2s(L, cb+1, ra+1); 673 setobjs2s(L, cb+1, ra+1);
674 setobjs2s(L, cb, ra); 674 setobjs2s(L, cb, ra);
675 L->top = cb+3; /* func. + 2 args (state and index) */ 675 L->baseCcalls++; /* allow yields */
676 L->baseCcalls++; 676 L->top = cb + 3; /* func. + 2 args (state and index) */
677 Protect(luaD_call(L, cb, GETARG_C(i))); 677 Protect(luaD_call(L, cb, GETARG_C(i)));
678 L->baseCcalls--;
679 L->top = L->ci->top; 678 L->top = L->ci->top;
680 cb = RA(i) + 3; /* previous call may change the stack */ 679 L->baseCcalls--;
681 if (!ttisnil(cb)) { /* continue loop? */ 680 i = *(L->savedpc++); /* go to next instruction */
682 setobjs2s(L, cb-1, cb); /* save control variable */ 681 ra = RA(i);
683 dojump(L, GETARG_sBx(*L->savedpc)); /* jump back */ 682 lua_assert(GET_OPCODE(i) == OP_TFORLOOP);
683 /* go through */
684 }
685 case OP_TFORLOOP: {
686 if (!ttisnil(ra + 1)) { /* continue loop? */
687 setobjs2s(L, ra, ra + 1); /* save control variable */
688 dojump(L, GETARG_sBx(i)); /* jump back */
684 } 689 }
685 L->savedpc++;
686 continue; 690 continue;
687 } 691 }
688 case OP_SETLIST: { 692 case OP_SETLIST: {