[pypy-commit] pypy improve-errors-again: (Edd, Ronan) Begin refactoring UnionError/AnnotatorError.

vext01 noreply at buildbot.pypy.org
Wed Aug 28 18:26:17 CEST 2013


Author: Edd Barrett <vext01 at gmail.com>
Branch: improve-errors-again
Changeset: r66413:34e2f4edb458
Date: 2013-08-28 12:43 +0100
http://bitbucket.org/pypy/pypy/changeset/34e2f4edb458/

Log:	(Edd, Ronan) Begin refactoring UnionError/AnnotatorError.

diff --git a/rpython/annotator/annrpython.py b/rpython/annotator/annrpython.py
--- a/rpython/annotator/annrpython.py
+++ b/rpython/annotator/annrpython.py
@@ -602,6 +602,10 @@
                 raise BlockedInference(self, op, opindex)
         try:
             resultcell = consider_meth(*argcells)
+        except annmodel.AnnotatorError as e: # note that UnionError is a subclass
+            graph = self.bookkeeper.position_key[0]
+            e.source = '\n'.join(source_lines(graph, block, opindex, long=True))
+            raise
         except Exception, e:
             graph = self.bookkeeper.position_key[0]
             e.args = e.args + (
diff --git a/rpython/annotator/model.py b/rpython/annotator/model.py
--- a/rpython/annotator/model.py
+++ b/rpython/annotator/model.py
@@ -678,9 +678,19 @@
 
 
 class AnnotatorError(Exception):
-    pass
+    def __init__(self, msg=None):
+        self.msg = msg
+        self.source = None
 
-class UnionError(Exception):
+    def __str__(self):
+        s = "\n\n%s" % self.msg
+        if self.source is not None:
+            s += "\n\n"
+            s += self.source
+
+        return s
+
+class UnionError(AnnotatorError):
     """Signals an suspicious attempt at taking the union of
     deeply incompatible SomeXxx instances."""
 
@@ -690,25 +700,16 @@
         The msg paramter is appended to a generic message. This can be used to
         give the user a little more information.
         """
+        s = ""
+        if msg is not None:
+            s += "%s\n\n" % msg
+        s += "Offending annotations:\n"
+        s += "  %s\n  %s" % (s_obj1, s_obj2)
         self.s_obj1 = s_obj1
         self.s_obj2 = s_obj2
-        self.msg = msg
+        self.msg = s
         self.source = None
 
-    def __str__(self):
-        s = "\n\n"
-
-        if self.msg is not None:
-            s += "%s\n\n" % self.msg
-
-        s += "Offending annotations:\n"
-        s += "%s\n%s\n\n" % (self.s_obj1, self.s_obj2)
-
-        if self.source is not None:
-            s += self.source
-
-        return s
-
     def __repr__(self):
         return str(self)
 
diff --git a/rpython/tool/error.py b/rpython/tool/error.py
--- a/rpython/tool/error.py
+++ b/rpython/tool/error.py
@@ -109,7 +109,6 @@
 def format_blocked_annotation_error(annotator, blocked_blocks):
     text = []
     for block, (graph, index) in blocked_blocks.items():
-        text.append('\n')
         text.append("Blocked block -- operation cannot succeed")
         text.append(gather_error(annotator, graph, block, index))
     return '\n'.join(text)


More information about the pypy-commit mailing list