|
|
@ -430,14 +430,15 @@ l_sinline void moveresults (lua_State *L, StkId res, int nres, int wanted) { |
|
|
|
break; |
|
|
|
default: /* two/more results and/or to-be-closed variables */ |
|
|
|
if (hastocloseCfunc(wanted)) { /* to-be-closed variables? */ |
|
|
|
ptrdiff_t savedres = savestack(L, res); |
|
|
|
L->ci->callstatus |= CIST_CLSRET; /* in case of yields */ |
|
|
|
L->ci->u2.nres = nres; |
|
|
|
luaF_close(L, res, CLOSEKTOP, 1); |
|
|
|
res = luaF_close(L, res, CLOSEKTOP, 1); |
|
|
|
L->ci->callstatus &= ~CIST_CLSRET; |
|
|
|
if (L->hookmask) /* if needed, call hook after '__close's */ |
|
|
|
if (L->hookmask) { /* if needed, call hook after '__close's */ |
|
|
|
ptrdiff_t savedres = savestack(L, res); |
|
|
|
rethook(L, L->ci, nres); |
|
|
|
res = restorestack(L, savedres); /* close and hook can move stack */ |
|
|
|
res = restorestack(L, savedres); /* hook can move stack */ |
|
|
|
} |
|
|
|
wanted = decodeNresults(wanted); |
|
|
|
if (wanted == LUA_MULTRET) |
|
|
|
wanted = nres; /* we want all results */ |
|
|
@ -654,8 +655,7 @@ static int finishpcallk (lua_State *L, CallInfo *ci) { |
|
|
|
else { /* error */ |
|
|
|
StkId func = restorestack(L, ci->u2.funcidx); |
|
|
|
L->allowhook = getoah(ci->callstatus); /* restore 'allowhook' */ |
|
|
|
luaF_close(L, func, status, 1); /* can yield or raise an error */ |
|
|
|
func = restorestack(L, ci->u2.funcidx); /* stack may be moved */ |
|
|
|
func = luaF_close(L, func, status, 1); /* can yield or raise an error */ |
|
|
|
luaD_seterrorobj(L, status, func); |
|
|
|
luaD_shrinkstack(L); /* restore stack size in case of overflow */ |
|
|
|
setcistrecst(ci, LUA_OK); /* clear original status */ |
|
|
|