Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 2c5e964

Browse files
author
Thomas Heller
committed
Accept bytes in c_char_p and c_wchar_p types.
1 parent 3af4266 commit 2c5e964

2 files changed

Lines changed: 18 additions & 9 deletions

File tree

Lib/ctypes/test/test_bytes.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,13 @@ def test_c_wchar(self):
1414
c_wchar.from_param(b"x")
1515
(c_wchar * 3)(b"a", b"b", b"c")
1616

17+
def test_c_char_p(self):
18+
c_char_p("foo bar")
19+
c_char_p(b"foo bar")
20+
21+
def test_c_wchar_p(self):
22+
c_wchar_p("foo bar")
23+
c_wchar_p(b"foo bar")
24+
1725
if __name__ == '__main__':
1826
unittest.main()

Modules/_ctypes/cfield.c

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1354,8 +1354,8 @@ z_set(void *ptr, PyObject *value, Py_ssize_t size)
13541354
Py_INCREF(value);
13551355
return value;
13561356
}
1357-
if (PyString_Check(value)) {
1358-
*(char **)ptr = PyString_AS_STRING(value);
1357+
if (PyBytes_Check(value)) {
1358+
*(char **)ptr = PyBytes_AsString(value);
13591359
Py_INCREF(value);
13601360
return value;
13611361
} else if (PyUnicode_Check(value)) {
@@ -1410,20 +1410,21 @@ Z_set(void *ptr, PyObject *value, Py_ssize_t size)
14101410
Py_INCREF(value);
14111411
return value;
14121412
}
1413-
if (PyString_Check(value)) {
1414-
value = PyUnicode_FromEncodedObject(value,
1415-
conversion_mode_encoding,
1416-
conversion_mode_errors);
1417-
if (!value)
1418-
return NULL;
1419-
} else if (PyInt_Check(value) || PyLong_Check(value)) {
1413+
if (PyInt_Check(value) || PyLong_Check(value)) {
14201414
#if SIZEOF_VOID_P == SIZEOF_LONG_LONG
14211415
*(wchar_t **)ptr = (wchar_t *)PyInt_AsUnsignedLongLongMask(value);
14221416
#else
14231417
*(wchar_t **)ptr = (wchar_t *)PyInt_AsUnsignedLongMask(value);
14241418
#endif
14251419
Py_INCREF(Py_None);
14261420
return Py_None;
1421+
}
1422+
if (PyBytes_Check(value)) {
1423+
value = PyUnicode_FromEncodedObject(value,
1424+
conversion_mode_encoding,
1425+
conversion_mode_errors);
1426+
if (!value)
1427+
return NULL;
14271428
} else if (!PyUnicode_Check(value)) {
14281429
PyErr_Format(PyExc_TypeError,
14291430
"unicode string or integer address expected instead of %s instance",

0 commit comments

Comments
 (0)