summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2009-03-04 10:32:29 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2009-03-04 10:32:29 -0300
commit1817dfc3016efc09cfa2c7aee06b22fe1d130652 (patch)
tree3de048bf2b14c6547f9ba15134b6b7fd0455f844
parent7837e34e567e174e21c7971439e6a4a093addb06 (diff)
downloadlua-1817dfc3016efc09cfa2c7aee06b22fe1d130652.tar.gz
lua-1817dfc3016efc09cfa2c7aee06b22fe1d130652.tar.bz2
lua-1817dfc3016efc09cfa2c7aee06b22fe1d130652.zip
initial separation, in CallInfo, of what is relevant only to Lua
functions or only to C functions
-rw-r--r--ldebug.c6
-rw-r--r--ldo.c8
-rw-r--r--lstate.h8
-rw-r--r--lvm.c4
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 @@
1/* 1/*
2** $Id: ldebug.c,v 2.41 2008/08/26 13:27:42 roberto Exp roberto $ 2** $Id: ldebug.c,v 2.42 2008/10/30 15:39:30 roberto Exp roberto $
3** Debug Interface 3** Debug Interface
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -89,7 +89,7 @@ LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) {
89 for (ci = L->ci; level > 0 && ci > L->base_ci; ci--) { 89 for (ci = L->ci; level > 0 && ci > L->base_ci; ci--) {
90 level--; 90 level--;
91 if (isLua(ci)) /* Lua function? */ 91 if (isLua(ci)) /* Lua function? */
92 level -= ci->tailcalls; /* skip lost tail calls */ 92 level -= ci->u.l.tailcalls; /* skip lost tail calls */
93 } 93 }
94 if (level == 0 && ci > L->base_ci) { /* level found? */ 94 if (level == 0 && ci > L->base_ci) { /* level found? */
95 status = 1; 95 status = 1;
@@ -527,7 +527,7 @@ static const char *getobjname (lua_State *L, CallInfo *ci, int stackpos,
527static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) { 527static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) {
528 TMS tm = 0; 528 TMS tm = 0;
529 Instruction i; 529 Instruction i;
530 if ((isLua(ci) && ci->tailcalls > 0) || !isLua(ci - 1)) 530 if ((isLua(ci) && ci->u.l.tailcalls > 0) || !isLua(ci - 1))
531 return NULL; /* calling function is not Lua (or is unknown) */ 531 return NULL; /* calling function is not Lua (or is unknown) */
532 ci--; /* calling function */ 532 ci--; /* calling function */
533 i = ci_func(ci)->l.p->code[currentpc(L, ci)]; 533 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 @@
1/* 1/*
2** $Id: ldo.c,v 2.52 2009/02/18 14:52:03 roberto Exp roberto $ 2** $Id: ldo.c,v 2.53 2009/03/03 18:51:24 roberto Exp roberto $
3** Stack and Call structure of Lua 3** Stack and Call structure of Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -289,7 +289,7 @@ int luaD_precall (lua_State *L, StkId func, int nresults) {
289 ci->top = L->base + p->maxstacksize; 289 ci->top = L->base + p->maxstacksize;
290 lua_assert(ci->top <= L->stack_last); 290 lua_assert(ci->top <= L->stack_last);
291 L->savedpc = p->code; /* starting point */ 291 L->savedpc = p->code; /* starting point */
292 ci->tailcalls = 0; 292 ci->u.l.tailcalls = 0;
293 ci->callstatus = CIST_LUA; 293 ci->callstatus = CIST_LUA;
294 ci->nresults = nresults; 294 ci->nresults = nresults;
295 for (st = L->top; st < ci->top; st++) 295 for (st = L->top; st < ci->top; st++)
@@ -328,8 +328,8 @@ static StkId callrethooks (lua_State *L, StkId firstResult) {
328 ptrdiff_t fr = savestack(L, firstResult); /* next call may change stack */ 328 ptrdiff_t fr = savestack(L, firstResult); /* next call may change stack */
329 luaD_callhook(L, LUA_HOOKRET, -1); 329 luaD_callhook(L, LUA_HOOKRET, -1);
330 if (isLua(L->ci)) { /* Lua function? */ 330 if (isLua(L->ci)) { /* Lua function? */
331 while ((L->hookmask & LUA_MASKRET) && L->ci->tailcalls--) /* tail calls */ 331 while ((L->hookmask & LUA_MASKRET) && L->ci->u.l.tailcalls--)
332 luaD_callhook(L, LUA_HOOKTAILRET, -1); 332 luaD_callhook(L, LUA_HOOKTAILRET, -1); /* ret. hooks for tail calls */
333 } 333 }
334 return restorestack(L, fr); 334 return restorestack(L, fr);
335} 335}
diff --git a/lstate.h b/lstate.h
index def5d7eb..174446dc 100644
--- a/lstate.h
+++ b/lstate.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstate.h,v 2.36 2008/08/26 13:27:42 roberto Exp roberto $ 2** $Id: lstate.h,v 2.37 2009/02/18 17:20:56 roberto Exp roberto $
3** Global State 3** Global State
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -83,7 +83,11 @@ typedef struct CallInfo {
83 const Instruction *savedpc; 83 const Instruction *savedpc;
84 short nresults; /* expected number of results from this function */ 84 short nresults; /* expected number of results from this function */
85 lu_byte callstatus; 85 lu_byte callstatus;
86 int tailcalls; /* number of tail calls lost under this entry */ 86 union {
87 struct { /* only for Lua functions */
88 int tailcalls; /* number of tail calls lost under this entry */
89 } l;
90 } u;
87} CallInfo; 91} CallInfo;
88 92
89 93
diff --git a/lvm.c b/lvm.c
index a83be238..2b54266f 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 2.81 2009/02/16 20:09:28 roberto Exp roberto $ 2** $Id: lvm.c,v 2.82 2009/03/02 16:34:23 roberto Exp roberto $
3** Lua virtual machine 3** Lua virtual machine
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -622,7 +622,7 @@ void luaV_execute (lua_State *L) {
622 ci->top = L->top = func+aux; /* correct top */ 622 ci->top = L->top = func+aux; /* correct top */
623 lua_assert(L->top == L->base + clvalue(func)->l.p->maxstacksize); 623 lua_assert(L->top == L->base + clvalue(func)->l.p->maxstacksize);
624 ci->savedpc = L->savedpc; 624 ci->savedpc = L->savedpc;
625 ci->tailcalls++; /* one more call lost */ 625 ci->u.l.tailcalls++; /* one more call lost */
626 L->ci--; /* remove new frame */ 626 L->ci--; /* remove new frame */
627 goto reentry; 627 goto reentry;
628 } 628 }