Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r2727:1629330be7e6 Date: 2016-07-19 08:40 +0200 http://bitbucket.org/cffi/cffi/changeset/1629330be7e6/
Log: Use Py_LIMITED_API in the generated C extension modules, because doing so seems easy. Still need to check if and how we have to produce the actual .so files. diff --git a/cffi/_cffi_include.h b/cffi/_cffi_include.h --- a/cffi/_cffi_include.h +++ b/cffi/_cffi_include.h @@ -196,20 +196,6 @@ return NULL; } -_CFFI_UNUSED_FN -static PyObject **_cffi_unpack_args(PyObject *args_tuple, Py_ssize_t expected, - const char *fnname) -{ - if (PyTuple_GET_SIZE(args_tuple) != expected) { - PyErr_Format(PyExc_TypeError, - "%.150s() takes exactly %zd arguments (%zd given)", - fnname, expected, PyTuple_GET_SIZE(args_tuple)); - return NULL; - } - return &PyTuple_GET_ITEM(args_tuple, 0); /* pointer to the first item, - the others follow */ -} - /********** end CPython-specific section **********/ #else _CFFI_UNUSED_FN diff --git a/cffi/recompiler.py b/cffi/recompiler.py --- a/cffi/recompiler.py +++ b/cffi/recompiler.py @@ -275,6 +275,8 @@ def write_c_source_to_f(self, f, preamble): self._f = f prnt = self._prnt + if self.ffi._embedding is None: + prnt('#define Py_LIMITED_API') # # first the '#include' (actually done by inlining the file's content) lines = self._rel_readlines('_cffi_include.h') @@ -683,13 +685,11 @@ rng = range(len(tp.args)) for i in rng: prnt(' PyObject *arg%d;' % i) - prnt(' PyObject **aa;') prnt() - prnt(' aa = _cffi_unpack_args(args, %d, "%s");' % (len(rng), name)) - prnt(' if (aa == NULL)') + prnt(' if (!PyArg_UnpackTuple(args, "%s", %d, %d, %s))' % ( + name, len(rng), len(rng), + ', '.join(['&arg%d' % i for i in rng]))) prnt(' return NULL;') - for i in rng: - prnt(' arg%d = aa[%d];' % (i, i)) prnt() # for i, type in enumerate(tp.args): 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 @@ -851,9 +851,12 @@ assert str(e2.value) == "foo0() takes no arguments (2 given)" assert str(e3.value) == "foo1() takes exactly one argument (0 given)" assert str(e4.value) == "foo1() takes exactly one argument (2 given)" - assert str(e5.value) == "foo2() takes exactly 2 arguments (0 given)" - assert str(e6.value) == "foo2() takes exactly 2 arguments (1 given)" - assert str(e7.value) == "foo2() takes exactly 2 arguments (3 given)" + assert str(e5.value) in ["foo2 expected 2 arguments, got 0", + "foo2() takes exactly 2 arguments (0 given)"] + assert str(e6.value) in ["foo2 expected 2 arguments, got 1", + "foo2() takes exactly 2 arguments (1 given)"] + assert str(e7.value) in ["foo2 expected 2 arguments, got 3", + "foo2() takes exactly 2 arguments (3 given)"] def test_address_of_function(): ffi = FFI() _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit