[pypy-svn] r27833 - in pypy/dist/pypy: interpreter/test module/_pickle_support objspace/std

ericvrp at codespeak.net ericvrp at codespeak.net
Mon May 29 12:13:26 CEST 2006


Author: ericvrp
Date: Mon May 29 12:13:22 2006
New Revision: 27833

Modified:
   pypy/dist/pypy/interpreter/test/test_pickle.py
   pypy/dist/pypy/module/_pickle_support/__init__.py
   pypy/dist/pypy/module/_pickle_support/maker.py
   pypy/dist/pypy/objspace/std/itertype.py
Log:
Added pickling support for reverse sequence iterator


Modified: pypy/dist/pypy/interpreter/test/test_pickle.py
==============================================================================
--- pypy/dist/pypy/interpreter/test/test_pickle.py	(original)
+++ pypy/dist/pypy/interpreter/test/test_pickle.py	Mon May 29 12:13:22 2006
@@ -189,9 +189,22 @@
         result = pickle.loads(pckl)
         liter.next()
         result.next()
+        assert type(liter) is type(result)
         assert len(liter) == 6
         assert list(liter) == list(result)
-    
+
+    def test_pickle_reversesequenceiter(self):
+        import pickle
+        liter  = reversed([3,9,6,12,15,17,19,111])
+        liter.next()
+        pckl   = pickle.dumps(liter)
+        result = pickle.loads(pckl)
+        liter.next()
+        result.next()
+        assert type(liter) is type(result)
+        assert len(liter) == 6
+        assert list(liter) == list(result)
+
     def test_pickle_dictiter(self):
         import pickle
         tdict = {'2':2, '3':3, '5':5}
@@ -224,16 +237,6 @@
         assert type(riter) is type(result)
         assert list(result) == [2,3,4]
     
-    def test_pickle_reversed_iterator(self):
-        import pickle
-        i = reversed(xrange(5))
-        i.next()
-        i.next()
-        pckl   = pickle.dumps(i)
-        result = pickle.loads(pckl)
-        assert type(i) is type(result)
-        assert list(result) == [2,1,0]
-    
     def test_pickle_generator(self):
         skip("work in progress")
         import pickle

Modified: pypy/dist/pypy/module/_pickle_support/__init__.py
==============================================================================
--- pypy/dist/pypy/module/_pickle_support/__init__.py	(original)
+++ pypy/dist/pypy/module/_pickle_support/__init__.py	Mon May 29 12:13:22 2006
@@ -14,4 +14,5 @@
         'method_new'   : 'maker.method_new',
         'dictiter_surrogate_new' : 'maker.dictiter_surrogate_new',
         'seqiter_new'  : 'maker.seqiter_new',
+        'reverseseqiter_new' : 'maker.reverseseqiter_new',
     }

Modified: pypy/dist/pypy/module/_pickle_support/maker.py
==============================================================================
--- pypy/dist/pypy/module/_pickle_support/maker.py	(original)
+++ pypy/dist/pypy/module/_pickle_support/maker.py	Mon May 29 12:13:22 2006
@@ -6,7 +6,7 @@
 from pypy.interpreter.argument import Arguments
 from pypy.interpreter.baseobjspace import ObjSpace, W_Root
 from pypy.objspace.std.dicttype import dictiter_typedef
-from pypy.objspace.std.iterobject import W_SeqIterObject
+from pypy.objspace.std.iterobject import W_SeqIterObject, W_ReverseSeqIterObject
 
 
 #note: for now we don't use the actual value when creating the Cell.
@@ -43,3 +43,8 @@
 
 def seqiter_new(space, w_seq, w_index):
     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)

Modified: pypy/dist/pypy/objspace/std/itertype.py
==============================================================================
--- pypy/dist/pypy/objspace/std/itertype.py	(original)
+++ pypy/dist/pypy/objspace/std/itertype.py	Mon May 29 12:13:22 2006
@@ -15,6 +15,20 @@
     return space.newtuple([new_inst, space.newtuple(tup)])
 
 # ____________________________________________________________
+
+def descr_reverseseqiter__reduce__(w_self, space):
+    """
+    XXX to do: remove this __reduce__ method and do
+    a registration with copy_reg, instead.
+    """
+    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      = [w_self.w_seq, space.wrap(w_self.index)]
+    return space.newtuple([new_inst, space.newtuple(tup)])
+
+# ____________________________________________________________
 iter_typedef = StdTypeDef("sequenceiterator",
     __doc__ = '''iter(collection) -> iterator
 iter(callable, sentinel) -> iterator
@@ -28,4 +42,7 @@
     )
 
 reverse_iter_typedef = StdTypeDef("reversesequenceiterator",
+
+    __reduce__ = gateway.interp2app(descr_reverseseqiter__reduce__,
+                           unwrap_spec=[gateway.W_Root, gateway.ObjSpace]),
     )



More information about the Pypy-commit mailing list