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

Reply via email to