[pypy-svn] r15723 - in pypy/dist/pypy/rpython/memory: . test

cfbolz at codespeak.net cfbolz at codespeak.net
Sat Aug 6 13:54:48 CEST 2005


Author: cfbolz
Date: Sat Aug  6 13:54:47 2005
New Revision: 15723

Modified:
   pypy/dist/pypy/rpython/memory/convertlltype.py
   pypy/dist/pypy/rpython/memory/test/test_convertlltype.py
Log:
added possiblity to convert function ptrs.


Modified: pypy/dist/pypy/rpython/memory/convertlltype.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/convertlltype.py	(original)
+++ pypy/dist/pypy/rpython/memory/convertlltype.py	Sat Aug  6 13:54:47 2005
@@ -1,12 +1,16 @@
+import autopath
 from pypy.rpython.memory import lladdress
 from pypy.rpython.memory.lltypesimulation import simulatorptr, get_total_size
 from pypy.rpython.memory.lltypesimulation import get_fixed_size
 from pypy.rpython.memory.lltypesimulation import get_variable_size
 from pypy.rpython.memory.lltypesimulation import primitive_to_fmt
 from pypy.rpython.memory.lltypesimulation import get_layout
-from pypy.objspace.flow.model import traverse, Link, Constant, SpaceOperation
+from pypy.objspace.flow.model import traverse, Link, Constant, Block
+from pypy.objspace.flow.model import Constant
 from pypy.rpython import lltype
 
+import struct
+
 class LLTypeConverter(object):
     def __init__(self, address):
         self.converted = {}
@@ -24,8 +28,14 @@
             return self.convert_struct(val_or_ptr, inline_to_addr)
         elif isinstance(TYPE, lltype.Ptr):
             return self.convert_pointer(val_or_ptr, inline_to_addr)
+        elif isinstance(TYPE, lltype.OpaqueType):
+            return self.convert_object(val_or_ptr, inline_to_addr)
+        elif isinstance(TYPE, lltype.FuncType):
+            return self.convert_object(val_or_ptr, inline_to_addr)
+        elif isinstance(TYPE, lltype.PyObjectType):
+            return self.convert_object(val_or_ptr, inline_to_addr)
         else:
-            assert 0, "not yet implemented"
+            assert 0, "don't know about %s" % (val_or_ptr, )
 
     def convert_array(self, _array, inline_to_addr):
         if _array in self.converted:
@@ -82,3 +92,14 @@
         if inline_to_addr is not None:
             inline_to_addr.address[0] = addr
         return simulatorptr(TYPE, addr)
+
+    def convert_object(self, _obj, inline_to_addr):
+        if inline_to_addr is not None:
+            inline_to_addr.attached[0] = _obj
+            return inline_to_addr
+        else:
+            addr = self.curraddress
+            addr.attached[0] = _obj
+            self.curraddress += struct.calcsize("i")
+            return addr
+

Modified: pypy/dist/pypy/rpython/memory/test/test_convertlltype.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/test/test_convertlltype.py	(original)
+++ pypy/dist/pypy/rpython/memory/test/test_convertlltype.py	Sat Aug  6 13:54:47 2005
@@ -107,3 +107,14 @@
     llptr = lltype.nullptr(S)
     s = cvter.convert(llptr)
     assert not s
+
+def test_funcptr():
+    def f(x, y):
+        return x + y
+    F = lltype.FuncType((lltype.Signed, lltype.Signed), lltype.Signed)
+    llfuncptr = lltype.functionptr(F, "add", _callable=f)
+    assert llfuncptr(1, 2) == 3
+    cvter = LLTypeConverter(lladdress.raw_malloc(10))
+    fpter = cvter.convert(llfuncptr)
+    assert fpter(1, 2) == 3
+



More information about the Pypy-commit mailing list