diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2009-04-15 13:53:39 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2009-04-15 13:53:39 -0300 |
| commit | 311e9f3ceb19eefe30a1b5f90dfad9898d8bac74 (patch) | |
| tree | a55686841303166bed3326092299b2f8c94fa164 | |
| parent | 8775f25830df02bc736296f70573032fa7781761 (diff) | |
| download | lua-311e9f3ceb19eefe30a1b5f90dfad9898d8bac74.tar.gz lua-311e9f3ceb19eefe30a1b5f90dfad9898d8bac74.tar.bz2 lua-311e9f3ceb19eefe30a1b5f90dfad9898d8bac74.zip | |
'nresults' is saved in CallInfo from the caller, not the called
| -rw-r--r-- | ldo.c | 9 |
1 files changed, 4 insertions, 5 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ldo.c,v 2.57 2009/03/26 12:56:38 roberto Exp roberto $ | 2 | ** $Id: ldo.c,v 2.58 2009/04/08 18:04:33 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 | */ |
| @@ -251,6 +251,7 @@ int luaD_precall (lua_State *L, StkId func, int nresults) { | |||
| 251 | funcr = savestack(L, func); | 251 | funcr = savestack(L, func); |
| 252 | cl = &clvalue(func)->l; | 252 | cl = &clvalue(func)->l; |
| 253 | L->ci->savedpc = L->savedpc; | 253 | L->ci->savedpc = L->savedpc; |
| 254 | L->ci->nresults = nresults; | ||
| 254 | if (!cl->isC) { /* Lua function? prepare its call */ | 255 | if (!cl->isC) { /* Lua function? prepare its call */ |
| 255 | CallInfo *ci; | 256 | CallInfo *ci; |
| 256 | StkId st, base; | 257 | StkId st, base; |
| @@ -272,7 +273,6 @@ int luaD_precall (lua_State *L, StkId func, int nresults) { | |||
| 272 | L->savedpc = p->code; /* starting point */ | 273 | L->savedpc = p->code; /* starting point */ |
| 273 | ci->u.l.tailcalls = 0; | 274 | ci->u.l.tailcalls = 0; |
| 274 | ci->callstatus = CIST_LUA; | 275 | ci->callstatus = CIST_LUA; |
| 275 | ci->nresults = nresults; | ||
| 276 | for (st = L->top; st < ci->top; st++) | 276 | for (st = L->top; st < ci->top; st++) |
| 277 | setnilvalue(st); | 277 | setnilvalue(st); |
| 278 | L->top = ci->top; | 278 | L->top = ci->top; |
| @@ -292,7 +292,6 @@ int luaD_precall (lua_State *L, StkId func, int nresults) { | |||
| 292 | L->base = ci->base = ci->func + 1; | 292 | L->base = ci->base = ci->func + 1; |
| 293 | ci->top = L->top + LUA_MINSTACK; | 293 | ci->top = L->top + LUA_MINSTACK; |
| 294 | lua_assert(ci->top <= L->stack_last); | 294 | lua_assert(ci->top <= L->stack_last); |
| 295 | ci->nresults = nresults; | ||
| 296 | ci->callstatus = 0; | 295 | ci->callstatus = 0; |
| 297 | if (L->hookmask & LUA_MASKCALL) | 296 | if (L->hookmask & LUA_MASKCALL) |
| 298 | luaD_callhook(L, LUA_HOOKCALL, -1); | 297 | luaD_callhook(L, LUA_HOOKCALL, -1); |
| @@ -327,7 +326,7 @@ int luaD_poscall (lua_State *L, StkId firstResult) { | |||
| 327 | } | 326 | } |
| 328 | ci = L->ci--; | 327 | ci = L->ci--; |
| 329 | res = ci->func; /* res == final position of 1st result */ | 328 | res = ci->func; /* res == final position of 1st result */ |
| 330 | wanted = ci->nresults; | 329 | wanted = (ci - 1)->nresults; |
| 331 | L->base = (ci - 1)->base; /* restore base */ | 330 | L->base = (ci - 1)->base; /* restore base */ |
| 332 | L->savedpc = (ci - 1)->savedpc; /* restore savedpc */ | 331 | L->savedpc = (ci - 1)->savedpc; /* restore savedpc */ |
| 333 | /* move results to correct place */ | 332 | /* move results to correct place */ |
| @@ -370,7 +369,7 @@ static void finishCcall (lua_State *L) { | |||
| 370 | /* finish 'luaD_call' */ | 369 | /* finish 'luaD_call' */ |
| 371 | G(L)->nCcalls--; | 370 | G(L)->nCcalls--; |
| 372 | /* finish 'lua_callk' */ | 371 | /* finish 'lua_callk' */ |
| 373 | adjustresults(L, (L->ci + 1)->nresults); | 372 | adjustresults(L, L->ci->nresults); |
| 374 | /* call continuation function */ | 373 | /* call continuation function */ |
| 375 | if (!(L->ci->callstatus & CIST_STAT)) /* no call status? */ | 374 | if (!(L->ci->callstatus & CIST_STAT)) /* no call status? */ |
| 376 | L->ci->u.c.status = LUA_YIELD; /* 'default' status */ | 375 | L->ci->u.c.status = LUA_YIELD; /* 'default' status */ |
