other access method for C upvalues (as arguments)

This commit is contained in:
Roberto Ierusalimschy
1997-11-27 16:25:14 -02:00
parent 024528e0c2
commit 5482992dec
4 changed files with 40 additions and 44 deletions

39
ldo.c
View File

@@ -1,5 +1,5 @@
/*
** $Id: ldo.c,v 1.11 1997/11/26 20:28:22 roberto Exp $
** $Id: ldo.c,v 1.12 1997/11/26 20:44:52 roberto Exp roberto $
** Stack and Call structure of Lua
** See Copyright Notice in lua.h
*/
@@ -143,25 +143,36 @@ void luaD_callHook (StkId base, lua_Type type, int isreturn)
/*
** Call a C function. L->Cstack.base will point to the top of the stack,
** and L->Cstack.num is the number of parameters. Returns an index
** to the first result from C.
** Call a C function.
** Cstack.num is the number of arguments; Cstack.lua2C points to the
** first argument. Returns an index to the first result from C.
*/
static StkId callC (lua_CFunction func, StkId base)
static StkId callC (struct Closure *cl, StkId base)
{
struct C_Lua_Stack oldCLS = L->Cstack;
struct C_Lua_Stack *CS = &L->Cstack;
struct C_Lua_Stack oldCLS = *CS;
StkId firstResult;
L->Cstack.num = (L->stack.top-L->stack.stack) - base;
/* incorporate parameters on the L->stack.stack */
L->Cstack.lua2C = base;
L->Cstack.base = base+L->Cstack.num; /* == top-stack */
int numarg = (L->stack.top-L->stack.stack) - base;
if (cl->nelems > 0) { /* are there upvalues? */
int i;
luaD_checkstack(cl->nelems);
for (i=1; i<=numarg; i++) /* open space */
*(L->stack.top+cl->nelems-i) = *(L->stack.top-i);
/* copy upvalues to stack */
memcpy(L->stack.top-numarg, cl->consts+1, cl->nelems*sizeof(TObject));
L->stack.top += cl->nelems;
numarg += cl->nelems;
}
CS->num = numarg;
CS->lua2C = base;
CS->base = base+numarg; /* == top-stack */
if (lua_callhook)
luaD_callHook(base, LUA_T_CPROTO, 0);
(*func)();
(*(fvalue(cl->consts)))(); /* do the actual call */
if (lua_callhook) /* func may have changed lua_callhook */
luaD_callHook(base, LUA_T_CPROTO, 1);
firstResult = L->Cstack.base;
L->Cstack = oldCLS;
firstResult = CS->base;
*CS = oldCLS;
return firstResult;
}
@@ -188,7 +199,7 @@ void luaD_call (StkId base, int nResults)
if (ttype(func) == LUA_T_FUNCTION) {
TObject *proto = protovalue(func);
ttype(func) = LUA_T_MARK;
firstResult = (ttype(proto) == LUA_T_CPROTO) ? callC(fvalue(proto), base)
firstResult = (ttype(proto) == LUA_T_CPROTO) ? callC(clvalue(func), base)
: luaV_execute(func->value.cl, base);
}
else { /* func is not a function */