[pypy-commit] cffi default: Functions and function pointers as arguments.

arigo noreply at buildbot.pypy.org
Wed Jul 11 12:34:11 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r627:08b8c2df4b16
Date: 2012-07-11 12:29 +0200
http://bitbucket.org/cffi/cffi/changeset/08b8c2df4b16/

Log:	Functions and function pointers as arguments.

diff --git a/cffi/verifier.py b/cffi/verifier.py
--- a/cffi/verifier.py
+++ b/cffi/verifier.py
@@ -151,9 +151,8 @@
             converter = '_cffi_to_c_%s' % (tp.name.replace(' ', '_'),)
             errvalue = '-1'
         #
-        elif isinstance(tp, (model.PointerType, model.FunctionPtrType)):
-            if (isinstance(tp, model.PointerType) and
-                    isinstance(tp.totype, model.PrimitiveType) and
+        elif isinstance(tp, model.PointerType):
+            if (isinstance(tp.totype, model.PrimitiveType) and
                     tp.totype.name == 'char'):
                 converter = '_cffi_to_c_char_p'
             else:
@@ -168,6 +167,13 @@
             self.prnt('    %s;' % errcode)
             return
         #
+        elif isinstance(tp, model.BaseFunctionType):
+            if isinstance(tp, model.RawFunctionType):
+                tp = tp.as_function_pointer()
+            converter = '(%s)_cffi_to_c_pointer' % tp.get_c_name('')
+            extraarg = ', _cffi_type(%d)' % self.gettypenum(tp)
+            errvalue = 'NULL'
+        #
         else:
             raise NotImplementedError(tp)
         #
@@ -223,6 +229,8 @@
         prnt('{')
         #
         for i, type in enumerate(tp.args):
+            if isinstance(type, model.RawFunctionType):
+                type = type.as_function_pointer()
             prnt('  %s;' % type.get_c_name(' x%d' % i))
         if not isinstance(tp.result, model.VoidType):
             result_code = 'result = '
diff --git a/testing/test_verify.py b/testing/test_verify.py
--- a/testing/test_verify.py
+++ b/testing/test_verify.py
@@ -630,3 +630,11 @@
             int (*compar)(const void *, const void *));
     """)
     ffi.verify("#include <stdlib.h>")
+
+def test_func_as_argument():
+    ffi = FFI()
+    ffi.cdef("""
+        void qsort(void *base, size_t nel, size_t width,
+            int compar(const void *, const void *));
+    """)
+    ffi.verify("#include <stdlib.h>")


More information about the pypy-commit mailing list