Author: Armin Rigo <[email protected]>
Branch: static-callback
Changeset: r2399:e0c7c1c5c761
Date: 2015-11-15 09:12 +0100
http://bitbucket.org/cffi/cffi/changeset/e0c7c1c5c761/
Log: More tests for what I thought would work because it uses the same
code as ffi.callback(). Alas, it didn't
diff --git a/c/ffi_obj.c b/c/ffi_obj.c
--- a/c/ffi_obj.c
+++ b/c/ffi_obj.c
@@ -745,10 +745,9 @@
(PyCFunction)_ffi_call_python_decorator, METH_O};
PyObject *name = Py_None, *error = Py_None;
PyObject *res, *onerror = Py_None;
- static char *keywords[] = {"name", "python_callable", "error",
- "onerror", NULL};
+ static char *keywords[] = {"name", "error", "onerror", NULL};
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOOO", keywords,
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOO", keywords,
&name, &error, &onerror))
return NULL;
diff --git a/testing/cffi1/test_recompiler.py b/testing/cffi1/test_recompiler.py
--- a/testing/cffi1/test_recompiler.py
+++ b/testing/cffi1/test_recompiler.py
@@ -1531,7 +1531,7 @@
assert type(seen[0][1]) is type(seen[0][2]) is int
assert baz == lib.baz
- @ffi.call_python()
+ @ffi.call_python(name="bok")
def bok():
seen.append("Bok")
return 42
@@ -1662,3 +1662,44 @@
return expected
res = lib.bok()
assert repr(res) == repr(expected)
+
+def test_call_python_signature():
+ ffi = FFI()
+ lib = verify(ffi, 'test_call_python_signature', "")
+ py.test.raises(TypeError, ffi.call_python(425), None)
+ py.test.raises(TypeError, ffi.call_python, 'a', 'b', 'c', 'd')
+
+def test_call_python_errors():
+ ffi = FFI()
+ ffi.cdef("""
+ CFFI_CALL_PYTHON int bar(int);
+ """)
+ lib = verify(ffi, 'test_call_python_errors', "")
+
+ seen = []
+ def oops(*args):
+ seen.append(args)
+
+ @ffi.call_python(onerror=oops)
+ def bar(x):
+ return x + ""
+ assert bar(10) == 0
+
+ @ffi.call_python(name="bar", onerror=oops, error=-66)
+ def bar2(x):
+ return x + ""
+ assert bar(10) == -66
+
+ assert len(seen) == 2
+ exc, val, tb = seen[0]
+ assert exc is TypeError
+ assert isinstance(val, TypeError)
+ assert tb.tb_frame.f_code.co_name == "bar"
+ exc, val, tb = seen[1]
+ assert exc is TypeError
+ assert isinstance(val, TypeError)
+ assert tb.tb_frame.f_code.co_name == "bar2"
+ #
+ # a case where 'onerror' is not callable
+ py.test.raises(TypeError, ffi.call_python(name='bar', onerror=42),
+ lambda x: x)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit