diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2021-01-13 13:54:10 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2021-01-13 13:54:10 -0300 |
commit | b07fc10e91a5954254b47280aba287220c734a4b (patch) | |
tree | e50d4e5ef9aab68487caf0944e72a7de04bb8bb5 /ldo.c | |
parent | cc1692515e2a6aabc6d07159e7926656e38eda53 (diff) | |
download | lua-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.c | 6 |
1 files changed, 3 insertions, 3 deletions
@@ -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 | */ |
804 | static void closepaux (lua_State *L, void *ud) { | 804 | static 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 | ||