diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-03-20 15:54:29 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-03-20 15:54:29 -0300 |
| commit | 19ac0fadc9ed657d550f44f66873be762dda39f1 (patch) | |
| tree | 633dff663496f03dc2aab94f58a44796432c5ccc | |
| parent | ca2ceef659ed013277485acd0b6058a536649730 (diff) | |
| download | lua-19ac0fadc9ed657d550f44f66873be762dda39f1.tar.gz lua-19ac0fadc9ed657d550f44f66873be762dda39f1.tar.bz2 lua-19ac0fadc9ed657d550f44f66873be762dda39f1.zip | |
don't need to mark the stacks twice ;-)
| -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); |
