lua

A copy of the Lua development repository
Log | Files | Refs | README

commit 2c8206d448fe05b94d3841e9e2472e78e6aadc13
parent ae76307847efa83df131fd9ad3180982131b8c72
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date:   Mon, 20 Mar 2006 09:49:07 -0300

bug in Lua 4.0.2: weak tables that survive one collection are never collected

Diffstat:
Mbugs | 37+++++++++++++++++++++++++++++++++++--
1 file changed, 35 insertions(+), 2 deletions(-)

diff --git a/bugs b/bugs @@ -1,4 +1,4 @@ ---[[ +--[=[ ** lua.stx / llex.c Tue Dec 2 10:45:48 EDT 1997 >> BUG: "lastline" was not reset on function entry, so debug information @@ -336,7 +336,7 @@ Thu Mar 20 11:40:12 EST 2003 ---]] +--]=] ----------------------------------------------------------------- -- Lua 5.0 (final) @@ -764,3 +764,36 @@ patch = [[ ]], } + +Bug{ +what = [[weak tables that survive one collection are never collected]], + +report = [[Chromix, 02/01/2006]], + +example = [[ +a = {} +print(gcinfo()) +for i = 1, 10000 do + a[i] = setmetatable({}, {__mode = "v"}) +end +collectgarbage() +a = nil +collectgarbage() +print(gcinfo()) +]], + +patch = [[ +* lgc.c +@@ -366,7 +366,7 @@ + GCObject *curr; + int count = 0; /* number of collected items */ + while ((curr = *p) != NULL) { +- if (curr->gch.marked > limit) { ++ if ((curr->gch.marked & ~(KEYWEAK | VALUEWEAK)) > limit) { + unmark(curr); + p = &curr->gch.next; + } +]], + +} +