[pypy-svn] r68263 - in pypy/branch/gc-compress/pypy/rpython: lltypesystem lltypesystem/test memory

arigo at codespeak.net arigo at codespeak.net
Fri Oct 9 10:05:00 CEST 2009


Author: arigo
Date: Fri Oct  9 10:04:58 2009
New Revision: 68263

Modified:
   pypy/branch/gc-compress/pypy/rpython/lltypesystem/llarena.py
   pypy/branch/gc-compress/pypy/rpython/lltypesystem/llmemory.py
   pypy/branch/gc-compress/pypy/rpython/lltypesystem/lltype.py
   pypy/branch/gc-compress/pypy/rpython/lltypesystem/test/test_llarena.py
   pypy/branch/gc-compress/pypy/rpython/memory/gcheader.py
Log:
Revert r68259 and r68260.  Does not seem to work...


Modified: pypy/branch/gc-compress/pypy/rpython/lltypesystem/llarena.py
==============================================================================
--- pypy/branch/gc-compress/pypy/rpython/lltypesystem/llarena.py	(original)
+++ pypy/branch/gc-compress/pypy/rpython/lltypesystem/llarena.py	Fri Oct  9 10:04:58 2009
@@ -103,48 +103,6 @@
         Arena.object_arena_location[container] = self, offset
         Arena.old_object_arena_location[container] = self, offset
 
-    def get_header_ofs(self, obj, oldheadersize):
-        headers = []
-        for offset, ptr in self.objectptrs.items():
-            size = self.objectsizes[offset]
-            if offset >= obj:      # object is at or after 'obj'
-                continue
-            if offset + size < obj:   # object is before the header
-                continue
-            headers.append(offset)
-        assert len(headers) >= 1, "header not found"
-        assert len(headers) == 1, "uh? multiple headers?"
-        offset = headers[0]
-        size = self.objectsizes[offset]
-        assert offset + size == obj + self.objectsizes[obj], "not a header?"
-        assert obj - offset == llmemory.raw_malloc_usage(oldheadersize)
-        return offset
-
-    def swap_header(self, startobj, oldheadersize, newheadersize):
-        prev_end = [0]
-        for offset, ptr in self.objectptrs.items():
-            size = self.objectsizes[offset]
-            if offset + size < startobj:
-                prev_end.append((offset + size))
-        prev_end = max(prev_end)
-        new_bytes = llmemory.raw_malloc_usage(newheadersize)
-        assert prev_end <= startobj - new_bytes, "new header too big"
-        old_offset = self.get_header_ofs(startobj, oldheadersize)
-        assert isinstance(newheadersize, llmemory.GCHeaderOffset)
-        obj = self.objectptrs[startobj]
-        oldheaderptr = self.objectptrs.pop(old_offset)
-        oldheadersize.gcheaderbuilder.detach_header(obj, oldheaderptr)
-        newheader = newheadersize.gcheaderbuilder.new_header(obj)
-        newheader = llmemory.cast_ptr_to_adr(newheader)
-        #
-        del self.objectsizes[old_offset]
-        self.setobject(newheader, startobj - new_bytes,
-                       new_bytes + self.objectsizes[startobj])
-        oldheaderobj = oldheaderptr._as_obj()
-        del Arena.object_arena_location[oldheaderobj]
-        oldheaderobj._free()
-
-
 class fakearenaaddress(llmemory.fakeaddress):
 
     def __init__(self, arena, offset):
