Author: Stefan Beyer <h...@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 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit