aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lgc.c7
-rw-r--r--testes/gc.lua10
2 files changed, 15 insertions, 2 deletions
diff --git a/lgc.c b/lgc.c
index e4cbcf0c..bbaa5ff7 100644
--- a/lgc.c
+++ b/lgc.c
@@ -617,8 +617,11 @@ static l_mem traversetable (global_State *g, Table *h) {
617 case 2: /* weak keys */ 617 case 2: /* weak keys */
618 traverseephemeron(g, h, 0); 618 traverseephemeron(g, h, 0);
619 break; 619 break;
620 case 3: /* all weak */ 620 case 3: /* all weak; nothing to traverse */
621 linkgclist(h, g->allweak); /* nothing to traverse now */ 621 if (g->gcstate == GCSpropagate)
622 linkgclist(h, g->grayagain); /* must visit again its metatable */
623 else
624 linkgclist(h, g->allweak); /* must clear collected entries */
622 break; 625 break;
623 } 626 }
624 return 1 + 2*sizenode(h) + h->asize; 627 return 1 + 2*sizenode(h) + h->asize;
diff --git a/testes/gc.lua b/testes/gc.lua
index 5d2b3085..62713dac 100644
--- a/testes/gc.lua
+++ b/testes/gc.lua
@@ -294,6 +294,16 @@ do -- invalid mode
294end 294end
295 295
296 296
297if T then -- bug since 5.3: all-weak tables are not being revisited
298 T.gcstate("propagate")
299 local t = setmetatable({}, {__mode = "kv"})
300 T.gcstate("enteratomic") -- 't' was visited
301 setmetatable(t, {__mode = "kv"})
302 T.gcstate("pause") -- its new metatable is not being visited
303 assert(getmetatable(t).__mode == "kv")
304end
305
306
297-- 'bug' in 5.1 307-- 'bug' in 5.1
298a = {} 308a = {}
299local t = {x = 10} 309local t = {x = 10}