[pypy-commit] pypy default: Issue #1633

arigo noreply at buildbot.pypy.org
Thu Nov 14 10:48:53 CET 2013


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r68070:8d1f6d47d417
Date: 2013-11-14 10:48 +0100
http://bitbucket.org/pypy/pypy/changeset/8d1f6d47d417/

Log:	Issue #1633

	Give a more sensible error message on int() or long() typeerrors.

diff --git a/pypy/objspace/std/inttype.py b/pypy/objspace/std/inttype.py
--- a/pypy/objspace/std/inttype.py
+++ b/pypy/objspace/std/inttype.py
@@ -119,9 +119,14 @@
         if not ok:
             # otherwise, use the __int__() or the __trunc__() methods
             w_obj = w_value
-            if space.lookup(w_obj, '__int__') is None:
+            if space.lookup(w_obj, '__int__') is not None:
+                w_obj = space.int(w_obj)
+            elif space.lookup(w_obj, '__trunc__') is not None:
                 w_obj = space.trunc(w_obj)
-            w_obj = space.int(w_obj)
+            else:
+                raise operationerrfmt(space.w_TypeError,
+                    "int() argument must be a string or a number, not '%T'",
+                    w_obj)
             # 'int(x)' should return what x.__int__() returned, which should
             # be an int or long or a subclass thereof.
             if space.is_w(w_inttype, space.w_int):
diff --git a/pypy/objspace/std/longtype.py b/pypy/objspace/std/longtype.py
--- a/pypy/objspace/std/longtype.py
+++ b/pypy/objspace/std/longtype.py
@@ -1,4 +1,4 @@
-from pypy.interpreter.error import OperationError
+from pypy.interpreter.error import OperationError, operationerrfmt
 from pypy.interpreter import typedef
 from pypy.interpreter.gateway import interp2app, unwrap_spec, WrappedDefault,\
      interpindirect2app
@@ -39,13 +39,17 @@
             if (space.lookup(w_obj, '__long__') is not None or
                 space.lookup(w_obj, '__int__') is not None):
                 w_obj = space.long(w_obj)
-            else:
+            elif space.lookup(w_obj, '__trunc__') is not None:
                 w_obj = space.trunc(w_obj)
                 # :-(  blame CPython 2.7
                 if space.lookup(w_obj, '__long__') is not None:
                     w_obj = space.long(w_obj)
                 else:
                     w_obj = space.int(w_obj)
+            else:
+                raise operationerrfmt(space.w_TypeError,
+                    "long() argument must be a string or a number, not '%T'",
+                    w_obj)
             bigint = space.bigint_w(w_obj)
             return newbigint(space, w_longtype, bigint)
     else:
diff --git a/pypy/objspace/std/test/test_intobject.py b/pypy/objspace/std/test/test_intobject.py
--- a/pypy/objspace/std/test/test_intobject.py
+++ b/pypy/objspace/std/test/test_intobject.py
@@ -498,6 +498,11 @@
         b = A(5).real
         assert type(b) is int
 
+    def test_int_error_msg(self):
+        e = raises(TypeError, int, [])
+        assert str(e.value) == (
+            "int() argument must be a string or a number, not 'list'")
+
 
 class AppTestIntOptimizedAdd(AppTestInt):
     spaceconfig = {"objspace.std.optimized_int_add": True}
diff --git a/pypy/objspace/std/test/test_longobject.py b/pypy/objspace/std/test/test_longobject.py
--- a/pypy/objspace/std/test/test_longobject.py
+++ b/pypy/objspace/std/test/test_longobject.py
@@ -341,3 +341,8 @@
 
         assert int(long(3)) == long(3)
         assert int(A(13)) == 42
+
+    def test_long_error_msg(self):
+        e = raises(TypeError, long, [])
+        assert str(e.value) == (
+            "long() argument must be a string or a number, not 'list'")


More information about the pypy-commit mailing list