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 /ldo.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 'ldo.c')
| -rw-r--r-- | ldo.c | 18 |
1 files changed, 7 insertions, 11 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ldo.c,v 2.48 2008/08/26 13:27:42 roberto Exp roberto $ | 2 | ** $Id: ldo.c,v 2.49 2008/10/28 16:53:16 roberto Exp roberto $ |
| 3 | ** Stack and Call structure of Lua | 3 | ** Stack and Call structure of Lua |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -391,8 +391,10 @@ static void unroll (lua_State *L) { | |||
| 391 | for (;;) { | 391 | for (;;) { |
| 392 | Instruction inst; | 392 | Instruction inst; |
| 393 | luaV_execute(L); /* execute up to higher C 'boundary' */ | 393 | luaV_execute(L); /* execute up to higher C 'boundary' */ |
| 394 | if (L->ci == L->base_ci) /* stack is empty? */ | 394 | if (L->ci == L->base_ci) { /* stack is empty? */ |
| 395 | lua_assert(L->baseCcalls == G(L)->nCcalls); | ||
| 395 | return; /* coroutine finished normally */ | 396 | return; /* coroutine finished normally */ |
| 397 | } | ||
| 396 | L->baseCcalls--; /* undo increment that allows yields */ | 398 | L->baseCcalls--; /* undo increment that allows yields */ |
| 397 | inst = *(L->savedpc - 1); /* interrupted instruction */ | 399 | inst = *(L->savedpc - 1); /* interrupted instruction */ |
| 398 | switch (GET_OPCODE(inst)) { /* finish its execution */ | 400 | switch (GET_OPCODE(inst)) { /* finish its execution */ |
| @@ -419,15 +421,9 @@ static void unroll (lua_State *L) { | |||
| 419 | } | 421 | } |
| 420 | case OP_SETGLOBAL: case OP_SETTABLE: | 422 | case OP_SETGLOBAL: case OP_SETTABLE: |
| 421 | break; /* nothing to be done */ | 423 | break; /* nothing to be done */ |
| 422 | case OP_TFORLOOP: { | 424 | case OP_TFORCALL: { |
| 423 | StkId cb = L->base + GETARG_A(inst) + 3; | 425 | lua_assert(GET_OPCODE(*L->savedpc) == OP_TFORLOOP); |
| 424 | L->top = L->ci->top; | 426 | L->top = L->ci->top; /* correct top */ |
| 425 | lua_assert(GET_OPCODE(*L->savedpc) == OP_JMP); | ||
| 426 | if (!ttisnil(cb)) { /* continue loop? */ | ||
| 427 | setobjs2s(L, cb - 1, cb); /* save control variable */ | ||
| 428 | L->savedpc += GETARG_sBx(*L->savedpc); /* jump back */ | ||
| 429 | } | ||
| 430 | L->savedpc++; | ||
| 431 | break; | 427 | break; |
| 432 | } | 428 | } |
| 433 | default: lua_assert(0); | 429 | default: lua_assert(0); |
