mirror of
https://github.com/python/cpython.git
synced 2025-09-27 10:50:04 +00:00
ctypes.c_char and ctypes.c_wchar now accept initialization from byte objects.
This commit is contained in:
parent
f7c6d86832
commit
3af4266d07
2 changed files with 41 additions and 2 deletions
18
Lib/ctypes/test/test_bytes.py
Normal file
18
Lib/ctypes/test/test_bytes.py
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
import unittest
|
||||||
|
from ctypes import *
|
||||||
|
|
||||||
|
class BytesTest(unittest.TestCase):
|
||||||
|
def test_c_char(self):
|
||||||
|
x = c_char(b"x")
|
||||||
|
x.value = b"y"
|
||||||
|
c_char.from_param(b"x")
|
||||||
|
(c_char * 3)(b"a", b"b", b"c")
|
||||||
|
|
||||||
|
def test_c_wchar(self):
|
||||||
|
x = c_wchar(b"x")
|
||||||
|
x.value = b"y"
|
||||||
|
c_wchar.from_param(b"x")
|
||||||
|
(c_wchar * 3)(b"a", b"b", b"c")
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
|
@ -1141,6 +1141,27 @@ O_set(void *ptr, PyObject *value, Py_ssize_t size)
|
||||||
static PyObject *
|
static PyObject *
|
||||||
c_set(void *ptr, PyObject *value, Py_ssize_t size)
|
c_set(void *ptr, PyObject *value, Py_ssize_t size)
|
||||||
{
|
{
|
||||||
|
if (PyUnicode_Check(value)) {
|
||||||
|
value = PyUnicode_AsEncodedString(value,
|
||||||
|
conversion_mode_encoding,
|
||||||
|
conversion_mode_errors);
|
||||||
|
if (value == NULL)
|
||||||
|
return NULL;
|
||||||
|
if (PyBytes_GET_SIZE(value) != 1) {
|
||||||
|
Py_DECREF(value);
|
||||||
|
PyErr_Format(PyExc_TypeError,
|
||||||
|
"one character string expected");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
*(char *)ptr = PyBytes_AsString(value)[0];
|
||||||
|
Py_DECREF(value);
|
||||||
|
_RET(value);
|
||||||
|
}
|
||||||
|
if (PyBytes_Check(value) && PyBytes_GET_SIZE(value) == 1) {
|
||||||
|
*(char *)ptr = PyBytes_AsString(value)[0];
|
||||||
|
_RET(value);
|
||||||
|
}
|
||||||
|
/* XXX struni remove later */
|
||||||
if (!PyString_Check(value) || (1 != PyString_Size(value))) {
|
if (!PyString_Check(value) || (1 != PyString_Size(value))) {
|
||||||
PyErr_Format(PyExc_TypeError,
|
PyErr_Format(PyExc_TypeError,
|
||||||
"one character string expected");
|
"one character string expected");
|
||||||
|
@ -1154,6 +1175,7 @@ c_set(void *ptr, PyObject *value, Py_ssize_t size)
|
||||||
static PyObject *
|
static PyObject *
|
||||||
c_get(void *ptr, Py_ssize_t size)
|
c_get(void *ptr, Py_ssize_t size)
|
||||||
{
|
{
|
||||||
|
/* XXX struni return PyBytes (or PyUnicode?) later */
|
||||||
return PyString_FromStringAndSize((char *)ptr, 1);
|
return PyString_FromStringAndSize((char *)ptr, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1163,8 +1185,7 @@ static PyObject *
|
||||||
u_set(void *ptr, PyObject *value, Py_ssize_t size)
|
u_set(void *ptr, PyObject *value, Py_ssize_t size)
|
||||||
{
|
{
|
||||||
Py_ssize_t len;
|
Py_ssize_t len;
|
||||||
|
if (PyBytes_Check(value)) {
|
||||||
if (PyString_Check(value)) {
|
|
||||||
value = PyUnicode_FromEncodedObject(value,
|
value = PyUnicode_FromEncodedObject(value,
|
||||||
conversion_mode_encoding,
|
conversion_mode_encoding,
|
||||||
conversion_mode_errors);
|
conversion_mode_errors);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue