[pypy-svn] r15787 - pypy/dist/pypy/objspace/std
ale at codespeak.net
ale at codespeak.net
Mon Aug 8 20:17:20 CEST 2005
Author: ale
Date: Mon Aug 8 20:17:19 2005
New Revision: 15787
Modified:
pypy/dist/pypy/objspace/std/iterobject.py
Log:
added support for reverse iteration in W_SeqIterObject
Modified: pypy/dist/pypy/objspace/std/iterobject.py
==============================================================================
--- pypy/dist/pypy/objspace/std/iterobject.py (original)
+++ pypy/dist/pypy/objspace/std/iterobject.py Mon Aug 8 20:17:19 2005
@@ -10,10 +10,21 @@
class W_SeqIterObject(W_Object):
from pypy.objspace.std.itertype import iter_typedef as typedef
- def __init__(w_self, space, w_seq, index=0):
+ def __init__(w_self, space, w_seq, index=0, reverse=False):
W_Object.__init__(w_self, space)
w_self.w_seq = w_seq
+ try:
+ w_self.length = space.unwrap(space.len(w_seq))
+ except OperationError,e:
+ if e.match(space, space.w_TypeError):
+ w_self.length = 0
+ else:
+ raise
w_self.index = index
+ if index < 0:
+ w_self.index += w_self.length
+ w_self.reverse = reverse
+ w_self.consumed = 0
registerimplementation(W_SeqIterObject)
@@ -23,21 +34,36 @@
def next__SeqIter(space, w_seqiter):
if w_seqiter.w_seq is None:
- raise OperationError(space.w_StopIteration, space.w_None)
+ raise OperationError(space.w_StopIteration, space.w_None)
try:
- w_item = space.getitem(w_seqiter.w_seq, space.wrap(w_seqiter.index))
+ if w_seqiter.index >=0:
+ w_item = space.getitem(w_seqiter.w_seq, space.wrap(w_seqiter.index))
+ else:
+ raise OperationError(space.w_StopIteration, space.w_None)
except OperationError, e:
w_seqiter.w_seq = None
if not e.match(space, space.w_IndexError):
raise
raise OperationError(space.w_StopIteration, space.w_None)
- w_seqiter.index += 1
+ if w_seqiter.reverse:
+ w_seqiter.index -= 1
+ else:
+ w_seqiter.index += 1
+ w_seqiter.consumed += 1
return w_item
def len__SeqIter(space, w_seqiter):
- if w_seqiter.w_seq is None:
+ if w_seqiter.w_seq is None :
return space.wrap(0)
- w_len = space.sub(space.len(w_seqiter.w_seq), space.wrap(w_seqiter.index))
+ w_index = space.sub(space.len(w_seqiter.w_seq), space.wrap(w_seqiter.index))
+ if space.is_true(space.gt(space.len(w_seqiter.w_seq), space.wrap(w_seqiter.index))):
+ if w_seqiter.reverse:
+ w_len = space.wrap(w_seqiter.index+1)
+ else:
+ w_len = space.sub(space.len(w_seqiter.w_seq), space.wrap(w_seqiter.consumed))
+ else:
+ w_seqiter.w_seq = None
+ w_len = space.wrap(0)
return w_len
register_all(vars())
More information about the Pypy-commit
mailing list