[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