diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2003-12-09 14:56:11 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2003-12-09 14:56:11 -0200 |
| commit | df429f163ada6581d921e7f51b016f1abfeefddd (patch) | |
| tree | a1af3ce961377e6548074f706f65e2b34181918f /lparser.c | |
| parent | fe595a45c246faf2cf12084e7aac4b772f8f72da (diff) | |
| download | lua-df429f163ada6581d921e7f51b016f1abfeefddd.tar.gz lua-df429f163ada6581d921e7f51b016f1abfeefddd.tar.bz2 lua-df429f163ada6581d921e7f51b016f1abfeefddd.zip | |
First version of incremental GC
Diffstat (limited to 'lparser.c')
| -rw-r--r-- | lparser.c | 11 |
1 files changed, 7 insertions, 4 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lparser.c,v 1.220 2003/10/03 16:04:24 roberto Exp roberto $ | 2 | ** $Id: lparser.c,v 1.221 2003/10/09 17:56:23 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 | */ |
| @@ -151,7 +151,8 @@ static int luaI_registerlocalvar (LexState *ls, TString *varname) { | |||
| 151 | luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars, | 151 | luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars, |
| 152 | LocVar, USHRT_MAX, "too many local variables"); | 152 | LocVar, USHRT_MAX, "too many local variables"); |
| 153 | while (oldsize < f->sizelocvars) f->locvars[oldsize++].varname = NULL; | 153 | while (oldsize < f->sizelocvars) f->locvars[oldsize++].varname = NULL; |
| 154 | f->locvars[fs->nlocvars].varname = varname; /* write barrier */ | 154 | f->locvars[fs->nlocvars].varname = varname; |
| 155 | luaC_objbarrier(ls->L, f, varname); | ||
| 155 | return fs->nlocvars++; | 156 | return fs->nlocvars++; |
| 156 | } | 157 | } |
| 157 | 158 | ||
| @@ -199,7 +200,8 @@ static int indexupvalue (FuncState *fs, TString *name, expdesc *v) { | |||
| 199 | luaM_growvector(fs->L, f->upvalues, f->nups, f->sizeupvalues, | 200 | luaM_growvector(fs->L, f->upvalues, f->nups, f->sizeupvalues, |
| 200 | TString *, MAX_INT, ""); | 201 | TString *, MAX_INT, ""); |
| 201 | while (oldsize < f->sizeupvalues) f->upvalues[oldsize++] = NULL; | 202 | while (oldsize < f->sizeupvalues) f->upvalues[oldsize++] = NULL; |
| 202 | f->upvalues[f->nups] = name; /* write barrier */ | 203 | f->upvalues[f->nups] = name; |
| 204 | luaC_objbarrier(fs->L, f, name); | ||
| 203 | lua_assert(v->k == VLOCAL || v->k == VUPVAL); | 205 | lua_assert(v->k == VLOCAL || v->k == VUPVAL); |
| 204 | fs->upvalues[f->nups].k = cast(lu_byte, v->k); | 206 | fs->upvalues[f->nups].k = cast(lu_byte, v->k); |
| 205 | fs->upvalues[f->nups].info = cast(lu_byte, v->info); | 207 | fs->upvalues[f->nups].info = cast(lu_byte, v->info); |
| @@ -307,7 +309,8 @@ static void pushclosure (LexState *ls, FuncState *func, expdesc *v) { | |||
| 307 | luaM_growvector(ls->L, f->p, fs->np, f->sizep, Proto *, | 309 | luaM_growvector(ls->L, f->p, fs->np, f->sizep, Proto *, |
| 308 | MAXARG_Bx, "constant table overflow"); | 310 | MAXARG_Bx, "constant table overflow"); |
| 309 | while (oldsize < f->sizep) f->p[oldsize++] = NULL; | 311 | while (oldsize < f->sizep) f->p[oldsize++] = NULL; |
| 310 | f->p[fs->np++] = func->f; /* write barrier */ | 312 | f->p[fs->np++] = func->f; |
| 313 | luaC_objbarrier(ls->L, f, func->f); | ||
| 311 | init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np-1)); | 314 | init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np-1)); |
| 312 | for (i=0; i<func->f->nups; i++) { | 315 | for (i=0; i<func->f->nups; i++) { |
| 313 | OpCode o = (func->upvalues[i].k == VLOCAL) ? OP_MOVE : OP_GETUPVAL; | 316 | OpCode o = (func->upvalues[i].k == VLOCAL) ? OP_MOVE : OP_GETUPVAL; |
