summaryrefslogtreecommitdiffstats
path: root/Objects/funcobject.c
diff options
context:
space:
mode:
authorInada Naoki <songofacandy@gmail.com>2022-01-05 12:25:54 (GMT)
committerGitHub <noreply@github.com>2022-01-05 12:25:54 (GMT)
commit46e4c257e7c26c813620232135781e6c53fe8d4d (patch)
tree582c3702756fe8314ef514dbf4c7327f46630ce8 /Objects/funcobject.c
parentdd50316e458d7c3284f8948b0606d8aa91ab855d (diff)
downloadcpython-46e4c257e7c26c813620232135781e6c53fe8d4d.zip
cpython-46e4c257e7c26c813620232135781e6c53fe8d4d.tar.gz
cpython-46e4c257e7c26c813620232135781e6c53fe8d4d.tar.bz2
bpo-46236: Fix PyFunction_GetAnnotations() returned tuple. (GH-30409)
Automerge-Triggered-By: GH:pablogsal
Diffstat (limited to 'Objects/funcobject.c')
-rw-r--r--Objects/funcobject.c55
1 files changed, 33 insertions, 22 deletions
diff --git a/Objects/funcobject.c b/Objects/funcobject.c
index 7891e4f..a8f006d 100644
--- a/Objects/funcobject.c
+++ b/Objects/funcobject.c
@@ -274,6 +274,37 @@ PyFunction_SetClosure(PyObject *op, PyObject *closure)
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 *
PyFunction_GetAnnotations(PyObject *op)
{
@@ -281,7 +312,7 @@ PyFunction_GetAnnotations(PyObject *op)
PyErr_BadInternalCall();
return NULL;
}
- return ((PyFunctionObject *) op) -> func_annotations;
+ return func_get_annotation_dict((PyFunctionObject *)op);
}
int
@@ -501,27 +532,7 @@ func_get_annotations(PyFunctionObject *op, void *Py_UNUSED(ignored))
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);
- return op->func_annotations;
+ return func_get_annotation_dict(op);
}
static int