mirror of
https://github.com/python/cpython.git
synced 2025-07-23 03:05:38 +00:00
[3.13] gh-126618: fix repr(itertools.count(sys.maxsize)) (GH-127048) (#127508)
gh-126618: fix repr(itertools.count(sys.maxsize)) (GH-127048)
(cherry picked from commit 930ba0ce60
)
Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com>
Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
This commit is contained in:
parent
943e57e1ce
commit
4bafce0912
3 changed files with 28 additions and 6 deletions
|
@ -627,6 +627,15 @@ class TestBasicOps(unittest.TestCase):
|
||||||
self.assertEqual(next(c), -8)
|
self.assertEqual(next(c), -8)
|
||||||
self.assertEqual(repr(count(10.25)), 'count(10.25)')
|
self.assertEqual(repr(count(10.25)), 'count(10.25)')
|
||||||
self.assertEqual(repr(count(10.0)), 'count(10.0)')
|
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)
|
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):
|
for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5):
|
||||||
# Test repr
|
# Test repr
|
||||||
|
@ -707,6 +716,20 @@ class TestBasicOps(unittest.TestCase):
|
||||||
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
|
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
|
||||||
self.pickletest(proto, count(i, j))
|
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()
|
@threading_helper.requires_working_threading()
|
||||||
def test_count_threading(self, step=1):
|
def test_count_threading(self, step=1):
|
||||||
# this test verifies multithreading consistency, which is
|
# this test verifies multithreading consistency, which is
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix the representation of :class:`itertools.count` objects when the count
|
||||||
|
value is :data:`sys.maxsize`.
|
|
@ -4019,7 +4019,7 @@ typedef struct {
|
||||||
|
|
||||||
fast_mode: when cnt an integer < PY_SSIZE_T_MAX and no step is specified.
|
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
|
Advances with: cnt += 1
|
||||||
When count hits PY_SSIZE_T_MAX, switch to slow_mode.
|
When count hits PY_SSIZE_T_MAX, switch to slow_mode.
|
||||||
|
|
||||||
|
@ -4075,9 +4075,6 @@ itertools_count_impl(PyTypeObject *type, PyObject *long_cnt,
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
fast_mode = 0;
|
fast_mode = 0;
|
||||||
}
|
}
|
||||||
else if (cnt == PY_SSIZE_T_MAX) {
|
|
||||||
fast_mode = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
cnt = 0;
|
cnt = 0;
|
||||||
|
@ -4109,7 +4106,7 @@ itertools_count_impl(PyTypeObject *type, PyObject *long_cnt,
|
||||||
else
|
else
|
||||||
cnt = PY_SSIZE_T_MAX;
|
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));
|
(cnt == PY_SSIZE_T_MAX && long_cnt != NULL && !fast_mode));
|
||||||
assert(!fast_mode ||
|
assert(!fast_mode ||
|
||||||
(PyLong_Check(long_step) && PyLong_AS_LONG(long_step) == 1));
|
(PyLong_Check(long_step) && PyLong_AS_LONG(long_step) == 1));
|
||||||
|
@ -4202,7 +4199,7 @@ count_next(countobject *lz)
|
||||||
static PyObject *
|
static PyObject *
|
||||||
count_repr(countobject *lz)
|
count_repr(countobject *lz)
|
||||||
{
|
{
|
||||||
if (lz->cnt != PY_SSIZE_T_MAX)
|
if (lz->long_cnt == NULL)
|
||||||
return PyUnicode_FromFormat("%s(%zd)",
|
return PyUnicode_FromFormat("%s(%zd)",
|
||||||
_PyType_Name(Py_TYPE(lz)), lz->cnt);
|
_PyType_Name(Py_TYPE(lz)), lz->cnt);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue