Index: pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart |
diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart |
index f6ff4828fd6f6dbbdb1b97bd045373a6af0f0e68..c23efd500fc60735aa3e8d75a03276333f73ced3 100644 |
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart |
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart |
@@ -1108,9 +1108,15 @@ abstract class RecursiveVisitor implements StatementVisitor, ExpressionVisitor { |
visitStatement(node.next); |
} |
- visitExpressionStatement(ExpressionStatement node) { |
- visitExpression(node.expression); |
- visitStatement(node.next); |
+ visitExpressionStatement(ExpressionStatement inputNode) { |
+ // Iterate over chains of expression statements to avoid deep recursion. |
+ Statement node = inputNode; |
+ while (node is ExpressionStatement) { |
+ ExpressionStatement stmt = node; |
+ visitExpression(stmt.expression); |
+ node = stmt.next; |
+ } |
+ visitStatement(node); |
} |
visitTry(Try node) { |
@@ -1326,9 +1332,18 @@ class RecursiveTransformer extends Transformer { |
} |
visitExpressionStatement(ExpressionStatement node) { |
- node.expression = visitExpression(node.expression); |
+ // Iterate over chains of expression statements to avoid deep recursion. |
+ Statement first = node; |
+ while (true) { |
+ node.expression = visitExpression(node.expression); |
+ if (node.next is ExpressionStatement) { |
+ node = node.next; |
+ } else { |
+ break; |
+ } |
+ } |
node.next = visitStatement(node.next); |
- return node; |
+ return first; |
} |
visitTry(Try node) { |