浏览代码

don't need to mark the stacks twice ;-)

Roberto Ierusalimschy 23 年之前
父节点
当前提交
19ac0fadc9
共有 1 个文件被更改,包括 5 次插入7 次删除
  1. 5 7
      lgc.c

+ 5 - 7
lgc.c

@@ -1,5 +1,5 @@
 /*
-** $Id: lgc.c,v 1.130 2002/03/07 18:14:29 roberto Exp roberto $
+** $Id: lgc.c,v 1.131 2002/03/20 18:37:28 roberto Exp roberto $
 ** Garbage Collector
 ** See Copyright Notice in lua.h
 */
@@ -234,10 +234,7 @@ static void traversetable (GCState *st, Table *h) {
 }
 
 
-static void markall (GCState *st) {
-  lua_assert(hvalue(defaultmeta(st->L))->flags == cast(unsigned short, ~0));
-                                                      /* table is unchanged */
-  markstacks(st); /* mark all stacks */
+static void propagatemarks (GCState *st) {
   while (st->tmark) {  /* traverse marked tables */
     Table *h = st->tmark;  /* get first table from list */
     st->tmark = h->mark;  /* remove it from list */
@@ -456,10 +453,11 @@ void luaC_collectgarbage (lua_State *L) {
   st.L = L;
   st.tmark = NULL;
   st.toclear = NULL;
-  markall(&st);  /* mark all reachable objects */
+  markstacks(&st); /* mark all stacks */
+  propagatemarks(&st);  /* mark all reachable objects */
   separateudata(L);  /* separate userdata to be preserved */
   marktmu(&st);  /* mark `preserved' userdata */
-  markall(&st);  /* remark */
+  propagatemarks(&st);  /* remark */
   cleartables(st.toclear);
   luaC_collect(L, 0);
   checkMbuffer(L);