diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-11-18 13:24:11 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-11-18 13:24:11 -0200 |
| commit | 9bab2cf55d9b151d730c1461e3882a5fbc7d790d (patch) | |
| tree | c264480215e163b96fe1d44d874648ee39cc3cfa /lvm.c | |
| parent | c4ae00a3d107a27d80bd157a135ef115104f98f0 (diff) | |
| download | lua-9bab2cf55d9b151d730c1461e3882a5fbc7d790d.tar.gz lua-9bab2cf55d9b151d730c1461e3882a5fbc7d790d.tar.bz2 lua-9bab2cf55d9b151d730c1461e3882a5fbc7d790d.zip | |
support for yield inside hooks
Diffstat (limited to 'lvm.c')
| -rw-r--r-- | lvm.c | 13 |
1 files changed, 9 insertions, 4 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.c,v 1.261 2002/11/14 16:15:53 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.262 2002/11/18 11:01:55 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 | */ |
| @@ -393,8 +393,14 @@ StkId luaV_execute (lua_State *L) { | |||
| 393 | const Instruction i = *pc++; | 393 | const Instruction i = *pc++; |
| 394 | StkId ra; | 394 | StkId ra; |
| 395 | if (L->hookmask >= LUA_MASKLINE && | 395 | if (L->hookmask >= LUA_MASKLINE && |
| 396 | (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) | 396 | (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) { |
| 397 | traceexec(L); | 397 | traceexec(L); |
| 398 | if (L->ci->state & CI_YIELD) { /* did hook yield? */ | ||
| 399 | L->ci->u.l.savedpc = pc - 1; | ||
| 400 | L->ci->state |= CI_SAVEDPC; | ||
| 401 | return NULL; | ||
| 402 | } | ||
| 403 | } | ||
| 398 | /* warning!! several calls may realloc the stack and invalidate `ra' */ | 404 | /* warning!! several calls may realloc the stack and invalidate `ra' */ |
| 399 | ra = RA(i); | 405 | ra = RA(i); |
| 400 | lua_assert(L->top <= L->stack + L->stacksize && L->top >= L->ci->base); | 406 | lua_assert(L->top <= L->stack + L->stacksize && L->top >= L->ci->base); |
| @@ -595,8 +601,7 @@ StkId luaV_execute (lua_State *L) { | |||
| 595 | if (firstResult) { | 601 | if (firstResult) { |
| 596 | if (firstResult > L->top) { /* yield? */ | 602 | if (firstResult > L->top) { /* yield? */ |
| 597 | (L->ci - 1)->u.l.savedpc = pc; | 603 | (L->ci - 1)->u.l.savedpc = pc; |
| 598 | (L->ci - 1)->state = CI_SAVEDPC; | 604 | (L->ci - 1)->state |= CI_SAVEDPC; |
| 599 | L->ci->state |= CI_YIELD; | ||
| 600 | return NULL; | 605 | return NULL; |
| 601 | } | 606 | } |
| 602 | /* it was a C function (`precall' called it); adjust results */ | 607 | /* it was a C function (`precall' called it); adjust results */ |
