Test finalizers and GC from inside __del__ for new classes.

This commit is contained in:
Guido van Rossum 2002-08-09 17:38:16 +00:00
parent bffb2efee0
commit 4aa21aa5b3
1 changed files with 41 additions and 0 deletions

View File

@ -124,6 +124,30 @@ def test_finalizer():
raise TestFailed, "didn't find obj in garbage (finalizer)" raise TestFailed, "didn't find obj in garbage (finalizer)"
gc.garbage.remove(obj) 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(): def test_function():
# Tricky: f -> d -> f, code should call d.clear() after the exec to # Tricky: f -> d -> f, code should call d.clear() after the exec to
# break the cycle. # break the cycle.
@ -177,6 +201,21 @@ def test_del():
gc.disable() gc.disable()
apply(gc.set_threshold, thresholds) 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: class Ouch:
n = 0 n = 0
def __del__(self): def __del__(self):
@ -225,7 +264,9 @@ def test_all():
run_test("functions", test_function) run_test("functions", test_function)
run_test("frames", test_frame) run_test("frames", test_frame)
run_test("finalizers", test_finalizer) run_test("finalizers", test_finalizer)
run_test("finalizers (new class)", test_finalizer_newclass)
run_test("__del__", test_del) run_test("__del__", test_del)
run_test("__del__ (new class)", test_del_newclass)
run_test("saveall", test_saveall) run_test("saveall", test_saveall)
run_test("trashcan", test_trashcan) run_test("trashcan", test_trashcan)