aboutsummaryrefslogtreecommitdiff
path: root/lapi.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2025-01-28 11:45:45 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2025-01-28 11:45:45 -0300
commit39a14ea7d7b14172595c61619e8f35c2614b2606 (patch)
tree863ea56e6014de9e1284f2e47ac1fbd4b69339ed /lapi.c
parentc4e7cdb541d89142056927ebdfd8f97017d38f45 (diff)
downloadlua-39a14ea7d7b14172595c61619e8f35c2614b2606.tar.gz
lua-39a14ea7d7b14172595c61619e8f35c2614b2606.tar.bz2
lua-39a14ea7d7b14172595c61619e8f35c2614b2606.zip
CallInfo bit CIST_CLSRET broken in two
Since commit f407b3c4a, it was being used for two distinct (and incompatible) meanings: A: Function has TBC variables (now bit CIST_TBC) B: Interpreter is closing TBC variables (original bit CIST_CLSRET) B implies A, but A does not imply B.
Diffstat (limited to 'lapi.c')
-rw-r--r--lapi.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/lapi.c b/lapi.c
index c0fd1a1b..7b30617f 100644
--- a/lapi.c
+++ b/lapi.c
@@ -195,7 +195,7 @@ LUA_API void lua_settop (lua_State *L, int idx) {
195 } 195 }
196 newtop = L->top.p + diff; 196 newtop = L->top.p + diff;
197 if (diff < 0 && L->tbclist.p >= newtop) { 197 if (diff < 0 && L->tbclist.p >= newtop) {
198 lua_assert(ci->callstatus & CIST_CLSRET); 198 lua_assert(ci->callstatus & CIST_TBC);
199 newtop = luaF_close(L, newtop, CLOSEKTOP, 0); 199 newtop = luaF_close(L, newtop, CLOSEKTOP, 0);
200 } 200 }
201 L->top.p = newtop; /* correct top only after closing any upvalue */ 201 L->top.p = newtop; /* correct top only after closing any upvalue */
@@ -207,7 +207,7 @@ LUA_API void lua_closeslot (lua_State *L, int idx) {
207 StkId level; 207 StkId level;
208 lua_lock(L); 208 lua_lock(L);
209 level = index2stack(L, idx); 209 level = index2stack(L, idx);
210 api_check(L, (L->ci->callstatus & CIST_CLSRET) && L->tbclist.p == level, 210 api_check(L, (L->ci->callstatus & CIST_TBC) && (L->tbclist.p == level),
211 "no variable to close at given level"); 211 "no variable to close at given level");
212 level = luaF_close(L, level, CLOSEKTOP, 0); 212 level = luaF_close(L, level, CLOSEKTOP, 0);
213 setnilvalue(s2v(level)); 213 setnilvalue(s2v(level));
@@ -1280,7 +1280,7 @@ LUA_API void lua_toclose (lua_State *L, int idx) {
1280 o = index2stack(L, idx); 1280 o = index2stack(L, idx);
1281 api_check(L, L->tbclist.p < o, "given index below or equal a marked one"); 1281 api_check(L, L->tbclist.p < o, "given index below or equal a marked one");
1282 luaF_newtbcupval(L, o); /* create new to-be-closed upvalue */ 1282 luaF_newtbcupval(L, o); /* create new to-be-closed upvalue */
1283 L->ci->callstatus |= CIST_CLSRET; /* mark that function has TBC slots */ 1283 L->ci->callstatus |= CIST_TBC; /* mark that function has TBC slots */
1284 lua_unlock(L); 1284 lua_unlock(L);
1285} 1285}
1286 1286