[pypy-commit] pypy default: Small tweaks and documentation for issue2752
arigo
pypy.commits at gmail.com
Sat Apr 14 17:20:50 EDT 2018
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r94331:f154dd05a3a5
Date: 2018-04-14 23:13 +0200
http://bitbucket.org/pypy/pypy/changeset/f154dd05a3a5/
Log: Small tweaks and documentation for issue2752
diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst
--- a/pypy/doc/whatsnew-head.rst
+++ b/pypy/doc/whatsnew-head.rst
@@ -6,3 +6,7 @@
.. startrev: f22145c34985
+.. branch: issue2752
+
+Fix a rare GC bug that was introduced more than one year ago, but was
+not diagnosed before issue #2752.
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
@@ -731,14 +731,11 @@
def move_out_of_nursery(self, obj):
# called twice, it should return the same shadow object,
- # and not creating another shadow object
- if self.header(obj).tid & GCFLAG_HAS_SHADOW:
- shadow = self.nursery_objects_shadows.get(obj)
- ll_assert(shadow != llmemory.NULL,
- "GCFLAG_HAS_SHADOW but no shadow found")
- else:
- shadow = self._allocate_shadow(obj)
-
+ # and not creating another shadow object. As a safety feature,
+ # when called on a non-nursery object, do nothing.
+ if not self.is_in_nursery(obj):
+ return obj
+ shadow = self._find_shadow(obj)
if (self.header(obj).tid & GCFLAG_SHADOW_INITIALIZED) == 0:
self.header(obj).tid |= GCFLAG_SHADOW_INITIALIZED
totalsize = self.get_size(obj)
@@ -2079,13 +2076,12 @@
ll_assert(newobj != llmemory.NULL, "GCFLAG_HAS_SHADOW but no shadow found")
newhdr = newobj - size_gc_header
#
- # Remove the flag GCFLAG_HAS_SHADOW, so that it doesn't get
- # copied to the shadow itself.
- self.header(obj).tid &= ~GCFLAG_HAS_SHADOW
+ # The flags GCFLAG_HAS_SHADOW and GCFLAG_SHADOW_INITIALIZED
+ # have no meaning in non-nursery objects. We don't need to
+ # remove them explicitly here before doing the copy.
tid = self.header(obj).tid
if (tid & GCFLAG_SHADOW_INITIALIZED) != 0:
copy = False
- self.header(obj).tid &= ~GCFLAG_SHADOW_INITIALIZED
#
totalsize = size_gc_header + self.get_size(obj)
self.nursery_surviving_size += raw_malloc_usage(totalsize)
More information about the pypy-commit
mailing list