Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 922a6cf

Browse files
gh-60203: Revert changes in cycle.__setstate__ (#99982)
In case if only True/False be supported as boolean arguments in future, we should continue to support 1/0 here.
1 parent 2488c1e commit 922a6cf

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

Lib/test/test_itertools.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,7 @@ def test_cycle(self):
675675
self.assertRaises(TypeError, cycle, 5)
676676
self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0])
677677

678+
def test_cycle_copy_pickle(self):
678679
# check copy, deepcopy, pickle
679680
c = cycle('abc')
680681
self.assertEqual(next(c), 'a')
@@ -710,6 +711,37 @@ def test_cycle(self):
710711
d = pickle.loads(p) # rebuild the cycle object
711712
self.assertEqual(take(20, d), list('cdeabcdeabcdeabcdeab'))
712713

714+
def test_cycle_unpickle_compat(self):
715+
testcases = [
716+
b'citertools\ncycle\n(c__builtin__\niter\n((lI1\naI2\naI3\natRI1\nbtR((lI1\naI0\ntb.',
717+
b'citertools\ncycle\n(c__builtin__\niter\n(](K\x01K\x02K\x03etRK\x01btR(]K\x01aK\x00tb.',
718+
b'\x80\x02citertools\ncycle\nc__builtin__\niter\n](K\x01K\x02K\x03e\x85RK\x01b\x85R]K\x01aK\x00\x86b.',
719+
b'\x80\x03citertools\ncycle\ncbuiltins\niter\n](K\x01K\x02K\x03e\x85RK\x01b\x85R]K\x01aK\x00\x86b.',
720+
b'\x80\x04\x95=\x00\x00\x00\x00\x00\x00\x00\x8c\titertools\x8c\x05cycle\x93\x8c\x08builtins\x8c\x04iter\x93](K\x01K\x02K\x03e\x85RK\x01b\x85R]K\x01aK\x00\x86b.',
721+
722+
b'citertools\ncycle\n(c__builtin__\niter\n((lp0\nI1\naI2\naI3\natRI1\nbtR(g0\nI1\ntb.',
723+
b'citertools\ncycle\n(c__builtin__\niter\n(]q\x00(K\x01K\x02K\x03etRK\x01btR(h\x00K\x01tb.',
724+
b'\x80\x02citertools\ncycle\nc__builtin__\niter\n]q\x00(K\x01K\x02K\x03e\x85RK\x01b\x85Rh\x00K\x01\x86b.',
725+
b'\x80\x03citertools\ncycle\ncbuiltins\niter\n]q\x00(K\x01K\x02K\x03e\x85RK\x01b\x85Rh\x00K\x01\x86b.',
726+
b'\x80\x04\x95<\x00\x00\x00\x00\x00\x00\x00\x8c\titertools\x8c\x05cycle\x93\x8c\x08builtins\x8c\x04iter\x93]\x94(K\x01K\x02K\x03e\x85RK\x01b\x85Rh\x00K\x01\x86b.',
727+
728+
b'citertools\ncycle\n(c__builtin__\niter\n((lI1\naI2\naI3\natRI1\nbtR((lI1\naI00\ntb.',
729+
b'citertools\ncycle\n(c__builtin__\niter\n(](K\x01K\x02K\x03etRK\x01btR(]K\x01aI00\ntb.',
730+
b'\x80\x02citertools\ncycle\nc__builtin__\niter\n](K\x01K\x02K\x03e\x85RK\x01b\x85R]K\x01a\x89\x86b.',
731+
b'\x80\x03citertools\ncycle\ncbuiltins\niter\n](K\x01K\x02K\x03e\x85RK\x01b\x85R]K\x01a\x89\x86b.',
732+
b'\x80\x04\x95<\x00\x00\x00\x00\x00\x00\x00\x8c\titertools\x8c\x05cycle\x93\x8c\x08builtins\x8c\x04iter\x93](K\x01K\x02K\x03e\x85RK\x01b\x85R]K\x01a\x89\x86b.',
733+
734+
b'citertools\ncycle\n(c__builtin__\niter\n((lp0\nI1\naI2\naI3\natRI1\nbtR(g0\nI01\ntb.',
735+
b'citertools\ncycle\n(c__builtin__\niter\n(]q\x00(K\x01K\x02K\x03etRK\x01btR(h\x00I01\ntb.',
736+
b'\x80\x02citertools\ncycle\nc__builtin__\niter\n]q\x00(K\x01K\x02K\x03e\x85RK\x01b\x85Rh\x00\x88\x86b.',
737+
b'\x80\x03citertools\ncycle\ncbuiltins\niter\n]q\x00(K\x01K\x02K\x03e\x85RK\x01b\x85Rh\x00\x88\x86b.',
738+
b'\x80\x04\x95;\x00\x00\x00\x00\x00\x00\x00\x8c\titertools\x8c\x05cycle\x93\x8c\x08builtins\x8c\x04iter\x93]\x94(K\x01K\x02K\x03e\x85RK\x01b\x85Rh\x00\x88\x86b.',
739+
]
740+
assert len(testcases) == 20
741+
for t in testcases:
742+
it = pickle.loads(t)
743+
self.assertEqual(take(10, it), [2, 3, 1, 2, 3, 1, 2, 3, 1, 2])
744+
713745
def test_cycle_setstate(self):
714746
# Verify both modes for restoring state
715747

@@ -739,6 +771,10 @@ def test_cycle_setstate(self):
739771
c.__setstate__((tuple('defg'), 0))
740772
take(20, c)
741773

774+
# The second argument in the setstate tuple must be an int
775+
with self.assertRaises(TypeError):
776+
cycle('defg').__setstate__((list('abcdefg'), 'x'))
777+
742778
self.assertRaises(TypeError, cycle('').__setstate__, ())
743779
self.assertRaises(TypeError, cycle('').__setstate__, ([],))
744780

Modules/itertoolsmodule.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1368,12 +1368,13 @@ cycle_setstate(cycleobject *lz, PyObject *state)
13681368
PyErr_SetString(PyExc_TypeError, "state is not a tuple");
13691369
return NULL;
13701370
}
1371-
if (!PyArg_ParseTuple(state, "O!p", &PyList_Type, &saved, &firstpass)) {
1371+
// The second item can be 1/0 in old pickles and True/False in new pickles
1372+
if (!PyArg_ParseTuple(state, "O!i", &PyList_Type, &saved, &firstpass)) {
13721373
return NULL;
13731374
}
13741375
Py_INCREF(saved);
13751376
Py_XSETREF(lz->saved, saved);
1376-
lz->firstpass = firstpass;
1377+
lz->firstpass = firstpass != 0;
13771378
lz->index = 0;
13781379
Py_RETURN_NONE;
13791380
}

0 commit comments

Comments
 (0)