mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
bpo-32571: Avoid raising unneeded AttributeError and silencing it in C code (GH-5222)
Add two new private APIs: _PyObject_LookupAttr() and _PyObject_LookupAttrId()
This commit is contained in:
parent
2b822a0bb1
commit
f320be77ff
22 changed files with 1455 additions and 1442 deletions
|
@ -352,13 +352,11 @@ gen_close_iter(PyObject *yf)
|
|||
return -1;
|
||||
}
|
||||
else {
|
||||
PyObject *meth = _PyObject_GetAttrId(yf, &PyId_close);
|
||||
if (meth == NULL) {
|
||||
if (!PyErr_ExceptionMatches(PyExc_AttributeError))
|
||||
PyErr_WriteUnraisable(yf);
|
||||
PyErr_Clear();
|
||||
PyObject *meth;
|
||||
if (_PyObject_LookupAttrId(yf, &PyId_close, &meth) < 0) {
|
||||
PyErr_WriteUnraisable(yf);
|
||||
}
|
||||
else {
|
||||
if (meth) {
|
||||
retval = _PyObject_CallNoArg(meth);
|
||||
Py_DECREF(meth);
|
||||
if (retval == NULL)
|
||||
|
@ -471,13 +469,12 @@ _gen_throw(PyGenObject *gen, int close_on_genexit,
|
|||
gen->gi_running = 0;
|
||||
} else {
|
||||
/* `yf` is an iterator or a coroutine-like object. */
|
||||
PyObject *meth = _PyObject_GetAttrId(yf, &PyId_throw);
|
||||
PyObject *meth;
|
||||
if (_PyObject_LookupAttrId(yf, &PyId_throw, &meth) < 0) {
|
||||
Py_DECREF(yf);
|
||||
return NULL;
|
||||
}
|
||||
if (meth == NULL) {
|
||||
if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
|
||||
Py_DECREF(yf);
|
||||
return NULL;
|
||||
}
|
||||
PyErr_Clear();
|
||||
Py_DECREF(yf);
|
||||
goto throw_here;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue