Author: Armin Rigo <[email protected]>
Branch:
Changeset: r65768:a89ed91dc553
Date: 2013-07-29 10:28 +0200
http://bitbucket.org/pypy/pypy/changeset/a89ed91dc553/
Log: Fix 74ec2abeb333: in particular, the line
if infobits | T_HAS_GCPTR_IN_VARSIZE...
is equivalent to "if True", so the shortcut was never taken.
diff --git a/rpython/memory/gc/minimark.py b/rpython/memory/gc/minimark.py
--- a/rpython/memory/gc/minimark.py
+++ b/rpython/memory/gc/minimark.py
@@ -991,9 +991,12 @@
# after a minor or major collection, no object should be in the nursery
ll_assert(not self.is_in_nursery(obj),
"object in nursery after collection")
- # similarily, all objects should have this flag:
- ll_assert(self.header(obj).tid & GCFLAG_TRACK_YOUNG_PTRS != 0,
- "missing GCFLAG_TRACK_YOUNG_PTRS")
+ # similarily, all objects should have this flag, except if they
+ # don't have any GC pointer
+ typeid = self.get_type_id(obj)
+ if self.has_gcptr(typeid):
+ ll_assert(self.header(obj).tid & GCFLAG_TRACK_YOUNG_PTRS != 0,
+ "missing GCFLAG_TRACK_YOUNG_PTRS")
# the GCFLAG_VISITED should not be set between collections
ll_assert(self.header(obj).tid & GCFLAG_VISITED == 0,
"unexpected GCFLAG_VISITED")
diff --git a/rpython/memory/gctypelayout.py b/rpython/memory/gctypelayout.py
--- a/rpython/memory/gctypelayout.py
+++ b/rpython/memory/gctypelayout.py
@@ -203,6 +203,8 @@
offsets = offsets_to_gc_pointers(TYPE)
infobits = index
info.ofstoptrs = builder.offsets2table(offsets, TYPE)
+ if len(offsets) > 0:
+ infobits |= T_HAS_GCPTR
#
fptrs = builder.special_funcptr_for_type(TYPE)
if fptrs:
@@ -216,7 +218,7 @@
infobits |= T_HAS_FINALIZER | T_HAS_LIGHTWEIGHT_FINALIZER
if "custom_trace" in fptrs:
extra.customtracer = fptrs["custom_trace"]
- infobits |= T_HAS_CUSTOM_TRACE
+ infobits |= T_HAS_CUSTOM_TRACE | T_HAS_GCPTR
info.extra = extra
#
if not TYPE._is_varsize():
@@ -249,15 +251,13 @@
else:
offsets = ()
if len(offsets) > 0:
- infobits |= T_HAS_GCPTR_IN_VARSIZE
+ infobits |= T_HAS_GCPTR_IN_VARSIZE | T_HAS_GCPTR
varinfo.varofstoptrs = builder.offsets2table(offsets, ARRAY.OF)
varinfo.varitemsize = llmemory.sizeof(ARRAY.OF)
if builder.is_weakref_type(TYPE):
infobits |= T_IS_WEAKREF
if is_subclass_of_object(TYPE):
infobits |= T_IS_RPYTHON_INSTANCE
- if infobits | T_HAS_GCPTR_IN_VARSIZE or offsets:
- infobits |= T_HAS_GCPTR
info.infobits = infobits | T_KEY_VALUE
# ____________________________________________________________
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit