Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r662:af85c6508b72 Date: 2012-07-17 10:24 +0200 http://bitbucket.org/cffi/cffi/changeset/af85c6508b72/
Log: Test and fix. diff --git a/c/_cffi_backend.c b/c/_cffi_backend.c --- a/c/_cffi_backend.c +++ b/c/_cffi_backend.c @@ -1578,6 +1578,22 @@ static cif_description_t * fb_prepare_cif(PyObject *fargs, CTypeDescrObject *, ffi_abi); /*forward*/ +static PyObject * +b_new_primitive_type(PyObject *self, PyObject *args); /*forward*/ + +static CTypeDescrObject *_get_ct_int(void) +{ + static CTypeDescrObject *ct_int = NULL; + if (ct_int == NULL) { + PyObject *args = Py_BuildValue("(s)", "int"); + if (args == NULL) + return NULL; + ct_int = (CTypeDescrObject *)b_new_primitive_type(NULL, args); + Py_DECREF(args); + } + return ct_int; +} + static PyObject* cdata_call(CDataObject *cd, PyObject *args, PyObject *kwds) { @@ -1639,8 +1655,17 @@ if (CData_Check(obj)) { ct = ((CDataObject *)obj)->c_type; - if (ct->ct_flags & CT_ARRAY) + if (ct->ct_flags & (CT_PRIMITIVE_CHAR|CT_PRIMITIVE_UNSIGNED| + CT_PRIMITIVE_SIGNED)) { + if (ct->ct_size < sizeof(int)) { + ct = _get_ct_int(); + if (ct == NULL) + goto error; + } + } + else if (ct->ct_flags & CT_ARRAY) { ct = (CTypeDescrObject *)ct->ct_stuff; + } Py_INCREF(ct); } else { diff --git a/c/test_c.py b/c/test_c.py --- a/c/test_c.py +++ b/c/test_c.py @@ -800,6 +800,11 @@ assert f(2, cast(BInt, 40), cast(BInt, 2)) == 42 py.test.raises(TypeError, f, 1, 42) py.test.raises(TypeError, f, 2, None) + # promotion of chars and shorts to ints + BSChar = new_primitive_type("signed char") + BUChar = new_primitive_type("unsigned char") + BSShort = new_primitive_type("short") + assert f(3, cast(BSChar, -3), cast(BUChar, 200), cast(BSShort, -5)) == 192 def test_cannot_call_with_a_autocompleted_struct(): BSChar = new_primitive_type("signed char") _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit