Author: Armin Rigo <[email protected]>
Branch: concurrent-marksweep
Changeset: r47940:427dfd51ee6b
Date: 2011-10-11 16:32 +0200
http://bitbucket.org/pypy/pypy/changeset/427dfd51ee6b/
Log: Fixes, but always for test_transformed_gc
diff --git a/pypy/rpython/lltypesystem/llarena.py
b/pypy/rpython/lltypesystem/llarena.py
--- a/pypy/rpython/lltypesystem/llarena.py
+++ b/pypy/rpython/lltypesystem/llarena.py
@@ -97,11 +97,10 @@
zero = False
else:
raise ArenaError("new object overlaps a previous object")
- assert offset not in self.objectptrs
addr2 = size._raw_malloc([], zero=zero)
pattern = letter.upper() + letter*(bytes-1)
self.usagemap[offset:offset+bytes] = array.array('c', pattern)
- self.setobject(addr2, offset, bytes)
+ self.setobject(addr2, offset, bytes, hdrbytes > 0)
# in the common case where 'size' starts with a GCHeaderOffset,
# we also remember that the real object starts after the header.
if hdrbytes > 0:
@@ -110,10 +109,10 @@
self.setobject(objaddr, objoffset, bytes - hdrbytes)
return addr2
- def setobject(self, objaddr, offset, bytes):
+ def setobject(self, objaddr, offset, bytes, can_overwrite=False):
assert bytes > 0, ("llarena does not support GcStructs with no field"
" or empty arrays")
- assert offset not in self.objectptrs
+ assert (offset not in self.objectptrs) or can_overwrite
self.objectptrs[offset] = objaddr.ptr
self.objectsizes[offset] = bytes
container = objaddr.ptr._obj
@@ -165,7 +164,8 @@
except KeyError:
self.arena.check()
raise ArenaError("don't know yet what type of object "
- "is at offset %d" % (self.offset,))
+ "is in %s at offset %d" % (self.arena,
+ self.offset))
ptr = property(_getptr)
def __repr__(self):
@@ -323,6 +323,9 @@
def raw_memcopy(self, srcadr, dstadr):
self.basesize.raw_memcopy(srcadr, dstadr)
+ def __sub__(self, other):
+ return RoundedUpForAllocation(self.basesize - other, self.minsize)
+
# ____________________________________________________________
#
# Public interface: arena_malloc(), arena_free(), arena_reset()
diff --git a/pypy/rpython/lltypesystem/llmemory.py
b/pypy/rpython/lltypesystem/llmemory.py
--- a/pypy/rpython/lltypesystem/llmemory.py
+++ b/pypy/rpython/lltypesystem/llmemory.py
@@ -238,6 +238,10 @@
ofs.reverse()
return CompositeOffset(*ofs)
+ def __sub__(self, other):
+ assert other == self.offsets[0]
+ return CompositeOffset(*self.offsets[1:])
+
def known_nonneg(self):
for item in self.offsets:
if not item.known_nonneg():
diff --git a/pypy/rpython/lltypesystem/opimpl.py
b/pypy/rpython/lltypesystem/opimpl.py
--- a/pypy/rpython/lltypesystem/opimpl.py
+++ b/pypy/rpython/lltypesystem/opimpl.py
@@ -599,15 +599,22 @@
objaddr = llmemory.cast_ptr_to_adr(obj)
hdraddr = objaddr - size_gc_header
hdr = llmemory.cast_adr_to_ptr(hdraddr, lltype.Ptr(HDR))
- typeid = getattr(hdr, fieldname)
- if lltype.typeOf(typeid) == lltype.Signed:
+ if isinstance(fieldname, tuple):
from pypy.rpython.lltypesystem import llgroup
- if isinstance(typeid, llgroup.CombinedSymbolic):
- typeid = op_extract_ushort(typeid)
- elif isinstance(typeid, llgroup.HighCombinedSymbolic):
- typeid = op_extract_high_ushort(typeid)
- else:
- raise TypeError(typeid)
+ assert fieldname[1] == llgroup.HALFSHIFT # xxx for now
+ typeid = getattr(hdr, fieldname[0])
+ assert isinstance(typeid, llgroup.HighCombinedSymbolic)
+ typeid = op_extract_high_ushort(typeid)
+ else:
+ typeid = getattr(hdr, fieldname)
+ if lltype.typeOf(typeid) == lltype.Signed:
+ from pypy.rpython.lltypesystem import llgroup
+ if isinstance(typeid, llgroup.CombinedSymbolic):
+ typeid = op_extract_ushort(typeid)
+ elif isinstance(typeid, llgroup.HighCombinedSymbolic):
+ typeid = op_extract_high_ushort(typeid)
+ else:
+ raise TypeError(typeid)
return op_get_next_group_member(TYPE, grpptr, typeid, skipoffset)
op_gc_gettypeptr_group.need_result_type = True
diff --git a/pypy/rpython/memory/gc/concurrentms.py
b/pypy/rpython/memory/gc/concurrentms.py
--- a/pypy/rpython/memory/gc/concurrentms.py
+++ b/pypy/rpython/memory/gc/concurrentms.py
@@ -466,7 +466,6 @@
# address of the full object.
adr = llmemory.cast_ptr_to_adr(hdr)
adr = llarena.getfakearenaaddress(adr)
- llarena.arena_reset(adr, self.HDRSIZE, 0)
llarena.arena_reserve(adr, totalsize)
return adr + self.gcheaderbuilder.size_gc_header
grow_reservation._always_inline_ = True
@@ -732,6 +731,7 @@
llinterp.eval_graph(graph)
except Exception, e:
print 'Crash!', e.__class__.__name__, e
+ #import pdb; pdb.post_mortem(sys.exc_info()[2])
self._exc_info = sys.exc_info()
def collector_run(self):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit