Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r91838:016c02447548
Date: 2017-07-08 16:57 +0200
http://bitbucket.org/pypy/pypy/changeset/016c02447548/

Log:    issue #2601

        Fix for 'reversed(mapping object)'

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
@@ -346,7 +346,7 @@
 class W_ReversedIterator(W_Root):
     def __init__(self, space, w_sequence):
         self.remaining = space.len_w(w_sequence) - 1
-        if space.lookup(w_sequence, "__getitem__") is None:
+        if not space.issequence_w(w_sequence):
             raise oefmt(space.w_TypeError,
                         "reversed() argument must be a sequence")
         self.w_sequence = w_sequence
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
@@ -227,6 +227,25 @@
         assert list(reversed(list(reversed("hello")))) == ['h','e','l','l','o']
         raises(TypeError, reversed, reversed("hello"))
 
+    def test_reversed_user_type(self):
+        class X(object):
+            def __getitem__(self, index):
+                return str(index)
+            def __len__(self):
+                return 5
+        assert list(reversed(X())) == ["4", "3", "2", "1", "0"]
+
+    def test_reversed_not_for_mapping(self):
+        raises(TypeError, reversed, {})
+        raises(TypeError, reversed, {2: 3})
+        assert not hasattr(dict, '__reversed__')
+
+    def test_reversed_type_with_no_len(self):
+        class X(object):
+            def __getitem__(self, key):
+                raise ValueError
+        raises(TypeError, reversed, X())
+
 
 class AppTestApply:
     def test_apply(self):
diff --git a/pypy/objspace/std/dictmultiobject.py 
b/pypy/objspace/std/dictmultiobject.py
--- a/pypy/objspace/std/dictmultiobject.py
+++ b/pypy/objspace/std/dictmultiobject.py
@@ -236,10 +236,6 @@
                         "an internal 'del' on the dictionary failed to find "
                         "the key")
 
-    def descr_reversed(self, space):
-        raise oefmt(space.w_TypeError,
-                    "argument to reversed() must be a sequence")
-
     def descr_copy(self, space):
         """D.copy() -> a shallow copy of D"""
         w_new = W_DictMultiObject.allocate_and_init_instance(space)
@@ -517,7 +513,6 @@
     __setitem__ = interp2app(W_DictMultiObject.descr_setitem),
     __delitem__ = interp2app(W_DictMultiObject.descr_delitem),
 
-    __reversed__ = interp2app(W_DictMultiObject.descr_reversed),
     copy = interp2app(W_DictMultiObject.descr_copy),
     items = interp2app(W_DictMultiObject.descr_items),
     keys = interp2app(W_DictMultiObject.descr_keys),
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to