aboutsummaryrefslogtreecommitdiff
path: root/lparser.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2003-12-09 14:56:11 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2003-12-09 14:56:11 -0200
commitdf429f163ada6581d921e7f51b016f1abfeefddd (patch)
treea1af3ce961377e6548074f706f65e2b34181918f /lparser.c
parentfe595a45c246faf2cf12084e7aac4b772f8f72da (diff)
downloadlua-df429f163ada6581d921e7f51b016f1abfeefddd.tar.gz
lua-df429f163ada6581d921e7f51b016f1abfeefddd.tar.bz2
lua-df429f163ada6581d921e7f51b016f1abfeefddd.zip
First version of incremental GC
Diffstat (limited to 'lparser.c')
-rw-r--r--lparser.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/lparser.c b/lparser.c
index cf0e18d1..bf2b7e08 100644
--- a/lparser.c
+++ b/lparser.c
@@ -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;