Exemplo n.º 1
0
    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'])
Exemplo n.º 2
0
    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'])
Exemplo n.º 3
0
    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))
Exemplo n.º 4
0
    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))