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