[pypy-commit] pypy cpyext-gc-cycle: Fixed untracked objects in rawrefcount tests

stevie_92 pypy.commits at gmail.com
Fri May 17 03:18:48 EDT 2019


Author: Stefan Beyer <home at sbeyer.at>
Branch: cpyext-gc-cycle
Changeset: r96630:1c39776f6612
Date: 2019-05-16 17:09 +0200
http://bitbucket.org/pypy/pypy/changeset/1c39776f6612/

Log:	Fixed untracked objects in rawrefcount tests

diff --git a/rpython/memory/gc/incminimark.py b/rpython/memory/gc/incminimark.py
--- a/rpython/memory/gc/incminimark.py
+++ b/rpython/memory/gc/incminimark.py
@@ -3448,11 +3448,11 @@
         if use_cylicrefcnt:
             pygchdr = self.rrc_pyobj_as_gc(pyobj)
             if pygchdr != lltype.nullptr(self.PYOBJ_GC_HDR):
-                #if pygchdr.c_gc_refs != self.RAWREFCOUNT_REFS_UNTRACKED:
-                rc = pygchdr.c_gc_refs >> self.RAWREFCOUNT_REFS_SHIFT
-                cyclic_rc = rc
-                #else:
-                #    rc = pyobj.c_ob_refcnt
+                if pygchdr.c_gc_refs != self.RAWREFCOUNT_REFS_UNTRACKED:
+                    rc = pygchdr.c_gc_refs >> self.RAWREFCOUNT_REFS_SHIFT
+                    cyclic_rc = rc
+                else:
+                    rc = pyobj.c_ob_refcnt
             else:
                 rc = pyobj.c_ob_refcnt
         else:
@@ -3595,18 +3595,18 @@
         obj = llmemory.cast_int_to_adr(intobj)
         gchdr = self.rrc_pyobj_as_gc(pyobj)
         if gchdr <> lltype.nullptr(self.PYOBJ_GC_HDR):
-            #if gchdr.c_gc_refs == self.RAWREFCOUNT_REFS_UNTRACKED:
-            #    debug_print("gc obj not tracked", gchdr, ": obj", obj)
-            #else:
-            refcnt = pyobj.c_ob_refcnt
-            if refcnt >= REFCNT_FROM_PYPY_LIGHT:
-                refcnt -= REFCNT_FROM_PYPY_LIGHT
-            elif refcnt >= REFCNT_FROM_PYPY:
-                refcnt -= REFCNT_FROM_PYPY
-            if self.header(obj).tid & (GCFLAG_VISITED |
-                                       GCFLAG_NO_HEAP_PTRS):
-                refcnt += 1
-            self._rrc_pyobj_gc_refcnt_set(gchdr, refcnt)
+            if gchdr.c_gc_refs == self.RAWREFCOUNT_REFS_UNTRACKED:
+                debug_print("gc obj not tracked", gchdr, ": obj", obj)
+            else:
+                refcnt = pyobj.c_ob_refcnt
+                if refcnt >= REFCNT_FROM_PYPY_LIGHT:
+                    refcnt -= REFCNT_FROM_PYPY_LIGHT
+                elif refcnt >= REFCNT_FROM_PYPY:
+                    refcnt -= REFCNT_FROM_PYPY
+                if self.header(obj).tid & (GCFLAG_VISITED |
+                                           GCFLAG_NO_HEAP_PTRS):
+                    refcnt += 1
+                self._rrc_pyobj_gc_refcnt_set(gchdr, refcnt)
 
     def _rrc_mark_rawrefcount(self):
         if self._rrc_gc_list_is_empty(self.rrc_pyobj_list):
@@ -3779,8 +3779,9 @@
     def _rrc_visit_action(self, pyobj, ignore):
         pygchdr = self.rrc_pyobj_as_gc(pyobj)
         if pygchdr <> lltype.nullptr(self.PYOBJ_GC_HDR):
-            pygchdr.c_gc_refs += self.rrc_refcnt_add << \
-                                 self.RAWREFCOUNT_REFS_SHIFT
+            if pygchdr.c_gc_refs != self.RAWREFCOUNT_REFS_UNTRACKED:
+                pygchdr.c_gc_refs += self.rrc_refcnt_add << \
+                                     self.RAWREFCOUNT_REFS_SHIFT
 
     def _rrc_traverse(self, pyobj, refcnt_add):
         from rpython.rlib.objectmodel import we_are_translated
diff --git a/rpython/memory/gc/test/dot/free_cpython_untracked_1.dot b/rpython/memory/gc/test/dot/free_cpython_untracked_1.dot
--- a/rpython/memory/gc/test/dot/free_cpython_untracked_1.dot
+++ b/rpython/memory/gc/test/dot/free_cpython_untracked_1.dot
@@ -1,8 +1,8 @@
 digraph G {
     "a" [type=C, alive=n];
-    "b" [type=C, alive=n, tracked=n];
-    "c" [type=C, alive=n];
+    "b" [type=C, alive=n];
+    "c" [type=C, alive=n, tracked=n];
     "a" -> "b";
-    "b" -> "c";
-    "c" -> "a"
+    "b" -> "a";
+    "b" -> "c"
 }
diff --git a/rpython/memory/gc/test/dot/keep_cpython_untracked_1.dot b/rpython/memory/gc/test/dot/keep_cpython_untracked_1.dot
--- a/rpython/memory/gc/test/dot/keep_cpython_untracked_1.dot
+++ b/rpython/memory/gc/test/dot/keep_cpython_untracked_1.dot
@@ -1,8 +1,8 @@
 digraph G {
     "a" [type=C, alive=y, ext_refcnt=1];
-    "b" [type=C, alive=y, tracked=n];
-    "c" [type=C, alive=y];
+    "b" [type=C, alive=y];
+    "c" [type=C, alive=y, tracked=n];
     "a" -> "b";
+    "b" -> "a";
     "b" -> "c";
-    "c" -> "a";
 }
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
@@ -660,9 +660,10 @@
                     finalize_modern(pyobj)
                 if pyobj.c_ob_refcnt == 0:
                     gchdr = self.gc.rrc_pyobj_as_gc(pyobj)
-                    next = gchdr.c_gc_next
-                    next.c_gc_prev = gchdr.c_gc_prev
-                    gchdr.c_gc_prev.c_gc_next = next
+                    if gchdr.c_gc_refs != RAWREFCOUNT_REFS_UNTRACKED:
+                        next = gchdr.c_gc_next
+                        next.c_gc_prev = gchdr.c_gc_prev
+                        gchdr.c_gc_prev.c_gc_next = next
                     decref_children(pyobj)
                     self.pyobjs[self.pyobjs.index(pyobj)] = \
                         lltype.nullptr(PYOBJ_HDR_PTR.TO)


More information about the pypy-commit mailing list