[pypy-commit] cffi default: verify: Function pointer as argument

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


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r626:2697448f7035
Date: 2012-07-11 12:25 +0200
http://bitbucket.org/cffi/cffi/changeset/2697448f7035/

Log:	verify: Function pointer as argument

diff --git a/cffi/verifier.py b/cffi/verifier.py
--- a/cffi/verifier.py
+++ b/cffi/verifier.py
@@ -151,8 +151,9 @@
             converter = '_cffi_to_c_%s' % (tp.name.replace(' ', '_'),)
             errvalue = '-1'
         #
-        elif isinstance(tp, model.PointerType):
-            if (isinstance(tp.totype, model.PrimitiveType) and
+        elif isinstance(tp, (model.PointerType, model.FunctionPtrType)):
+            if (isinstance(tp, model.PointerType) and
+                    isinstance(tp.totype, model.PrimitiveType) and
                     tp.totype.name == 'char'):
                 converter = '_cffi_to_c_char_p'
             else:
@@ -160,7 +161,7 @@
                 extraarg = ', _cffi_type(%d)' % self.gettypenum(tp)
             errvalue = 'NULL'
         #
-        elif isinstance(tp, model.StructType):
+        elif isinstance(tp, model.StructOrUnion):
             # a struct (not a struct pointer) as a function argument
             self.prnt('  if (_cffi_to_c((char*)&%s, _cffi_type(%d), %s) < 0)'
                       % (tovar, self.gettypenum(tp), fromvar))
diff --git a/testing/test_verify.py b/testing/test_verify.py
--- a/testing/test_verify.py
+++ b/testing/test_verify.py
@@ -622,3 +622,11 @@
     foochar = ffi.cast("char *(*)(void)", lib.fooptr)
     s = foochar()
     assert str(s) == "foobar"
+
+def test_funcptr_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