[pypy-svn] r71449 - in pypy/branch/gc-better-hash/pypy/rpython: lltypesystem memory/gc/test

arigo at codespeak.net arigo at codespeak.net
Wed Feb 24 16:49:36 CET 2010


Author: arigo
Date: Wed Feb 24 16:49:35 2010
New Revision: 71449

Modified:
   pypy/branch/gc-better-hash/pypy/rpython/lltypesystem/llarena.py
   pypy/branch/gc-better-hash/pypy/rpython/lltypesystem/llmemory.py
   pypy/branch/gc-better-hash/pypy/rpython/memory/gc/test/test_direct.py
Log:
A direct test about identityhash().


Modified: pypy/branch/gc-better-hash/pypy/rpython/lltypesystem/llarena.py
==============================================================================
--- pypy/branch/gc-better-hash/pypy/rpython/lltypesystem/llarena.py	(original)
+++ pypy/branch/gc-better-hash/pypy/rpython/lltypesystem/llarena.py	Wed Feb 24 16:49:35 2010
@@ -227,7 +227,7 @@
         return self.arena._getid() + self.offset
 
 
-def _getfakearenaaddress(addr):
+def getfakearenaaddress(addr):
     """Logic to handle test_replace_object_with_stub()."""
     if isinstance(addr, fakearenaaddress):
         return addr
@@ -306,7 +306,7 @@
       * 1: clear, optimized for a very large area of memory
       * 2: clear, optimized for a small or medium area of memory
     """
-    arena_addr = _getfakearenaaddress(arena_addr)
+    arena_addr = getfakearenaaddress(arena_addr)
     arena_addr.arena.reset(zero, arena_addr.offset, size)
 
 def arena_reserve(addr, size, check_alignment=True):
@@ -315,7 +315,7 @@
     overlap.  The size must be symbolic; in non-translated version
     this is used to know what type of lltype object to allocate."""
     from pypy.rpython.memory.lltypelayout import memory_alignment
-    addr = _getfakearenaaddress(addr)
+    addr = getfakearenaaddress(addr)
     if check_alignment and (addr.offset & (memory_alignment-1)) != 0:
         raise ArenaError("object at offset %d would not be correctly aligned"
                          % (addr.offset,))
@@ -324,7 +324,7 @@
 def arena_shrink_obj(addr, newsize):
     """ Mark object as shorter than it was
     """
-    addr = _getfakearenaaddress(addr)
+    addr = getfakearenaaddress(addr)
     addr.arena.shrink_obj(addr.offset, newsize)
 
 def round_up_for_allocation(size, minsize=0):
@@ -505,3 +505,11 @@
 register_external(arena_new_view, [llmemory.Address], llmemory.Address,
                   'll_arena.arena_new_view', llimpl=llimpl_arena_new_view,
                   llfakeimpl=arena_new_view, sandboxsafe=True)
+
+def llimpl_getfakearenaaddress(addr):
+    return addr
+register_external(getfakearenaaddress, [llmemory.Address], llmemory.Address,
+                  'll_arena.getfakearenaaddress',
+                  llimpl=llimpl_getfakearenaaddress,
+                  llfakeimpl=getfakearenaaddress,
+                  sandboxsafe=True)

Modified: pypy/branch/gc-better-hash/pypy/rpython/lltypesystem/llmemory.py
==============================================================================
--- pypy/branch/gc-better-hash/pypy/rpython/lltypesystem/llmemory.py	(original)
+++ pypy/branch/gc-better-hash/pypy/rpython/lltypesystem/llmemory.py	Wed Feb 24 16:49:35 2010
@@ -490,7 +490,7 @@
         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)
+            return llarena.getfakearenaaddress(self)
         else:
             return self
 

Modified: pypy/branch/gc-better-hash/pypy/rpython/memory/gc/test/test_direct.py
==============================================================================
--- pypy/branch/gc-better-hash/pypy/rpython/memory/gc/test/test_direct.py	(original)
+++ pypy/branch/gc-better-hash/pypy/rpython/memory/gc/test/test_direct.py	Wed Feb 24 16:49:35 2010
@@ -264,6 +264,51 @@
         self.gc.collect()
         verify()
 
+    def test_identityhash(self):
+        # a "does not crash" kind of test
+        p_const = lltype.malloc(S, immortal=True)
+        self.consider_constant(p_const)
+        # (1) p is in the nursery
+        self.gc.collect()
+        p = self.malloc(S)
+        hash = self.gc.identityhash(p)
+        print hash
+        assert isinstance(hash, (int, long))
+        assert hash == self.gc.identityhash(p)
+        self.stackroots.append(p)
+        for i in range(6):
+            self.gc.collect()
+            assert hash == self.gc.identityhash(self.stackroots[-1])
+        self.stackroots.pop()
+        # (2) p is an older object
+        p = self.malloc(S)
+        self.stackroots.append(p)
+        self.gc.collect()
+        hash = self.gc.identityhash(self.stackroots[-1])
+        print hash
+        assert isinstance(hash, (int, long))
+        for i in range(6):
+            self.gc.collect()
+            assert hash == self.gc.identityhash(self.stackroots[-1])
+        self.stackroots.pop()
+        # (3) p is a gen3 object (for hybrid)
+        p = self.malloc(S)
+        self.stackroots.append(p)
+        for i in range(6):
+            self.gc.collect()
+        hash = self.gc.identityhash(self.stackroots[-1])
+        print hash
+        assert isinstance(hash, (int, long))
+        for i in range(2):
+            self.gc.collect()
+            assert hash == self.gc.identityhash(self.stackroots[-1])
+        self.stackroots.pop()
+        # (4) p is a prebuilt object
+        hash = self.gc.identityhash(p_const)
+        print hash
+        assert isinstance(hash, (int, long))
+        assert hash == self.gc.identityhash(p_const)
+
 
 class TestSemiSpaceGC(DirectGCTest):
     from pypy.rpython.memory.gc.semispace import SemiSpaceGC as GCClass



More information about the Pypy-commit mailing list