Author: Armin Rigo <ar...@tunes.org> Branch: release-5.x Changeset: r83119:fd7f20eabad9 Date: 2016-03-12 20:24 +0100 http://bitbucket.org/pypy/pypy/changeset/fd7f20eabad9/
Log: Test and fix: if we use create_link_pypy() on *non-nursery* young objects, crash 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 @@ -1654,15 +1654,15 @@ else: self.nursery_objects_shadows.clear() # + # visit the P and O lists from rawrefcount, if enabled. + if self.rrc_enabled: + self.rrc_minor_collection_free() + # # Walk the list of young raw-malloced objects, and either free # them or make them old. if self.young_rawmalloced_objects: self.free_young_rawmalloced_objects() # - # visit the P and O lists from rawrefcount, if enabled. - if self.rrc_enabled: - self.rrc_minor_collection_free() - # # All live nursery objects are out of the nursery or pinned inside # the nursery. Create nursery barriers to protect the pinned objects, # fill the rest of the nursery with zeros and reset the current nursery 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 @@ -29,7 +29,8 @@ assert count2 - count1 == expected_trigger def _rawrefcount_pair(self, intval, is_light=False, is_pyobj=False, - create_old=False, create_immortal=False): + create_old=False, create_immortal=False, + force_external=False): if is_light: rc = REFCNT_FROM_PYPY_LIGHT else: @@ -40,7 +41,13 @@ if create_immortal: p1 = lltype.malloc(S, immortal=True) else: - p1 = self.malloc(S) + saved = self.gc.nonlarge_max + try: + if force_external: + self.gc.nonlarge_max = 1 + p1 = self.malloc(S) + finally: + self.gc.nonlarge_max = saved p1.x = intval if create_immortal: self.consider_constant(p1) @@ -220,9 +227,10 @@ def test_pypy_nonlight_dies_quickly_old(self): self.test_pypy_nonlight_dies_quickly(old=True) - def test_pyobject_pypy_link_dies_on_minor_collection(self): + @py.test.mark.parametrize('external', [False, True]) + def test_pyobject_pypy_link_dies_on_minor_collection(self, external): p1, p1ref, r1, r1addr, check_alive = ( - self._rawrefcount_pair(42, is_pyobj=True)) + self._rawrefcount_pair(42, is_pyobj=True, force_external=external)) check_alive(0) r1.ob_refcnt += 1 # the pyobject is kept alive self._collect(major=False) @@ -231,9 +239,12 @@ self.gc.check_no_more_rawrefcount_state() lltype.free(r1, flavor='raw') - def test_pyobject_dies(self, old=False): + @py.test.mark.parametrize('old,external', [ + (False, False), (True, False), (False, True)]) + def test_pyobject_dies(self, old, external): p1, p1ref, r1, r1addr, check_alive = ( - self._rawrefcount_pair(42, is_pyobj=True, create_old=old)) + self._rawrefcount_pair(42, is_pyobj=True, create_old=old, + force_external=external)) check_alive(0) if old: self._collect(major=False) @@ -247,9 +258,12 @@ self.gc.check_no_more_rawrefcount_state() lltype.free(r1, flavor='raw') - def test_pyobject_survives_from_obj(self, old=False): + @py.test.mark.parametrize('old,external', [ + (False, False), (True, False), (False, True)]) + def test_pyobject_survives_from_obj(self, old, external): p1, p1ref, r1, r1addr, check_alive = ( - self._rawrefcount_pair(42, is_pyobj=True, create_old=old)) + self._rawrefcount_pair(42, is_pyobj=True, create_old=old, + force_external=external)) check_alive(0) self.stackroots.append(p1) self._collect(major=False) @@ -269,11 +283,6 @@ self.gc.check_no_more_rawrefcount_state() lltype.free(r1, flavor='raw') - def test_pyobject_dies_old(self): - self.test_pyobject_dies(old=True) - def test_pyobject_survives_from_obj_old(self): - self.test_pyobject_survives_from_obj(old=True) - def test_pyobject_attached_to_prebuilt_obj(self): p1, p1ref, r1, r1addr, check_alive = ( self._rawrefcount_pair(42, create_immortal=True)) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit