Skip to content

Commit 5ec52c3

Browse files
authored
[3.12] gh-112087: Fix reduce logic for the empty reverse iterator for list (gh-115471)
1 parent 7d9ce3c commit 5ec52c3

File tree

3 files changed

+9
-8
lines changed

3 files changed

+9
-8
lines changed

Lib/test/test_iter.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ def __eq__(self, other):
302302
# listiter_reduce_general
303303
self.assertEqual(
304304
run("reversed", orig["reversed"](list(range(8)))),
305-
(iter, ([],))
305+
(reversed, ([],))
306306
)
307307

308308
for case in types:
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
For an empty reverse iterator for list will be reduced to :func:`reversed`.
2+
Patch by Donghee Na.

Objects/listobject.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3441,36 +3441,35 @@ static PyObject *
34413441
listiter_reduce_general(void *_it, int forward)
34423442
{
34433443
PyObject *list;
3444+
PyObject *iter;
34443445

34453446
/* _PyEval_GetBuiltin can invoke arbitrary code,
34463447
* call must be before access of iterator pointers.
34473448
* see issue #101765 */
34483449

34493450
/* the objects are not the same, index is of different types! */
34503451
if (forward) {
3451-
PyObject *iter = _PyEval_GetBuiltin(&_Py_ID(iter));
3452+
iter = _PyEval_GetBuiltin(&_Py_ID(iter));
34523453
if (!iter) {
34533454
return NULL;
34543455
}
34553456
_PyListIterObject *it = (_PyListIterObject *)_it;
34563457
if (it->it_seq) {
34573458
return Py_BuildValue("N(O)n", iter, it->it_seq, it->it_index);
34583459
}
3459-
Py_DECREF(iter);
34603460
} else {
3461-
PyObject *reversed = _PyEval_GetBuiltin(&_Py_ID(reversed));
3462-
if (!reversed) {
3461+
iter = _PyEval_GetBuiltin(&_Py_ID(reversed));
3462+
if (!iter) {
34633463
return NULL;
34643464
}
34653465
listreviterobject *it = (listreviterobject *)_it;
34663466
if (it->it_seq) {
3467-
return Py_BuildValue("N(O)n", reversed, it->it_seq, it->it_index);
3467+
return Py_BuildValue("N(O)n", iter, it->it_seq, it->it_index);
34683468
}
3469-
Py_DECREF(reversed);
34703469
}
34713470
/* empty iterator, create an empty list */
34723471
list = PyList_New(0);
34733472
if (list == NULL)
34743473
return NULL;
3475-
return Py_BuildValue("N(N)", _PyEval_GetBuiltin(&_Py_ID(iter)), list);
3474+
return Py_BuildValue("N(N)", iter, list);
34763475
}

0 commit comments

Comments
 (0)