mirror of https://github.com/python/cpython
bpo-31393: Fix the use of PyUnicode_READY(). (#3451)
This commit is contained in:
parent
70c2dd306f
commit
e3b2b4b8d9
|
@ -1467,7 +1467,10 @@ idna_converter(PyObject *obj, struct maybe_idna *data)
|
|||
len = PyByteArray_Size(obj);
|
||||
}
|
||||
else if (PyUnicode_Check(obj)) {
|
||||
if (PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
|
||||
if (PyUnicode_READY(obj) == -1) {
|
||||
return 0;
|
||||
}
|
||||
if (PyUnicode_IS_COMPACT_ASCII(obj)) {
|
||||
data->buf = PyUnicode_DATA(obj);
|
||||
len = PyUnicode_GET_LENGTH(obj);
|
||||
}
|
||||
|
|
|
@ -27,7 +27,7 @@ all_name_chars(PyObject *o)
|
|||
};
|
||||
const unsigned char *s, *e;
|
||||
|
||||
if (PyUnicode_READY(o) == -1 || !PyUnicode_IS_ASCII(o))
|
||||
if (!PyUnicode_IS_ASCII(o))
|
||||
return 0;
|
||||
|
||||
s = PyUnicode_1BYTE_DATA(o);
|
||||
|
@ -63,6 +63,10 @@ intern_string_constants(PyObject *tuple)
|
|||
for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
|
||||
PyObject *v = PyTuple_GET_ITEM(tuple, i);
|
||||
if (PyUnicode_CheckExact(v)) {
|
||||
if (PyUnicode_READY(v) == -1) {
|
||||
PyErr_Clear();
|
||||
continue;
|
||||
}
|
||||
if (all_name_chars(v)) {
|
||||
PyObject *w = v;
|
||||
PyUnicode_InternInPlace(&v);
|
||||
|
|
|
@ -32,7 +32,7 @@ class object "PyObject *" "&PyBaseObject_Type"
|
|||
((PyASCIIObject *)(name))->hash)
|
||||
#define MCACHE_CACHEABLE_NAME(name) \
|
||||
PyUnicode_CheckExact(name) && \
|
||||
PyUnicode_READY(name) != -1 && \
|
||||
PyUnicode_IS_READY(name) && \
|
||||
PyUnicode_GET_LENGTH(name) <= MCACHE_MAX_ATTR_SIZE
|
||||
|
||||
struct method_cache_entry {
|
||||
|
|
|
@ -4185,10 +4185,13 @@ PyUnicode_ReadChar(PyObject *unicode, Py_ssize_t index)
|
|||
void *data;
|
||||
int kind;
|
||||
|
||||
if (!PyUnicode_Check(unicode) || PyUnicode_READY(unicode) == -1) {
|
||||
if (!PyUnicode_Check(unicode)) {
|
||||
PyErr_BadArgument();
|
||||
return (Py_UCS4)-1;
|
||||
}
|
||||
if (PyUnicode_READY(unicode) == -1) {
|
||||
return (Py_UCS4)-1;
|
||||
}
|
||||
if (index < 0 || index >= PyUnicode_GET_LENGTH(unicode)) {
|
||||
PyErr_SetString(PyExc_IndexError, "string index out of range");
|
||||
return (Py_UCS4)-1;
|
||||
|
@ -11668,10 +11671,13 @@ unicode_getitem(PyObject *self, Py_ssize_t index)
|
|||
enum PyUnicode_Kind kind;
|
||||
Py_UCS4 ch;
|
||||
|
||||
if (!PyUnicode_Check(self) || PyUnicode_READY(self) == -1) {
|
||||
if (!PyUnicode_Check(self)) {
|
||||
PyErr_BadArgument();
|
||||
return NULL;
|
||||
}
|
||||
if (PyUnicode_READY(self) == -1) {
|
||||
return NULL;
|
||||
}
|
||||
if (index < 0 || index >= PyUnicode_GET_LENGTH(self)) {
|
||||
PyErr_SetString(PyExc_IndexError, "string index out of range");
|
||||
return NULL;
|
||||
|
|
|
@ -5017,14 +5017,17 @@ import_all_from(PyObject *locals, PyObject *v)
|
|||
PyErr_Clear();
|
||||
break;
|
||||
}
|
||||
if (skip_leading_underscores &&
|
||||
PyUnicode_Check(name) &&
|
||||
PyUnicode_READY(name) != -1 &&
|
||||
PyUnicode_READ_CHAR(name, 0) == '_')
|
||||
{
|
||||
if (skip_leading_underscores && PyUnicode_Check(name)) {
|
||||
if (PyUnicode_READY(name) == -1) {
|
||||
Py_DECREF(name);
|
||||
err = -1;
|
||||
break;
|
||||
}
|
||||
if (PyUnicode_READ_CHAR(name, 0) == '_') {
|
||||
Py_DECREF(name);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
value = PyObject_GetAttr(v, name);
|
||||
if (value == NULL)
|
||||
err = -1;
|
||||
|
|
Loading…
Reference in New Issue