aboutsummaryrefslogtreecommitdiff
path: root/ldo.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-10-02 13:45:03 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-10-02 13:45:03 -0300
commit15462edb0ff86bf1904011b29635420451cab2c5 (patch)
tree9a626d34736b830f83fda3f1b2f3342990a05b1f /ldo.c
parent6f936bc7931662d0460d47ad73eca308ba5fab2f (diff)
downloadlua-15462edb0ff86bf1904011b29635420451cab2c5.tar.gz
lua-15462edb0ff86bf1904011b29635420451cab2c5.tar.bz2
lua-15462edb0ff86bf1904011b29635420451cab2c5.zip
new definitions for closure structures
Diffstat (limited to 'ldo.c')
-rw-r--r--ldo.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/ldo.c b/ldo.c
index ee055a8f..60e5dc2e 100644
--- a/ldo.c
+++ b/ldo.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldo.c,v 1.140 2001/09/07 17:39:10 roberto Exp $ 2** $Id: ldo.c,v 1.141 2001/09/25 17:05:49 roberto Exp $
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*/
@@ -118,14 +118,14 @@ static void luaD_callHook (lua_State *L, lua_Hook callhook,
118} 118}
119 119
120 120
121static StkId callCclosure (lua_State *L, const struct Closure *cl) { 121static StkId callCclosure (lua_State *L, const struct CClosure *cl) {
122 int nup = cl->nupvalues; /* number of upvalues */ 122 int nup = cl->nupvalues; /* number of upvalues */
123 int n; 123 int n;
124 luaD_checkstack(L, nup+LUA_MINSTACK); /* ensure minimum stack size */ 124 luaD_checkstack(L, nup+LUA_MINSTACK); /* ensure minimum stack size */
125 for (n=0; n<nup; n++) /* copy upvalues as extra arguments */ 125 for (n=0; n<nup; n++) /* copy upvalues as extra arguments */
126 setobj(L->top++, &cl->u.c.upvalue[n]); 126 setobj(L->top++, &cl->upvalue[n]);
127 lua_unlock(L); 127 lua_unlock(L);
128 n = (*cl->u.c.f)(L); /* do the actual call */ 128 n = (*cl->f)(L); /* do the actual call */
129 lua_lock(L); 129 lua_lock(L);
130 return L->top - n; /* return index of first result */ 130 return L->top - n; /* return index of first result */
131} 131}
@@ -155,8 +155,9 @@ void luaD_call (lua_State *L, StkId func) {
155 callhook = L->callhook; 155 callhook = L->callhook;
156 if (callhook) 156 if (callhook)
157 luaD_callHook(L, callhook, l_s("call")); 157 luaD_callHook(L, callhook, l_s("call"));
158 firstResult = (clvalue(func)->isC ? callCclosure(L, clvalue(func)) : 158 firstResult = (clvalue(func)->c.isC ?
159 luaV_execute(L, clvalue(func), func+1)); 159 callCclosure(L, &clvalue(func)->c) :
160 luaV_execute(L, &clvalue(func)->l, func+1));
160 if (callhook) /* same hook that was active at entry */ 161 if (callhook) /* same hook that was active at entry */
161 luaD_callHook(L, callhook, l_s("return")); 162 luaD_callHook(L, callhook, l_s("return"));
162 L->ci = ci.prev; /* unchain callinfo */ 163 L->ci = ci.prev; /* unchain callinfo */
@@ -213,7 +214,7 @@ static void f_parser (lua_State *L, void *ud) {
213 struct SParser *p = cast(struct SParser *, ud); 214 struct SParser *p = cast(struct SParser *, ud);
214 Proto *tf = p->bin ? luaU_undump(L, p->z) : luaY_parser(L, p->z); 215 Proto *tf = p->bin ? luaU_undump(L, p->z) : luaY_parser(L, p->z);
215 Closure *cl = luaF_newLclosure(L, 0); 216 Closure *cl = luaF_newLclosure(L, 0);
216 cl->u.l.p = tf; 217 cl->l.p = tf;
217 luaF_LConlist(L, cl); 218 luaF_LConlist(L, cl);
218 setclvalue(L->top, cl); 219 setclvalue(L->top, cl);
219 incr_top; 220 incr_top;