[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