Skip to content

Commit 1739efc

Browse files
authored
[3.11] gh-112087: Fix reduce logic for the empty reverse iterator for list (gh-115472)
1 parent c12b0a2 commit 1739efc

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
@@ -3451,36 +3451,35 @@ static PyObject *
34513451
listiter_reduce_general(void *_it, int forward)
34523452
{
34533453
PyObject *list;
3454+
PyObject *iter;
34543455

34553456
/* _PyEval_GetBuiltin can invoke arbitrary code,
34563457
* call must be before access of iterator pointers.
34573458
* see issue #101765 */
34583459

34593460
/* the objects are not the same, index is of different types! */
34603461
if (forward) {
3461-
PyObject *iter = _PyEval_GetBuiltin(&_Py_ID(iter));
3462+
iter = _PyEval_GetBuiltin(&_Py_ID(iter));
34623463
if (!iter) {
34633464
return NULL;
34643465
}
34653466
listiterobject *it = (listiterobject *)_it;
34663467
if (it->it_seq) {
34673468
return Py_BuildValue("N(O)n", iter, it->it_seq, it->it_index);
34683469
}
3469-
Py_DECREF(iter);
34703470
} else {
3471-
PyObject *reversed = _PyEval_GetBuiltin(&_Py_ID(reversed));
3472-
if (!reversed) {
3471+
iter = _PyEval_GetBuiltin(&_Py_ID(reversed));
3472+
if (!iter) {
34733473
return NULL;
34743474
}
34753475
listreviterobject *it = (listreviterobject *)_it;
34763476
if (it->it_seq) {
3477-
return Py_BuildValue("N(O)n", reversed, it->it_seq, it->it_index);
3477+
return Py_BuildValue("N(O)n", iter, it->it_seq, it->it_index);
34783478
}
3479-
Py_DECREF(reversed);
34803479
}
34813480
/* empty iterator, create an empty list */
34823481
list = PyList_New(0);
34833482
if (list == NULL)
34843483
return NULL;
3485-
return Py_BuildValue("N(N)", _PyEval_GetBuiltin(&_Py_ID(iter)), list);
3484+
return Py_BuildValue("N(N)", iter, list);
34863485
}

0 commit comments

Comments
 (0)