mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
[3.11] gh-106719: Fix __annotations__ getter and setter in the type and module types (GH-106720) (GH-106850)
No longer suppress arbitrary errors. Simplify the code.
(cherry picked from commit e1c295e3da
)
This commit is contained in:
parent
a7acc5cb5c
commit
fb04874053
3 changed files with 35 additions and 48 deletions
|
@ -881,26 +881,20 @@ static PyObject *
|
|||
module_get_annotations(PyModuleObject *m, void *Py_UNUSED(ignored))
|
||||
{
|
||||
PyObject *dict = PyObject_GetAttr((PyObject *)m, &_Py_ID(__dict__));
|
||||
|
||||
if ((dict == NULL) || !PyDict_Check(dict)) {
|
||||
if (dict == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
if (!PyDict_Check(dict)) {
|
||||
PyErr_Format(PyExc_TypeError, "<module>.__dict__ is not a dictionary");
|
||||
Py_XDECREF(dict);
|
||||
Py_DECREF(dict);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PyObject *annotations;
|
||||
/* there's no _PyDict_GetItemId without WithError, so let's LBYL. */
|
||||
if (PyDict_Contains(dict, &_Py_ID(__annotations__))) {
|
||||
annotations = PyDict_GetItemWithError(dict, &_Py_ID(__annotations__));
|
||||
/*
|
||||
** _PyDict_GetItemIdWithError could still fail,
|
||||
** for instance with a well-timed Ctrl-C or a MemoryError.
|
||||
** so let's be totally safe.
|
||||
*/
|
||||
if (annotations) {
|
||||
Py_INCREF(annotations);
|
||||
}
|
||||
} else {
|
||||
PyObject *annotations = PyDict_GetItemWithError(dict, &_Py_ID(__annotations__));
|
||||
if (annotations) {
|
||||
Py_INCREF(annotations);
|
||||
}
|
||||
else if (!PyErr_Occurred()) {
|
||||
annotations = PyDict_New();
|
||||
if (annotations) {
|
||||
int result = PyDict_SetItem(
|
||||
|
@ -919,8 +913,10 @@ module_set_annotations(PyModuleObject *m, PyObject *value, void *Py_UNUSED(ignor
|
|||
{
|
||||
int ret = -1;
|
||||
PyObject *dict = PyObject_GetAttr((PyObject *)m, &_Py_ID(__dict__));
|
||||
|
||||
if ((dict == NULL) || !PyDict_Check(dict)) {
|
||||
if (dict == NULL) {
|
||||
return -1;
|
||||
}
|
||||
if (!PyDict_Check(dict)) {
|
||||
PyErr_Format(PyExc_TypeError, "<module>.__dict__ is not a dictionary");
|
||||
goto exit;
|
||||
}
|
||||
|
@ -928,19 +924,17 @@ module_set_annotations(PyModuleObject *m, PyObject *value, void *Py_UNUSED(ignor
|
|||
if (value != NULL) {
|
||||
/* set */
|
||||
ret = PyDict_SetItem(dict, &_Py_ID(__annotations__), value);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* delete */
|
||||
if (!PyDict_Contains(dict, &_Py_ID(__annotations__))) {
|
||||
PyErr_Format(PyExc_AttributeError, "__annotations__");
|
||||
goto exit;
|
||||
else {
|
||||
/* delete */
|
||||
ret = PyDict_DelItem(dict, &_Py_ID(__annotations__));
|
||||
if (ret < 0 && PyErr_ExceptionMatches(PyExc_KeyError)) {
|
||||
PyErr_SetString(PyExc_AttributeError, "__annotations__");
|
||||
}
|
||||
}
|
||||
|
||||
ret = PyDict_DelItem(dict, &_Py_ID(__annotations__));
|
||||
|
||||
exit:
|
||||
Py_XDECREF(dict);
|
||||
Py_DECREF(dict);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue