Author: Philip Jenvey <pjen...@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)) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit