mirror of https://github.com/python/cpython
bpo-46236: Fix PyFunction_GetAnnotations() returned tuple. (GH-30409)
Automerge-Triggered-By: GH:pablogsal
This commit is contained in:
parent
dd50316e45
commit
46e4c257e7
|
@ -0,0 +1 @@
|
||||||
|
Fix a bug in :c:func:`PyFunction_GetAnnotations` that caused it to return a ``tuple`` instead of a ``dict``.
|
|
@ -274,6 +274,37 @@ PyFunction_SetClosure(PyObject *op, PyObject *closure)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
func_get_annotation_dict(PyFunctionObject *op)
|
||||||
|
{
|
||||||
|
if (op->func_annotations == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (PyTuple_CheckExact(op->func_annotations)) {
|
||||||
|
PyObject *ann_tuple = op->func_annotations;
|
||||||
|
PyObject *ann_dict = PyDict_New();
|
||||||
|
if (ann_dict == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(PyTuple_GET_SIZE(ann_tuple) % 2 == 0);
|
||||||
|
|
||||||
|
for (Py_ssize_t i = 0; i < PyTuple_GET_SIZE(ann_tuple); i += 2) {
|
||||||
|
int err = PyDict_SetItem(ann_dict,
|
||||||
|
PyTuple_GET_ITEM(ann_tuple, i),
|
||||||
|
PyTuple_GET_ITEM(ann_tuple, i + 1));
|
||||||
|
|
||||||
|
if (err < 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Py_SETREF(op->func_annotations, ann_dict);
|
||||||
|
}
|
||||||
|
Py_INCREF(op->func_annotations);
|
||||||
|
assert(PyDict_Check(op->func_annotations));
|
||||||
|
return op->func_annotations;
|
||||||
|
}
|
||||||
|
|
||||||
PyObject *
|
PyObject *
|
||||||
PyFunction_GetAnnotations(PyObject *op)
|
PyFunction_GetAnnotations(PyObject *op)
|
||||||
{
|
{
|
||||||
|
@ -281,7 +312,7 @@ PyFunction_GetAnnotations(PyObject *op)
|
||||||
PyErr_BadInternalCall();
|
PyErr_BadInternalCall();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return ((PyFunctionObject *) op) -> func_annotations;
|
return func_get_annotation_dict((PyFunctionObject *)op);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -501,27 +532,7 @@ func_get_annotations(PyFunctionObject *op, void *Py_UNUSED(ignored))
|
||||||
if (op->func_annotations == NULL)
|
if (op->func_annotations == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (PyTuple_CheckExact(op->func_annotations)) {
|
return func_get_annotation_dict(op);
|
||||||
PyObject *ann_tuple = op->func_annotations;
|
|
||||||
PyObject *ann_dict = PyDict_New();
|
|
||||||
if (ann_dict == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(PyTuple_GET_SIZE(ann_tuple) % 2 == 0);
|
|
||||||
|
|
||||||
for (Py_ssize_t i = 0; i < PyTuple_GET_SIZE(ann_tuple); i += 2) {
|
|
||||||
int err = PyDict_SetItem(ann_dict,
|
|
||||||
PyTuple_GET_ITEM(ann_tuple, i),
|
|
||||||
PyTuple_GET_ITEM(ann_tuple, i + 1));
|
|
||||||
|
|
||||||
if (err < 0)
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
Py_SETREF(op->func_annotations, ann_dict);
|
|
||||||
}
|
|
||||||
Py_INCREF(op->func_annotations);
|
|
||||||
return op->func_annotations;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
Loading…
Reference in New Issue