aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lgc.c8
-rw-r--r--testes/gc.lua10
2 files changed, 16 insertions, 2 deletions
diff --git a/lgc.c b/lgc.c
index 5817f9ee..c01660ab 100644
--- a/lgc.c
+++ b/lgc.c
@@ -553,8 +553,12 @@ static lu_mem traversetable (global_State *g, Table *h) {
553 traverseweakvalue(g, h); 553 traverseweakvalue(g, h);
554 else if (!weakvalue) /* strong values? */ 554 else if (!weakvalue) /* strong values? */
555 traverseephemeron(g, h, 0); 555 traverseephemeron(g, h, 0);
556 else /* all weak */ 556 else { /* all weak */
557 linkgclist(h, g->allweak); /* nothing to traverse now */ 557 if (g->gcstate == GCSpropagate)
558 linkgclist(h, g->grayagain); /* must visit again its metatable */
559 else
560 linkgclist(h, g->allweak); /* must clear collected entries */
561 }
558 } 562 }
559 else /* not weak */ 563 else /* not weak */
560 traversestrongtable(g, h); 564 traversestrongtable(g, h);
diff --git a/testes/gc.lua b/testes/gc.lua
index 03093e34..f017f330 100644
--- a/testes/gc.lua
+++ b/testes/gc.lua
@@ -301,6 +301,16 @@ collectgarbage()
301assert(next(a) == string.rep('$', 11)) 301assert(next(a) == string.rep('$', 11))
302 302
303 303
304if T then -- bug since 5.3: all-weak tables are not being revisited
305 T.gcstate("propagate")
306 local t = setmetatable({}, {__mode = "kv"})
307 T.gcstate("atomic") -- 't' was visited
308 setmetatable(t, {__mode = "kv"})
309 T.gcstate("pause") -- its new metatable is not being visited
310 assert(getmetatable(t).__mode == "kv")
311end
312
313
304-- 'bug' in 5.1 314-- 'bug' in 5.1
305a = {} 315a = {}
306local t = {x = 10} 316local t = {x = 10}