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; |