[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