[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