[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