mirror of
https://github.com/python/cpython.git
synced 2025-08-22 17:55:18 +00:00
[3.10] bpo-46940: Don't override existing AttributeError suggestion information (GH-31710) (GH-31724)
When an exception is created in a nested call to PyObject_GetAttr, any
external calls will override the context information of the
AttributeError that we have already placed in the most internal call.
This will cause the suggestions we create to nor work properly as the
attribute name and object that we will be using are the incorrect ones.
To avoid this, we need to check first if these attributes are already
set and bail out if that's the case..
(cherry picked from commit 3b3be05a16
)
Co-authored-by: Pablo Galindo Salgado <Pablogsal@gmail.com>
This commit is contained in:
parent
8acbb93c07
commit
3594ebca2c
4 changed files with 48 additions and 15 deletions
|
@ -6261,9 +6261,12 @@ format_exc_check_arg(PyThreadState *tstate, PyObject *exc,
|
|||
PyErr_Fetch(&type, &value, &traceback);
|
||||
PyErr_NormalizeException(&type, &value, &traceback);
|
||||
if (PyErr_GivenExceptionMatches(value, PyExc_NameError)) {
|
||||
// We do not care if this fails because we are going to restore the
|
||||
// NameError anyway.
|
||||
(void)_PyObject_SetAttrId(value, &PyId_name, obj);
|
||||
PyNameErrorObject* exc = (PyNameErrorObject*) value;
|
||||
if (exc->name == NULL) {
|
||||
// We do not care if this fails because we are going to restore the
|
||||
// NameError anyway.
|
||||
(void)_PyObject_SetAttrId(value, &PyId_name, obj);
|
||||
}
|
||||
}
|
||||
PyErr_Restore(type, value, traceback);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue