summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Heller <theller@ctypes.org>2007-07-12 15:41:51 (GMT)
committerThomas Heller <theller@ctypes.org>2007-07-12 15:41:51 (GMT)
commit2c5e96465faa2e79b60f21b10422a6a30281cdb8 (patch)
tree7489bd6a38337fc58946eb5e6a6146c40d970d05
parent3af4266d07c38a136858acd63fe663d24590400c (diff)
downloadcpython-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.py8
-rw-r--r--Modules/_ctypes/cfield.c19
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",