[pypy-svn] r59990 - pypy/branch/oo-jit/pypy/rpython/lltypesystem

arigo at codespeak.net arigo at codespeak.net
Wed Nov 19 16:22:20 CET 2008


Author: arigo
Date: Wed Nov 19 16:22:19 2008
New Revision: 59990

Modified:
   pypy/branch/oo-jit/pypy/rpython/lltypesystem/ll2ctypes.py
Log:
Hack hack hack....


Modified: pypy/branch/oo-jit/pypy/rpython/lltypesystem/ll2ctypes.py
==============================================================================
--- pypy/branch/oo-jit/pypy/rpython/lltypesystem/ll2ctypes.py	(original)
+++ pypy/branch/oo-jit/pypy/rpython/lltypesystem/ll2ctypes.py	Wed Nov 19 16:22:19 2008
@@ -260,7 +260,8 @@
     if not isinstance(ARRAY.OF, lltype.ContainerType):
         for i in range(container.getlength()):
             item_value = container.items[i]    # fish fish
-            carray.items[i] = lltype2ctypes(item_value)
+            carray.items[i] = lltype2ctypes(item_value,
+                                            acceptgckind=acceptgckind)
         remove_regular_array_content(container)
     else:
         assert isinstance(ARRAY.OF, lltype.Struct)
@@ -445,7 +446,6 @@
                 v1voidlist = [(i, getattr(container, '_void' + str(i), None))
                                  for i in range(len(T.TO.ARGS))
                                      if T.TO.ARGS[i] is lltype.Void]
-                ctypes_func_type = get_ctypes_type(T)
                 def callback(*cargs):
                     cargs = list(cargs)
                     for v1 in v1voidlist:
@@ -461,8 +461,17 @@
                     assert lltype.typeOf(llres) == T.TO.RESULT
                     if T.TO.RESULT is lltype.Void:
                         return None
-                    else:
-                        return lltype2ctypes(llres)
+                    res = lltype2ctypes(llres, acceptgckind=acceptgckind)
+                    if isinstance(T.TO.RESULT, lltype.Ptr):
+                        _all_callbacks.append(res)
+                        res = ctypes.cast(res, ctypes.c_void_p).value
+                    return res
+                if isinstance(T.TO.RESULT, lltype.Ptr):
+                    TMod = lltype.Ptr(lltype.FuncType(T.TO.ARGS,
+                                                      lltype.Signed))
+                    ctypes_func_type = get_ctypes_type(TMod)
+                else:
+                    ctypes_func_type = get_ctypes_type(T)
                 res = ctypes_func_type(callback)
                 _all_callbacks.append(res)
                 return res



More information about the Pypy-commit mailing list