Author: Mark Young <[email protected]>
Branch: py3k
Changeset: r84266:e31a3547aa90
Date: 2016-05-06 01:13 -0400
http://bitbucket.org/pypy/pypy/changeset/e31a3547aa90/

Log:    Fix deque as I meant to do before. Added tests specifically testing
        pickleability of deque iterators.

diff --git a/lib-python/conftest.py b/lib-python/conftest.py
--- a/lib-python/conftest.py
+++ b/lib-python/conftest.py
@@ -149,7 +149,7 @@
     RegrTest('test_codecmaps_jp.py', usemodules='_multibytecodec'),
     RegrTest('test_codecmaps_kr.py', usemodules='_multibytecodec'),
     RegrTest('test_codecmaps_tw.py', usemodules='_multibytecodec'),
-    RegrTest('test_codecs.py', core=True, usemodules='_multibytecodec'),
+    RegrTest('test_codecs.py', core=True, usemodules='_multibytecodec struct 
unicodedata array'),
     RegrTest('test_codeop.py', core=True),
     RegrTest('test_coding.py', core=True),
     RegrTest('test_collections.py', usemodules='binascii struct'),
@@ -179,7 +179,7 @@
     RegrTest('test_decimal.py'),
     RegrTest('test_decorators.py', core=True),
     RegrTest('test_defaultdict.py', usemodules='_collections'),
-    RegrTest('test_deque.py', core=True, usemodules='_collections'),
+    RegrTest('test_deque.py', core=True, usemodules='_collections struct'),
     RegrTest('test_descr.py', core=True, usemodules='_weakref'),
     RegrTest('test_descrtut.py', core=True),
     RegrTest('test_devpoll.py'),
diff --git a/pypy/module/_collections/interp_deque.py 
b/pypy/module/_collections/interp_deque.py
--- a/pypy/module/_collections/interp_deque.py
+++ b/pypy/module/_collections/interp_deque.py
@@ -533,7 +533,16 @@
         return self.space.newtuple([self.space.gettypefor(W_DequeIter),
                                     self.space.newtuple([self.deque])])
 
+def W_DequeIter__new__(space, w_subtype, w_deque):
+    w_self = space.allocate_instance(W_DequeIter, w_subtype)
+    if not isinstance(w_deque, W_Deque):
+        raise oefmt(space.w_TypeError, "must be collections.deque, not %T")
+        
+    W_DequeIter.__init__(space.interp_w(W_DequeIter, w_self), w_deque)
+    return w_self
+
 W_DequeIter.typedef = TypeDef("_collections.deque_iterator",
+    __new__ = interp2app(W_DequeIter__new__),
     __iter__        = interp2app(W_DequeIter.iter),
     __length_hint__ = interp2app(W_DequeIter.length),
     __next__        = interp2app(W_DequeIter.next),
@@ -576,10 +585,24 @@
         self.index = ri
         return w_x
 
+    def reduce(self):
+        return self.space.newtuple([self.space.gettypefor(W_DequeRevIter),
+                                    self.space.newtuple([self.deque])])
+
+def W_DequeRevIter__new__(space, w_subtype, w_deque):
+    w_self = space.allocate_instance(W_DequeRevIter, w_subtype)
+    if not isinstance(w_deque, W_Deque):
+        raise oefmt(space.w_TypeError, "must be collections.deque, not %T")
+        
+    W_DequeRevIter.__init__(space.interp_w(W_DequeRevIter, w_self), w_deque)
+    return w_self
+
 W_DequeRevIter.typedef = TypeDef("_collections.deque_reverse_iterator",
+    __new__         = interp2app(W_DequeRevIter__new__),
     __iter__        = interp2app(W_DequeRevIter.iter),
     __length_hint__ = interp2app(W_DequeRevIter.length),
     __next__        = interp2app(W_DequeRevIter.next),
+    __reduce__      = interp2app(W_DequeRevIter.reduce)
 )
 W_DequeRevIter.typedef.acceptable_as_base_class = False
 
diff --git a/pypy/module/_collections/test/test_deque.py 
b/pypy/module/_collections/test/test_deque.py
--- a/pypy/module/_collections/test/test_deque.py
+++ b/pypy/module/_collections/test/test_deque.py
@@ -1,6 +1,6 @@
 
 class AppTestBasic:
-    spaceconfig = dict(usemodules=['_collections'])
+    spaceconfig = dict(usemodules=['_collections', 'struct'])
 
     def test_basics(self):
         from _collections import deque
@@ -301,3 +301,19 @@
         d.pop()
         gc.collect(); gc.collect(); gc.collect()
         assert X.freed
+
+    def test_DequeIter_pickle(self):
+        from _collections import deque
+        import pickle
+        d = deque([1,2,3])
+        iterator = iter(d)
+        copy = pickle.loads(pickle.dumps(iterator))
+        assert list(iterator) == list(copy)
+
+    def test_DequeRevIter_pickle(self):
+        from _collections import deque
+        import pickle
+        d = deque([1,2,3])
+        iterator = reversed(d)
+        copy = pickle.loads(pickle.dumps(iterator))
+        assert list(iterator) == list(copy)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to