Author: Armin Rigo <[email protected]>
Branch: py3.5
Changeset: r88021:f9dfa88ad22a
Date: 2016-11-01 11:36 +0100
http://bitbucket.org/pypy/pypy/changeset/f9dfa88ad22a/

Log:    Test and fix

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
@@ -335,8 +335,16 @@
     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_length_hint(self, space):
+        # bah, there is even a CPython test that checks that this
+        # actually calls 'len_w(w_sequence)'.  Obscure.
+        res = 0
+        if self.remaining >= 0:
+            total_length = space.len_w(self.w_sequence)
+            rem_length = self.remaining + 1
+            if rem_length <= total_length:
+                res = rem_length
+        return space.wrap(res)
 
     def descr_next(self, space):
         if self.remaining >= 0:
@@ -383,7 +391,7 @@
 W_ReversedIterator.typedef = TypeDef("reversed",
     __new__         = interp2app(W_ReversedIterator.descr___new__2),
     __iter__        = interp2app(W_ReversedIterator.descr___iter__),
-    __length_hint__ = interp2app(W_ReversedIterator.descr_length),
+    __length_hint__ = interp2app(W_ReversedIterator.descr_length_hint),
     __next__        = interp2app(W_ReversedIterator.descr_next),
     __reduce__      = interp2app(W_ReversedIterator.descr___reduce__),
     __setstate__      = interp2app(W_ReversedIterator.descr___setstate__),
diff --git a/pypy/module/__builtin__/test/test_functional.py 
b/pypy/module/__builtin__/test/test_functional.py
--- a/pypy/module/__builtin__/test/test_functional.py
+++ b/pypy/module/__builtin__/test/test_functional.py
@@ -527,6 +527,25 @@
         assert list(reversed(list(reversed("hello")))) == ['h','e','l','l','o']
         raises(TypeError, reversed, reversed("hello"))
 
+    def test_reversed_length_hint(self):
+        lst = [1, 2, 3]
+        r = reversed(lst)
+        assert r.__length_hint__() == 3
+        assert next(r) == 3
+        assert r.__length_hint__() == 2
+        lst.pop()
+        assert r.__length_hint__() == 2
+        lst.pop()
+        assert r.__length_hint__() == 0
+        raises(StopIteration, next, r)
+        #
+        r = reversed(lst)
+        assert r.__length_hint__() == 1
+        assert next(r) == 1
+        assert r.__length_hint__() == 0
+        raises(StopIteration, next, r)
+        assert r.__length_hint__() == 0
+
 
 class AppTestAllAny:
     """
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to