aboutsummaryrefslogtreecommitdiff
path: root/lparser.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-02-20 15:28:11 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-02-20 15:28:11 -0300
commit888f91fa24d7561471acb87ddafc156408dd3617 (patch)
tree81d17820c81cf8c98bcff12b0ec7373b12e18bd8 /lparser.c
parentc1db0b2bf1ba9c5e60d77fd70f8de06aab2e0e93 (diff)
downloadlua-888f91fa24d7561471acb87ddafc156408dd3617.tar.gz
lua-888f91fa24d7561471acb87ddafc156408dd3617.tar.bz2
lua-888f91fa24d7561471acb87ddafc156408dd3617.zip
code check for upvalues
Diffstat (limited to 'lparser.c')
-rw-r--r--lparser.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/lparser.c b/lparser.c
index be917924..aea4b621 100644
--- a/lparser.c
+++ b/lparser.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lparser.c,v 1.134 2001/02/14 17:38:45 roberto Exp roberto $ 2** $Id: lparser.c,v 1.135 2001/02/20 18:15:33 roberto Exp roberto $
3** LL(1) Parser and code generator for Lua 3** LL(1) Parser and code generator for Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -219,14 +219,14 @@ static void singlevar (LexState *ls, TString *n, expdesc *var) {
219static int indexupvalue (LexState *ls, expdesc *v) { 219static int indexupvalue (LexState *ls, expdesc *v) {
220 FuncState *fs = ls->fs; 220 FuncState *fs = ls->fs;
221 int i; 221 int i;
222 for (i=0; i<fs->nupvalues; i++) { 222 for (i=0; i<fs->f->nupvalues; i++) {
223 if (fs->upvalues[i].k == v->k && fs->upvalues[i].u.index == v->u.index) 223 if (fs->upvalues[i].k == v->k && fs->upvalues[i].u.index == v->u.index)
224 return i; 224 return i;
225 } 225 }
226 /* new one */ 226 /* new one */
227 luaX_checklimit(ls, fs->nupvalues+1, MAXUPVALUES, "upvalues"); 227 luaX_checklimit(ls, fs->f->nupvalues+1, MAXUPVALUES, "upvalues");
228 fs->upvalues[fs->nupvalues] = *v; 228 fs->upvalues[fs->f->nupvalues] = *v;
229 return fs->nupvalues++; 229 return fs->f->nupvalues++;
230} 230}
231 231
232 232
@@ -297,12 +297,12 @@ static void pushclosure (LexState *ls, FuncState *func) {
297 FuncState *fs = ls->fs; 297 FuncState *fs = ls->fs;
298 Proto *f = fs->f; 298 Proto *f = fs->f;
299 int i; 299 int i;
300 for (i=0; i<func->nupvalues; i++) 300 for (i=0; i<func->f->nupvalues; i++)
301 luaK_tostack(ls, &func->upvalues[i], 1); 301 luaK_tostack(ls, &func->upvalues[i], 1);
302 luaM_growvector(ls->L, f->kproto, fs->nkproto, f->sizekproto, Proto *, 302 luaM_growvector(ls->L, f->kproto, fs->nkproto, f->sizekproto, Proto *,
303 MAXARG_A, "constant table overflow"); 303 MAXARG_A, "constant table overflow");
304 f->kproto[fs->nkproto++] = func->f; 304 f->kproto[fs->nkproto++] = func->f;
305 luaK_code2(fs, OP_CLOSURE, fs->nkproto-1, func->nupvalues); 305 luaK_code2(fs, OP_CLOSURE, fs->nkproto-1, func->f->nupvalues);
306} 306}
307 307
308 308
@@ -323,7 +323,6 @@ static void open_func (LexState *ls, FuncState *fs) {
323 fs->nlineinfo = 0; 323 fs->nlineinfo = 0;
324 fs->nlocvars = 0; 324 fs->nlocvars = 0;
325 fs->nactloc = 0; 325 fs->nactloc = 0;
326 fs->nupvalues = 0;
327 fs->lastline = 0; 326 fs->lastline = 0;
328 fs->bl = NULL; 327 fs->bl = NULL;
329 f->code = NULL; 328 f->code = NULL;
@@ -370,7 +369,7 @@ Proto *luaY_parser (lua_State *L, ZIO *z) {
370 check_condition(&lexstate, (lexstate.t.token == TK_EOS), "<eof> expected"); 369 check_condition(&lexstate, (lexstate.t.token == TK_EOS), "<eof> expected");
371 close_func(&lexstate); 370 close_func(&lexstate);
372 lua_assert(funcstate.prev == NULL); 371 lua_assert(funcstate.prev == NULL);
373 lua_assert(funcstate.nupvalues == 0); 372 lua_assert(funcstate.f->nupvalues == 0);
374 return funcstate.f; 373 return funcstate.f;
375} 374}
376 375