mirror of https://github.com/python/cpython.git
[3.11] gh-106030: Miscellaneous fixes in Python/suggestions.c (GH-106… (GH-106039)
* PyUnicode_CompareWithASCIIString() only works if the second argument
is ASCII string.
* Refleak in get_suggestions_for_name_error.
* Add some missing error checks.
(cherry picked from commit c8c162ef52
)
This commit is contained in:
parent
15f4bba7a7
commit
26d87fd5c7
|
@ -147,14 +147,14 @@ calculate_suggestions(PyObject *dir,
|
||||||
|
|
||||||
for (int i = 0; i < dir_size; ++i) {
|
for (int i = 0; i < dir_size; ++i) {
|
||||||
PyObject *item = PyList_GET_ITEM(dir, i);
|
PyObject *item = PyList_GET_ITEM(dir, i);
|
||||||
|
if (_PyUnicode_Equal(name, item)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
Py_ssize_t item_size;
|
Py_ssize_t item_size;
|
||||||
const char *item_str = PyUnicode_AsUTF8AndSize(item, &item_size);
|
const char *item_str = PyUnicode_AsUTF8AndSize(item, &item_size);
|
||||||
if (item_str == NULL) {
|
if (item_str == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (PyUnicode_CompareWithASCIIString(name, item_str) == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// No more than 1/3 of the involved characters should need changed.
|
// No more than 1/3 of the involved characters should need changed.
|
||||||
Py_ssize_t max_distance = (name_size + item_size + 3) * MOVE_COST / 6;
|
Py_ssize_t max_distance = (name_size + item_size + 3) * MOVE_COST / 6;
|
||||||
// Don't take matches we've already beaten.
|
// Don't take matches we've already beaten.
|
||||||
|
@ -225,19 +225,19 @@ offer_suggestions_for_name_error(PyNameErrorObject *exc)
|
||||||
PyCodeObject *code = PyFrame_GetCode(frame);
|
PyCodeObject *code = PyFrame_GetCode(frame);
|
||||||
assert(code != NULL && code->co_localsplusnames != NULL);
|
assert(code != NULL && code->co_localsplusnames != NULL);
|
||||||
PyObject *varnames = _PyCode_GetVarnames(code);
|
PyObject *varnames = _PyCode_GetVarnames(code);
|
||||||
|
Py_DECREF(code);
|
||||||
if (varnames == NULL) {
|
if (varnames == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
PyObject *dir = PySequence_List(varnames);
|
PyObject *dir = PySequence_List(varnames);
|
||||||
Py_DECREF(varnames);
|
Py_DECREF(varnames);
|
||||||
Py_DECREF(code);
|
|
||||||
if (dir == NULL) {
|
if (dir == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObject *suggestions = calculate_suggestions(dir, name);
|
PyObject *suggestions = calculate_suggestions(dir, name);
|
||||||
Py_DECREF(dir);
|
Py_DECREF(dir);
|
||||||
if (suggestions != NULL) {
|
if (suggestions != NULL|| PyErr_Occurred()) {
|
||||||
return suggestions;
|
return suggestions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -247,7 +247,7 @@ offer_suggestions_for_name_error(PyNameErrorObject *exc)
|
||||||
}
|
}
|
||||||
suggestions = calculate_suggestions(dir, name);
|
suggestions = calculate_suggestions(dir, name);
|
||||||
Py_DECREF(dir);
|
Py_DECREF(dir);
|
||||||
if (suggestions != NULL) {
|
if (suggestions != NULL || PyErr_Occurred()) {
|
||||||
return suggestions;
|
return suggestions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue