Author: Stefan Beyer <h...@sbeyer.at>
Branch: cpyext-gc-cycle
Changeset: r95610:c1219f8ea34b
Date: 2018-08-03 09:43 +0200
http://bitbucket.org/pypy/pypy/changeset/c1219f8ea34b/

Log:    Fixed rawrefcount tests

diff --git a/rpython/memory/gc/test/test_rawrefcount.py 
b/rpython/memory/gc/test/test_rawrefcount.py
--- a/rpython/memory/gc/test/test_rawrefcount.py
+++ b/rpython/memory/gc/test/test_rawrefcount.py
@@ -334,146 +334,66 @@
         self._collect(major=True)
         check_alive(0)
 
-    def test_cycle_self_reference_free(self):
+    def test_linked_cycle_self_reference_dies_without_external_reference(self):
+        p1, p1ref, r1, r1addr, check_alive = (
+            self._rawrefcount_pair(42))
+        r1.c_ob_refcnt += 1
+        p1.next = p1
+        check_alive(+1)
+        self._collect(major=True, expected_trigger=1)
+        py.test.raises(RuntimeError, "p1.x")  # dead
+        assert r1.c_ob_refcnt == 1  # in the pending list
+        assert r1.c_ob_pypy_link == 0
+        assert self.gc.rawrefcount_next_dead() == r1addr
+        assert self.gc.rawrefcount_next_dead() == llmemory.NULL
+        assert self.gc.rawrefcount_next_dead() == llmemory.NULL
+        self.gc.check_no_more_rawrefcount_state()
+        lltype.free(r1, flavor='raw')
+
+    def test_linked_cycle_self_reference_survives_with_pyobj_reference(self):
         p1, p1ref, r1, r1addr, check_alive = (
             self._rawrefcount_pair(42, create_immortal=True))
+        r1.c_ob_refcnt += 2  # the pyobject is kept alive
         p1.next = p1
-        check_alive(0)
+        check_alive(+2)
         self._collect(major=True)
-        py.test.raises(RuntimeError, "r1.c_ob_refcnt")  # dead
+        check_alive(+2)
+        r1.c_ob_refcnt -= 1 # the external reference from pyobj is removed
+        check_alive(+1)
+        self._collect(major=True, expected_trigger=1)
         py.test.raises(RuntimeError, "p1.x")  # dead
+        assert r1.c_ob_refcnt == 1  # in the pending list
+        assert r1.c_ob_pypy_link == 0
+        assert self.gc.rawrefcount_next_dead() == r1addr
+        assert self.gc.rawrefcount_next_dead() == llmemory.NULL
+        assert self.gc.rawrefcount_next_dead() == llmemory.NULL
+        self.gc.check_no_more_rawrefcount_state()
+        lltype.free(r1, flavor='raw')
 
-    def test_cycle_self_reference_not_free(self):
+    def test_linked_cycle_self_reference_survives_with_pypy_reference(self):
         p1, p1ref, r1, r1addr, check_alive = (
             self._rawrefcount_pair(42, create_immortal=True))
-        r1.c_ob_refcnt += 1  # the pyobject is kept alive
+        r1.c_ob_refcnt += 1
         p1.next = p1
+        self.stackroots.append(p1)
         check_alive(+1)
         self._collect(major=True)
+        assert p1.x == 42
+        assert self.trigger == []
         check_alive(+1)
+        p1 = self.stackroots.pop()
+        check_alive(+1)
+        self._collect(major=True, expected_trigger=1)
+        py.test.raises(RuntimeError, "p1.x")  # dead
+        assert r1.c_ob_refcnt == 1
+        assert r1.c_ob_pypy_link == 0
+        assert self.gc.rawrefcount_next_dead() == r1addr
+        self.gc.check_no_more_rawrefcount_state()
+        lltype.free(r1, flavor='raw')
 
-    # def test_simple_cycle_free(self):
-    #     self.gc.rawrefcount_init(lambda: self.trigger.append(1))
-    #     r1 = self._rawrefcount_cycle_obj()
-    #     r2 = self._rawrefcount_cycle_obj()
-    #     r1.next = r2
-    #     r2.next = r1
-    #     self._rawrefcount_buffer_obj(r1)
-    #     self.gc.rrc_collect_cycles()
-    #     assert r1.base.c_ob_refcnt & REFCNT_MASK == 0
-    #     assert r2.base.c_ob_refcnt & REFCNT_MASK == 0
-    #
-    # def test_simple_cycle_not_free(self):
-    #     self.gc.rawrefcount_init(lambda: self.trigger.append(1))
-    #     r1 = self._rawrefcount_cycle_obj()
-    #     r2 = self._rawrefcount_cycle_obj()
-    #     r1.next = r2
-    #     r2.next = r1
-    #     r2.base.c_ob_refcnt += 1
-    #     self._rawrefcount_buffer_obj(r1)
-    #     self.gc.rrc_collect_cycles()
-    #     assert r1.base.c_ob_refcnt & REFCNT_MASK == 1
-    #     assert r2.base.c_ob_refcnt & REFCNT_MASK == 2
-    #
-    # def test_complex_cycle_free(self):
-    #     self.gc.rawrefcount_init(lambda: self.trigger.append(1))
-    #     r1 = self._rawrefcount_cycle_obj()
-    #     r2 = self._rawrefcount_cycle_obj()
-    #     r3 = self._rawrefcount_cycle_obj()
-    #     r1.next = r2
-    #     r1.prev = r2
-    #     r2.base.c_ob_refcnt += 1
-    #     r2.next = r3
-    #     r3.prev = r1
-    #     self._rawrefcount_buffer_obj(r1)
-    #     self.gc.rrc_collect_cycles()
-    #     assert r1.base.c_ob_refcnt & REFCNT_MASK == 0
-    #     assert r2.base.c_ob_refcnt & REFCNT_MASK == 0
-    #     assert r3.base.c_ob_refcnt & REFCNT_MASK == 0
-    #
-    # def test_complex_cycle_not_free(self):
-    #     self.gc.rawrefcount_init(lambda: self.trigger.append(1))
-    #     r1 = self._rawrefcount_cycle_obj()
-    #     r2 = self._rawrefcount_cycle_obj()
-    #     r3 = self._rawrefcount_cycle_obj()
-    #     r1.next = r2
-    #     r1.prev = r2
-    #     r2.base.c_ob_refcnt += 1
-    #     r2.next = r3
-    #     r3.prev = r1
-    #     r3.base.c_ob_refcnt += 1
-    #     self._rawrefcount_buffer_obj(r1)
-    #     self.gc.rrc_collect_cycles()
-    #     assert r1.base.c_ob_refcnt & REFCNT_MASK == 1
-    #     assert r2.base.c_ob_refcnt & REFCNT_MASK == 2
-    #     assert r3.base.c_ob_refcnt & REFCNT_MASK == 2
-    #
-    # def test_cycle_2_buffered_free(self):
-    #     self.gc.rawrefcount_init(lambda: self.trigger.append(1))
-    #     r1 = self._rawrefcount_cycle_obj()
-    #     r2 = self._rawrefcount_cycle_obj()
-    #     r1.next = r2
-    #     r2.prev = r1
-    #     self._rawrefcount_buffer_obj(r1)
-    #     self._rawrefcount_buffer_obj(r2)
-    #     self.gc.rrc_collect_cycles()
-    #     assert r1.base.c_ob_refcnt & REFCNT_MASK == 0
-    #     assert r2.base.c_ob_refcnt & REFCNT_MASK == 0
-    #
-    # def test_cycle_2_buffered_not_free(self):
-    #     self.gc.rawrefcount_init(lambda: self.trigger.append(1))
-    #     r1 = self._rawrefcount_cycle_obj()
-    #     r2 = self._rawrefcount_cycle_obj()
-    #     r1.next = r2
-    #     r2.prev = r1
-    #     r1.base.c_ob_refcnt += 1
-    #     self._rawrefcount_buffer_obj(r1)
-    #     self._rawrefcount_buffer_obj(r2)
-    #     self.gc.rrc_collect_cycles()
-    #     assert r1.base.c_ob_refcnt & REFCNT_MASK == 2
-    #     assert r2.base.c_ob_refcnt & REFCNT_MASK == 1
-    #
-    # def test_multiple_cycles_partial_free(self):
-    #     self.gc.rawrefcount_init(lambda: self.trigger.append(1))
-    #     r1 = self._rawrefcount_cycle_obj()
-    #     r2 = self._rawrefcount_cycle_obj()
-    #     r3 = self._rawrefcount_cycle_obj()
-    #     r4 = self._rawrefcount_cycle_obj()
-    #     r5 = self._rawrefcount_cycle_obj()
-    #     r1.next = r2
-    #     r2.next = r3
-    #     r3.next = r1
-    #     r2.prev = r5
-    #     r5.next = r4
-    #     r4.next = r5
-    #     r5.base.c_ob_refcnt += 1
-    #     r4.base.c_ob_refcnt += 1
-    #     self._rawrefcount_buffer_obj(r1)
-    #     self.gc.rrc_collect_cycles()
-    #     assert r1.base.c_ob_refcnt & REFCNT_MASK == 0
-    #     assert r2.base.c_ob_refcnt & REFCNT_MASK == 0
-    #     assert r3.base.c_ob_refcnt & REFCNT_MASK == 0
-    #     assert r4.base.c_ob_refcnt & REFCNT_MASK == 2
-    #     assert r5.base.c_ob_refcnt & REFCNT_MASK == 1
-    #
-    # def test_multiple_cycles_all_free(self):
-    #     self.gc.rawrefcount_init(lambda: self.trigger.append(1))
-    #     r1 = self._rawrefcount_cycle_obj()
-    #     r2 = self._rawrefcount_cycle_obj()
-    #     r3 = self._rawrefcount_cycle_obj()
-    #     r4 = self._rawrefcount_cycle_obj()
-    #     r5 = self._rawrefcount_cycle_obj()
-    #     r1.next = r2
-    #     r2.next = r3
-    #     r3.next = r1
-    #     r2.prev = r5
-    #     r5.next = r4
-    #     r4.next = r5
-    #     r5.base.c_ob_refcnt += 1
-    #     self._rawrefcount_buffer_obj(r1)
-    #     self.gc.rrc_collect_cycles()
-    #     assert r1.base.c_ob_refcnt & REFCNT_MASK == 0
-    #     assert r2.base.c_ob_refcnt & REFCNT_MASK == 0
-    #     assert r3.base.c_ob_refcnt & REFCNT_MASK == 0
-    #     assert r4.base.c_ob_refcnt & REFCNT_MASK == 0
-    #     assert r5.base.c_ob_refcnt & REFCNT_MASK == 0
+# TODO: pyobj_cycle_self_reference (without linked pypy object)
+# TODO: linked_cycle_simple
+# TODO: pyobj_cycle_simple
+# TODO: linked_cycle_complex
+# TODO: pyobj_cycle_complex
+# TODO: pyobj_cycle_dies_including_linked_pypy
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to