summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_gc.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_gc.py')
-rw-r--r--Lib/test/test_gc.py41
1 files changed, 41 insertions, 0 deletions
diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
index 40edd30..8c79ac6 100644
--- a/Lib/test/test_gc.py
+++ b/Lib/test/test_gc.py
@@ -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)