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:
M | bugs | | | 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;
+ }
+]],
+
+}
+