[pypy-svn] r49983 - in pypy/dist/pypy/translator/llvm: . test

arigo at codespeak.net arigo at codespeak.net
Fri Dec 21 14:56:03 CET 2007


Author: arigo
Date: Fri Dec 21 14:55:57 2007
New Revision: 49983

Modified:
   pypy/dist/pypy/translator/llvm/opwriter.py
   pypy/dist/pypy/translator/llvm/test/test_lladdresses.py
Log:
Support for cast_int_to_adr and back.


Modified: pypy/dist/pypy/translator/llvm/opwriter.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/opwriter.py	(original)
+++ pypy/dist/pypy/translator/llvm/opwriter.py	Fri Dec 21 14:55:57 2007
@@ -133,8 +133,10 @@
             self.shiftop(opr)
 
         elif op.opname.startswith('cast_') or op.opname.startswith('truncate_'):
-            if op.opname == "cast_ptr_to_int":
+            if op.opname in ("cast_ptr_to_int", "cast_adr_to_int"):
                 self.cast_ptr_to_int(opr)
+            elif op.opname in ("cast_int_to_ptr", "cast_int_to_adr"):
+                self.cast_int_to_ptr(opr)
             else:
                 self.cast_primitive(opr)
         else:
@@ -265,7 +267,11 @@
     def cast_ptr_to_int(self, opr):
         self.codewriter.cast(opr.retref, opr.argtypes[0],
                              opr.argrefs[0], opr.rettype, 'ptrtoint')
-        
+
+    def cast_int_to_ptr(self, opr):
+        self.codewriter.cast(opr.retref, opr.argtypes[0],
+                             opr.argrefs[0], opr.rettype, 'inttoptr')
+
     def int_is_true(self, opr):
         self.codewriter.binaryop("icmp ne", opr.retref, opr.argtypes[0],
                                  opr.argrefs[0], "0")

Modified: pypy/dist/pypy/translator/llvm/test/test_lladdresses.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/test/test_lladdresses.py	(original)
+++ pypy/dist/pypy/translator/llvm/test/test_lladdresses.py	Fri Dec 21 14:55:57 2007
@@ -154,5 +154,17 @@
         return s1.x + s1.y
     
     fn = compile_function(f, [])
-    assert f() == 579
+    assert fn() == 579
     
+def test_cast_to_int():
+    S1 = lltype.GcStruct("S1", ("x", lltype.Signed), ("y", lltype.Signed))
+    s1 = lltype.malloc(S1, zero=True)
+    def f():
+        a1 = llmemory.cast_ptr_to_adr(s1)
+        i1 = llmemory.cast_adr_to_int(a1)
+        a2 = llmemory.cast_int_to_adr(i1)
+        s2 = llmemory.cast_adr_to_ptr(a2, lltype.Ptr(S1))
+        return int(s1 == s2)
+
+    fn = compile_function(f, [])
+    assert fn() == 1



More information about the Pypy-commit mailing list