From 9bab2cf55d9b151d730c1461e3882a5fbc7d790d Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Mon, 18 Nov 2002 13:24:11 -0200 Subject: support for yield inside hooks --- lvm.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'lvm.c') diff --git a/lvm.c b/lvm.c index e9f122d0..29dcc56d 100644 --- a/lvm.c +++ b/lvm.c @@ -1,5 +1,5 @@ /* -** $Id: lvm.c,v 1.261 2002/11/14 16:15:53 roberto Exp roberto $ +** $Id: lvm.c,v 1.262 2002/11/18 11:01:55 roberto Exp roberto $ ** Lua virtual machine ** See Copyright Notice in lua.h */ @@ -393,8 +393,14 @@ StkId luaV_execute (lua_State *L) { const Instruction i = *pc++; StkId ra; if (L->hookmask >= LUA_MASKLINE && - (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) + (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) { traceexec(L); + if (L->ci->state & CI_YIELD) { /* did hook yield? */ + L->ci->u.l.savedpc = pc - 1; + L->ci->state |= CI_SAVEDPC; + return NULL; + } + } /* warning!! several calls may realloc the stack and invalidate `ra' */ ra = RA(i); lua_assert(L->top <= L->stack + L->stacksize && L->top >= L->ci->base); @@ -595,8 +601,7 @@ StkId luaV_execute (lua_State *L) { if (firstResult) { if (firstResult > L->top) { /* yield? */ (L->ci - 1)->u.l.savedpc = pc; - (L->ci - 1)->state = CI_SAVEDPC; - L->ci->state |= CI_YIELD; + (L->ci - 1)->state |= CI_SAVEDPC; return NULL; } /* it was a C function (`precall' called it); adjust results */ -- cgit v1.2.3-55-g6feb