[pypy-commit] pypy py3.5: Add setstate method to SeqIterObject (reubano & plan_rich)
reubano
pypy.commits at gmail.com
Sun Oct 9 04:54:47 EDT 2016
Author: Reuben Cummings <reubano at gmail.com>
Branch: py3.5
Changeset: r87652:1e446f2bd949
Date: 2016-10-09 11:52 +0300
http://bitbucket.org/pypy/pypy/changeset/1e446f2bd949/
Log: Add setstate method to SeqIterObject (reubano & plan_rich)
diff --git a/pypy/objspace/std/iterobject.py b/pypy/objspace/std/iterobject.py
--- a/pypy/objspace/std/iterobject.py
+++ b/pypy/objspace/std/iterobject.py
@@ -40,6 +40,15 @@
def descr_length_hint(self, space):
return self.getlength(space)
+ def descr_setstate(self, space, w_state):
+ index = space.int_w(w_state)
+ if self.w_seq is not space.w_None:
+ if index < 0:
+ index = 0
+
+ self.index = index
+
+
W_AbstractSeqIterObject.typedef = TypeDef(
"sequenceiterator",
__doc__ = '''iter(collection) -> iterator
@@ -52,6 +61,7 @@
__next__ = interpindirect2app(W_AbstractSeqIterObject.descr_next),
__reduce__ = interp2app(W_AbstractSeqIterObject.descr_reduce),
__length_hint__ = interp2app(W_AbstractSeqIterObject.descr_length_hint),
+ __setstate__ = interp2app(W_AbstractSeqIterObject.descr_setstate),
)
W_AbstractSeqIterObject.typedef.acceptable_as_base_class = False
diff --git a/pypy/objspace/std/test/test_iterobject.py b/pypy/objspace/std/test/test_iterobject.py
--- a/pypy/objspace/std/test/test_iterobject.py
+++ b/pypy/objspace/std/test/test_iterobject.py
@@ -19,7 +19,7 @@
w_tuple = self.space.newtuple([w(5), w(3), w(99)])
w_iter = W_SeqIterObject(w_tuple)
self.body3(w_iter)
-
+
def test_iter_builtin(self):
w = self.space.wrap
w_tuple = self.space.newtuple([w(5), w(3), w(99)])
@@ -30,7 +30,7 @@
w_list = self.space.newlist([])
w_iter = W_SeqIterObject(w_list)
self.body0(w_iter)
-
+
def test_emptyiter_builtin(self):
w_list = self.space.newlist([])
w_iter = self.space.iter(w_list)
@@ -63,10 +63,20 @@
iterable = [1,2,3,4]
raises(TypeError, len, iter(iterable))
+ def test_list_iter_setstate(self):
+ iterable = iter([1,2,3,4])
+ assert next(iterable) == 1
+ iterable.__setstate__(0)
+ assert next(iterable) == 1
+ iterable.__setstate__(-100)
+ assert next(iterable) == 1
+ raises(TypeError, iterable.__setstate__, '0')
+
+
def test_no_len_on_tuple_iter(self):
iterable = (1,2,3,4)
raises(TypeError, len, iter(iterable))
-
+
def test_no_len_on_deque_iter(self):
from _collections import deque
iterable = deque([1,2,3,4])
More information about the pypy-commit
mailing list