[pypy-svn] r24733 - in pypy/dist/pypy: annotation rpython rpython/lltypesystem rpython/lltypesystem/test rpython/memory

pedronis at codespeak.net pedronis at codespeak.net
Tue Mar 21 22:25:07 CET 2006


Author: pedronis
Date: Tue Mar 21 22:24:58 2006
New Revision: 24733

Modified:
   pypy/dist/pypy/annotation/builtin.py
   pypy/dist/pypy/rpython/llinterp.py
   pypy/dist/pypy/rpython/lltypesystem/llmemory.py
   pypy/dist/pypy/rpython/lltypesystem/lloperation.py
   pypy/dist/pypy/rpython/lltypesystem/test/test_llmemory.py
   pypy/dist/pypy/rpython/memory/lladdress.py
   pypy/dist/pypy/rpython/raddress.py
   pypy/dist/pypy/rpython/rbuiltin.py
Log:
cast_adr_to_int. proper hashing for addresses.



Modified: pypy/dist/pypy/annotation/builtin.py
==============================================================================
--- pypy/dist/pypy/annotation/builtin.py	(original)
+++ pypy/dist/pypy/annotation/builtin.py	Tue Mar 21 22:24:58 2006
@@ -322,6 +322,9 @@
     assert s_type.is_constant()
     return SomePtr(s_type.const)
 
+def llmemory_cast_adr_to_int(s):
+    return SomeInteger() # xxx
+
 def rstack_yield_current_frame_to_caller():
     return SomeExternalObject(pypy.rpython.rstack.frame_stack_top)
     
@@ -369,6 +372,7 @@
 BUILTIN_ANALYZERS[pypy.rpython.objectmodel.hint] = robjmodel_hint
 BUILTIN_ANALYZERS[pypy.rpython.lltypesystem.llmemory.cast_ptr_to_adr] = llmemory_cast_ptr_to_adr
 BUILTIN_ANALYZERS[pypy.rpython.lltypesystem.llmemory.cast_adr_to_ptr] = llmemory_cast_adr_to_ptr
+BUILTIN_ANALYZERS[pypy.rpython.lltypesystem.llmemory.cast_adr_to_int] = llmemory_cast_adr_to_int
 BUILTIN_ANALYZERS[pypy.rpython.rstack.yield_current_frame_to_caller] = (
     rstack_yield_current_frame_to_caller)
 

Modified: pypy/dist/pypy/rpython/llinterp.py
==============================================================================
--- pypy/dist/pypy/rpython/llinterp.py	(original)
+++ pypy/dist/pypy/rpython/llinterp.py	Tue Mar 21 22:24:58 2006
@@ -511,6 +511,10 @@
         assert checkadr(adr)
         return llmemory.cast_adr_to_ptr(adr, TYPE)
 
+    def op_cast_adr_to_int(self, adr):
+        assert checkadr(adr)
+        return llmemory.cast_adr_to_int(adr)
+
     def op_cast_int_to_float(self, i):
         assert type(i) is int
         return float(i)

Modified: pypy/dist/pypy/rpython/lltypesystem/llmemory.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/llmemory.py	(original)
+++ pypy/dist/pypy/rpython/lltypesystem/llmemory.py	Tue Mar 21 22:24:58 2006
@@ -154,6 +154,9 @@
     def _cast_to_ptr(self, EXPECTED_TYPE):
         return lltype.cast_pointer(EXPECTED_TYPE, self.get())
 
+    def _cast_to_int(self):
+        return self.get()._cast_to_int()
+
 # XXX the indexing in code like
 #     addr.signed[0] = v
 #     is just silly.  remove it.
@@ -202,3 +205,6 @@
 def cast_adr_to_ptr(adr, EXPECTED_TYPE):
     return adr._cast_to_ptr(EXPECTED_TYPE)
 
+def cast_adr_to_int(adr):
+    return adr._cast_to_int()
+

