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

arigo at codespeak.net arigo at codespeak.net
Tue Aug 9 19:01:52 CEST 2005


Author: arigo
Date: Tue Aug  9 19:01:47 2005
New Revision: 15856

Modified:
   pypy/dist/pypy/objspace/std/iterobject.py
   pypy/dist/pypy/objspace/std/listtype.py
   pypy/dist/pypy/objspace/std/test/test_iterobject.py
   pypy/dist/pypy/objspace/std/test/test_listobject.py
Log:
* some clean-ups of W_SeqIterObject, trying to minimize the number of fields
  required on the iterator instances.
* more tests.
* why did lst.__reversed__() store the iterator on the list object??

Note that space.unwrap() should not be used; instead use space.int_w(),
or space.str_w(), etc.


Modified: pypy/dist/pypy/objspace/std/iterobject.py
==============================================================================
--- pypy/dist/pypy/objspace/std/iterobject.py	(original)
+++ pypy/dist/pypy/objspace/std/iterobject.py	Tue Aug  9 19:01:47 2005
@@ -9,22 +9,15 @@
 
 class W_SeqIterObject(W_Object):
     from pypy.objspace.std.itertype import iter_typedef as typedef
+    direction = +1
     
-    def __init__(w_self, space, w_seq, index=0, reverse=False):
+    def __init__(w_self, space, w_seq, index=0):
         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
+
+class W_ReverseSeqIterObject(W_SeqIterObject):
+    direction = -1
 
 registerimplementation(W_SeqIterObject)
 
@@ -34,36 +27,24 @@
 
 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:
-        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) 
+        w_item = space.getitem(w_seqiter.w_seq, space.wrap(w_seqiter.index))
     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) 
-    if w_seqiter.reverse:
-        w_seqiter.index -= 1
-    else:
-        w_seqiter.index += 1
-    w_seqiter.consumed += 1
+    w_seqiter.index += w_seqiter.direction
     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_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)
+    index = w_seqiter.index
+    if w_seqiter.direction == -1:
+        index = ~index   # -1=>0, -2=>1, etc.
+    w_len = space.sub(space.len(w_seqiter.w_seq), space.wrap(index))
     return w_len
 
 register_all(vars())

Modified: pypy/dist/pypy/objspace/std/listtype.py
==============================================================================
--- pypy/dist/pypy/objspace/std/listtype.py	(original)
+++ pypy/dist/pypy/objspace/std/listtype.py	Tue Aug  9 19:01:47 2005
@@ -1,6 +1,5 @@
 from __future__ import generators
 from pypy.objspace.std.stdtypedef import *
-from pypy.objspace.std.iterobject import W_SeqIterObject
 from pypy.objspace.std.register_all import register_all
 from sys import maxint
 
@@ -26,9 +25,9 @@
 ##
 ##''', filename=__file__).interphook('reversed')
 def list_reversed__ANY(space, w_list):
-    w_list.running_iter = W_SeqIterObject(space,w_list,-1,True)
-    return w_list.running_iter
-    
+    from pypy.objspace.std.iterobject import W_ReverseSeqIterObject
+    return W_ReverseSeqIterObject(space,w_list,-1)
+
 register_all(vars(), globals())
 
 # ____________________________________________________________

Modified: pypy/dist/pypy/objspace/std/test/test_iterobject.py
==============================================================================
--- pypy/dist/pypy/objspace/std/test/test_iterobject.py	(original)
+++ pypy/dist/pypy/objspace/std/test/test_iterobject.py	Tue Aug  9 19:01:47 2005
@@ -120,34 +120,37 @@
         raises(StopIteration, it.next)
         assert len(it) == 0
         
-##    def test_iter_len_deque(self):
-##        from collections import deque
-##
-##        iterable = deque((1,2,3,4))
-##        it = iter(iterable)
-##        for i in reversed(range(len(it))):
-##            assert len(it) == i+1
-##            x = it.next()
-##            print x
-##        raises(StopIteration, it.next)
-##        assert len(it) == 0
-##
-##    def test_iter_len_xrange(self):
-##        iterable = xrange(8)
-##        it = iter(iterable)
-##        for i in reversed(range(len(it))):
-##            assert len(it) == i+1
-##            x = it.next()
-##            print x
-##        raises(StopIteration, it.next)
-##        assert len(it) == 0
-##
-##    def test_iter_len_reversed(self):
-##        iterable = reversed((1,2,3,4))
-##        it = iter(iterable)
-##        for i in reversed(range(len(it))):
-##            assert len(it) == i+1
-##            x = it.next()
-##            print x
-##        raises(StopIteration, it.next)
-##        assert len(it) == 0
+    def test_iter_len_deque(self):
+        from collections import deque
+
+        iterable = deque((1,2,3,4))
+        it = iter(iterable)
+        for i in reversed(range(len(it))):
+            assert len(it) == i+1
+            x = it.next()
+            print x
+        raises(StopIteration, it.next)
+        assert len(it) == 0
+
+    def test_iter_len_reversed(self):
+        iterable = reversed((1,2,3,4))
+        it = iter(iterable)
+        for i in reversed(range(len(it))):
+            assert len(it) == i+1
+            x = it.next()
+            print x
+        raises(StopIteration, it.next)
+        assert len(it) == 0
+
+    def test_len_reversed_seqiter(self):
+        it = reversed([5,6,7])
+        assert iter(it) is it
+        assert len(it) == 3
+        assert it.next() == 7
+        assert len(it) == 2
+        assert it.next() == 6
+        assert len(it) == 1
+        assert it.next() == 5
+        assert len(it) == 0
+        raises(StopIteration, it.next)
+        assert len(it) == 0

Modified: pypy/dist/pypy/objspace/std/test/test_listobject.py
==============================================================================
--- pypy/dist/pypy/objspace/std/test/test_listobject.py	(original)
+++ pypy/dist/pypy/objspace/std/test/test_listobject.py	Tue Aug  9 19:01:47 2005
@@ -558,3 +558,7 @@
         c = list('hello world')
         c.reverse()
         assert ''.join(c) == 'dlrow olleh'
+
+    def test_reversed(self):
+        assert list(list('hello').__reversed__()) == ['o', 'l', 'l', 'e', 'h']
+        assert list(reversed(list('hello'))) == ['o', 'l', 'l', 'e', 'h']



More information about the Pypy-commit mailing list