[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