[pypy-commit] pypy py3.6: CPython Issue26482: can pickle recursive deque objects.

amauryfa pypy.commits at gmail.com
Mon Dec 11 13:18:44 EST 2017


Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: py3.6
Changeset: r93371:ce0523b30644
Date: 2017-12-11 19:14 +0100
http://bitbucket.org/pypy/pypy/changeset/ce0523b30644/

Log:	CPython Issue26482: can pickle recursive deque objects.

diff --git a/lib_pypy/_collections.py b/lib_pypy/_collections.py
--- a/lib_pypy/_collections.py
+++ b/lib_pypy/_collections.py
@@ -323,7 +323,7 @@
             self.rotate(-index)
 
     def __reduce_ex__(self, proto):
-        return type(self), (list(self), self.maxlen)
+        return type(self), ((), self.maxlen), None, iter(self)
 
     __hash__ = None
 
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
@@ -491,23 +491,14 @@
         "Return state information for pickling."
         space = self.space
         w_type = space.type(self)
-        w_dict = space.findattr(self, space.newtext('__dict__'))
-        w_list = space.call_function(space.w_list, self)
-        if w_dict is None:
-            if self.maxlen == sys.maxint:
-                result = [
-                    w_type, space.newtuple([w_list])]
-            else:
-                result = [
-                    w_type, space.newtuple([w_list, space.newint(self.maxlen)])]
+        w_dict = space.findattr(self, space.newtext('__dict__')) or space.w_None
+        w_it = space.iter(self)
+        if self.maxlen == sys.maxint:
+            w_lentuple = space.newtuple([])
         else:
-            if self.maxlen == sys.maxint:
-                w_len = space.w_None
-            else:
-                w_len = space.newint(self.maxlen)
-            result = [
-                w_type, space.newtuple([w_list, w_len]), w_dict]
-        return space.newtuple(result)
+            w_lentuple = space.newtuple([space.newtuple([]),
+                                         space.newint(self.maxlen)])
+        return space.newtuple([w_type, w_lentuple, w_dict, w_it])
 
     def get_maxlen(space, self):
         if self.maxlen == sys.maxint:
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
@@ -264,25 +264,25 @@
         #
         d = deque('hello world')
         r = d.__reduce__()
-        assert r == (deque, (list('hello world'),))
+        assert r[:3] == (deque, (), None)
         #
         d = deque('hello world', 42)
         r = d.__reduce__()
-        assert r == (deque, (list('hello world'), 42))
+        assert r[:3] == (deque, ((), 42), None)
         #
         class D(deque):
             pass
         d = D('hello world')
         d.a = 5
         r = d.__reduce__()
-        assert r == (D, (list('hello world'), None), {'a': 5})
+        assert r[:3] == (D, (), {'a': 5})
         #
         class D(deque):
             pass
         d = D('hello world', 42)
         d.a = 5
         r = d.__reduce__()
-        assert r == (D, (list('hello world'), 42), {'a': 5})
+        assert r[:3] == (D, ((), 42), {'a': 5})
 
     def test_copy(self):
         from _collections import deque


More information about the pypy-commit mailing list