aboutsummaryrefslogtreecommitdiff
path: root/lgc.c
diff options
context:
space:
mode:
Diffstat (limited to 'lgc.c')
-rw-r--r--lgc.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/lgc.c b/lgc.c
index 264af24d..593346dc 100644
--- a/lgc.c
+++ b/lgc.c
@@ -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
237static void markall (GCState *st) { 237static 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);