Browse Source

"nupvalues" is kept in Closure, not in prototype (as a preparation

for C closures...)
v5-2
Roberto Ierusalimschy 27 years ago
parent
commit
45ccb0e881
  1. 4
      ldo.c
  2. 3
      lfunc.c
  3. 4
      lgc.c
  4. 4
      lobject.h
  5. 7
      lopcodes.h
  6. 15
      lua.stx
  7. 26
      lvm.c
  8. 4
      lvm.h

4
ldo.c

@ -1,5 +1,5 @@
/* /*
** $Id: ldo.c,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $ ** $Id: ldo.c,v 1.2 1997/09/26 15:02:26 roberto Exp roberto $
** Stack and Call structure of Lua ** Stack and Call structure of Lua
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -338,7 +338,7 @@ static int protectedparser (ZIO *z, char *chunkname, int bin)
luaD_adjusttop(luaD_Cstack.base+1); /* one slot for the pseudo-function */ luaD_adjusttop(luaD_Cstack.base+1); /* one slot for the pseudo-function */
luaD_stack.stack[luaD_Cstack.base].ttype = LUA_T_PROTO; luaD_stack.stack[luaD_Cstack.base].ttype = LUA_T_PROTO;
luaD_stack.stack[luaD_Cstack.base].value.tf = tf; luaD_stack.stack[luaD_Cstack.base].value.tf = tf;
luaV_closure(); luaV_closure(0);
return 0; return 0;
} }

3
lfunc.c

