Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r2660:89ba430d6c58 Date: 2016-04-15 19:11 +0200 http://bitbucket.org/cffi/cffi/changeset/89ba430d6c58/
Log: Also accept arrays of int8_t or uint8_t, like ffi.string() diff --git a/c/_cffi_backend.c b/c/_cffi_backend.c --- a/c/_cffi_backend.c +++ b/c/_cffi_backend.c @@ -5585,6 +5585,7 @@ static PyObject *b_rawstring(PyObject *self, PyObject *arg) { CDataObject *cd; + CTypeDescrObject *ctitem; Py_ssize_t length; if (!CData_Check(arg)) { @@ -5592,23 +5593,25 @@ return NULL; } cd = (CDataObject *)arg; - if (!(cd->c_type->ct_flags & CT_ARRAY) || - !(cd->c_type->ct_itemdescr->ct_flags & CT_PRIMITIVE_CHAR)) { - PyErr_Format(PyExc_TypeError, - "expected an array of 'char' or 'wchar_t', got '%s'", - cd->c_type->ct_name); - return NULL; - } - - length = get_array_length(cd); - if (cd->c_type->ct_itemdescr->ct_size == sizeof(char)) - return PyBytes_FromStringAndSize(cd->c_data, length); + ctitem = cd->c_type->ct_itemdescr; + if ((cd->c_type->ct_flags & CT_ARRAY) && + (ctitem->ct_flags & (CT_PRIMITIVE_CHAR | + CT_PRIMITIVE_SIGNED | + CT_PRIMITIVE_UNSIGNED))) { + length = get_array_length(cd); + if (ctitem->ct_size == sizeof(char)) + return PyBytes_FromStringAndSize(cd->c_data, length); #ifdef HAVE_WCHAR_H - else if (cd->c_type->ct_itemdescr->ct_size == sizeof(wchar_t)) - return _my_PyUnicode_FromWideChar((wchar_t *)cd->c_data, length); + else if (ctitem->ct_flags & CT_PRIMITIVE_CHAR) { + assert(ctitem->ct_size == sizeof(wchar_t)); + return _my_PyUnicode_FromWideChar((wchar_t *)cd->c_data, length); + } #endif - - PyErr_SetString(PyExc_SystemError, "bad size for char-like"); + } + PyErr_Format(PyExc_TypeError, + "expected a 'char[]' or 'uint8_t[]' or 'int8_t[]' " + "or 'wchar_t[]', got '%s'", + cd->c_type->ct_name); return NULL; } diff --git a/c/test_c.py b/c/test_c.py --- a/c/test_c.py +++ b/c/test_c.py @@ -3537,6 +3537,10 @@ p = newp(BArray, u"abc\x00def") assert rawstring(p) == u"abc\x00def\x00\x00\x00" assert rawstring(p[1:6]) == u"bc\x00de" + BChar = new_primitive_type("uint8_t") + BArray = new_array_type(new_pointer_type(BChar), 10) # uint8_t[10] + p = newp(BArray, [65 + i for i in range(10)]) + assert rawstring(p) == "ABCDEFGHIJ" # py.test.raises(TypeError, rawstring, "foobar") py.test.raises(TypeError, rawstring, p + 1) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit