diff options
Diffstat (limited to 'lparser.c')
-rw-r--r-- | lparser.c | 39 |
1 files changed, 18 insertions, 21 deletions
@@ -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 | } |