From d46f37e060897732c2ee2d7e0e098764c2a8972a Mon Sep 17 00:00:00 2001 From: Larry Hastings Date: Wed, 5 Oct 2022 17:03:49 -0700 Subject: [PATCH] gh-97943: PyFunction_GetAnnotations should return a borrowed reference. It was returning a new reference, which isn't how it used to work, and isn't how it's documented. --- .../2022-10-05-17-02-22.gh-issue-97943.LYAWlE.rst | 2 ++ Objects/funcobject.c | 7 +++++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2022-10-05-17-02-22.gh-issue-97943.LYAWlE.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-10-05-17-02-22.gh-issue-97943.LYAWlE.rst b/Misc/NEWS.d/next/Core and Builtins/2022-10-05-17-02-22.gh-issue-97943.LYAWlE.rst new file mode 100644 index 00000000000000..9b4a421a9d475a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-10-05-17-02-22.gh-issue-97943.LYAWlE.rst @@ -0,0 +1,2 @@ +Bugfix: :func:`PyFunction_GetAnnotations` should return a borrowed +reference. It was returning a new reference. diff --git a/Objects/funcobject.c b/Objects/funcobject.c index 7f257a9986987b..ccc6d0b52eab68 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -311,7 +311,6 @@ func_get_annotation_dict(PyFunctionObject *op) } Py_SETREF(op->func_annotations, ann_dict); } - Py_INCREF(op->func_annotations); assert(PyDict_Check(op->func_annotations)); return op->func_annotations; } @@ -543,7 +542,11 @@ func_get_annotations(PyFunctionObject *op, void *Py_UNUSED(ignored)) if (op->func_annotations == NULL) return NULL; } - return func_get_annotation_dict(op); + PyObject *d = func_get_annotation_dict(op); + if (d) { + Py_INCREF(d); + } + return d; } static int