[pypy-commit] pypy cpyext-gc-cycle: Fixed translation issues

stevie_92 pypy.commits at gmail.com
Wed Jan 16 17:49:03 EST 2019


Author: Stefan Beyer <home at sbeyer.at>
Branch: cpyext-gc-cycle
Changeset: r95663:1fdae7eeae56
Date: 2019-01-16 23:38 +0100
http://bitbucket.org/pypy/pypy/changeset/1fdae7eeae56/

Log:	Fixed translation issues

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
@@ -3296,17 +3296,12 @@
         pygchdr = self.rrc_pyobj_list.c_gc_next
         while pygchdr <> self.rrc_pyobj_list:
             pyobj = self.rrc_gc_as_pyobj(pygchdr)
-            self._rrc_visit_pyobj = self._rrc_subtract_internal_refcnt
-            self._rrc_traverse(pyobj)
+            self._rrc_traverse(pyobj, -1)
             pygchdr = pygchdr.c_gc_next
 
         # now all rawrefcounted roots or live border objects have a
         # refcount > 0
 
-    def _rrc_subtract_internal_refcnt(self, pyobj):
-        pygchdr = self.rrc_pyobj_as_gc(pyobj)
-        pygchdr.c_gc_refs -= 1
-
     def _rrc_obj_fix_refcnt(self, pyobject, ignore):
         intobj = self._pyobj(pyobject).c_ob_pypy_link
         obj = llmemory.cast_int_to_adr(intobj)
@@ -3358,10 +3353,11 @@
                     gchdr.c_gc_next = next
                     next.c_gc_prev = gchdr
                     # increment refcounts
-                    self._rrc_visit_pyobj = self._rrc_increment_refcnt
-                    self._rrc_traverse(pyobj)
+                    self._rrc_traverse(pyobj, 1)
                     # mark recursively, if it is a pypyobj
-                    if not obj is None:
+                    if pyobj.c_ob_pypy_link <> 0:
+                        intobj = pyobj.c_ob_pypy_link
+                        obj = llmemory.cast_int_to_adr(intobj)
                         self.objects_to_trace.append(obj)
                         self.visit_all_objects()
                     found_alive = True
@@ -3370,31 +3366,31 @@
         # now all rawrefcounted objects, which are alive, have a cyclic
         # refcount > 0 or are marked
 
-    def _rrc_increment_refcnt(self, pyobj):
-        pygchdr = self.rrc_pyobj_as_gc(pyobj)
-        pygchdr.c_gc_refs += 1
-
     def _rrc_visit(pyobj, self_ptr):
         from rpython.rtyper.annlowlevel import cast_adr_to_nongc_instance
         #
         self_adr = rffi.cast(llmemory.Address, self_ptr)
         self = cast_adr_to_nongc_instance(IncrementalMiniMarkGC, self_adr)
-        self._rrc_visit_pyobj(pyobj)
+        self._rrc_visit_action(pyobj, None)
         return rffi.cast(rffi.INT_real, 0)
 
-    def _rrc_traverse(self, pyobj):
+    def _rrc_visit_action(self, pyobj, ignore):
+        pygchdr = self.rrc_pyobj_as_gc(pyobj)
+        pygchdr.c_gc_refs += self.rrc_refcnt_add
+
+    def _rrc_traverse(self, pyobj, refcnt_add):
         from rpython.rlib.objectmodel import we_are_translated
         from rpython.rtyper.annlowlevel import (cast_nongc_instance_to_adr,
                                                 llhelper)
         #
+        self.rrc_refcnt_add = refcnt_add
         if we_are_translated():
             callback_ptr = llhelper(self.RAWREFCOUNT_VISIT,
                                     IncrementalMiniMarkGC._rrc_visit)
             self_ptr = rffi.cast(rffi.VOIDP, cast_nongc_instance_to_adr(self))
+            self.rrc_tp_traverse(pyobj, callback_ptr, self_ptr)
         else:
-            callback_ptr = self._rrc_visit_pyobj
-            self_ptr = None
-        self.rrc_tp_traverse(pyobj, callback_ptr, self_ptr)
+            self.rrc_tp_traverse(pyobj, self._rrc_visit_action, None)
 
     def _rrc_gc_list_init(self, pygclist):
         pygclist.c_gc_next = pygclist
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
@@ -31,7 +31,7 @@
         def rawrefcount_tp_traverse(obj, callback, args):
             refs = self.pyobj_refs[self.pyobjs.index(obj)]
             for ref in refs:
-                callback(ref)
+                callback(ref, args)
 
         def rawrefcount_gc_as_pyobj(gc):
             return self.pyobjs[self.gcobjs.index(gc)]
@@ -481,10 +481,9 @@
                 dests_by_source[source].append(dest.r)
         for source in dests_by_source:
             dests_target = dests_by_source[source]
-            def append(pyobj):
+            def append(pyobj, ignore):
                 dests_target.remove(pyobj)
-            self.gc._rrc_visit_pyobj = append
-            self.gc._rrc_traverse(source.r)
+            self.gc.rrc_tp_traverse(source.r, append, None)
             assert len(dests_target) == 0
 
         # do collection


More information about the pypy-commit mailing list