Author: Armin Rigo <ar...@tunes.org> 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 pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit