ctypes: remove use of legacy unicode API (GH-12340)
PyUnicode_AsUnicodeAndSize() -> PyUnicode_AsWideChar()
This commit is contained in:
parent
e8113f51a8
commit
9d062d690b
|
@ -1304,8 +1304,6 @@ static int
|
|||
WCharArray_set_value(CDataObject *self, PyObject *value, void *Py_UNUSED(ignored))
|
||||
{
|
||||
Py_ssize_t result = 0;
|
||||
Py_UNICODE *wstr;
|
||||
Py_ssize_t len;
|
||||
|
||||
if (value == NULL) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
|
@ -1320,12 +1318,14 @@ WCharArray_set_value(CDataObject *self, PyObject *value, void *Py_UNUSED(ignored
|
|||
} else
|
||||
Py_INCREF(value);
|
||||
|
||||
wstr = PyUnicode_AsUnicodeAndSize(value, &len);
|
||||
if (wstr == NULL)
|
||||
Py_ssize_t len = PyUnicode_AsWideChar(value, NULL, 0);
|
||||
if (len < 0) {
|
||||
return -1;
|
||||
if ((size_t)len > self->b_size/sizeof(wchar_t)) {
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"string too long");
|
||||
}
|
||||
// PyUnicode_AsWideChar() returns number of wchars including trailing null byte,
|
||||
// when it is called with NULL.
|
||||
if (((size_t)len-1) > self->b_size/sizeof(wchar_t)) {
|
||||
PyErr_SetString(PyExc_ValueError, "string too long");
|
||||
result = -1;
|
||||
goto done;
|
||||
}
|
||||
|
|
|
@ -1229,9 +1229,6 @@ U_get(void *ptr, Py_ssize_t size)
|
|||
static PyObject *
|
||||
U_set(void *ptr, PyObject *value, Py_ssize_t length)
|
||||
{
|
||||
Py_UNICODE *wstr;
|
||||
Py_ssize_t size;
|
||||
|
||||
/* It's easier to calculate in characters than in bytes */
|
||||
length /= sizeof(wchar_t);
|
||||
|
||||
|
@ -1242,9 +1239,14 @@ U_set(void *ptr, PyObject *value, Py_ssize_t length)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
wstr = PyUnicode_AsUnicodeAndSize(value, &size);
|
||||
if (wstr == NULL)
|
||||
Py_ssize_t size = PyUnicode_AsWideChar(value, NULL, 0);
|
||||
if (size < 0) {
|
||||
return NULL;
|
||||
}
|
||||
// PyUnicode_AsWideChar() returns number of wchars including trailing null byte,
|
||||
// when it is called with NULL.
|
||||
size--;
|
||||
assert(size >= 0);
|
||||
if (size > length) {
|
||||
PyErr_Format(PyExc_ValueError,
|
||||
"string too long (%zd, maximum length %zd)",
|
||||
|
@ -1421,16 +1423,18 @@ BSTR_set(void *ptr, PyObject *value, Py_ssize_t size)
|
|||
|
||||
/* create a BSTR from value */
|
||||
if (value) {
|
||||
wchar_t* wvalue;
|
||||
Py_ssize_t wsize;
|
||||
wvalue = PyUnicode_AsUnicodeAndSize(value, &wsize);
|
||||
if (wvalue == NULL)
|
||||
wchar_t *wvalue = PyUnicode_AsWideCharString(value, &wsize);
|
||||
if (wvalue == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
if ((unsigned) wsize != wsize) {
|
||||
PyErr_SetString(PyExc_ValueError, "String too long for BSTR");
|
||||
PyMem_Free(wvalue);
|
||||
return NULL;
|
||||
}
|
||||
bstr = SysAllocStringLen(wvalue, (unsigned)wsize);
|
||||
PyMem_Free(wvalue);
|
||||
} else
|
||||
bstr = NULL;
|
||||
|
||||
|
|
Loading…
Reference in New Issue