[pypy-commit] pypy default: Update to cffi/eeef3869b994
arigo
pypy.commits at gmail.com
Tue Apr 19 04:37:40 EDT 2016
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r83762:cea8ead4e869
Date: 2016-04-19 10:37 +0200
http://bitbucket.org/pypy/pypy/changeset/cea8ead4e869/
Log: Update to cffi/eeef3869b994
diff --git a/pypy/module/_cffi_backend/lib_obj.py b/pypy/module/_cffi_backend/lib_obj.py
--- a/pypy/module/_cffi_backend/lib_obj.py
+++ b/pypy/module/_cffi_backend/lib_obj.py
@@ -64,7 +64,8 @@
#
ptr = rffi.cast(rffi.CCHARP, g.c_address)
assert ptr
- return W_FunctionWrapper(self.space, ptr, g.c_size_or_direct_fn,
+ return W_FunctionWrapper(self.space, self.ffi,
+ ptr, g.c_size_or_direct_fn,
rawfunctype, fnname, self.libname)
@jit.elidable_promote()
diff --git a/pypy/module/_cffi_backend/realize_c_type.py b/pypy/module/_cffi_backend/realize_c_type.py
--- a/pypy/module/_cffi_backend/realize_c_type.py
+++ b/pypy/module/_cffi_backend/realize_c_type.py
@@ -238,7 +238,7 @@
self.nostruct_nargs = len(ctfuncptr.fargs) - (locs is not None and
locs[0] == 'R')
- def unexpected_fn_type(self, ffi):
+ def repr_fn_type(self, ffi, repl=""):
fargs, fret, ellipsis, abi = self._unpack(ffi)
argnames = [farg.name for farg in fargs]
if ellipsis:
@@ -246,9 +246,14 @@
sargs = ', '.join(argnames)
sret1 = fret.name[:fret.name_position]
sret2 = fret.name[fret.name_position:]
+ if len(repl) > 0 and not sret1.endswith('*'):
+ repl = " " + repl
+ return '%s%s(%s)%s' % (sret1, repl, sargs, sret2)
+
+ def unexpected_fn_type(self, ffi):
raise oefmt(ffi.w_FFIError,
- "the type '%s(%s)%s' is a function type, not a "
- "pointer-to-function type", sret1, sargs, sret2)
+ "the type '%s' is a function type, not a "
+ "pointer-to-function type", self.repr_fn_type(ffi))
def realize_c_type(ffi, opcodes, index):
diff --git a/pypy/module/_cffi_backend/test/test_recompiler.py b/pypy/module/_cffi_backend/test/test_recompiler.py
--- a/pypy/module/_cffi_backend/test/test_recompiler.py
+++ b/pypy/module/_cffi_backend/test/test_recompiler.py
@@ -420,9 +420,11 @@
def test_math_sin_type(self):
ffi, lib = self.prepare(
- "double sin(double);",
+ "double sin(double); void *xxtestfunc();",
'test_math_sin_type',
- '#include <math.h>')
+ """#include <math.h>
+ void *xxtestfunc(void) { return 0; }
+ """)
# 'lib.sin' is typed as a <built-in method> object on lib
assert ffi.typeof(lib.sin).cname == "double(*)(double)"
# 'x' is another <built-in method> object on lib, made very indirectly
@@ -432,7 +434,16 @@
# present on built-in functions on CPython; must be emulated on PyPy:
assert lib.sin.__name__ == 'sin'
assert lib.sin.__module__ == '_CFFI_test_math_sin_type'
- assert lib.sin.__doc__=='direct call to the C function of the same name'
+ assert lib.sin.__doc__ == (
+ "double sin(double);\n"
+ "\n"
+ "CFFI C function from _CFFI_test_math_sin_type.lib")
+
+ assert ffi.typeof(lib.xxtestfunc).cname == "void *(*)()"
+ assert lib.xxtestfunc.__doc__ == (
+ "void *xxtestfunc();\n"
+ "\n"
+ "CFFI C function from _CFFI_test_math_sin_type.lib")
def test_verify_anonymous_struct_with_typedef(self):
ffi, lib = self.prepare(
diff --git a/pypy/module/_cffi_backend/wrapper.py b/pypy/module/_cffi_backend/wrapper.py
--- a/pypy/module/_cffi_backend/wrapper.py
+++ b/pypy/module/_cffi_backend/wrapper.py
@@ -1,6 +1,7 @@
from pypy.interpreter.error import oefmt
from pypy.interpreter.baseobjspace import W_Root
from pypy.interpreter.typedef import TypeDef, interp_attrproperty
+from pypy.interpreter.typedef import GetSetProperty
from pypy.interpreter.gateway import interp2app
from rpython.rlib import jit
@@ -24,9 +25,8 @@
This class cannot be used for variadic functions.
"""
_immutable_ = True
- common_doc_str = 'direct call to the C function of the same name'
- def __init__(self, space, fnptr, directfnptr,
+ def __init__(self, space, ffi, fnptr, directfnptr,
rawfunctype, fnname, modulename):
# everything related to the type of the function is accessed
# as immutable attributes of the 'rawfunctype' object, which
@@ -39,6 +39,7 @@
assert locs is None or len(ctype.fargs) == len(locs)
#
self.space = space
+ self.ffi = ffi
self.fnptr = fnptr
self.directfnptr = directfnptr
self.rawfunctype = rawfunctype
@@ -93,6 +94,11 @@
def descr_repr(self, space):
return space.wrap("<FFIFunctionWrapper for %s()>" % (self.fnname,))
+ def descr_get_doc(self, space):
+ doc = self.rawfunctype.repr_fn_type(self.ffi, self.fnname)
+ doc = '%s;\n\nCFFI C function from %s.lib' % (doc, self.modulename)
+ return space.wrap(doc)
+
@jit.unroll_safe
def prepare_args(space, rawfunctype, args_w, start_index):
@@ -128,6 +134,6 @@
__call__ = interp2app(W_FunctionWrapper.descr_call),
__name__ = interp_attrproperty('fnname', cls=W_FunctionWrapper),
__module__ = interp_attrproperty('modulename', cls=W_FunctionWrapper),
- __doc__ = interp_attrproperty('common_doc_str', cls=W_FunctionWrapper),
+ __doc__ = GetSetProperty(W_FunctionWrapper.descr_get_doc),
)
W_FunctionWrapper.typedef.acceptable_as_base_class = False
More information about the pypy-commit
mailing list