diff options
author | Thomas Heller <theller@ctypes.org> | 2007-07-12 15:41:51 (GMT) |
---|---|---|
committer | Thomas Heller <theller@ctypes.org> | 2007-07-12 15:41:51 (GMT) |
commit | 2c5e96465faa2e79b60f21b10422a6a30281cdb8 (patch) | |
tree | 7489bd6a38337fc58946eb5e6a6146c40d970d05 | |
parent | 3af4266d07c38a136858acd63fe663d24590400c (diff) | |
download | cpython-2c5e96465faa2e79b60f21b10422a6a30281cdb8.zip cpython-2c5e96465faa2e79b60f21b10422a6a30281cdb8.tar.gz cpython-2c5e96465faa2e79b60f21b10422a6a30281cdb8.tar.bz2 |
Accept bytes in c_char_p and c_wchar_p types.
-rw-r--r-- | Lib/ctypes/test/test_bytes.py | 8 | ||||
-rw-r--r-- | 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 778fe09..25e017b 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 75b00b6..a8d0d4b 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", |