summaryrefslogtreecommitdiff
path: root/lparser.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-12-19 09:11:55 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-12-19 09:11:55 -0200
commitdd8edecae19251a3b89502416a2e7f8e75b2bd20 (patch)
tree10c94c2a2f89f534ca9a5b9b2591008bda8eae17 /lparser.c
parent28021c5c663702a1b1890f0e5d280c36be8a6c16 (diff)
downloadlua-dd8edecae19251a3b89502416a2e7f8e75b2bd20.tar.gz
lua-dd8edecae19251a3b89502416a2e7f8e75b2bd20.tar.bz2
lua-dd8edecae19251a3b89502416a2e7f8e75b2bd20.zip
new functions to manipulate upvales (get/setupvalue)
Diffstat (limited to 'lparser.c')
-rw-r--r--lparser.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/lparser.c b/lparser.c
index e016b835..d804e430 100644
--- a/lparser.c
+++ b/lparser.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lparser.c,v 1.201 2002/12/06 17:09:00 roberto Exp roberto $ 2** $Id: lparser.c,v 1.202 2002/12/11 12:34:22 roberto Exp roberto $
3** Lua Parser 3** Lua Parser
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -179,16 +179,21 @@ static void create_local (LexState *ls, const char *name) {
179} 179}
180 180
181 181
182static int indexupvalue (FuncState *fs, expdesc *v) { 182static int indexupvalue (FuncState *fs, TString *name, expdesc *v) {
183 int i; 183 int i;
184 for (i=0; i<fs->f->nupvalues; i++) { 184 for (i=0; i<fs->nu; i++) {
185 if (fs->upvalues[i].k == v->k && fs->upvalues[i].info == v->info) 185 if (fs->upvalues[i].k == v->k && fs->upvalues[i].info == v->info) {
186 lua_assert(fs->f->upvalues[i] == name);
186 return i; 187 return i;
188 }
187 } 189 }
188 /* new one */ 190 /* new one */
189 luaX_checklimit(fs->ls, fs->f->nupvalues+1, MAXUPVALUES, "upvalues"); 191 luaX_checklimit(fs->ls, fs->nu + 1, MAXUPVALUES, "upvalues");
190 fs->upvalues[fs->f->nupvalues] = *v; 192 luaM_growvector(fs->L, fs->f->upvalues, fs->nu, fs->f->nupvalues,
191 return fs->f->nupvalues++; 193 TString *, MAX_INT, "");
194 fs->f->upvalues[fs->nu] = name;
195 fs->upvalues[fs->nu] = *v;
196 return fs->nu++;
192} 197}
193 198
194 199
@@ -226,7 +231,7 @@ static void singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) {
226 var->info = luaK_stringK(fs, n); /* info points to global name */ 231 var->info = luaK_stringK(fs, n); /* info points to global name */
227 } 232 }
228 else { /* LOCAL or UPVAL */ 233 else { /* LOCAL or UPVAL */
229 var->info = indexupvalue(fs, var); 234 var->info = indexupvalue(fs, n, var);
230 var->k = VUPVAL; /* upvalue in this level */ 235 var->k = VUPVAL; /* upvalue in this level */
231 } 236 }
232 } 237 }
@@ -302,7 +307,7 @@ static void pushclosure (LexState *ls, FuncState *func, expdesc *v) {
302 MAXARG_Bx, "constant table overflow"); 307 MAXARG_Bx, "constant table overflow");
303 f->p[fs->np++] = func->f; 308 f->p[fs->np++] = func->f;
304 init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np-1)); 309 init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np-1));
305 for (i=0; i<func->f->nupvalues; i++) { 310 for (i=0; i<func->nu; i++) {
306 OpCode o = (func->upvalues[i].k == VLOCAL) ? OP_MOVE : OP_GETUPVAL; 311 OpCode o = (func->upvalues[i].k == VLOCAL) ? OP_MOVE : OP_GETUPVAL;
307 luaK_codeABC(fs, o, 0, func->upvalues[i].info, 0); 312 luaK_codeABC(fs, o, 0, func->upvalues[i].info, 0);
308 } 313 }
@@ -321,6 +326,7 @@ static void open_func (LexState *ls, FuncState *fs) {
321 fs->jpc = NO_JUMP; 326 fs->jpc = NO_JUMP;
322 fs->freereg = 0; 327 fs->freereg = 0;
323 fs->nk = 0; 328 fs->nk = 0;
329 fs->nu = 0;
324 fs->h = luaH_new(ls->L, 0, 0); 330 fs->h = luaH_new(ls->L, 0, 0);
325 fs->np = 0; 331 fs->np = 0;
326 fs->nlocvars = 0; 332 fs->nlocvars = 0;
@@ -350,6 +356,8 @@ static void close_func (LexState *ls) {
350 f->sizep = fs->np; 356 f->sizep = fs->np;
351 luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar); 357 luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar);
352 f->sizelocvars = fs->nlocvars; 358 f->sizelocvars = fs->nlocvars;
359 luaM_reallocvector(L, f->upvalues, f->nupvalues, fs->nu, TString *);
360 f->nupvalues = fs->nu;
353 lua_assert(luaG_checkcode(f)); 361 lua_assert(luaG_checkcode(f));
354 lua_assert(fs->bl == NULL); 362 lua_assert(fs->bl == NULL);
355 ls->fs = fs->prev; 363 ls->fs = fs->prev;
@@ -368,7 +376,7 @@ Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff) {
368 check_condition(&lexstate, (lexstate.t.token == TK_EOS), "<eof> expected"); 376 check_condition(&lexstate, (lexstate.t.token == TK_EOS), "<eof> expected");
369 close_func(&lexstate); 377 close_func(&lexstate);
370 lua_assert(funcstate.prev == NULL); 378 lua_assert(funcstate.prev == NULL);
371 lua_assert(funcstate.f->nupvalues == 0); 379 lua_assert(funcstate.nu == 0);
372 lua_assert(lexstate.nestlevel == 0); 380 lua_assert(lexstate.nestlevel == 0);
373 return funcstate.f; 381 return funcstate.f;
374} 382}