diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2008-10-30 13:39:30 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2008-10-30 13:39:30 -0200 |
commit | 84b3daebbd09b334db0fa125700ffdb1d326c4f6 (patch) | |
tree | dc99189c46297759609894ac71f75d4a57c854fa /lvm.c | |
parent | f6978173e03fdbe5536887b08beb53884f7c1a18 (diff) | |
download | lua-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.c | 26 |
1 files changed, 15 insertions, 11 deletions
@@ -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: { |