From 5938212748636d21d6f4b372481ab3b6dd6c7538 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Mon, 28 Sep 2009 13:32:50 -0300 Subject: information about upvalues (where they come from) kept in Proto structure, instead of sequence of pseudo-opcodes after OP_CLOSURE --- lvm.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) (limited to 'lvm.c') diff --git a/lvm.c b/lvm.c index f3a452de..7473d73b 100644 --- a/lvm.c +++ b/lvm.c @@ -1,5 +1,5 @@ /* -** $Id: lvm.c,v 2.96 2009/08/07 16:17:41 roberto Exp roberto $ +** $Id: lvm.c,v 2.97 2009/09/23 20:33:05 roberto Exp roberto $ ** Lua virtual machine ** See Copyright Notice in lua.h */ @@ -773,22 +773,18 @@ void luaV_execute (lua_State *L) { continue; } case OP_CLOSURE: { - Proto *p; - Closure *ncl; - int nup, j; - p = cl->p->p[GETARG_Bx(i)]; - nup = p->nups; - ncl = luaF_newLclosure(L, nup, cl->env); + Proto *p = cl->p->p[GETARG_Bx(i)]; /* prototype for new closure */ + int nup = p->sizeupvalues; + Closure *ncl = luaF_newLclosure(L, nup, cl->env); + Upvaldesc *uv = p->upvalues; + int j; ncl->l.p = p; - setclvalue(L, ra, ncl); - for (j=0; ju.l.savedpc++; - if (GET_OPCODE(u) == OP_GETUPVAL) - ncl->l.upvals[j] = cl->upvals[GETARG_B(u)]; - else { - lua_assert(GET_OPCODE(u) == OP_MOVE); - ncl->l.upvals[j] = luaF_findupval(L, base + GETARG_B(u)); - } + setclvalue(L, ra, ncl); /* anchor new closure in stack */ + for (j = 0; j < nup; j++) { /* fill in upvalues */ + if (uv[j].instack) /* upvalue refers to local variable? */ + ncl->l.upvals[j] = luaF_findupval(L, base + uv[j].idx); + else /* get upvalue from enclosing function */ + ncl->l.upvals[j] = cl->upvals[uv[j].idx]; } Protect(luaC_checkGC(L)); continue; -- cgit v1.2.3-55-g6feb