[pypy-commit] pypy stdlib-2.7.12: fix pickling of stopped reversed types
pjenvey
pypy.commits at gmail.com
Sun Oct 2 13:37:19 EDT 2016
Author: Philip Jenvey <pjenvey at 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):
More information about the pypy-commit
mailing list