[pypy-svn] r67557 - in pypy/trunk/pypy: interpreter/test module/__builtin__

benjamin at codespeak.net benjamin at codespeak.net
Mon Sep 7 15:23:21 CEST 2009


Author: benjamin
Date: Mon Sep  7 15:23:19 2009
New Revision: 67557

Modified:
   pypy/trunk/pypy/interpreter/test/test_zzpickle_and_slow.py
   pypy/trunk/pypy/module/__builtin__/functional.py
Log:
fix picking of reversed

Modified: pypy/trunk/pypy/interpreter/test/test_zzpickle_and_slow.py
==============================================================================
--- pypy/trunk/pypy/interpreter/test/test_zzpickle_and_slow.py	(original)
+++ pypy/trunk/pypy/interpreter/test/test_zzpickle_and_slow.py	Mon Sep  7 15:23:19 2009
@@ -369,7 +369,19 @@
         result = pickle.loads(pckl)
         raises(TypeError, len, diter)
         assert list(diter) == list(result)
-    
+
+    def test_pickle_reversed(self):
+        import pickle
+        r = reversed(tuple(range(10)))
+        r.next()
+        r.next()
+        pickled = pickle.dumps(r)
+        result = pickle.loads(pickled)
+        result.next()
+        r.next()
+        assert type(r) is type(result)
+        assert list(r) == list(result)
+
     def test_pickle_enum(self):
         import pickle
         e      = enumerate(range(10))

Modified: pypy/trunk/pypy/module/__builtin__/functional.py
==============================================================================
--- pypy/trunk/pypy/module/__builtin__/functional.py	(original)
+++ pypy/trunk/pypy/module/__builtin__/functional.py	Mon Sep  7 15:23:19 2009
@@ -437,11 +437,27 @@
         raise OperationError(space.w_StopIteration, space.w_None)
     descr_next.unwrap_spec = ["self", ObjSpace]
 
+    def descr___reduce__(self, space):
+        info_w = [self.w_sequence, space.wrap(self.remaining)]
+        w_info = space.newtuple(info_w)
+        return space.newtuple([space.wrap(_make_reversed), w_info])
+    descr___reduce__.unwrap_spec = ["self", ObjSpace]
+
 W_ReversedIterator.typedef = TypeDef("reversed",
     __iter__=interp2app(W_ReversedIterator.descr___iter__),
     next=interp2app(W_ReversedIterator.descr_next),
+    __reduce__=interp2app(W_ReversedIterator.descr___reduce__),
 )
 
+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)
+    return space.wrap(iterator)
+_make_reversed.unwrap_spec = [ObjSpace, W_Root, W_Root]
+_make_reversed = interp2app(_make_reversed)
+
 
 class W_XRange(Wrappable):
     def __init__(self, space, start, len, step):



More information about the Pypy-commit mailing list