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

Reply via email to