Skip to content

Commit

Permalink
[3.13] gh-126618: fix repr(itertools.count(sys.maxsize)) (GH-127048) (#…
Browse files Browse the repository at this point in the history
…127508)

gh-126618: fix repr(itertools.count(sys.maxsize)) (GH-127048)
(cherry picked from commit 930ba0c)

Co-authored-by: Sergey B Kirpichev <[email protected]>
Co-authored-by: Bénédikt Tran <[email protected]>
  • Loading branch information
3 people authored Dec 2, 2024
1 parent 943e57e commit 4bafce0
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 6 deletions.
23 changes: 23 additions & 0 deletions Lib/test/test_itertools.py
Original file line number Diff line number Diff line change
Expand Up @@ -627,6 +627,15 @@ def test_count(self):
self.assertEqual(next(c), -8)
self.assertEqual(repr(count(10.25)), 'count(10.25)')
self.assertEqual(repr(count(10.0)), 'count(10.0)')

self.assertEqual(repr(count(maxsize)), f'count({maxsize})')
c = count(maxsize - 1)
self.assertEqual(repr(c), f'count({maxsize - 1})')
next(c) # c is now at masize
self.assertEqual(repr(c), f'count({maxsize})')
next(c)
self.assertEqual(repr(c), f'count({maxsize + 1})')

self.assertEqual(type(next(count(10.0))), float)
for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5):
# Test repr
Expand Down Expand Up @@ -707,6 +716,20 @@ def test_count_with_step(self):
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
self.pickletest(proto, count(i, j))

c = count(maxsize -2, 2)
self.assertEqual(repr(c), f'count({maxsize - 2}, 2)')
next(c) # c is now at masize
self.assertEqual(repr(c), f'count({maxsize}, 2)')
next(c)
self.assertEqual(repr(c), f'count({maxsize + 2}, 2)')

c = count(maxsize + 1, -1)
self.assertEqual(repr(c), f'count({maxsize + 1}, -1)')
next(c) # c is now at masize
self.assertEqual(repr(c), f'count({maxsize}, -1)')
next(c)
self.assertEqual(repr(c), f'count({maxsize - 1}, -1)')

@threading_helper.requires_working_threading()
def test_count_threading(self, step=1):
# this test verifies multithreading consistency, which is
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fix the representation of :class:`itertools.count` objects when the count
value is :data:`sys.maxsize`.
9 changes: 3 additions & 6 deletions Modules/itertoolsmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -4019,7 +4019,7 @@ typedef struct {
fast_mode: when cnt an integer < PY_SSIZE_T_MAX and no step is specified.
assert(cnt != PY_SSIZE_T_MAX && long_cnt == NULL && long_step==PyLong(1));
assert(long_cnt == NULL && long_step==PyLong(1));
Advances with: cnt += 1
When count hits PY_SSIZE_T_MAX, switch to slow_mode.
Expand Down Expand Up @@ -4075,9 +4075,6 @@ itertools_count_impl(PyTypeObject *type, PyObject *long_cnt,
PyErr_Clear();
fast_mode = 0;
}
else if (cnt == PY_SSIZE_T_MAX) {
fast_mode = 0;
}
}
} else {
cnt = 0;
Expand Down Expand Up @@ -4109,7 +4106,7 @@ itertools_count_impl(PyTypeObject *type, PyObject *long_cnt,
else
cnt = PY_SSIZE_T_MAX;

assert((cnt != PY_SSIZE_T_MAX && long_cnt == NULL && fast_mode) ||
assert((long_cnt == NULL && fast_mode) ||
(cnt == PY_SSIZE_T_MAX && long_cnt != NULL && !fast_mode));
assert(!fast_mode ||
(PyLong_Check(long_step) && PyLong_AS_LONG(long_step) == 1));
Expand Down Expand Up @@ -4202,7 +4199,7 @@ count_next(countobject *lz)
static PyObject *
count_repr(countobject *lz)
{
if (lz->cnt != PY_SSIZE_T_MAX)
if (lz->long_cnt == NULL)
return PyUnicode_FromFormat("%s(%zd)",
_PyType_Name(Py_TYPE(lz)), lz->cnt);

Expand Down

0 comments on commit 4bafce0

Please sign in to comment.