commit 9c28ed05c95cb6854d917ac3e3ed7be9ae109480
parent 8082906c059f2b1473de4363ca57fe19b52f281f
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Wed, 17 Jul 2019 15:21:44 -0300
Calls 'luaF_close' in 'lua_settop' only when needed
In 'lua_settop', avoid calling 'luaF_close' when increasing the stack
or when the function has no to-be-closed variables.
Diffstat:
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/lapi.c b/lapi.c
@@ -170,12 +170,13 @@ LUA_API int lua_gettop (lua_State *L) {
LUA_API void lua_settop (lua_State *L, int idx) {
- StkId func = L->ci->func;
- int diff; /* difference for new top */
+ CallInfo *ci = L->ci;
+ StkId func = ci->func;
+ ptrdiff_t diff; /* difference for new top */
lua_lock(L);
if (idx >= 0) {
- api_check(L, idx <= L->ci->top - (func + 1), "new top too large");
- diff = (func + 1) + idx - L->top;
+ api_check(L, idx <= ci->top - (func + 1), "new top too large");
+ diff = ((func + 1) + idx) - L->top;
for (; diff > 0; diff--)
setnilvalue(s2v(L->top++)); /* clear new slots */
}
@@ -183,7 +184,8 @@ LUA_API void lua_settop (lua_State *L, int idx) {
api_check(L, -(idx+1) <= (L->top - (func + 1)), "invalid new top");
diff = idx + 1; /* will "subtract" index (as it is negative) */
}
- luaF_close(L, L->top + diff, LUA_OK);
+ if (diff < 0 && hastocloseCfunc(ci->nresults))
+ luaF_close(L, L->top + diff, LUA_OK);
L->top += diff; /* correct top only after closing any upvalue */
lua_unlock(L);
}