[pypy-commit] pypy length-hint: another __length_hint__ impl for the generic reversed

pjenvey noreply at buildbot.pypy.org
Sun Oct 7 20:41:56 CEST 2012


Author: Philip Jenvey <pjenvey at underboss.org>
Branch: length-hint
Changeset: r57859:ad1264e5637a
Date: 2012-10-07 11:40 -0700
http://bitbucket.org/pypy/pypy/changeset/ad1264e5637a/

Log:	another __length_hint__ impl for the generic reversed

diff --git a/pypy/module/__builtin__/functional.py b/pypy/module/__builtin__/functional.py
--- a/pypy/module/__builtin__/functional.py
+++ b/pypy/module/__builtin__/functional.py
@@ -270,6 +270,9 @@
     def descr___iter__(self, space):
         return space.wrap(self)
 
+    def descr_length(self, space):
+        return space.wrap(0 if self.remaining == -1 else self.remaining + 1)
+
     def descr_next(self, space):
         if self.remaining >= 0:
             w_index = space.wrap(self.remaining)
@@ -296,9 +299,10 @@
         return space.newtuple([w_new_inst, w_info])
 
 W_ReversedIterator.typedef = TypeDef("reversed",
-    __iter__=interp2app(W_ReversedIterator.descr___iter__),
-    next=interp2app(W_ReversedIterator.descr_next),
-    __reduce__=interp2app(W_ReversedIterator.descr___reduce__),
+    __iter__        = interp2app(W_ReversedIterator.descr___iter__),
+    __length_hint__ = interp2app(W_ReversedIterator.descr_length),
+    next            = interp2app(W_ReversedIterator.descr_next),
+    __reduce__      = interp2app(W_ReversedIterator.descr___reduce__),
 )
 
 # exported through _pickle_support
diff --git a/pypy/objspace/std/test/test_lengthhint.py b/pypy/objspace/std/test/test_lengthhint.py
--- a/pypy/objspace/std/test/test_lengthhint.py
+++ b/pypy/objspace/std/test/test_lengthhint.py
@@ -65,6 +65,24 @@
         self._test_length_hint(self.space.newtuple(self.ITEMS))
 
     def test_reversed(self):
+        # test the generic reversed iterator (w_foo lacks __reversed__)
+        space = self.space
+        w_foo = space.appexec([], """():
+            class Foo(object):
+                def __len__(self):
+                    return %r
+                def __getitem__(self, index):
+                    if 0 <= index < %r:
+                        return index
+                    raise IndexError()
+            return Foo()
+        """ % (self.SIZE, self.SIZE))
+        w_reversed = space.call_method(space.builtin, 'reversed', w_foo)
+        assert space.int_w(
+            space.call_method(w_reversed, '__length_hint__')) == self.SIZE
+        self._test_length_hint(w_reversed)
+
+    def test_reversedsequenceiterator(self):
         space = self.space
         w_reversed = space.call_method(space.builtin, 'reversed',
                                        space.wrap(self.ITEMS))


More information about the pypy-commit mailing list