Author: Ronan Lamy <[email protected]>
Branch: exc-later
Changeset: r80719:1a9060a49acb
Date: 2015-11-17 00:13 +0000
http://bitbucket.org/pypy/pypy/changeset/1a9060a49acb/

Log:    Make it possible to tell the annotator what exceptions builtins
        raise

diff --git a/rpython/annotator/builtin.py b/rpython/annotator/builtin.py
--- a/rpython/annotator/builtin.py
+++ b/rpython/annotator/builtin.py
@@ -106,18 +106,23 @@
         args_s = [s_obj]
     nonneg = isinstance(s_obj, SomeInteger) and s_obj.nonneg
     return constpropagate(int, args_s, SomeInteger(nonneg=nonneg))
+builtin_int.can_only_throw = [ValueError]
 
 def builtin_float(s_obj):
     return constpropagate(float, [s_obj], SomeFloat())
+builtin_float.can_only_throw = [ValueError]
 
 def builtin_chr(s_int):
     return constpropagate(chr, [s_int], SomeChar())
+builtin_chr.can_only_throw = [ValueError]
 
 def builtin_unichr(s_int):
     return constpropagate(unichr, [s_int], SomeUnicodeCodePoint())
+builtin_unichr.can_only_throw = [ValueError]
 
 def builtin_unicode(s_unicode):
     return constpropagate(unicode, [s_unicode], SomeUnicodeString())
+builtin_unicode.can_only_throw = [UnicodeDecodeError]
 
 def builtin_bytearray(s_str):
     return SomeByteArray()
diff --git a/rpython/annotator/model.py b/rpython/annotator/model.py
--- a/rpython/annotator/model.py
+++ b/rpython/annotator/model.py
@@ -563,6 +563,11 @@
     def can_be_none(self):
         return False
 
+    @property
+    def can_only_throw(self):
+        # Unless otherwise specified, builtins don't raise exceptions
+        return getattr(self.analyser, 'can_only_throw', [])
+
 
 class SomeBuiltinMethod(SomeBuiltin):
     """ Stands for a built-in method which has got special meaning
diff --git a/rpython/annotator/test/test_annsimplifyrpython.py 
b/rpython/annotator/test/test_annsimplifyrpython.py
--- a/rpython/annotator/test/test_annsimplifyrpython.py
+++ b/rpython/annotator/test/test_annsimplifyrpython.py
@@ -135,3 +135,16 @@
         a = self.RPythonAnnotator()
         with py.test.raises(AnnotatorError):
             a.build_types(f, [int])
+
+    def test_irrelevant_except(self):
+        def f(name):
+            try:
+                number = int(name)
+            except IndexError:
+                return 0
+            return number
+        a = self.RPythonAnnotator()
+        s = a.build_types(f, [str])
+        graph = graphof(a, f)
+        return_links = [l for l in graph.iterlinks() if l.target is 
graph.returnblock]
+        assert len(return_links) == 1
diff --git a/rpython/annotator/unaryop.py b/rpython/annotator/unaryop.py
--- a/rpython/annotator/unaryop.py
+++ b/rpython/annotator/unaryop.py
@@ -863,6 +863,19 @@
             kwds_s['s_'+key] = s_value
         return self.analyser(*args_s, **kwds_s)
 
+def read_builtins_exc(s_builtin):
+    return getattr(s_builtin, 'can_only_throw', [])
+
[email protected]_call.register(SomeBuiltin)
+def simple_call_SomeBuiltin(annotator, v_func, *args_v):
+    return simple_call_SomeObject(annotator, v_func, *args_v)
+simple_call_SomeBuiltin.can_only_throw = read_builtins_exc
+
[email protected]_args.register(SomeBuiltin)
+def call_args_SomeBuiltin(annotator, v_func, *args_v):
+    return call_args(annotator, v_func, *args_v)
+call_args_SomeBuiltin.can_only_throw = read_builtins_exc
+
 
 class __extend__(SomeBuiltinMethod):
     def _can_only_throw(self, *args):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to