@ -1,5 +1,5 @@
/* /*
** $Id: lfunc.c,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $ ** $Id: lfunc.c,v 1.2 1997/09/26 16:46:20 roberto Exp roberto $
** Lua Funcion auxiliar ** Lua Funcion auxiliar
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -32,7 +32,6 @@ TProtoFunc *luaF_newproto (void)
f->fileName = NULL; f->fileName = NULL;
f->consts = NULL; f->consts = NULL;
f->nconsts = 0; f->nconsts = 0;
f->nupvalues = 0;
f->locvars = NULL; f->locvars = NULL;
luaO_insertlist(&luaF_root, (GCnode *)f); luaO_insertlist(&luaF_root, (GCnode *)f);
return f; return f;

4
lgc.c

@ -1,5 +1,5 @@
/* /*
** $Id: lgc.c,v 1.2 1997/09/26 15:02:26 roberto Exp roberto $ ** $Id: lgc.c,v 1.3 1997/09/26 16:46:20 roberto Exp roberto $
** Garbage Collector ** Garbage Collector
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -187,7 +187,7 @@ static void funcmark (Closure *f)
if (!f->head.marked) { if (!f->head.marked) {
int i; int i;
f->head.marked = 1; f->head.marked = 1;
for (i=f->consts[0].value.tf->nupvalues; i>=0; i--) for (i=f->nelems; i>=0; i--)
markobject(&f->consts[i]); markobject(&f->consts[i]);
} }
} }

4
lobject.h

@ -1,5 +1,5 @@
/* /*
** $Id: lobject.h,v 1.2 1997/09/26 15:02:26 roberto Exp roberto $ ** $Id: lobject.h,v 1.3 1997/09/26 16:46:20 roberto Exp roberto $
** Type definitions for Lua objects ** Type definitions for Lua objects
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -110,7 +110,6 @@ typedef struct TProtoFunc {
struct TObject *consts; struct TObject *consts;
int nconsts; int nconsts;
struct LocVar *locvars; /* ends with line = -1 */ struct LocVar *locvars; /* ends with line = -1 */
int nupvalues;
} TProtoFunc; } TProtoFunc;
typedef struct LocVar { typedef struct LocVar {
@ -138,6 +137,7 @@ typedef struct LocVar {
*/ */
typedef struct Closure { typedef struct Closure {
GCnode head; GCnode head;
int nelems; /* not included the first one (always the prototype) */
TObject consts[1]; /* at least one for prototype */ TObject consts[1]; /* at least one for prototype */
} Closure; } Closure;

7
lopcodes.h

@ -1,5 +1,5 @@
/* /*
** $Id: lopcodes.h,v 1.7 1997/10/06 14:51:11 roberto Exp roberto $ ** $Id: lopcodes.h,v 1.8 1997/10/13 22:12:04 roberto Exp roberto $
** Opcodes for Lua virtual machine ** Opcodes for Lua virtual machine
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -135,8 +135,9 @@ IFTUPJMPW,/* w x - (x!=nil)? PC-=w */
IFFUPJMP,/* b x - (x==nil)? PC-=b */ IFFUPJMP,/* b x - (x==nil)? PC-=b */
IFFUPJMPW,/* w x - (x==nil)? PC-=w */ IFFUPJMPW,/* w x - (x==nil)? PC-=w */
CLOSURE,/* b v_1...v_n c(CNST[b]) */ CLOSURE,/* b v_b...v_1 prt c(prt) */
CLOSUREW,/* w v_1...v_n c(CNST[w]) */ CLOSURE0,/* b prt c(prt) */
CLOSURE1,/* b v_1 prt c(prt) */
CALLFUNC,/* b c v_c...v_1 f r_b...r_1 f(v1,...,v_c) */ CALLFUNC,/* b c v_c...v_1 f r_b...r_1 f(v1,...,v_c) */
CALLFUNC0,/* b v_b...v_1 f - f(v1,...,v_b) */ CALLFUNC0,/* b v_b...v_1 f - f(v1,...,v_b) */

15
lua.stx

@ -1,6 +1,6 @@
%{ %{
/* /*
** $Id: lua.stx,v 1.9 1997/10/13 22:12:04 roberto Exp roberto $ ** $Id: lua.stx,v 1.10 1997/10/15 20:16:00 roberto Exp roberto $
** Syntax analizer and code generator ** Syntax analizer and code generator
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -57,6 +57,7 @@ typedef struct State {
int stacksize; /* number of values on activation register */ int stacksize; /* number of values on activation register */
int maxstacksize; /* maximum number of values on activation register */ int maxstacksize; /* maximum number of values on activation register */
int nlocalvar; /* number of active local variables */ int nlocalvar; /* number of active local variables */
int nupvalues; /* number of upvalues */
int nvars; /* number of entries in f->locvars */ int nvars; /* number of entries in f->locvars */
int maxcode; /* size of f->code */ int maxcode; /* size of f->code */
int maxvars; /* size of f->locvars (-1 if no debug information) */ int maxvars; /* size of f->locvars (-1 if no debug information) */
@ -347,14 +348,14 @@ static int indexupvalue (TaggedString *n)
{ {
vardesc v = singlevar(n, currState-1); vardesc v = singlevar(n, currState-1);
int i; int i;
for (i=0; i<currState->f->nupvalues; i++) { for (i=0; i<currState->nupvalues; i++) {
if (currState->upvalues[i] == v) if (currState->upvalues[i] == v)
return i; return i;
} }
/* new one */ /* new one */
if (++currState->f->nupvalues > MAXUPVALUES) if (++currState->nupvalues > MAXUPVALUES)
luaY_error("too many upvalues in a single function"); luaY_error("too many upvalues in a single function");
currState->upvalues[i] = v; /* i = currState->f->nupvalues - 1 */ currState->upvalues[i] = v; /* i = currState->nupvalues - 1 */
return i; return i;
} }
@ -515,13 +516,14 @@ static void codereturn (void)
static void func_onstack (TProtoFunc *f) static void func_onstack (TProtoFunc *f)
{ {
int i; int i;
int nupvalues = (currState+1)->f->nupvalues; int nupvalues = (currState+1)->nupvalues;
int c = next_constant(currState); int c = next_constant(currState);
ttype(&currState->f->consts[c]) = LUA_T_PROTO; ttype(&currState->f->consts[c]) = LUA_T_PROTO;
currState->f->consts[c].value.tf = (currState+1)->f; currState->f->consts[c].value.tf = (currState+1)->f;
code_constant(c);
for (i=0; i<nupvalues; i++) for (i=0; i<nupvalues; i++)
lua_pushvar((currState+1)->upvalues[i]); lua_pushvar((currState+1)->upvalues[i]);
code_oparg(CLOSURE, 0, c, 1-nupvalues); code_oparg(CLOSURE, 2, nupvalues, -nupvalues);
} }
@ -531,6 +533,7 @@ static void init_state (TaggedString *filename)
currState->stacksize = 0; currState->stacksize = 0;
currState->maxstacksize = 0; currState->maxstacksize = 0;
currState->nlocalvar = 0; currState->nlocalvar = 0;
currState->nupvalues = 0;
currState->f = f; currState->f = f;
f->fileName = filename; f->fileName = filename;
currState->pc = 0; currState->pc = 0;

26
lvm.c

@ -1,5 +1,5 @@
/* /*
** $Id: lvm.c,v 1.8 1997/10/06 14:51:11 roberto Exp roberto $ ** $Id: lvm.c,v 1.9 1997/10/13 22:12:04 roberto Exp roberto $
** Lua virtual machine ** Lua virtual machine
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -76,12 +76,11 @@ int luaV_tostring (TObject *obj)
} }
void luaV_closure (void) void luaV_closure (int nelems)
{ {
int nelems = (luaD_stack.top-1)->value.tf->nupvalues;
Closure *c = luaF_newclosure(nelems); Closure *c = luaF_newclosure(nelems);
c->consts[0] = *(luaD_stack.top-1); memcpy(c->consts, luaD_stack.top-(nelems+1), (nelems+1)*sizeof(TObject));
memcpy(&c->consts[1], luaD_stack.top-(nelems+1), nelems*sizeof(TObject)); c->nelems = nelems;
luaD_stack.top -= nelems; luaD_stack.top -= nelems;
ttype(luaD_stack.top-1) = LUA_T_FUNCTION; ttype(luaD_stack.top-1) = LUA_T_FUNCTION;
(luaD_stack.top-1)->value.cl = c; (luaD_stack.top-1)->value.cl = c;
@ -427,7 +426,7 @@ StkId luaV_execute (Closure *cl, StkId base)
aux = 0; goto setmap; aux = 0; goto setmap;
case SETMAP: case SETMAP:
aux = *(pc++); aux = *pc++;
setmap: { setmap: {
TObject *arr = luaD_stack.top-(2*aux)-3; TObject *arr = luaD_stack.top-(2*aux)-3;
do { do {
@ -447,12 +446,12 @@ StkId luaV_execute (Closure *cl, StkId base)
break; break;
case ARGS: case ARGS:
luaD_adjusttop(base + *(pc++)); luaD_adjusttop(base+(*pc++));
break; break;
case VARARGS: case VARARGS:
luaC_checkGC(); luaC_checkGC();
adjust_varargs(base + *(pc++)); adjust_varargs(base+(*pc++));
break; break;
case CREATEARRAYW: case CREATEARRAYW:
@ -632,14 +631,13 @@ StkId luaV_execute (Closure *cl, StkId base)
if (ttype(--luaD_stack.top) == LUA_T_NIL) pc -= aux; if (ttype(--luaD_stack.top) == LUA_T_NIL) pc -= aux;
break; break;
case CLOSUREW:
aux = next_word(pc); goto closure;
case CLOSURE: case CLOSURE:
aux = *pc++; aux = *pc++; goto closure;
case CLOSURE0: case CLOSURE1:
aux -= CLOSURE0;
closure: closure:
*luaD_stack.top++ = consts[aux]; luaV_closure(aux);
luaV_closure();
luaC_checkGC(); luaC_checkGC();
break; break;

4
lvm.h

@ -1,5 +1,5 @@
/* /*
** $Id: lvm.h,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $ ** $Id: lvm.h,v 1.2 1997/09/26 15:02:26 roberto Exp roberto $
** Lua virtual machine ** Lua virtual machine
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -24,6 +24,6 @@ void luaV_settable (TObject *t, int mode);
void luaV_getglobal (TaggedString *ts); void luaV_getglobal (TaggedString *ts);
void luaV_setglobal (TaggedString *ts); void luaV_setglobal (TaggedString *ts);
StkId luaV_execute (Closure *func, StkId base); StkId luaV_execute (Closure *func, StkId base);
void luaV_closure (void); void luaV_closure (int nelems);
#endif #endif

Loading…
Cancel
Save