diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-12-19 09:11:55 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-12-19 09:11:55 -0200 |
| commit | dd8edecae19251a3b89502416a2e7f8e75b2bd20 (patch) | |
| tree | 10c94c2a2f89f534ca9a5b9b2591008bda8eae17 /lparser.c | |
| parent | 28021c5c663702a1b1890f0e5d280c36be8a6c16 (diff) | |
| download | lua-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.c | 28 |
1 files changed, 18 insertions, 10 deletions
| @@ -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 | ||
| 182 | static int indexupvalue (FuncState *fs, expdesc *v) { | 182 | static 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 | } |
