[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