]> granicus.if.org Git - python/commitdiff
Accept bytes in c_char_p and c_wchar_p types.
authorThomas Heller <theller@ctypes.org>
Thu, 12 Jul 2007 15:41:51 +0000 (15:41 +0000)
committerThomas Heller <theller@ctypes.org>
Thu, 12 Jul 2007 15:41:51 +0000 (15:41 +0000)
Lib/ctypes/test/test_bytes.py
Modules/_ctypes/cfield.c

index 778fe09361d74d36122867aebf127cd38f2a2fed..25e017b8bf17b442763045a18d2f2b45268f044b 100644 (file)
@@ -14,5 +14,13 @@ class BytesTest(unittest.TestCase):
         c_wchar.from_param(b"x")
         (c_wchar * 3)(b"a", b"b", b"c")
 
+    def test_c_char_p(self):
+        c_char_p("foo bar")
+        c_char_p(b"foo bar")
+
+    def test_c_wchar_p(self):
+        c_wchar_p("foo bar")
+        c_wchar_p(b"foo bar")
+
 if __name__ == '__main__':
     unittest.main()
index 75b00b69c0fce385a078d413268e9d67db0f1708..a8d0d4bb833d13fc94354a56bff2af936fe884fe 100644 (file)
@@ -1354,8 +1354,8 @@ z_set(void *ptr, PyObject *value, Py_ssize_t size)
                Py_INCREF(value);
                return value;
        }
-       if (PyString_Check(value)) {
-               *(char **)ptr = PyString_AS_STRING(value);
+       if (PyBytes_Check(value)) {
+               *(char **)ptr = PyBytes_AsString(value);
                Py_INCREF(value);
                return value;
        } else if (PyUnicode_Check(value)) {
@@ -1410,13 +1410,7 @@ Z_set(void *ptr, PyObject *value, Py_ssize_t size)
                Py_INCREF(value);
                return value;
        }
-       if (PyString_Check(value)) {
-               value = PyUnicode_FromEncodedObject(value,
-                                                   conversion_mode_encoding,
-                                                   conversion_mode_errors);
-               if (!value)
-                       return NULL;
-       } else if (PyInt_Check(value) || PyLong_Check(value)) {
+       if (PyInt_Check(value) || PyLong_Check(value)) {
 #if SIZEOF_VOID_P == SIZEOF_LONG_LONG
                *(wchar_t **)ptr = (wchar_t *)PyInt_AsUnsignedLongLongMask(value);
 #else
@@ -1424,6 +1418,13 @@ Z_set(void *ptr, PyObject *value, Py_ssize_t size)
 #endif
                Py_INCREF(Py_None);
                return Py_None;
+       }
+       if (PyBytes_Check(value)) {
+               value = PyUnicode_FromEncodedObject(value,
+                                                   conversion_mode_encoding,
+                                                   conversion_mode_errors);
+               if (!value)
+                       return NULL;
        } else if (!PyUnicode_Check(value)) {
                PyErr_Format(PyExc_TypeError,
                             "unicode string or integer address expected instead of %s instance",