[pypy-svn] r47311 - pypy/dist/pypy/rlib

fijal at codespeak.net fijal at codespeak.net
Mon Oct 8 20:52:41 CEST 2007


Author: fijal
Date: Mon Oct  8 20:52:41 2007
New Revision: 47311

Modified:
   pypy/dist/pypy/rlib/libffi.py
Log:
More rpython. Still complains about broken casts


Modified: pypy/dist/pypy/rlib/libffi.py
==============================================================================
--- pypy/dist/pypy/rlib/libffi.py	(original)
+++ pypy/dist/pypy/rlib/libffi.py	Mon Oct  8 20:52:41 2007
@@ -117,7 +117,7 @@
         mode = RTLD_NOW
     res = c_dlopen(name, mode)
     if not res:
-        raise OSError(dlerror())
+        raise OSError(-1, dlerror())
     return res
 
 def dlsym(libhandle, name):
@@ -129,57 +129,60 @@
     # XXX rffi.cast here...
     return res
 
-class FuncPtr:
-    def __init__(self, func_sym, argtypes, restype):
-        argnum = len(argtypes)
-        TP = rffi.CFixedArray(FFI_TYPE_P, argnum)
-        self.ll_argtypes = lltype.malloc(TP, flavor='raw')
-        self.argtypes = argtypes
-        for i in unrolling_iterable(range(len(argtypes))):
-            argtype = argtypes[i]
-            self.ll_argtypes[i] = TYPE_MAP[argtype]
-        TP = rffi.CFixedArray(rffi.VOIDP, argnum)
-        self.ll_args = lltype.malloc(TP, flavor='raw')
-        for i in range(argnum):
-            # XXX
-            TP = rffi.CFixedArray(argtypes[i], 1)
-            self.ll_args[i] = rffi.cast(rffi.VOIDP,
-                                        lltype.malloc(TP, flavor='raw'))
-        self.restype = restype
-        if restype is not None:
-            TP = rffi.CFixedArray(restype, 1)
-            self.ll_res = lltype.malloc(TP, flavor='raw')
-        if not func_sym:
-            raise OSError("NULL func_sym")
-        self.func_sym = func_sym
-        self.ll_cif = lltype.malloc(FFI_CIFP.TO, flavor='raw')
-        res = c_ffi_prep_cif(self.ll_cif, FFI_DEFAULT_ABI,
-                             rffi.cast(rffi.UINT, argnum),
-                             TYPE_MAP[restype],
-                             rffi.cast(FFI_TYPE_PP, self.ll_argtypes))
-        if not res == FFI_OK:
-            raise OSError("Wrong typedef")
-    __init__._annspecialcase_ = 'specialize:arg(2, 3)'
-
-    def call(self, args):
-        # allocated result should be padded and stuff
-        PTR_T = lltype.Ptr(rffi.CFixedArray(rffi.INT, 1))
-        for i in range(len(args)):
-            TP = lltype.Ptr(rffi.CFixedArray(self.argtypes[i], 1))
-            addr = rffi.cast(TP, self.ll_args[i])
-            addr[0] = args[i]
-        c_ffi_call(self.ll_cif, self.func_sym,
-                   rffi.cast(rffi.VOIDP, self.ll_res),
-                   rffi.cast(VOIDPP, self.ll_args))
-        return self.ll_res[0]
-    call._annspecialcase_ = 'specialize:argtype(1)'
+def new_funcptr(argtypes, restype):
+    argnum = len(argtypes)
 
-    def __del__(self):
-        lltype.free(self.ll_argtypes, flavor='raw')
-        lltype.free(self.ll_args, flavor='raw')
-        lltype.free(self.ll_cif, flavor='raw')
-        if self.restype is not None:
-            lltype.free(self.ll_res, flavor='raw')
+    argtypes_iterable = unrolling_iterable(enumerate(argtypes))
+
+    class FuncPtr:
+        def __init__(self, func_sym):
+            TP = rffi.CFixedArray(FFI_TYPE_P, argnum)
+            self.ll_argtypes = lltype.malloc(TP, flavor='raw')
+            self.argtypes = argtypes
+            for i, argtype in argtypes_iterable:
+                self.ll_argtypes[i] = TYPE_MAP[argtype]
+            TP = rffi.CFixedArray(rffi.VOIDP, argnum)
+            self.ll_args = lltype.malloc(TP, flavor='raw')
+            for i, argtype in argtypes_iterable:
+                # XXX
+                TP = rffi.CFixedArray(argtypes[i], 1)
+                self.ll_args[i] = rffi.cast(rffi.VOIDP,
+                                            lltype.malloc(TP, flavor='raw'))
+            self.restype = restype
+            if restype is not None:
+                TP = rffi.CFixedArray(restype, 1)
+                self.ll_res = lltype.malloc(TP, flavor='raw')
+            if not func_sym:
+                raise OSError(-1, "NULL func_sym")
+            self.func_sym = func_sym
+            self.ll_cif = lltype.malloc(FFI_CIFP.TO, flavor='raw')
+            res = c_ffi_prep_cif(self.ll_cif, FFI_DEFAULT_ABI,
+                                 rffi.cast(rffi.UINT, argnum),
+                                 TYPE_MAP[restype],
+                                 rffi.cast(FFI_TYPE_PP, self.ll_argtypes))
+            if not res == FFI_OK:
+                raise OSError(-1, "Wrong typedef")
+
+        def call(self, args):
+            # allocated result should be padded and stuff
+            PTR_T = lltype.Ptr(rffi.CFixedArray(rffi.INT, 1))
+            for i, argtype in argtypes_iterable:
+                TP = lltype.Ptr(rffi.CFixedArray(argtype, 1))
+                addr = rffi.cast(TP, self.ll_args[i])
+                addr[0] = args[i]
+            c_ffi_call(self.ll_cif, self.func_sym,
+                       rffi.cast(rffi.VOIDP, self.ll_res),
+                       rffi.cast(VOIDPP, self.ll_args))
+            return self.ll_res[0]
+
+        def __del__(self):
+            lltype.free(self.ll_argtypes, flavor='raw')
+            lltype.free(self.ll_args, flavor='raw')
+            lltype.free(self.ll_cif, flavor='raw')
+            if self.restype is not None:
+                lltype.free(self.ll_res, flavor='raw')
+    return FuncPtr
+new_funcptr._annspecialcase_ = 'specialize:memo'
 
 class CDLL:
     def __init__(self, libname):
@@ -189,5 +192,6 @@
         c_dlclose(self.lib)
 
     def getpointer(self, name, argtypes, restype):
-        return FuncPtr(dlsym(self.lib, name), argtypes, restype)
+        funcptr = new_funcptr(argtypes, restype)
+        return funcptr(dlsym(self.lib, name))
     getpointer._annspecialcase_ = 'specialize:arg(2, 3)'



More information about the Pypy-commit mailing list