]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
New test_traschcan() test in test_gc, which reliably provokes segfaults
authorTim Peters <tim.peters@gmail.com>
Thu, 28 Mar 2002 21:08:30 +0000 (21:08 +0000)
committerTim Peters <tim.peters@gmail.com>
Thu, 28 Mar 2002 21:08:30 +0000 (21:08 +0000)
under 2.0, 2.1 and 2.2.

Bugfix candidate.

Lib/test/test_gc.py

index d4fcf7b223a925d80000923f197f1f9ef81507ee..33c57caf8e7017b729487e45977e2c03581a8582 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 i 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: