From 6188f3a654c0380db08eb40a5465ce8e71c784f5 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Mon, 28 Dec 2020 16:34:07 -0300 Subject: Reset thread before panicking Before panicking, it is simpler to reset the thread instead of closing its variables and adjust the top manually. --- lstate.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) (limited to 'lstate.c') diff --git a/lstate.c b/lstate.c index e01a7e7b..a6ef82a3 100644 --- a/lstate.c +++ b/lstate.c @@ -321,11 +321,8 @@ void luaE_freethread (lua_State *L, lua_State *L1) { } -int lua_resetthread (lua_State *L) { - CallInfo *ci; - int status = L->status; - lua_lock(L); - L->ci = ci = &L->base_ci; /* unwind CallInfo list */ +int luaE_resetthread (lua_State *L, int status) { + CallInfo *ci = L->ci = &L->base_ci; /* unwind CallInfo list */ setnilvalue(s2v(L->stack)); /* 'function' entry for basic 'ci' */ ci->func = L->stack; ci->callstatus = CIST_C; @@ -334,12 +331,19 @@ int lua_resetthread (lua_State *L) { status = luaD_closeprotected(L, 0, status); if (status != LUA_OK) /* errors? */ luaD_seterrorobj(L, status, L->stack + 1); - else { - status = LUA_OK; + else L->top = L->stack + 1; - } ci->top = L->top + LUA_MINSTACK; - L->status = status; + L->status = cast_byte(status); + luaD_reallocstack(L, cast_int(ci->top - L->stack), 0); + return status; +} + + +LUA_API int lua_resetthread (lua_State *L) { + int status; + lua_lock(L); + status = luaE_resetthread(L, L->status); lua_unlock(L); return status; } -- cgit v1.2.3-55-g6feb