From 2c5e96465faa2e79b60f21b10422a6a30281cdb8 Mon Sep 17 00:00:00 2001 From: Thomas Heller Date: Thu, 12 Jul 2007 15:41:51 +0000 Subject: [PATCH] Accept bytes in c_char_p and c_wchar_p types. --- Lib/ctypes/test/test_bytes.py | 8 ++++++++ Modules/_ctypes/cfield.c | 19 ++++++++++--------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/Lib/ctypes/test/test_bytes.py b/Lib/ctypes/test/test_bytes.py index 778fe09361d..25e017b8bf1 100644 --- a/Lib/ctypes/test/test_bytes.py +++ b/Lib/ctypes/test/test_bytes.py @@ -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() diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c index 75b00b69c0f..a8d0d4bb833 100644 --- a/Modules/_ctypes/cfield.c +++ b/Modules/_ctypes/cfield.c @@ -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",