[pypy-commit] pypy default: Complain more cleanly about reversed(x) or enumerate(x) for objects of

arigo noreply at buildbot.pypy.org
Wed Mar 18 18:19:15 CET 2015


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r76458:31c12715fa13
Date: 2015-03-18 18:19 +0100
http://bitbucket.org/pypy/pypy/changeset/31c12715fa13/

Log:	Complain more cleanly about reversed(x) or enumerate(x) for objects
	of unsupported type

diff --git a/rpython/rtyper/lltypesystem/rlist.py b/rpython/rtyper/lltypesystem/rlist.py
--- a/rpython/rtyper/lltypesystem/rlist.py
+++ b/rpython/rtyper/lltypesystem/rlist.py
@@ -57,7 +57,7 @@
         elif variant == ("reversed",):
             return ReversedListIteratorRepr(self)
         else:
-            raise NotImplementedError(variant)
+            raise TyperError("unsupported %r iterator over a list" % (variant,))
 
     def get_itemarray_lowleveltype(self):
         ITEM = self.item_repr.lowleveltype
diff --git a/rpython/rtyper/lltypesystem/rrange.py b/rpython/rtyper/lltypesystem/rrange.py
--- a/rpython/rtyper/lltypesystem/rrange.py
+++ b/rpython/rtyper/lltypesystem/rrange.py
@@ -59,7 +59,10 @@
         self.ll_newrange = ll_newrange
         self.ll_newrangest = ll_newrangest
 
-    def make_iterator_repr(self):
+    def make_iterator_repr(self, variant=None):
+        if variant is not None:
+            raise TyperError("unsupported %r iterator over a range list" %
+                             (variant,))
         return RangeIteratorRepr(self)
 
 
diff --git a/rpython/rtyper/lltypesystem/rstr.py b/rpython/rtyper/lltypesystem/rstr.py
--- a/rpython/rtyper/lltypesystem/rstr.py
+++ b/rpython/rtyper/lltypesystem/rstr.py
@@ -156,7 +156,10 @@
             self.CACHE[value] = p
             return p
 
-    def make_iterator_repr(self):
+    def make_iterator_repr(self, variant=None):
+        if variant is not None:
+            raise TyperError("unsupported %r iterator over a str/unicode" %
+                             (variant,))
         return self.repr.iterator_repr
 
     def can_ll_be_null(self, s_value):
diff --git a/rpython/rtyper/rtuple.py b/rpython/rtyper/rtuple.py
--- a/rpython/rtyper/rtuple.py
+++ b/rpython/rtyper/rtuple.py
@@ -210,7 +210,10 @@
 
     ll_str = property(gen_str_function)
 
-    def make_iterator_repr(self):
+    def make_iterator_repr(self, variant=None):
+        if variant is not None:
+            raise TyperError("unsupported %r iterator over a tuple" %
+                             (variant,))
         if len(self.items_r) == 1:
             # subclasses are supposed to set the IteratorRepr attribute
             return self.IteratorRepr(self)
diff --git a/rpython/rtyper/test/test_rstr.py b/rpython/rtyper/test/test_rstr.py
--- a/rpython/rtyper/test/test_rstr.py
+++ b/rpython/rtyper/test/test_rstr.py
@@ -116,6 +116,16 @@
         res = self.interpret(fn, [1])
         assert res == 1 + ord('a') + 10000
 
+    def test_str_iterator_reversed_unsupported(self):
+        const = self.const
+        def fn():
+            total = 0
+            t = const('foo')
+            for x in reversed(t):
+                total += ord(x)
+            return total
+        py.test.raises(TyperError, self.interpret, fn, [])
+
     def test_char_constant(self):
         const = self.const
         def fn(s):
diff --git a/rpython/rtyper/test/test_rtuple.py b/rpython/rtyper/test/test_rtuple.py
--- a/rpython/rtyper/test/test_rtuple.py
+++ b/rpython/rtyper/test/test_rtuple.py
@@ -1,8 +1,10 @@
+import py
 from rpython.rtyper.rtuple import TUPLE_TYPE, TupleRepr
 from rpython.rtyper.lltypesystem.lltype import Signed, Bool
 from rpython.rtyper.rbool import bool_repr
 from rpython.rtyper.rint import signed_repr
 from rpython.rtyper.test.tool import BaseRtypingTest
+from rpython.rtyper.error import TyperError
 from rpython.rlib.objectmodel import compute_hash
 from rpython.translator.translator import TranslationContext
 
@@ -228,6 +230,15 @@
         res = self.interpret(f, [93813])
         assert res == 93813
 
+    def test_tuple_iterator_reversed_unsupported(self):
+        def f(i):
+            total = 0
+            t = (i,)
+            for x in reversed(t):
+                total += x
+            return total
+        py.test.raises(TyperError, self.interpret, f, [93813])
+
     def test_inst_tuple_iter(self):
         class A:
             pass


More information about the pypy-commit mailing list