[pypy-svn] r52643 - in pypy/dist/pypy/objspace/std: . test

arigo at codespeak.net arigo at codespeak.net
Mon Mar 17 15:51:35 CET 2008


Author: arigo
Date: Mon Mar 17 15:51:34 2008
New Revision: 52643

Modified:
   pypy/dist/pypy/objspace/std/rangeobject.py
   pypy/dist/pypy/objspace/std/test/test_rangeobject.py
Log:
Test and fix for iter(range(10))__reduce__().


Modified: pypy/dist/pypy/objspace/std/rangeobject.py
==============================================================================
--- pypy/dist/pypy/objspace/std/rangeobject.py	(original)
+++ pypy/dist/pypy/objspace/std/rangeobject.py	Mon Mar 17 15:51:34 2008
@@ -4,6 +4,7 @@
 from pypy.objspace.std.sliceobject import W_SliceObject
 from pypy.objspace.std.listobject import W_ListObject
 from pypy.objspace.std import listtype
+from pypy.objspace.std import iterobject
 
 from pypy.objspace.std import slicetype
 from pypy.interpreter import gateway, baseobjspace
@@ -100,7 +101,6 @@
     return W_RangeListObject(rangestart, rangestep, slicelength)
 
 def iter__RangeList(space, w_rangelist):
-    from pypy.objspace.std import iterobject
     return W_RangeIterObject(w_rangelist)
 
 def repr__RangeList(space, w_rangelist):
@@ -163,25 +163,24 @@
         w_rangelist.step = -w_rangelist.step
     return space.w_None
 
-class W_RangeIterObject(W_Object):
-    from pypy.objspace.std.itertype import iter_typedef as typedef
 
-    def __init__(w_self, w_rangelist, index=0):
-        w_self.w_rangelist = w_rangelist
-        w_self.index = index
+class W_RangeIterObject(iterobject.W_AbstractSeqIterObject):
+    pass
 
 def iter__RangeIter(space, w_rangeiter):
     return w_rangeiter
 
 def next__RangeIter(space, w_rangeiter):
-    if w_rangeiter.w_rangelist is None:
+    w_rangelist = w_rangeiter.w_seq
+    if w_rangelist is None:
         raise OperationError(space.w_StopIteration, space.w_None)
-    if w_rangeiter.w_rangelist.w_list is not None:
+    assert isinstance(w_rangelist, W_RangeListObject)
+    if w_rangelist.w_list is not None:
         try:
-            w_item = space.getitem(w_rangeiter.w_rangelist.w_list,
+            w_item = space.getitem(w_rangelist.w_list,
                                    wrapint(space, w_rangeiter.index))
         except OperationError, e:
-            w_rangeiter.w_rangelist = None
+            w_rangeiter.w_seq = None
             if not e.match(space, space.w_IndexError):
                 raise
             raise OperationError(space.w_StopIteration, space.w_None)
@@ -189,18 +188,18 @@
         try:
             w_item = wrapint(
                 space,
-                w_rangeiter.w_rangelist.getitem(w_rangeiter.index))
+                w_rangelist.getitem(w_rangeiter.index))
         except IndexError:
-            w_rangeiter.w_rangelist = None
+            w_rangeiter.w_seq = None
             raise OperationError(space.w_StopIteration, space.w_None)
     w_rangeiter.index += 1
     return w_item
 
 def len__RangeIter(space,  w_rangeiter):
-    if w_rangeiter.w_rangelist is None:
+    if w_rangeiter.w_seq is None:
         return wrapint(space, 0)
     index = w_rangeiter.index
-    w_length = space.len(w_rangeiter.w_rangelist)
+    w_length = space.len(w_rangeiter.w_seq)
     w_len = space.sub(w_length, wrapint(space, index))
     if space.is_true(space.lt(w_len, wrapint(space, 0))):
         w_len = wrapint(space, 0)

Modified: pypy/dist/pypy/objspace/std/test/test_rangeobject.py
==============================================================================
--- pypy/dist/pypy/objspace/std/test/test_rangeobject.py	(original)
+++ pypy/dist/pypy/objspace/std/test/test_rangeobject.py	Mon Mar 17 15:51:34 2008
@@ -105,3 +105,18 @@
         assert not self.not_forced(r)
         assert r == [1, 2, 5, 6, 7]
        
+    def test_reduce(self):
+        it = iter(range(10))
+        assert it.next() == 0
+        assert it.next() == 1
+        assert it.next() == 2
+        assert it.next() == 3
+        seqiter_new, args = it.__reduce__()
+        assert it.next() == 4
+        assert it.next() == 5
+        it2 = seqiter_new(*args)
+        assert it2.next() == 4
+        assert it2.next() == 5
+        it3 = seqiter_new(*args)
+        assert it3.next() == 4
+        assert it3.next() == 5



More information about the Pypy-commit mailing list