Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(98)

Unified Diff: pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart

Issue 1251083002: dart2js cps: Avoid deep recursion using trampolines and basic blocks. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Rebase Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart ('k') | pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
« no previous file with comments | « pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart ('k') | pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698