[pypy-commit] pypy py3.3: Add support for pickling set iterator

amauryfa noreply at buildbot.pypy.org
Tue Mar 10 21:56:44 CET 2015


Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: py3.3
Changeset: r76301:91188a5ae517
Date: 2015-03-06 16:10 +0100
http://bitbucket.org/pypy/pypy/changeset/91188a5ae517/

Log:	Add support for pickling set iterator

diff --git a/pypy/objspace/std/setobject.py b/pypy/objspace/std/setobject.py
--- a/pypy/objspace/std/setobject.py
+++ b/pypy/objspace/std/setobject.py
@@ -1520,10 +1520,23 @@
             return w_key
         raise OperationError(space.w_StopIteration, space.w_None)
 
+    def descr_reduce(self, space):
+        # copy the iterator state
+        w_set = self.iterimplementation.setimplementation
+        w_clone = W_SetIterObject(space, w_set.iter())
+        # spool until we have the same pos
+        for x in xrange(self.iterimplementation.pos):
+            w_clone.descr_next(space)
+        w_res = space.call_function(space.w_list, w_clone)
+        w_iter = space.builtin.get('iter')
+        return space.newtuple([w_iter, space.newtuple([w_res])])
+
+
 W_SetIterObject.typedef = TypeDef("setiterator",
     __length_hint__ = gateway.interp2app(W_SetIterObject.descr_length_hint),
     __iter__ = gateway.interp2app(W_SetIterObject.descr_iter),
-    __next__ = gateway.interp2app(W_SetIterObject.descr_next)
+    __next__ = gateway.interp2app(W_SetIterObject.descr_next),
+    __reduce__ = gateway.interp2app(W_SetIterObject.descr_reduce),
     )
 setiter_typedef = W_SetIterObject.typedef
 
diff --git a/pypy/objspace/std/test/test_setobject.py b/pypy/objspace/std/test/test_setobject.py
--- a/pypy/objspace/std/test/test_setobject.py
+++ b/pypy/objspace/std/test/test_setobject.py
@@ -1062,3 +1062,17 @@
         s = set([1, 2, 3])
         s.intersection_update(set())
         assert strategy(s) == "EmptySetStrategy"
+
+    def test_pickle(self):
+        d = {1, 2, 3}
+        it = iter(d)
+        first = next(it)
+        reduced = it.__reduce__()
+        rebuild, args = reduced
+        assert rebuild is iter
+        new = rebuild(*args)
+        items = set(new)
+        assert len(items) == 2
+        items.add(first)
+        assert items == set(d)        
+


More information about the pypy-commit mailing list