Modified: pypy/dist/pypy/rpython/lltypesystem/lloperation.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/lloperation.py	(original)
+++ pypy/dist/pypy/rpython/lltypesystem/lloperation.py	Tue Mar 21 22:24:58 2006
@@ -267,6 +267,7 @@
     'adr_ge':               LLOp(canfold=True),
     'cast_ptr_to_adr':      LLOp(canfold=True),
     'cast_adr_to_ptr':      LLOp(canfold=True),
+    'cast_adr_to_int':      LLOp(canfold=True),
 
     # __________ GC operations __________
 

Modified: pypy/dist/pypy/rpython/lltypesystem/test/test_llmemory.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/test/test_llmemory.py	(original)
+++ pypy/dist/pypy/rpython/lltypesystem/test/test_llmemory.py	Tue Mar 21 22:24:58 2006
@@ -80,3 +80,18 @@
         return s1 == s2
     res = interpret(f, [])
     assert res
+
+def test_cast_adr_to_int():
+    from pypy.rpython.memory.test.test_llinterpsim import interpret
+    from pypy.rpython.lltypesystem import lltype
+    S = lltype.GcStruct("S", ("x", lltype.Signed))
+    Sptr = lltype.Ptr(S)
+    def f():
+        s1 = lltype.malloc(S)
+        adr = cast_ptr_to_adr(s1)
+        i = cast_adr_to_int(adr)
+        i2 = lltype.cast_ptr_to_int(s1)
+        return i == i2
+    assert f()
+    res = interpret(f, [])
+    assert res

Modified: pypy/dist/pypy/rpython/memory/lladdress.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/lladdress.py	(original)
+++ pypy/dist/pypy/rpython/memory/lladdress.py	Tue Mar 21 22:24:58 2006
@@ -62,6 +62,9 @@
     def _cast_to_ptr(self, EXPECTED_TYPE):
         from pypy.rpython.memory.lltypesimulation import simulatorptr
         return simulatorptr(EXPECTED_TYPE, self)
+
+    def _cast_to_int(self):
+        return self.intaddress
     
 
 class _accessor(object):

Modified: pypy/dist/pypy/rpython/raddress.py
==============================================================================
--- pypy/dist/pypy/rpython/raddress.py	(original)
+++ pypy/dist/pypy/rpython/raddress.py	Tue Mar 21 22:24:58 2006
@@ -2,7 +2,7 @@
 from pypy.annotation.pairtype import pairtype
 from pypy.annotation import model as annmodel
 from pypy.rpython.memory.lladdress import NULL, address
-from pypy.rpython.lltypesystem.llmemory import Address
+from pypy.rpython.lltypesystem.llmemory import Address, cast_adr_to_int
 from pypy.rpython.rmodel import Repr, IntegerRepr
 from pypy.rpython.rptr import PtrRepr
 from pypy.rpython.lltypesystem import lltype
@@ -45,7 +45,7 @@
 
     def get_ll_hash_function(self):
         def ll_hash(addr1):
-            return 0 # XXX do better
+            return cast_adr_to_int(addr1)
         return ll_hash
 
 

Modified: pypy/dist/pypy/rpython/rbuiltin.py
==============================================================================
--- pypy/dist/pypy/rpython/rbuiltin.py	(original)
+++ pypy/dist/pypy/rpython/rbuiltin.py	Tue Mar 21 22:24:58 2006
@@ -485,6 +485,14 @@
     return hop.genop('cast_adr_to_ptr', [adr],
                      resulttype = TYPE.value)
 
+def rtype_cast_adr_to_int(hop):
+    assert isinstance(hop.args_r[0], raddress.AddressRepr)
+    adr, = hop.inputargs(hop.args_r[0])
+    hop.exception_cannot_occur()
+    return hop.genop('cast_adr_to_int', [adr],
+                     resulttype = lltype.Signed)
+
 BUILTIN_TYPER[llmemory.cast_ptr_to_adr] = rtype_cast_ptr_to_adr
 BUILTIN_TYPER[llmemory.cast_adr_to_ptr] = rtype_cast_adr_to_ptr
+BUILTIN_TYPER[llmemory.cast_adr_to_int] = rtype_cast_adr_to_int
 



More information about the Pypy-commit mailing list