| Index: pkg/compiler/lib/src/tree_ir/tree_ir_integrity.dart
|
| diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_integrity.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_integrity.dart
|
| index 01eaa9ce86da09ead2a7afcf4ae86e04e776de75..8829e70d2d5875c252d265b02ee184cb703ac2f1 100644
|
| --- a/pkg/compiler/lib/src/tree_ir/tree_ir_integrity.dart
|
| +++ b/pkg/compiler/lib/src/tree_ir/tree_ir_integrity.dart
|
| @@ -16,7 +16,7 @@ import 'tree_ir_nodes.dart';
|
| /// - Variables must not have more than one declaration.
|
| ///
|
| class CheckTreeIntegrity extends RecursiveVisitor {
|
| - ExecutableDefinition topLevelNode;
|
| + RootNode topLevelNode;
|
|
|
| Map<Variable, int> varReads = <Variable, int>{};
|
| Map<Variable, int> varWrites = <Variable, int>{};
|
| @@ -85,22 +85,9 @@ class CheckTreeIntegrity extends RecursiveVisitor {
|
| node.catchParameters.forEach(undeclare);
|
| }
|
|
|
| - visitFunctionDefinition(FunctionDefinition node) {
|
| - node.parameters.forEach(declare);
|
| - if (node.body != null) visitStatement(node.body);
|
| - node.parameters.forEach(undeclare);
|
| - }
|
| -
|
| - visitConstructorDefinition(ConstructorDefinition node) {
|
| - node.parameters.forEach(declare);
|
| - if (node.initializers != null) node.initializers.forEach(visitInitializer);
|
| - if (node.body != null) visitStatement(node.body);
|
| - node.parameters.forEach(undeclare);
|
| - }
|
| -
|
| visitFunctionDeclaration(FunctionDeclaration node) {
|
| declare(node.variable);
|
| - visitFunctionDefinition(node.definition);
|
| + checkBody(node.definition);
|
| visitStatement(node.next);
|
| undeclare(node.variable);
|
| if (varWrites[node.variable] > 1) {
|
| @@ -159,13 +146,23 @@ class CheckTreeIntegrity extends RecursiveVisitor {
|
| labelUses[node.target]++;
|
| }
|
|
|
| + visitInnerFunction(FunctionDefinition node) {
|
| + checkBody(node);
|
| + }
|
| +
|
| + void checkBody(RootNode node) {
|
| + node.parameters.forEach(declare);
|
| + node.forEachBody(visitStatement);
|
| + node.parameters.forEach(undeclare);
|
| + }
|
| +
|
| dynamic error(String message) {
|
| throw 'Tree IR integrity violation in ${topLevelNode.element}:\n$message';
|
| }
|
|
|
| - void check(ExecutableDefinition node) {
|
| + void check(RootNode node) {
|
| topLevelNode = node;
|
| - visitExecutableDefinition(node);
|
| + checkBody(node);
|
|
|
| // Verify reference counters for all variables.
|
| List<Variable> seenVariables = new List<Variable>();
|
|
|