aboutsummaryrefslogtreecommitdiff
path: root/lparser.c
diff options
context:
space:
mode:
Diffstat (limited to 'lparser.c')
-rw-r--r--lparser.c39
1 files changed, 18 insertions, 21 deletions
diff --git a/lparser.c b/lparser.c
index 29fd747c..935526ce 100644
--- a/lparser.c
+++ b/lparser.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lparser.c,v 2.65 2009/08/10 20:41:04 roberto Exp roberto $ 2** $Id: lparser.c,v 2.66 2009/09/23 20:14:00 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*/
@@ -188,23 +188,24 @@ static int indexupvalue (FuncState *fs, TString *name, expdesc *v) {
188 int i; 188 int i;
189 Proto *f = fs->f; 189 Proto *f = fs->f;
190 int oldsize = f->sizeupvalues; 190 int oldsize = f->sizeupvalues;
191 for (i=0; i<f->nups; i++) { 191 int instk = (v->k == VLOCAL);
192 if (fs->upvalues[i].k == v->k && fs->upvalues[i].info == v->u.s.info) { 192 lua_assert(instk || v->k == VUPVAL);
193 lua_assert(f->upvalues[i] == name); 193 for (i=0; i<fs->nups; i++) {
194 if (f->upvalues[i].instack == instk && f->upvalues[i].idx == v->u.s.info) {
195 lua_assert(f->upvalues[i].name == name);
194 return i; 196 return i;
195 } 197 }
196 } 198 }
197 /* new one */ 199 /* new one */
198 luaY_checklimit(fs, f->nups + 1, LUAI_MAXUPVALUES, "upvalues"); 200 luaY_checklimit(fs, fs->nups + 1, UCHAR_MAX, "upvalues");
199 luaM_growvector(fs->L, f->upvalues, f->nups, f->sizeupvalues, 201 luaM_growvector(fs->L, f->upvalues, fs->nups, f->sizeupvalues,
200 TString *, MAX_INT, "upvalues"); 202 Upvaldesc, UCHAR_MAX, "upvalues");
201 while (oldsize < f->sizeupvalues) f->upvalues[oldsize++] = NULL; 203 while (oldsize < f->sizeupvalues) f->upvalues[oldsize++].name = NULL;
202 f->upvalues[f->nups] = name; 204 f->upvalues[fs->nups].name = name;
203 luaC_objbarrier(fs->L, f, name); 205 luaC_objbarrier(fs->L, f, name);
204 lua_assert(v->k == VLOCAL || v->k == VUPVAL); 206 f->upvalues[fs->nups].instack = cast_byte(instk);
205 fs->upvalues[f->nups].k = cast_byte(v->k); 207 f->upvalues[fs->nups].idx = cast_byte(v->u.s.info);
206 fs->upvalues[f->nups].info = cast_byte(v->u.s.info); 208 return fs->nups++;
207 return f->nups++;
208} 209}
209 210
210 211
@@ -316,17 +317,12 @@ static void pushclosure (LexState *ls, FuncState *func, expdesc *v) {
316 FuncState *fs = ls->fs->prev; 317 FuncState *fs = ls->fs->prev;
317 Proto *f = fs->f; 318 Proto *f = fs->f;
318 int oldsize = f->sizep; 319 int oldsize = f->sizep;
319 int i;
320 luaM_growvector(ls->L, f->p, fs->np, f->sizep, Proto *, 320 luaM_growvector(ls->L, f->p, fs->np, f->sizep, Proto *,
321 MAXARG_Bx, "functions"); 321 MAXARG_Bx, "functions");
322 while (oldsize < f->sizep) f->p[oldsize++] = NULL; 322 while (oldsize < f->sizep) f->p[oldsize++] = NULL;
323 f->p[fs->np++] = func->f; 323 f->p[fs->np++] = func->f;
324 luaC_objbarrier(ls->L, f, func->f); 324 luaC_objbarrier(ls->L, f, func->f);
325 init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np-1)); 325 init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np-1));
326 for (i=0; i<func->f->nups; i++) {
327 OpCode o = (func->upvalues[i].k == VLOCAL) ? OP_MOVE : OP_GETUPVAL;
328 luaK_codeABC(fs, o, 0, func->upvalues[i].info, 0);
329 }
330} 326}
331 327
332 328
@@ -343,6 +339,7 @@ static void open_func (LexState *ls, FuncState *fs) {
343 fs->freereg = 0; 339 fs->freereg = 0;
344 fs->nk = 0; 340 fs->nk = 0;
345 fs->np = 0; 341 fs->np = 0;
342 fs->nups = 0;
346 fs->nlocvars = 0; 343 fs->nlocvars = 0;
347 fs->nactvar = 0; 344 fs->nactvar = 0;
348 fs->bl = NULL; 345 fs->bl = NULL;
@@ -376,8 +373,8 @@ static void close_func (LexState *ls) {
376 f->sizep = fs->np; 373 f->sizep = fs->np;
377 luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar); 374 luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar);
378 f->sizelocvars = fs->nlocvars; 375 f->sizelocvars = fs->nlocvars;
379 luaM_reallocvector(L, f->upvalues, f->sizeupvalues, f->nups, TString *); 376 luaM_reallocvector(L, f->upvalues, f->sizeupvalues, fs->nups, Upvaldesc);
380 f->sizeupvalues = f->nups; 377 f->sizeupvalues = fs->nups;
381 lua_assert(fs->bl == NULL); 378 lua_assert(fs->bl == NULL);
382 ls->fs = fs->prev; 379 ls->fs = fs->prev;
383 L->top -= 2; /* remove table and prototype from the stack */ 380 L->top -= 2; /* remove table and prototype from the stack */
@@ -402,7 +399,7 @@ Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) {
402 close_func(&lexstate); 399 close_func(&lexstate);
403 L->top--; 400 L->top--;
404 lua_assert(funcstate.prev == NULL); 401 lua_assert(funcstate.prev == NULL);
405 lua_assert(funcstate.f->nups == 0); 402 lua_assert(funcstate.nups == 0);
406 lua_assert(lexstate.fs == NULL); 403 lua_assert(lexstate.fs == NULL);
407 return funcstate.f; 404 return funcstate.f;
408} 405}