From 8332d5c8a5059b85da1adaa3f0197d0f57afae81 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Wed, 27 Aug 2003 18:01:44 -0300 Subject: parser fully reentrant(!) --- lgc.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) (limited to 'lgc.c') diff --git a/lgc.c b/lgc.c index d5169fdc..1ec12f1d 100644 --- a/lgc.c +++ b/lgc.c @@ -1,5 +1,5 @@ /* -** $Id: lgc.c,v 1.175 2003/07/16 20:49:02 roberto Exp roberto $ +** $Id: lgc.c,v 1.176 2003/07/29 19:25:37 roberto Exp roberto $ ** Garbage Collector ** See Copyright Notice in lua.h */ @@ -176,20 +176,29 @@ static void traversetable (GCState *st, Table *h) { } +/* +** All marks are conditional because a GC may happen while the +** prototype is still being created +*/ static void traverseproto (GCState *st, Proto *f) { int i; - stringmark(f->source); + if (f->source) stringmark(f->source); for (i=0; isizek; i++) { /* mark literal strings */ if (ttisstring(f->k+i)) stringmark(tsvalue(f->k+i)); } - for (i=0; isizeupvalues; i++) /* mark upvalue names */ - stringmark(f->upvalues[i]); - for (i=0; isizep; i++) /* mark nested protos */ - markvalue(st, f->p[i]); - for (i=0; isizelocvars; i++) /* mark local-variable names */ - stringmark(f->locvars[i].varname); - lua_assert(luaG_checkcode(f)); + for (i=0; isizeupvalues; i++) { /* mark upvalue names */ + if (f->upvalues[i]) + stringmark(f->upvalues[i]); + } + for (i=0; isizep; i++) { /* mark nested protos */ + if (f->p[i]) + markvalue(st, f->p[i]); + } + for (i=0; isizelocvars; i++) { /* mark local-variable names */ + if (f->locvars[i].varname) + stringmark(f->locvars[i].varname); + } } -- cgit v1.2.3-55-g6feb