aboutsummaryrefslogtreecommitdiff
path: root/ldo.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2021-01-13 13:54:10 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2021-01-13 13:54:10 -0300
commitb07fc10e91a5954254b47280aba287220c734a4b (patch)
treee50d4e5ef9aab68487caf0944e72a7de04bb8bb5 /ldo.c
parentcc1692515e2a6aabc6d07159e7926656e38eda53 (diff)
downloadlua-b07fc10e91a5954254b47280aba287220c734a4b.tar.gz
lua-b07fc10e91a5954254b47280aba287220c734a4b.tar.bz2
lua-b07fc10e91a5954254b47280aba287220c734a4b.zip
Allow yields inside '__close' metamethods
Initial implementation to allow yields inside '__close' metamethods. This current version still does not allow a '__close' metamethod to yield when called due to an error. '__close' metamethods from C functions also are not allowed to yield.
Diffstat (limited to '')
-rw-r--r--ldo.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/ldo.c b/ldo.c
index ba0c93b8..aa159cf0 100644
--- a/ldo.c
+++ b/ldo.c
@@ -406,7 +406,7 @@ static void moveresults (lua_State *L, StkId res, int nres, int wanted) {
406 default: /* multiple results (or to-be-closed variables) */ 406 default: /* multiple results (or to-be-closed variables) */
407 if (hastocloseCfunc(wanted)) { /* to-be-closed variables? */ 407 if (hastocloseCfunc(wanted)) { /* to-be-closed variables? */
408 ptrdiff_t savedres = savestack(L, res); 408 ptrdiff_t savedres = savestack(L, res);
409 luaF_close(L, res, CLOSEKTOP); /* may change the stack */ 409 luaF_close(L, res, CLOSEKTOP, 0); /* may change the stack */
410 res = restorestack(L, savedres); 410 res = restorestack(L, savedres);
411 wanted = codeNresults(wanted); /* correct value */ 411 wanted = codeNresults(wanted); /* correct value */
412 if (wanted == LUA_MULTRET) 412 if (wanted == LUA_MULTRET)
@@ -647,7 +647,7 @@ static void recover (lua_State *L, void *ud) {
647 /* "finish" luaD_pcall */ 647 /* "finish" luaD_pcall */
648 L->ci = ci; 648 L->ci = ci;
649 L->allowhook = getoah(ci->callstatus); /* restore original 'allowhook' */ 649 L->allowhook = getoah(ci->callstatus); /* restore original 'allowhook' */
650 luaF_close(L, func, status); /* may change the stack */ 650 luaF_close(L, func, status, 0); /* may change the stack */
651 func = restorestack(L, ci->u2.funcidx); 651 func = restorestack(L, ci->u2.funcidx);
652 luaD_seterrorobj(L, status, func); 652 luaD_seterrorobj(L, status, func);
653 luaD_shrinkstack(L); /* restore stack size in case of overflow */ 653 luaD_shrinkstack(L); /* restore stack size in case of overflow */
@@ -803,7 +803,7 @@ struct CloseP {
803*/ 803*/
804static void closepaux (lua_State *L, void *ud) { 804static void closepaux (lua_State *L, void *ud) {
805 struct CloseP *pcl = cast(struct CloseP *, ud); 805 struct CloseP *pcl = cast(struct CloseP *, ud);
806 luaF_close(L, pcl->level, pcl->status); 806 luaF_close(L, pcl->level, pcl->status, 0);
807} 807}
808 808
809 809