[pypy-svn] r70871 - in pypy/branch/stringbuilder2/pypy/rpython: lltypesystem lltypesystem/test memory/gc memory/test

arigo at codespeak.net arigo at codespeak.net
Tue Jan 26 11:23:53 CET 2010


Author: arigo
Date: Tue Jan 26 11:23:53 2010
New Revision: 70871

Modified:
   pypy/branch/stringbuilder2/pypy/rpython/lltypesystem/llarena.py
   pypy/branch/stringbuilder2/pypy/rpython/lltypesystem/test/test_llarena.py
   pypy/branch/stringbuilder2/pypy/rpython/memory/gc/semispace.py
   pypy/branch/stringbuilder2/pypy/rpython/memory/test/test_gc.py
Log:
Fuh.  Fix test_shrink_array.


Modified: pypy/branch/stringbuilder2/pypy/rpython/lltypesystem/llarena.py
==============================================================================
--- pypy/branch/stringbuilder2/pypy/rpython/lltypesystem/llarena.py	(original)
+++ pypy/branch/stringbuilder2/pypy/rpython/lltypesystem/llarena.py	Tue Jan 26 11:23:53 2010
@@ -104,11 +104,17 @@
         Arena.old_object_arena_location[container] = self, offset
 
     def shrink_obj(self, offset, newsize):
-        assert offset in self.objectptrs
-        oldsize = self.objectsizes[offset]
-        assert newsize <= oldsize
-        self.objectsizes[offset] = newsize
-        for i in range(offset + newsize, offset + oldsize):
+        oldbytes = self.objectsizes[offset]
+        newbytes = llmemory.raw_malloc_usage(newsize)
+        assert newbytes <= oldbytes
+        # fix self.objectsizes
+        for i in range(newbytes):
+            adr = offset + i
+            if adr in self.objectsizes:
+                assert self.objectsizes[adr] == oldbytes - i
+                self.objectsizes[adr] = newbytes - i
+        # fix self.usagemap
+        for i in range(offset + newbytes, offset + oldbytes):
             assert self.usagemap[i] == 'x'
             self.usagemap[i] = '#'
 
@@ -319,8 +325,7 @@
     """ Mark object as shorter than it was
     """
     addr = _getfakearenaaddress(addr)
-    bytes = llmemory.raw_malloc_usage(newsize)
-    addr.arena.shrink_obj(addr.offset, bytes)
+    addr.arena.shrink_obj(addr.offset, newsize)
 
 def round_up_for_allocation(size, minsize=0):
     """Round up the size in order to preserve alignment of objects

Modified: pypy/branch/stringbuilder2/pypy/rpython/lltypesystem/test/test_llarena.py
==============================================================================
--- pypy/branch/stringbuilder2/pypy/rpython/lltypesystem/test/test_llarena.py	(original)
+++ pypy/branch/stringbuilder2/pypy/rpython/lltypesystem/test/test_llarena.py	Tue Jan 26 11:23:53 2010
@@ -271,11 +271,14 @@
     assert res == 42
 
 def test_shrink_obj():
-    S = lltype.Struct('S', ('x', lltype.Signed),
-                      ('a', lltype.Array(lltype.Signed)))
+    from pypy.rpython.memory.gcheader import GCHeaderBuilder
+    HDR = lltype.Struct('HDR', ('h', lltype.Signed))
+    gcheaderbuilder = GCHeaderBuilder(HDR)
+    size_gc_header = gcheaderbuilder.size_gc_header
+    S = lltype.GcStruct('S', ('x', lltype.Signed),
+                             ('a', lltype.Array(lltype.Signed)))
     myarenasize = 200
     a = arena_malloc(myarenasize, False)
-    arena_reserve(a, llmemory.sizeof(S, 10))
-    arena_shrink_obj(a, llmemory.sizeof(S, 5))
-    arena_reserve(a + llmemory.sizeof(S, 5), llmemory.sizeof(S, 10))
-    arena_reset(a, llmemory.sizeof(S, 5), False)
+    arena_reserve(a, size_gc_header + llmemory.sizeof(S, 10))
+    arena_shrink_obj(a, size_gc_header + llmemory.sizeof(S, 5))
+    arena_reset(a, size_gc_header + llmemory.sizeof(S, 5), False)

Modified: pypy/branch/stringbuilder2/pypy/rpython/memory/gc/semispace.py
==============================================================================
--- pypy/branch/stringbuilder2/pypy/rpython/memory/gc/semispace.py	(original)
+++ pypy/branch/stringbuilder2/pypy/rpython/memory/gc/semispace.py	Tue Jan 26 11:23:53 2010
@@ -119,11 +119,17 @@
         self.free = result + llarena.round_up_for_allocation(totalsize)
         return llmemory.cast_adr_to_ptr(result+size_gc_header, llmemory.GCREF)
 
-    def shrink_array(self, addr, smallersize):
-        if self._is_in_the_space(addr):
+    def shrink_array(self, addr, smallerlength):
+        size_gc_header = self.gcheaderbuilder.size_gc_header
+        if self._is_in_the_space(addr - size_gc_header):
             typeid = self.get_type_id(addr)
+            totalsmallersize = (
+                size_gc_header + self.fixed_size(typeid) +
+                self.varsize_item_sizes(typeid) * smallerlength)
+            llarena.arena_shrink_obj(addr - size_gc_header, totalsmallersize)
+            #
             offset_to_length = self.varsize_offset_to_length(typeid)
-            (addr + offset_to_length).signed[0] = smallersize
+            (addr + offset_to_length).signed[0] = smallerlength
             return True
         else:
             return False

Modified: pypy/branch/stringbuilder2/pypy/rpython/memory/test/test_gc.py
==============================================================================
--- pypy/branch/stringbuilder2/pypy/rpython/memory/test/test_gc.py	(original)
+++ pypy/branch/stringbuilder2/pypy/rpython/memory/test/test_gc.py	Tue Jan 26 11:23:53 2010
@@ -488,7 +488,11 @@
                     (ptr2.hash         << 24))
 
         assert self.interpret(f, [3, 0]) == 0x62024241
-        assert self.interpret(f, [12, 0]) == 0x62024241
+        # don't test with larger numbers of top of the Hybrid GC, because
+        # the default settings make it a too-large varsized object that
+        # gets allocated outside the semispace
+        if not isinstance(self, TestHybridGC):
+            assert self.interpret(f, [12, 0]) == 0x62024241
 
     def test_tagged_simple(self):
         from pypy.rlib.objectmodel import UnboxedValue



More information about the Pypy-commit mailing list