summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2022-11-30 21:04:30 (GMT)
committerGitHub <noreply@github.com>2022-11-30 21:04:30 (GMT)
commit787764219f874ce2035699ed772af1e9f3bbf813 (patch)
treecad58073df5fba2f204c4633054ba6a91daf542e /Lib
parent9628136fac997847b4662e6a17faf06d2a0507eb (diff)
downloadcpython-787764219f874ce2035699ed772af1e9f3bbf813.zip
cpython-787764219f874ce2035699ed772af1e9f3bbf813.tar.gz
cpython-787764219f874ce2035699ed772af1e9f3bbf813.tar.bz2
gh-89189: More compact range iterator (GH-27986)
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_range.py38
-rw-r--r--Lib/test/test_sys.py3
2 files changed, 35 insertions, 6 deletions
diff --git a/Lib/test/test_range.py b/Lib/test/test_range.py
index 851ad5b..7be76b3 100644
--- a/Lib/test/test_range.py
+++ b/Lib/test/test_range.py
@@ -407,11 +407,7 @@ class RangeTest(unittest.TestCase):
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
with self.subTest(proto=proto):
it = iter(range(2**32 + 2))
- _, _, idx = it.__reduce__()
- self.assertEqual(idx, 0)
- it.__setstate__(2**32 + 1) # undocumented way to set r->index
- _, _, idx = it.__reduce__()
- self.assertEqual(idx, 2**32 + 1)
+ it.__setstate__(2**32 + 1) # undocumented way to advance an iterator
d = pickle.dumps(it, proto)
it = pickle.loads(d)
self.assertEqual(next(it), 2**32 + 1)
@@ -442,6 +438,38 @@ class RangeTest(unittest.TestCase):
self.assertEqual(list(i), [])
self.assertEqual(list(i2), [])
+ def test_iterator_unpickle_compat(self):
+ testcases = [
+ b'c__builtin__\niter\n(c__builtin__\nxrange\n(I10\nI20\nI2\ntRtRI2\nb.',
+ b'c__builtin__\niter\n(c__builtin__\nxrange\n(K\nK\x14K\x02tRtRK\x02b.',
+ b'\x80\x02c__builtin__\niter\nc__builtin__\nxrange\nK\nK\x14K\x02\x87R\x85RK\x02b.',
+ b'\x80\x03cbuiltins\niter\ncbuiltins\nrange\nK\nK\x14K\x02\x87R\x85RK\x02b.',
+ b'\x80\x04\x951\x00\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x8c\x04iter\x93\x8c\x08builtins\x8c\x05range\x93K\nK\x14K\x02\x87R\x85RK\x02b.',
+
+ b'c__builtin__\niter\n(c__builtin__\nxrange\n(L-36893488147419103232L\nI20\nI2\ntRtRL18446744073709551623L\nb.',
+ b'c__builtin__\niter\n(c__builtin__\nxrange\n(L-36893488147419103232L\nK\x14K\x02tRtRL18446744073709551623L\nb.',
+ b'\x80\x02c__builtin__\niter\nc__builtin__\nxrange\n\x8a\t\x00\x00\x00\x00\x00\x00\x00\x00\xfeK\x14K\x02\x87R\x85R\x8a\t\x07\x00\x00\x00\x00\x00\x00\x00\x01b.',
+ b'\x80\x03cbuiltins\niter\ncbuiltins\nrange\n\x8a\t\x00\x00\x00\x00\x00\x00\x00\x00\xfeK\x14K\x02\x87R\x85R\x8a\t\x07\x00\x00\x00\x00\x00\x00\x00\x01b.',
+ b'\x80\x04\x95C\x00\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x8c\x04iter\x93\x8c\x08builtins\x8c\x05range\x93\x8a\t\x00\x00\x00\x00\x00\x00\x00\x00\xfeK\x14K\x02\x87R\x85R\x8a\t\x07\x00\x00\x00\x00\x00\x00\x00\x01b.',
+ ]
+ for t in testcases:
+ it = pickle.loads(t)
+ self.assertEqual(list(it), [14, 16, 18])
+
+ def test_iterator_setstate(self):
+ it = iter(range(10, 20, 2))
+ it.__setstate__(2)
+ self.assertEqual(list(it), [14, 16, 18])
+ it = reversed(range(10, 20, 2))
+ it.__setstate__(3)
+ self.assertEqual(list(it), [12, 10])
+ it = iter(range(-2**65, 20, 2))
+ it.__setstate__(2**64 + 7)
+ self.assertEqual(list(it), [14, 16, 18])
+ it = reversed(range(10, 2**65, 2))
+ it.__setstate__(2**64 - 7)
+ self.assertEqual(list(it), [12, 10])
+
def test_odd_bug(self):
# This used to raise a "SystemError: NULL result without error"
# because the range validation step was eating the exception
diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py
index 2403c7c..17a5026 100644
--- a/Lib/test/test_sys.py
+++ b/Lib/test/test_sys.py
@@ -1484,7 +1484,8 @@ class SizeofTest(unittest.TestCase):
# PyCapsule
# XXX
# rangeiterator
- check(iter(range(1)), size('4l'))
+ check(iter(range(1)), size('3l'))
+ check(iter(range(2**65)), size('3P'))
# reverse
check(reversed(''), size('nP'))
# range