From 9c28ed05c95cb6854d917ac3e3ed7be9ae109480 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Wed, 17 Jul 2019 15:22:11 -0300 Subject: [PATCH] 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. --- lapi.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lapi.c b/lapi.c index 0f81107f..0ea3dc0f 100644 --- 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); }