From 1817dfc3016efc09cfa2c7aee06b22fe1d130652 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Wed, 4 Mar 2009 10:32:29 -0300 Subject: [PATCH] initial separation, in CallInfo, of what is relevant only to Lua functions or only to C functions --- ldebug.c | 6 +++--- ldo.c | 8 ++++---- lstate.h | 8 ++++++-- lvm.c | 4 ++-- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/ldebug.c b/ldebug.c index aecb2f8d..6148cfcf 100644 --- a/ldebug.c +++ b/ldebug.c @@ -1,5 +1,5 @@ /* -** $Id: ldebug.c,v 2.41 2008/08/26 13:27:42 roberto Exp roberto $ +** $Id: ldebug.c,v 2.42 2008/10/30 15:39:30 roberto Exp roberto $ ** Debug Interface ** See Copyright Notice in lua.h */ @@ -89,7 +89,7 @@ LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) { for (ci = L->ci; level > 0 && ci > L->base_ci; ci--) { level--; if (isLua(ci)) /* Lua function? */ - level -= ci->tailcalls; /* skip lost tail calls */ + level -= ci->u.l.tailcalls; /* skip lost tail calls */ } if (level == 0 && ci > L->base_ci) { /* level found? */ status = 1; @@ -527,7 +527,7 @@ static const char *getobjname (lua_State *L, CallInfo *ci, int stackpos, static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) { TMS tm = 0; Instruction i; - if ((isLua(ci) && ci->tailcalls > 0) || !isLua(ci - 1)) + if ((isLua(ci) && ci->u.l.tailcalls > 0) || !isLua(ci - 1)) return NULL; /* calling function is not Lua (or is unknown) */ ci--; /* calling function */ i = ci_func(ci)->l.p->code[currentpc(L, ci)]; diff --git a/ldo.c b/ldo.c index 15764948..effef571 100644 --- a/ldo.c +++ b/ldo.c @@ -1,5 +1,5 @@ /* -** $Id: ldo.c,v 2.52 2009/02/18 14:52:03 roberto Exp roberto $ +** $Id: ldo.c,v 2.53 2009/03/03 18:51:24 roberto Exp roberto $ ** Stack and Call structure of Lua ** See Copyright Notice in lua.h */ @@ -289,7 +289,7 @@ int luaD_precall (lua_State *L, StkId func, int nresults) { ci->top = L->base + p->maxstacksize; lua_assert(ci->top <= L->stack_last); L->savedpc = p->code; /* starting point */ - ci->tailcalls = 0; + ci->u.l.tailcalls = 0; ci->callstatus = CIST_LUA; ci->nresults = nresults; for (st = L->top; st < ci->top; st++) @@ -328,8 +328,8 @@ static StkId callrethooks (lua_State *L, StkId firstResult) { ptrdiff_t fr = savestack(L, firstResult); /* next call may change stack */ luaD_callhook(L, LUA_HOOKRET, -1); if (isLua(L->ci)) { /* Lua function? */ - while ((L->hookmask & LUA_MASKRET) && L->ci->tailcalls--) /* tail calls */ - luaD_callhook(L, LUA_HOOKTAILRET, -1); + while ((L->hookmask & LUA_MASKRET) && L->ci->u.l.tailcalls--) + luaD_callhook(L, LUA_HOOKTAILRET, -1); /* ret. hooks for tail calls */ } return restorestack(L, fr); } diff --git a/lstate.h b/lstate.h index def5d7eb..174446dc 100644 --- a/lstate.h +++ b/lstate.h @@ -1,5 +1,5 @@ /* -** $Id: lstate.h,v 2.36 2008/08/26 13:27:42 roberto Exp roberto $ +** $Id: lstate.h,v 2.37 2009/02/18 17:20:56 roberto Exp roberto $ ** Global State ** See Copyright Notice in lua.h */ @@ -83,7 +83,11 @@ typedef struct CallInfo { const Instruction *savedpc; short nresults; /* expected number of results from this function */ lu_byte callstatus; - int tailcalls; /* number of tail calls lost under this entry */ + union { + struct { /* only for Lua functions */ + int tailcalls; /* number of tail calls lost under this entry */ + } l; + } u; } CallInfo; diff --git a/lvm.c b/lvm.c index a83be238..2b54266f 100644 --- a/lvm.c +++ b/lvm.c @@ -1,5 +1,5 @@ /* -** $Id: lvm.c,v 2.81 2009/02/16 20:09:28 roberto Exp roberto $ +** $Id: lvm.c,v 2.82 2009/03/02 16:34:23 roberto Exp roberto $ ** Lua virtual machine ** See Copyright Notice in lua.h */ @@ -622,7 +622,7 @@ void luaV_execute (lua_State *L) { ci->top = L->top = func+aux; /* correct top */ lua_assert(L->top == L->base + clvalue(func)->l.p->maxstacksize); ci->savedpc = L->savedpc; - ci->tailcalls++; /* one more call lost */ + ci->u.l.tailcalls++; /* one more call lost */ L->ci--; /* remove new frame */ goto reentry; }