From 1d5b885437286a307a77b5d12756d73d374efd54 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Wed, 20 Dec 2017 12:58:05 -0200 Subject: when running Lua code, there is no need to keep 'L->top' "correct"; set it only when needed. --- ldebug.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) (limited to 'ldebug.c') diff --git a/ldebug.c b/ldebug.c index 11d2b6a7..80c19d31 100644 --- a/ldebug.c +++ b/ldebug.c @@ -1,5 +1,5 @@ /* -** $Id: ldebug.c,v 2.148 2017/12/13 18:32:09 roberto Exp roberto $ +** $Id: ldebug.c,v 2.149 2017/12/15 13:07:10 roberto Exp roberto $ ** Debug Interface ** See Copyright Notice in lua.h */ @@ -189,14 +189,10 @@ static const char *upvalname (Proto *p, int uv) { static const char *findlocal (lua_State *L, CallInfo *ci, int n, StkId *pos) { - const char *name = NULL; - StkId base; - if (isLua(ci)) { - base = ci->func + 1; - name = luaF_getlocalname(ci_func(ci)->p, n, currentpc(ci)); - } - else - base = ci->func + 1; + StkId base = ci->func + 1; + const char *name = (isLua(ci)) + ? luaF_getlocalname(ci_func(ci)->p, n, currentpc(ci)) + : NULL; if (name == NULL) { /* no 'standard' name? */ StkId limit = (ci == L->ci) ? L->top : ci->next->func; if (limit - base >= n && n > 0) /* is 'n' inside 'ci' stack? */ @@ -741,6 +737,8 @@ l_noret luaG_runerror (lua_State *L, const char *fmt, ...) { const char *msg; va_list argp; luaC_checkGC(L); /* error message uses memory */ + if (isLuacode(ci)) + L->top = ci->top; /* prepare top */ va_start(argp, fmt); msg = luaO_pushvfstring(L, fmt, argp); /* format message */ va_end(argp); @@ -764,6 +762,7 @@ static int changedline (Proto *p, int oldpc, int newpc) { void luaG_traceexec (lua_State *L) { + ptrdiff_t oldtop = savestack(L, L->top); CallInfo *ci = L->ci; lu_byte mask = L->hookmask; int counthook = (--L->hookcount == 0 && (mask & LUA_MASKCOUNT)); @@ -775,6 +774,7 @@ void luaG_traceexec (lua_State *L) { ci->callstatus &= ~CIST_HOOKYIELD; /* erase mark */ return; /* do not call hook again (VM yielded, so it did not move) */ } + L->top = ci->top; /* prepare top */ if (counthook) luaD_hook(L, LUA_HOOKCOUNT, -1); /* call count hook */ if (mask & LUA_MASKLINE) { @@ -789,6 +789,7 @@ void luaG_traceexec (lua_State *L) { } L->oldpc = npc; } + L->top = restorestack(L, oldtop); if (L->status == LUA_YIELD) { /* did hook yield? */ if (counthook) L->hookcount = 1; /* undo decrement to zero */ -- cgit v1.2.3-55-g6feb