Author: Armin Rigo <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit