]> granicus.if.org Git - python/commitdiff
Test finalizers and GC from inside __del__ for new classes.
authorGuido van Rossum <guido@python.org>
Fri, 9 Aug 2002 17:38:16 +0000 (17:38 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 9 Aug 2002 17:38:16 +0000 (17:38 +0000)
Lib/test/test_gc.py

index 40edd30b752eeff13b2c7bbaaaf867772b714b0f..8c79ac66ddbb9cb5cb733233b3b10d5e03b89d05 100644 (file)
@@ -124,6 +124,30 @@ def test_finalizer():
         raise TestFailed, "didn't find obj in garbage (finalizer)"
     gc.garbage.remove(obj)
 
+def test_finalizer_newclass():
+    # A() is uncollectable if it is part of a cycle, make sure it shows up
+    # in gc.garbage.
+    class A(object):
+        def __del__(self): pass
+    class B(object):
+        pass
+    a = A()
+    a.a = a
+    id_a = id(a)
+    b = B()
+    b.b = b
+    gc.collect()
+    del a
+    del b
+    expect_nonzero(gc.collect(), "finalizer")
+    for obj in gc.garbage:
+        if id(obj) == id_a:
+            del obj.a
+            break
+    else:
+        raise TestFailed, "didn't find obj in garbage (finalizer)"
+    gc.garbage.remove(obj)
+
 def test_function():
     # Tricky: f -> d -> f, code should call d.clear() after the exec to
     # break the cycle.
@@ -177,6 +201,21 @@ def test_del():
     gc.disable()
     apply(gc.set_threshold, thresholds)
 
+def test_del_newclass():
+    # __del__ methods can trigger collection, make this to happen
+    thresholds = gc.get_threshold()
+    gc.enable()
+    gc.set_threshold(1)
+
+    class A(object):
+        def __del__(self):
+            dir(self)
+    a = A()
+    del a
+
+    gc.disable()
+    apply(gc.set_threshold, thresholds)
+
 class Ouch:
     n = 0
     def __del__(self):
@@ -225,7 +264,9 @@ def test_all():
     run_test("functions", test_function)
     run_test("frames", test_frame)
     run_test("finalizers", test_finalizer)
+    run_test("finalizers (new class)", test_finalizer_newclass)
     run_test("__del__", test_del)
+    run_test("__del__ (new class)", test_del_newclass)
     run_test("saveall", test_saveall)
     run_test("trashcan", test_trashcan)