aboutsummaryrefslogtreecommitdiff
path: root/lparser.c
diff options
context:
space:
mode:
Diffstat (limited to 'lparser.c')
-rw-r--r--lparser.c27
1 files changed, 12 insertions, 15 deletions
diff --git a/lparser.c b/lparser.c
index d804e430..fb98ebc8 100644
--- a/lparser.c
+++ b/lparser.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lparser.c,v 1.202 2002/12/11 12:34:22 roberto Exp roberto $ 2** $Id: lparser.c,v 1.203 2002/12/19 11:11:55 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*/
@@ -181,19 +181,20 @@ static void create_local (LexState *ls, const char *name) {
181 181
182static int indexupvalue (FuncState *fs, TString *name, expdesc *v) { 182static int indexupvalue (FuncState *fs, TString *name, expdesc *v) {
183 int i; 183 int i;
184 for (i=0; i<fs->nu; i++) { 184 Proto *f = fs->f;
185 for (i=0; i<f->nups; i++) {
185 if (fs->upvalues[i].k == v->k && fs->upvalues[i].info == v->info) { 186 if (fs->upvalues[i].k == v->k && fs->upvalues[i].info == v->info) {
186 lua_assert(fs->f->upvalues[i] == name); 187 lua_assert(fs->f->upvalues[i] == name);
187 return i; 188 return i;
188 } 189 }
189 } 190 }
190 /* new one */ 191 /* new one */
191 luaX_checklimit(fs->ls, fs->nu + 1, MAXUPVALUES, "upvalues"); 192 luaX_checklimit(fs->ls, f->nups + 1, MAXUPVALUES, "upvalues");
192 luaM_growvector(fs->L, fs->f->upvalues, fs->nu, fs->f->nupvalues, 193 luaM_growvector(fs->L, fs->f->upvalues, f->nups, fs->f->sizeupvalues,
193 TString *, MAX_INT, ""); 194 TString *, MAX_INT, "");
194 fs->f->upvalues[fs->nu] = name; 195 fs->f->upvalues[f->nups] = name;
195 fs->upvalues[fs->nu] = *v; 196 fs->upvalues[f->nups] = *v;
196 return fs->nu++; 197 return f->nups++;
197} 198}
198 199
199 200
@@ -307,7 +308,7 @@ static void pushclosure (LexState *ls, FuncState *func, expdesc *v) {
307 MAXARG_Bx, "constant table overflow"); 308 MAXARG_Bx, "constant table overflow");
308 f->p[fs->np++] = func->f; 309 f->p[fs->np++] = func->f;
309 init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np-1)); 310 init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np-1));
310 for (i=0; i<func->nu; i++) { 311 for (i=0; i<func->f->nups; i++) {
311 OpCode o = (func->upvalues[i].k == VLOCAL) ? OP_MOVE : OP_GETUPVAL; 312 OpCode o = (func->upvalues[i].k == VLOCAL) ? OP_MOVE : OP_GETUPVAL;
312 luaK_codeABC(fs, o, 0, func->upvalues[i].info, 0); 313 luaK_codeABC(fs, o, 0, func->upvalues[i].info, 0);
313 } 314 }
@@ -326,17 +327,13 @@ static void open_func (LexState *ls, FuncState *fs) {
326 fs->jpc = NO_JUMP; 327 fs->jpc = NO_JUMP;
327 fs->freereg = 0; 328 fs->freereg = 0;
328 fs->nk = 0; 329 fs->nk = 0;
329 fs->nu = 0;
330 fs->h = luaH_new(ls->L, 0, 0); 330 fs->h = luaH_new(ls->L, 0, 0);
331 fs->np = 0; 331 fs->np = 0;
332 fs->nlocvars = 0; 332 fs->nlocvars = 0;
333 fs->nactvar = 0; 333 fs->nactvar = 0;
334 fs->bl = NULL; 334 fs->bl = NULL;
335 f->code = NULL;
336 f->source = ls->source; 335 f->source = ls->source;
337 f->maxstacksize = 2; /* registers 0/1 are always valid */ 336 f->maxstacksize = 2; /* registers 0/1 are always valid */
338 f->numparams = 0; /* default for main chunk */
339 f->is_vararg = 0; /* default for main chunk */
340} 337}
341 338
342 339
@@ -356,8 +353,8 @@ static void close_func (LexState *ls) {
356 f->sizep = fs->np; 353 f->sizep = fs->np;
357 luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar); 354 luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar);
358 f->sizelocvars = fs->nlocvars; 355 f->sizelocvars = fs->nlocvars;
359 luaM_reallocvector(L, f->upvalues, f->nupvalues, fs->nu, TString *); 356 luaM_reallocvector(L, f->upvalues, f->sizeupvalues, f->nups, TString *);
360 f->nupvalues = fs->nu; 357 f->sizeupvalues = f->nups;
361 lua_assert(luaG_checkcode(f)); 358 lua_assert(luaG_checkcode(f));
362 lua_assert(fs->bl == NULL); 359 lua_assert(fs->bl == NULL);
363 ls->fs = fs->prev; 360 ls->fs = fs->prev;
@@ -376,7 +373,7 @@ Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff) {
376 check_condition(&lexstate, (lexstate.t.token == TK_EOS), "<eof> expected"); 373 check_condition(&lexstate, (lexstate.t.token == TK_EOS), "<eof> expected");
377 close_func(&lexstate); 374 close_func(&lexstate);
378 lua_assert(funcstate.prev == NULL); 375 lua_assert(funcstate.prev == NULL);
379 lua_assert(funcstate.nu == 0); 376 lua_assert(funcstate.f->nups == 0);
380 lua_assert(lexstate.nestlevel == 0); 377 lua_assert(lexstate.nestlevel == 0);
381 return funcstate.f; 378 return funcstate.f;
382} 379}