Index: pkg/compiler/lib/src/cps_ir/cps_ir_integrity.dart |
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_integrity.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_integrity.dart |
index dfc07a39e7d3f103acd4babd31a4d6a8474562c1..88faa4d5713549ae7a928e3771f306e1dacc4cf9 100644 |
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_integrity.dart |
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_integrity.dart |
@@ -24,10 +24,9 @@ const bool ENABLE_DUMP = tracer.TRACE_FILTER_PATTERN != null; |
/// - Each definition object occurs only once in the IR (no redeclaring). |
/// - Each reference object occurs only once in the IR (no sharing). |
/// |
-class CheckCpsIntegrity extends TrampolineRecursiveVisitor { |
+class CheckCpsIntegrity extends RecursiveVisitor { |
FunctionDefinition topLevelNode; |
- String previousPass; |
Set<Definition> seenDefinitions = new Set<Definition>(); |
Map<Definition, Set<Reference>> seenReferences = |
@@ -53,10 +52,8 @@ class CheckCpsIntegrity extends TrampolineRecursiveVisitor { |
pushAction(() => insideContinuations.remove(cont)); |
} |
- void check(FunctionDefinition node, String previousPass) { |
+ void check(FunctionDefinition node) { |
topLevelNode = node; |
- this.previousPass = previousPass; |
- ParentChecker.checkParents(node, this); |
visit(node); |
// Check for broken reference chains. We check this last, so out-of-scope |
// references are not classified as a broken reference chain. |
@@ -184,58 +181,16 @@ class CheckCpsIntegrity extends TrampolineRecursiveVisitor { |
try { |
Decorator decorator = (n, String s) => n == node ? '**$s**' : s; |
sexpr = new SExpressionStringifier(decorator).visit(topLevelNode); |
- sexpr = 'SExpr dump (offending node marked with **):\n\n$sexpr'; |
} catch (e) { |
sexpr = '(Exception thrown by SExpressionStringifier: $e)'; |
} |
} else { |
- sexpr = '(Set DUMP_IR flag to enable SExpr dump)'; |
+ sexpr = '(Set DUMP_IR flag to enable)'; |
} |
- throw 'CPS integrity violation\n' |
- 'After $previousPass on ${topLevelNode.element}\n' |
+ throw 'CPS integrity violation in ${topLevelNode.element}:\n' |
'$message\n\n' |
+ 'SExpr dump (offending node marked with **):\n\n' |
'$sexpr\n'; |
} |
-} |
- |
-/// Traverses the CPS term and checks that node.parent is correctly set |
-/// for each visited node. |
-class ParentChecker extends DeepRecursiveVisitor { |
- static void checkParents(Node node, CheckCpsIntegrity main) { |
- ParentChecker visitor = new ParentChecker._make(main); |
- visitor._worklist.add(node); |
- visitor.trampoline(); |
- } |
- |
- ParentChecker._make(this.main); |
- |
- Node _parent; |
- final List<Node> _worklist = <Node>[]; |
- final CheckCpsIntegrity main; |
- |
- void trampoline() { |
- while (_worklist.isNotEmpty) { |
- _parent = _worklist.removeLast(); |
- _parent.accept(this); |
- } |
- } |
- error(String message, node) => main.error(message, node); |
- |
- @override |
- visit(Node node) { |
- _worklist.add(node); |
- if (node.parent != _parent) { |
- error('Parent pointer on $node is ${node.parent} but should be $_parent', |
- node); |
- } |
- } |
- |
- @override |
- processReference(Reference node) { |
- if (node.parent != _parent) { |
- error('Parent pointer on $node is ${node.parent} but should be $_parent', |
- node); |
- } |
- } |
} |