Author: Ronan Lamy <ronan.l...@gmail.com> Branch: Changeset: r88599:cbf3627becf5 Date: 2016-11-23 23:10 +0000 http://bitbucket.org/pypy/pypy/changeset/cbf3627becf5/
Log: Add translation option to keep annotating as much as possible when AnnotationErrors are raised, and report all these errors at the end. diff --git a/rpython/annotator/annrpython.py b/rpython/annotator/annrpython.py --- a/rpython/annotator/annrpython.py +++ b/rpython/annotator/annrpython.py @@ -22,7 +22,8 @@ """Block annotator for RPython. See description in doc/translation.txt.""" - def __init__(self, translator=None, policy=None, bookkeeper=None): + def __init__(self, translator=None, policy=None, bookkeeper=None, + keepgoing=False): import rpython.rtyper.extfuncregistry # has side effects if translator is None: @@ -50,6 +51,9 @@ if bookkeeper is None: bookkeeper = Bookkeeper(self) self.bookkeeper = bookkeeper + self.keepgoing = keepgoing + self.failed_blocks = set() + self.errors = [] def __getstate__(self): attrs = """translator pendingblocks annotated links_followed @@ -202,6 +206,12 @@ else: newgraphs = self.translator.graphs #all of them got_blocked_blocks = False in self.annotated.values() + if self.failed_blocks: + text = ('Annotation failed, %s errors were recorded:' % + len(self.errors)) + text += '\n-----'.join(str(e) for e in self.errors) + raise annmodel.AnnotatorError(text) + if got_blocked_blocks: for graph in self.blocked_graphs.values(): self.blocked_graphs[graph] = True @@ -348,6 +358,8 @@ #print '* processblock', block, cells self.annotated[block] = graph + if block in self.failed_blocks: + return if block in self.blocked_blocks: del self.blocked_blocks[block] try: @@ -392,6 +404,10 @@ except annmodel.UnionError as e: # Add source code to the UnionError e.source = '\n'.join(source_lines(graph, block, None, long=True)) + if self.keepgoing: + self.errors.append(e) + self.failed_blocks.add(block) + return raise # if the merged cells changed, we must redo the analysis if unions != oldcells: @@ -482,6 +498,10 @@ except annmodel.AnnotatorError as e: # note that UnionError is a subclass e.source = gather_error(self, graph, block, i) + if self.keepgoing: + self.errors.append(e) + self.failed_blocks.add(block) + return raise else: diff --git a/rpython/config/translationoption.py b/rpython/config/translationoption.py --- a/rpython/config/translationoption.py +++ b/rpython/config/translationoption.py @@ -188,6 +188,10 @@ "When true, enable the use of tagged pointers. " "If false, use normal boxing", default=False), + BoolOption("keepgoing", + "Continue annotating when errors are encountered, and report " + "them all at the end of the annotation phase", + default=False, cmdline="--keepgoing"), BoolOption("lldebug", "If true, makes an lldebug build", default=False, cmdline="--lldebug"), diff --git a/rpython/translator/translator.py b/rpython/translator/translator.py --- a/rpython/translator/translator.py +++ b/rpython/translator/translator.py @@ -67,7 +67,8 @@ if self.annotator is not None: raise ValueError("we already have an annotator") from rpython.annotator.annrpython import RPythonAnnotator - self.annotator = RPythonAnnotator(self, policy=policy) + self.annotator = RPythonAnnotator( + self, policy=policy, keepgoing=self.config.translation.keepgoing) return self.annotator def buildrtyper(self): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit