[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