@@ -351,13 +309,6 @@
     """
     return Arena(ptr.arena.nbytes, False).getaddr(0)
 
-def arena_swap_header(obj, oldheadersize, newheadersize):
-    """Free the old header attached to 'obj', and attach one
-    of the size 'newheadersize' instead."""
-    arena_addr = _getfakearenaaddress(obj)
-    arena_addr.arena.swap_header(arena_addr.offset, oldheadersize,
-                                 newheadersize)
-
 # ____________________________________________________________
 #
 # Translation support: the functions above turn into the code below.

Modified: pypy/branch/gc-compress/pypy/rpython/lltypesystem/llmemory.py
==============================================================================
--- pypy/branch/gc-compress/pypy/rpython/lltypesystem/llmemory.py	(original)
+++ pypy/branch/gc-compress/pypy/rpython/lltypesystem/llmemory.py	Fri Oct  9 10:04:58 2009
@@ -376,7 +376,9 @@
     # NOTE: the 'ptr' in the addresses must be normalized.
     # Use cast_ptr_to_adr() instead of directly fakeaddress() if unsure.
     def __init__(self, ptr):
-        self.ptr = ptr or None   # null ptr => None
+        if ptr is not None and ptr._obj0 is None:
+            ptr = None   # null ptr => None
+        self.ptr = ptr
 
     def __repr__(self):
         if self.ptr is None:
@@ -415,8 +417,8 @@
     def __eq__(self, other):
         if isinstance(other, fakeaddress):
             try:
-                obj1 = self.ptr
-                obj2 = other.ptr
+                obj1 = self._fixup().ptr
+                obj2 = other._fixup().ptr
                 if obj1 is not None: obj1 = obj1._obj
                 if obj2 is not None: obj2 = obj2._obj
                 return obj1 == obj2
@@ -455,8 +457,9 @@
         return self.ptr
 
     def _cast_to_ptr(self, EXPECTED_TYPE):
-        if self:
-            return cast_any_ptr(EXPECTED_TYPE, self.ptr)
+        addr = self._fixup()
+        if addr:
+            return cast_any_ptr(EXPECTED_TYPE, addr.ptr)
         else:
             return lltype.nullptr(EXPECTED_TYPE.TO)
 
@@ -466,6 +469,14 @@
         else:
             return 0
 
+    def _fixup(self):
+        if self.ptr is not None and self.ptr._was_freed():
+            # hack to support llarena.test_replace_object_with_stub()
+            from pypy.rpython.lltypesystem import llarena
+            return llarena._getfakearenaaddress(self)
+        else:
+            return self
+
 # ____________________________________________________________
 
 class NullAddressError(Exception):

Modified: pypy/branch/gc-compress/pypy/rpython/lltypesystem/lltype.py
==============================================================================
--- pypy/branch/gc-compress/pypy/rpython/lltypesystem/lltype.py	(original)
+++ pypy/branch/gc-compress/pypy/rpython/lltypesystem/lltype.py	Fri Oct  9 10:04:58 2009
@@ -1194,6 +1194,10 @@
         from pypy.rpython.lltypesystem import llmemory
         if isinstance(self._T, FuncType):
             return llmemory.fakeaddress(self)
+        elif self._was_freed():
+            # hack to support llarena.test_replace_object_with_stub()
+            from pypy.rpython.lltypesystem import llarena
+            return llarena._oldobj_to_address(self._getobj(check=False))
         elif isinstance(self._obj, _subarray):
             return llmemory.fakeaddress(self)
 ##            # return an address built as an offset in the whole array

Modified: pypy/branch/gc-compress/pypy/rpython/lltypesystem/test/test_llarena.py
==============================================================================
--- pypy/branch/gc-compress/pypy/rpython/lltypesystem/test/test_llarena.py	(original)
+++ pypy/branch/gc-compress/pypy/rpython/lltypesystem/test/test_llarena.py	Fri Oct  9 10:04:58 2009
@@ -5,7 +5,6 @@
 from pypy.rpython.lltypesystem.llarena import arena_reserve, arena_free
 from pypy.rpython.lltypesystem.llarena import round_up_for_allocation
 from pypy.rpython.lltypesystem.llarena import ArenaError, arena_new_view
-from pypy.rpython.lltypesystem.llarena import arena_swap_header
 
 def test_arena():
     S = lltype.Struct('S', ('x',lltype.Signed))
@@ -218,15 +217,13 @@
     assert llmemory.cast_adr_to_int(a) == llmemory.cast_adr_to_int(a1)
     assert llmemory.cast_adr_to_int(a+1) == llmemory.cast_adr_to_int(a1) + 1
 
-def test_replace_object_header():
+def test_replace_object_with_stub():
     from pypy.rpython.memory.gcheader import GCHeaderBuilder
     HDR = lltype.Struct('HDR', ('x', lltype.Signed))
-    STUB = lltype.Struct('STUB', ('t', lltype.Char))
     S = lltype.GcStruct('S', ('y', lltype.Signed), ('z', lltype.Signed))
+    STUB = lltype.GcStruct('STUB', ('t', lltype.Char))
     gcheaderbuilder = GCHeaderBuilder(HDR)
     size_gc_header = gcheaderbuilder.size_gc_header
-    gcstubbuilder = GCHeaderBuilder(STUB)
-    size_stub = gcstubbuilder.size_gc_header
     ssize = llmemory.raw_malloc_usage(llmemory.sizeof(S))
 
     a = arena_malloc(13*ssize, True)
@@ -234,28 +231,31 @@
     arena_reserve(hdraddr, size_gc_header + llmemory.sizeof(S))
     hdr = llmemory.cast_adr_to_ptr(hdraddr, lltype.Ptr(HDR))
     hdr.x = 42
-    objaddr = hdraddr + size_gc_header
-    obj = llmemory.cast_adr_to_ptr(objaddr, lltype.Ptr(S))
+    obj = llmemory.cast_adr_to_ptr(hdraddr + size_gc_header, lltype.Ptr(S))
     obj.y = -5
     obj.z = -6
 
-    arena_swap_header(objaddr, size_gc_header, size_stub)
-    assert obj.y == -5
-    assert obj.z == -6
-    stubaddr = objaddr - size_stub
-    stub = llmemory.cast_adr_to_ptr(stubaddr, lltype.Ptr(STUB))
-    stub.t = 'A'
-    py.test.raises(RuntimeError, "hdr.x")
-    py.test.raises(KeyError, "objaddr - size_gc_header")
-
-    arena_swap_header(objaddr, size_stub, size_gc_header)
-    hdr2addr = objaddr - size_gc_header
-    hdr2 = llmemory.cast_adr_to_ptr(hdr2addr, lltype.Ptr(HDR))
-    hdr2.x = 42
-    assert obj.y == -5
-    assert obj.z == -6
-    py.test.raises(RuntimeError, "stub.t")
-    py.test.raises(KeyError, "objaddr - size_stub")
+    hdraddr = llmemory.cast_ptr_to_adr(obj) - size_gc_header
+    arena_reset(hdraddr, size_gc_header + llmemory.sizeof(S), False)
+    arena_reserve(hdraddr, size_gc_header + llmemory.sizeof(STUB))
+
+    # check that it possible to reach the newly reserved HDR+STUB
+    # via the header of the old 'obj' pointer, both via the existing
+    # 'hdraddr':
+    hdr = llmemory.cast_adr_to_ptr(hdraddr, lltype.Ptr(HDR))
+    hdr.x = 46
+    stub = llmemory.cast_adr_to_ptr(hdraddr + size_gc_header, lltype.Ptr(STUB))
+    stub.t = '!'
+
+    # and via a (now-invalid) pointer to the old 'obj': (this is needed
+    # because during a garbage collection there are still pointers to
+    # the old 'obj' around to be fixed)
+    hdraddr = llmemory.cast_ptr_to_adr(obj) - size_gc_header
+    hdr = llmemory.cast_adr_to_ptr(hdraddr, lltype.Ptr(HDR))
+    assert hdr.x == 46
+    stub = llmemory.cast_adr_to_ptr(hdraddr + size_gc_header,
+                                    lltype.Ptr(STUB))
+    assert stub.t == '!'
 
 
 def test_llinterpreted():

Modified: pypy/branch/gc-compress/pypy/rpython/memory/gcheader.py
==============================================================================
--- pypy/branch/gc-compress/pypy/rpython/memory/gcheader.py	(original)
+++ pypy/branch/gc-compress/pypy/rpython/memory/gcheader.py	Fri Oct  9 10:04:58 2009
@@ -16,17 +16,17 @@
 
     def header_of_object(self, gcptr):
         # XXX hackhackhack
-        gcptr = gcptr._as_obj()
+        gcptr = gcptr._as_obj(check=False)
         if isinstance(gcptr, llmemory._gctransformed_wref):
-            return self.obj2header[gcptr._ptr._as_obj()]
+            return self.obj2header[gcptr._ptr._as_obj(check=False)]
         return self.obj2header[gcptr]
 
     def object_from_header(headerptr):
-        return header2obj[headerptr._as_obj()]
+        return header2obj[headerptr._as_obj(check=False)]
     object_from_header = staticmethod(object_from_header)
 
     def get_header(self, gcptr):
-        return self.obj2header.get(gcptr._as_obj(), None)
+        return self.obj2header.get(gcptr._as_obj(check=False), None)
 
     def attach_header(self, gcptr, headerptr):
         gcobj = gcptr._as_obj()
@@ -38,12 +38,6 @@
         self.obj2header[gcobj] = headerptr
         header2obj[headerptr._obj] = gcptr._as_ptr()
 
-    def detach_header(self, gcptr, headerptr):
-        gcobj = gcptr._as_obj()
-        assert self.obj2header[gcobj] == headerptr
-        del self.obj2header[gcobj]
-        del header2obj[headerptr._obj]
-
     def new_header(self, gcptr):
         headerptr = lltype.malloc(self.HDR, immortal=True)
         self.attach_header(gcptr, headerptr)



More information about the Pypy-commit mailing list