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: { |
