]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Backport of a new test to check the interaction between cyclic GC
authorTim Peters <tim.peters@gmail.com>
Thu, 28 Mar 2002 23:18:08 +0000 (23:18 +0000)
committerTim Peters <tim.peters@gmail.com>
Thu, 28 Mar 2002 23:18:08 +0000 (23:18 +0000)
and the trashcan mechanism.

Lib/test/test_gc.py

index d4fcf7b223a925d80000923f197f1f9ef81507ee..22f7e74114be79617b6ebebd3f46c6f3b3bc8879 100644 (file)
@@ -171,6 +171,34 @@ def test_del():
     gc.disable()
     apply(gc.set_threshold, thresholds)
 
+class Ouch:
+    n = 0
+    def __del__(self):
+        Ouch.n = Ouch.n + 1
+        if Ouch.n % 7 == 0:
+            gc.collect()
+
+def test_trashcan():
+    # "trashcan" is a hack to prevent stack overflow when deallocating
+    # very deeply nested tuples etc.  It works in part by abusing the
+    # type pointer and refcount fields, and that can yield horrible
+    # problems when gc tries to traverse the structures.
+    # If this test fails (as it does in 2.0, 2.1 and 2.2), it will
+    # most likely die via segfault.
+
+    gc.enable()
+    N = 200
+    for count in range(3):
+        t = []
+        for i in range(N):
+            t = [t, Ouch()]
+        u = []
+        for i in range(N):
+            u = [u, Ouch()]
+        v = {}
+        for i in range(N):
+            v = {1: v, 2: Ouch()}
+    gc.disable()
 
 def test_all():
     gc.collect() # Delete 2nd generation garbage
@@ -187,6 +215,7 @@ def test_all():
     run_test("finalizers", test_finalizer)
     run_test("__del__", test_del)
     run_test("saveall", test_saveall)
+    run_test("trashcan", test_trashcan)
 
 def test():
     if verbose: