From 39255a9a8c1ab7a71c69cc9678f39eff2c1a3cdd Mon Sep 17 00:00:00 2001 From: Donghee Na Date: Thu, 15 Feb 2024 02:08:49 +0900 Subject: [PATCH] gh-112087: Fix the logic for the empty reverse iterator for list --- Lib/test/test_iter.py | 2 +- .../2024-02-14-23-50-55.gh-issue-112087.H_4W_v.rst | 2 ++ Objects/listobject.c | 13 ++++++------- 3 files changed, 9 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2024-02-14-23-50-55.gh-issue-112087.H_4W_v.rst diff --git a/Lib/test/test_iter.py b/Lib/test/test_iter.py index 30aedb0db3bb3d..9606d5beab71cb 100644 --- a/Lib/test/test_iter.py +++ b/Lib/test/test_iter.py @@ -302,7 +302,7 @@ def __eq__(self, other): # listiter_reduce_general self.assertEqual( run("reversed", orig["reversed"](list(range(8)))), - (iter, ([],)) + (reversed, ([],)) ) for case in types: diff --git a/Misc/NEWS.d/next/Core and Builtins/2024-02-14-23-50-55.gh-issue-112087.H_4W_v.rst b/Misc/NEWS.d/next/Core and Builtins/2024-02-14-23-50-55.gh-issue-112087.H_4W_v.rst new file mode 100644 index 00000000000000..05c135347d6a17 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2024-02-14-23-50-55.gh-issue-112087.H_4W_v.rst @@ -0,0 +1,2 @@ +For an empty reverse iterator for list will be reduced to :func:`reversed`. +Patch by Donghee Na. diff --git a/Objects/listobject.c b/Objects/listobject.c index f1edfb3a9a039d..f59abe2e644f14 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -3441,6 +3441,7 @@ static PyObject * listiter_reduce_general(void *_it, int forward) { PyObject *list; + PyObject *iter; /* _PyEval_GetBuiltin can invoke arbitrary code, * call must be before access of iterator pointers. @@ -3448,7 +3449,7 @@ listiter_reduce_general(void *_it, int forward) /* the objects are not the same, index is of different types! */ if (forward) { - PyObject *iter = _PyEval_GetBuiltin(&_Py_ID(iter)); + iter = _PyEval_GetBuiltin(&_Py_ID(iter)); if (!iter) { return NULL; } @@ -3456,21 +3457,19 @@ listiter_reduce_general(void *_it, int forward) if (it->it_seq) { return Py_BuildValue("N(O)n", iter, it->it_seq, it->it_index); } - Py_DECREF(iter); } else { - PyObject *reversed = _PyEval_GetBuiltin(&_Py_ID(reversed)); - if (!reversed) { + iter = _PyEval_GetBuiltin(&_Py_ID(reversed)); + if (!iter) { return NULL; } listreviterobject *it = (listreviterobject *)_it; if (it->it_seq) { - return Py_BuildValue("N(O)n", reversed, it->it_seq, it->it_index); + return Py_BuildValue("N(O)n", iter, it->it_seq, it->it_index); } - Py_DECREF(reversed); } /* empty iterator, create an empty list */ list = PyList_New(0); if (list == NULL) return NULL; - return Py_BuildValue("N(N)", _PyEval_GetBuiltin(&_Py_ID(iter)), list); + return Py_BuildValue("N(N)", iter, list); }