diff options
-rw-r--r-- | lgc.c | 12 |
1 files changed, 5 insertions, 7 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lgc.c,v 1.130 2002/03/07 18:14:29 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 1.131 2002/03/20 18:37:28 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 | */ |
@@ -234,10 +234,7 @@ static void traversetable (GCState *st, Table *h) { | |||
234 | } | 234 | } |
235 | 235 | ||
236 | 236 | ||
237 | static void markall (GCState *st) { | 237 | static void propagatemarks (GCState *st) { |
238 | lua_assert(hvalue(defaultmeta(st->L))->flags == cast(unsigned short, ~0)); | ||
239 | /* table is unchanged */ | ||
240 | markstacks(st); /* mark all stacks */ | ||
241 | while (st->tmark) { /* traverse marked tables */ | 238 | while (st->tmark) { /* traverse marked tables */ |
242 | Table *h = st->tmark; /* get first table from list */ | 239 | Table *h = st->tmark; /* get first table from list */ |
243 | st->tmark = h->mark; /* remove it from list */ | 240 | st->tmark = h->mark; /* remove it from list */ |
@@ -456,10 +453,11 @@ void luaC_collectgarbage (lua_State *L) { | |||
456 | st.L = L; | 453 | st.L = L; |
457 | st.tmark = NULL; | 454 | st.tmark = NULL; |
458 | st.toclear = NULL; | 455 | st.toclear = NULL; |
459 | markall(&st); /* mark all reachable objects */ | 456 | markstacks(&st); /* mark all stacks */ |
457 | propagatemarks(&st); /* mark all reachable objects */ | ||
460 | separateudata(L); /* separate userdata to be preserved */ | 458 | separateudata(L); /* separate userdata to be preserved */ |
461 | marktmu(&st); /* mark `preserved' userdata */ | 459 | marktmu(&st); /* mark `preserved' userdata */ |
462 | markall(&st); /* remark */ | 460 | propagatemarks(&st); /* remark */ |
463 | cleartables(st.toclear); | 461 | cleartables(st.toclear); |
464 | luaC_collect(L, 0); | 462 | luaC_collect(L, 0); |
465 | checkMbuffer(L); | 463 | checkMbuffer(L); |