Author: Philip Jenvey <pjen...@underboss.org>
Branch: stdlib-2.7.12
Changeset: r87521:714b2a3cb52d
Date: 2016-10-02 10:36 -0700
http://bitbucket.org/pypy/pypy/changeset/714b2a3cb52d/

Log:    fix pickling of stopped reversed types

diff --git a/pypy/interpreter/test/test_zzpickle_and_slow.py 
b/pypy/interpreter/test/test_zzpickle_and_slow.py
--- a/pypy/interpreter/test/test_zzpickle_and_slow.py
+++ b/pypy/interpreter/test/test_zzpickle_and_slow.py
@@ -367,6 +367,14 @@
         raises(TypeError, len, liter)
         assert list(liter) == list(result)
 
+    def test_pickle_reversesequenceiter_stopped(self):
+        import pickle
+        iter = reversed([])
+        raises(StopIteration, iter.next)
+        pckl   = pickle.dumps(iter)
+        result = pickle.loads(pckl)
+        raises(StopIteration, result.next)
+
     # This test used to be marked xfail and it tried to test for the past
     # support of pickling dictiter objects.
     def test_pickle_dictiter(self):
@@ -388,6 +396,14 @@
         assert type(r) is type(result)
         assert list(r) == list(result)
 
+    def test_pickle_reversed_stopped(self):
+        import pickle
+        iter = reversed(())
+        raises(StopIteration, iter.next)
+        pckl   = pickle.dumps(iter)
+        result = pickle.loads(pckl)
+        raises(StopIteration, result.next)
+
     def test_pickle_enum(self):
         import pickle
         e = enumerate(range(100, 106))
diff --git a/pypy/module/__builtin__/functional.py 
b/pypy/module/__builtin__/functional.py
--- a/pypy/module/__builtin__/functional.py
+++ b/pypy/module/__builtin__/functional.py
@@ -379,7 +379,8 @@
         w_mod    = space.getbuiltinmodule('_pickle_support')
         mod      = space.interp_w(MixedModule, w_mod)
         w_new_inst = mod.get('reversed_new')
-        info_w = [self.w_sequence, space.wrap(self.remaining)]
+        w_seq = space.w_None if self.w_sequence is None else self.w_sequence
+        info_w = [w_seq, space.wrap(self.remaining)]
         w_info = space.newtuple(info_w)
         return space.newtuple([w_new_inst, w_info])
 
@@ -395,8 +396,12 @@
 def _make_reversed(space, w_seq, w_remaining):
     w_type = space.gettypeobject(W_ReversedIterator.typedef)
     iterator = space.allocate_instance(W_ReversedIterator, w_type)
-    iterator.w_sequence = w_seq
-    iterator.remaining = space.int_w(w_remaining)
+    if space.is_w(w_seq, space.w_None):
+        iterator.w_sequence = None
+        iterator.remaining = -1
+    else:
+        iterator.w_sequence = w_seq
+        iterator.remaining = space.int_w(w_remaining)
     return space.wrap(iterator)
 
 
diff --git a/pypy/module/_pickle_support/maker.py 
b/pypy/module/_pickle_support/maker.py
--- a/pypy/module/_pickle_support/maker.py
+++ b/pypy/module/_pickle_support/maker.py
@@ -46,9 +46,14 @@
     return W_SeqIterObject(w_seq, space.int_w(w_index))
 
 def reverseseqiter_new(space, w_seq, w_index):
-    w_len = space.len(w_seq)
-    index = space.int_w(w_index) - space.int_w(w_len)
-    return W_ReverseSeqIterObject(space, w_seq, index)
+    w_rev = instantiate(W_ReverseSeqIterObject)
+    if space.is_w(w_seq, space.w_None):
+        w_rev.w_seq = None
+        w_rev.index = -1
+    else:
+        w_rev.w_seq = w_seq
+        w_rev.index = space.int_w(w_index)
+    return w_rev
 
 def frame_new(space):
     new_frame = instantiate(space.FrameClass)   # XXX fish
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
@@ -117,15 +117,15 @@
 class W_ReverseSeqIterObject(W_Root):
     def __init__(self, space, w_seq, index=-1):
         self.w_seq = w_seq
-        self.w_len = space.len(w_seq)
-        self.index = space.int_w(self.w_len) + index
+        self.index = space.len_w(w_seq) + index
 
     def descr_reduce(self, space):
         from pypy.interpreter.mixedmodule import MixedModule
         w_mod = space.getbuiltinmodule('_pickle_support')
         mod = space.interp_w(MixedModule, w_mod)
         new_inst = mod.get('reverseseqiter_new')
-        tup = [self.w_seq, space.wrap(self.index)]
+        w_seq = space.w_None if self.w_seq is None else self.w_seq
+        tup = [w_seq, space.wrap(self.index)]
         return space.newtuple([new_inst, space.newtuple(tup)])
 
     def descr_length_hint(self, space):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to