aboutsummaryrefslogtreecommitdiff
path: root/lgc.c
diff options
context:
space:
mode:
Diffstat (limited to 'lgc.c')
-rw-r--r--lgc.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/lgc.c b/lgc.c
index d5169fdc..1ec12f1d 100644
--- a/lgc.c
+++ b/lgc.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lgc.c,v 1.175 2003/07/16 20:49:02 roberto Exp roberto $ 2** $Id: lgc.c,v 1.176 2003/07/29 19:25:37 roberto Exp roberto $
3** Garbage Collector 3** Garbage Collector
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -176,20 +176,29 @@ static void traversetable (GCState *st, Table *h) {
176} 176}
177 177
178 178
179/*
180** All marks are conditional because a GC may happen while the
181** prototype is still being created
182*/
179static void traverseproto (GCState *st, Proto *f) { 183static void traverseproto (GCState *st, Proto *f) {
180 int i; 184 int i;
181 stringmark(f->source); 185 if (f->source) stringmark(f->source);
182 for (i=0; i<f->sizek; i++) { /* mark literal strings */ 186 for (i=0; i<f->sizek; i++) { /* mark literal strings */
183 if (ttisstring(f->k+i)) 187 if (ttisstring(f->k+i))
184 stringmark(tsvalue(f->k+i)); 188 stringmark(tsvalue(f->k+i));
185 } 189 }
186 for (i=0; i<f->sizeupvalues; i++) /* mark upvalue names */ 190 for (i=0; i<f->sizeupvalues; i++) { /* mark upvalue names */
187 stringmark(f->upvalues[i]); 191 if (f->upvalues[i])
188 for (i=0; i<f->sizep; i++) /* mark nested protos */ 192 stringmark(f->upvalues[i]);
189 markvalue(st, f->p[i]); 193 }
190 for (i=0; i<f->sizelocvars; i++) /* mark local-variable names */ 194 for (i=0; i<f->sizep; i++) { /* mark nested protos */
191 stringmark(f->locvars[i].varname); 195 if (f->p[i])
192 lua_assert(luaG_checkcode(f)); 196 markvalue(st, f->p[i]);
197 }
198 for (i=0; i<f->sizelocvars; i++) { /* mark local-variable names */
199 if (f->locvars[i].varname)
200 stringmark(f->locvars[i].varname);
201 }
193} 202}
194 203
195 204