def test_notifyRerun_for_delayed_finalization(self): gc.collect() comments = [] class Test_Finalizable(object): def __init__(self, name): self.name = name def __repr__(self): return "<" + self.name + ">" def __del__(self): comments.append("del " + self.name) a = Test_Finalizable("a") lst = [] lst1 = [lst] lst.append(lst1) a.b = Test_Finalizable("b") a.b.lst = lst del lst del lst1 try: self.assertTrue(gc.isMonitored(a)) self.assertTrue(gc.isMonitored(a.b)) except AttributeError: pass del a self.assertEqual(gc.collect(), 2) # c is not cyclic and a, b are resurrected, # the cycle of two lists is counted here self.assertEqual(comments, ['del a', 'del b'])
def test_notifyRerun_for_delayed_finalization(self): gc.collect() comments = [] class Test_Finalizable(object): def __init__(self, name): self.name = name def __repr__(self): return "<"+self.name+">" def __del__(self): comments.append("del "+self.name) a = Test_Finalizable("a") lst = [] lst1 = [lst] lst.append(lst1) a.b = Test_Finalizable("b") a.b.lst = lst del lst del lst1 try: self.assertTrue(gc.isMonitored(a)) self.assertTrue(gc.isMonitored(a.b)) except AttributeError: pass del a self.assertEqual(gc.collect(), 2) # c is not cyclic and a, b are resurrected, # the cycle of two lists is counted here self.assertEqual(comments, ['del a', 'del b'])
def test_monitor_status_after_delayed_finalization(self): resurrect = [] comments = [] class Test_Finalizable(object): def __init__(self, name): self.name = name def __repr__(self): return "<" + self.name + ">" def __del__(self): comments.append("del " + self.name) class Test_Resurrection(object): def __init__(self, name): self.name = name def __repr__(self): return "<" + self.name + ">" def __del__(self): comments.append("del " + self.name) if hasattr(self, "toResurrect"): resurrect.append(self.toResurrect) a = Test_Finalizable("a") a.b = Test_Finalizable("b") c = Test_Resurrection("c") c.toResurrect = a a.b.a = a self.assertTrue(gc.isMonitored(a)) self.assertTrue(gc.isMonitored(a.b)) self.assertTrue(gc.isMonitored(c)) gc.collect() del a del c #gc.set_debug(gc.DEBUG_SAVEALL) self.assertEqual(gc.collect(), 0) #c is not cyclic and a, b are resurrected, #so nothing to count here #self.asserEqual(len(gc.garbage), 0) # if we called gc.set_debug(gc.DEBUG_SAVEALL) above, it would # be okay for gc.garbage to be empty, because a and b # are not finalized and c is not cyclic. self.assertEqual(comments, ['del c']) self.assertEqual(str(resurrect), "[<a>]") self.assertTrue(gc.isMonitored(resurrect[0])) self.assertTrue(gc.isMonitored(resurrect[0].b))
def test_monitor_status_after_delayed_finalization(self): resurrect = [] comments = [] class Test_Finalizable(object): def __init__(self, name): self.name = name def __repr__(self): return "<"+self.name+">" def __del__(self): comments.append("del "+self.name) class Test_Resurrection(object): def __init__(self, name): self.name = name def __repr__(self): return "<"+self.name+">" def __del__(self): comments.append("del "+self.name) if hasattr(self, "toResurrect"): resurrect.append(self.toResurrect) a = Test_Finalizable("a") a.b = Test_Finalizable("b") c = Test_Resurrection("c") c.toResurrect = a a.b.a = a self.assertTrue(gc.isMonitored(a)) self.assertTrue(gc.isMonitored(a.b)) self.assertTrue(gc.isMonitored(c)) gc.collect() del a del c #gc.set_debug(gc.DEBUG_SAVEALL) self.assertEqual(gc.collect(), 0) #c is not cyclic and a, b are resurrected, #so nothing to count here #self.asserEqual(len(gc.garbage), 0) #if we called gc.set_debug(gc.DEBUG_SAVEALL) above, it would #be okay for gc.garbage to be empty, because a and b #are not finalized and c is not cyclic. self.assertEqual(comments, ['del c']) self.assertEqual(str(resurrect), "[<a>]") self.assertTrue(gc.isMonitored(resurrect[0])) self.assertTrue(gc.isMonitored(resurrect[0].b))