Skip to content

Commit 34fe4af

Browse files
skirpichevpicnixz
andauthored
[3.12] gh-126618: fix repr(itertools.count(sys.maxsize)) (GH-127048) (#127510)
(cherry picked from commit 930ba0c) Co-authored-by: Bénédikt Tran <[email protected]>
1 parent 34137cb commit 34fe4af

File tree

3 files changed

+28
-6
lines changed

3 files changed

+28
-6
lines changed

Lib/test/test_itertools.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -623,6 +623,15 @@ def test_count(self):
623623
self.assertEqual(next(c), -8)
624624
self.assertEqual(repr(count(10.25)), 'count(10.25)')
625625
self.assertEqual(repr(count(10.0)), 'count(10.0)')
626+
627+
self.assertEqual(repr(count(maxsize)), f'count({maxsize})')
628+
c = count(maxsize - 1)
629+
self.assertEqual(repr(c), f'count({maxsize - 1})')
630+
next(c) # c is now at masize
631+
self.assertEqual(repr(c), f'count({maxsize})')
632+
next(c)
633+
self.assertEqual(repr(c), f'count({maxsize + 1})')
634+
626635
self.assertEqual(type(next(count(10.0))), float)
627636
for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5):
628637
# Test repr
@@ -703,6 +712,20 @@ def test_count_with_stride(self):
703712
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
704713
self.pickletest(proto, count(i, j))
705714

715+
c = count(maxsize -2, 2)
716+
self.assertEqual(repr(c), f'count({maxsize - 2}, 2)')
717+
next(c) # c is now at masize
718+
self.assertEqual(repr(c), f'count({maxsize}, 2)')
719+
next(c)
720+
self.assertEqual(repr(c), f'count({maxsize + 2}, 2)')
721+
722+
c = count(maxsize + 1, -1)
723+
self.assertEqual(repr(c), f'count({maxsize + 1}, -1)')
724+
next(c) # c is now at masize
725+
self.assertEqual(repr(c), f'count({maxsize}, -1)')
726+
next(c)
727+
self.assertEqual(repr(c), f'count({maxsize - 1}, -1)')
728+
706729
def test_cycle(self):
707730
self.assertEqual(take(10, cycle('abc')), list('abcabcabca'))
708731
self.assertEqual(list(cycle('')), [])
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix the representation of :class:`itertools.count` objects when the count
2+
value is :data:`sys.maxsize`.

Modules/itertoolsmodule.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3981,7 +3981,7 @@ typedef struct {
39813981
39823982
fast_mode: when cnt an integer < PY_SSIZE_T_MAX and no step is specified.
39833983
3984-
assert(cnt != PY_SSIZE_T_MAX && long_cnt == NULL && long_step==PyLong(1));
3984+
assert(long_cnt == NULL && long_step==PyLong(1));
39853985
Advances with: cnt += 1
39863986
When count hits Y_SSIZE_T_MAX, switch to slow_mode.
39873987
@@ -4037,9 +4037,6 @@ itertools_count_impl(PyTypeObject *type, PyObject *long_cnt,
40374037
PyErr_Clear();
40384038
fast_mode = 0;
40394039
}
4040-
else if (cnt == PY_SSIZE_T_MAX) {
4041-
fast_mode = 0;
4042-
}
40434040
}
40444041
} else {
40454042
cnt = 0;
@@ -4071,7 +4068,7 @@ itertools_count_impl(PyTypeObject *type, PyObject *long_cnt,
40714068
else
40724069
cnt = PY_SSIZE_T_MAX;
40734070

4074-
assert((cnt != PY_SSIZE_T_MAX && long_cnt == NULL && fast_mode) ||
4071+
assert((long_cnt == NULL && fast_mode) ||
40754072
(cnt == PY_SSIZE_T_MAX && long_cnt != NULL && !fast_mode));
40764073
assert(!fast_mode ||
40774074
(PyLong_Check(long_step) && PyLong_AS_LONG(long_step) == 1));
@@ -4143,7 +4140,7 @@ count_next(countobject *lz)
41434140
static PyObject *
41444141
count_repr(countobject *lz)
41454142
{
4146-
if (lz->cnt != PY_SSIZE_T_MAX)
4143+
if (lz->long_cnt == NULL)
41474144
return PyUnicode_FromFormat("%s(%zd)",
41484145
_PyType_Name(Py_TYPE(lz)), lz->cnt);
41494146

0 commit comments

Comments
 (0)