]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] gh-112087: Fix reduce logic for the empty reverse iterator for list (gh-115471)
authorDonghee Na <donghee.na@python.org>
Wed, 14 Feb 2024 18:44:26 +0000 (03:44 +0900)
committerGitHub <noreply@github.com>
Wed, 14 Feb 2024 18:44:26 +0000 (18:44 +0000)
Lib/test/test_iter.py
Misc/NEWS.d/next/Core and Builtins/2024-02-14-23-50-55.gh-issue-112087.H_4W_v.rst [new file with mode: 0644]
Objects/listobject.c

index 30aedb0db3bb3dbf4e5cf9aba5fd1a05af179764..9606d5beab71cb0a4990c6acb42a17bf3d942b73 100644 (file)
@@ -302,7 +302,7 @@ class TestCase(unittest.TestCase):
             # 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 (file)
index 0000000..05c1353
--- /dev/null
@@ -0,0 +1,2 @@
+For an empty reverse iterator for list will be reduced to :func:`reversed`.
+Patch by Donghee Na.
index f1edfb3a9a039d62d0dd540dc9c43aa16fb3d51b..f59abe2e644f14c599410cbb8316d548c9bfd6b6 100644 (file)
@@ -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);
 }