浏览代码

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

Roberto Ierusalimschy 19 年之前
父节点
当前提交
2c8206d448
共有 1 个文件被更改,包括 35 次插入2 次删除
  1. 35 2
      bugs

+ 35 - 2
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;
+     }
+]],
+
+}
+