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

Side by Side Diff: pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart

Issue 1287253002: dart2js cps: Compile some loops as 'for' loops. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 4 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library tree_ir_nodes; 5 library tree_ir_nodes;
6 6
7 import '../constants/values.dart' as values; 7 import '../constants/values.dart' as values;
8 import '../dart_types.dart' show DartType, InterfaceType, TypeVariableType; 8 import '../dart_types.dart' show DartType, InterfaceType, TypeVariableType;
9 import '../elements/elements.dart'; 9 import '../elements/elements.dart';
10 import '../io/source_information.dart' show SourceInformation; 10 import '../io/source_information.dart' show SourceInformation;
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 } 489 }
490 490
491 Statement get next => null; 491 Statement get next => null;
492 void set next(Statement s) => throw 'UNREACHABLE'; 492 void set next(Statement s) => throw 'UNREACHABLE';
493 493
494 accept(StatementVisitor visitor) => visitor.visitWhileTrue(this); 494 accept(StatementVisitor visitor) => visitor.visitWhileTrue(this);
495 accept1(StatementVisitor1 visitor, arg) => visitor.visitWhileTrue(this, arg); 495 accept1(StatementVisitor1 visitor, arg) => visitor.visitWhileTrue(this, arg);
496 } 496 }
497 497
498 /** 498 /**
499 * A while loop with a condition. If the condition is false, control resumes 499 * A loop with a condition and update expressions. If there are any update
500 * at the [next] statement. 500 * expressions, this generates a for loop, otherwise a while loop.
501 *
502 * When the condition is false, control resumes at the [next] statement.
501 * 503 *
502 * It is NOT valid to target this statement with a [Break]. 504 * It is NOT valid to target this statement with a [Break].
503 * The only way to reach [next] is for the condition to evaluate to false. 505 * The only way to reach [next] is for the condition to evaluate to false.
504 * 506 *
505 * [WhileCondition] statements are introduced in the [LoopRewriter] and is 507 * [WhileCondition] statements are introduced in the [LoopRewriter] and is
506 * assumed not to occur before then. 508 * assumed not to occur before then.
507 */ 509 */
508 class WhileCondition extends Loop { 510 class WhileCondition extends Loop {
Kevin Millikin (Google) 2015/08/13 11:32:47 Strange that While has updates. Maybe we call it
asgerf 2015/08/13 12:06:42 Renamed.
509 final Label label; 511 final Label label;
510 Expression condition; 512 Expression condition;
513 List<Expression> updates;
511 Statement body; 514 Statement body;
512 Statement next; 515 Statement next;
513 516
514 WhileCondition(this.label, this.condition, this.body, 517 WhileCondition(this.label,
518 this.condition,
519 this.updates,
520 this.body,
515 this.next) { 521 this.next) {
516 assert(label.binding == null); 522 assert(label.binding == null);
517 label.binding = this; 523 label.binding = this;
518 } 524 }
519 525
520 accept(StatementVisitor visitor) => visitor.visitWhileCondition(this); 526 accept(StatementVisitor visitor) => visitor.visitWhileCondition(this);
521 accept1(StatementVisitor1 visitor, arg) { 527 accept1(StatementVisitor1 visitor, arg) {
522 return visitor.visitWhileCondition(this, arg); 528 return visitor.visitWhileCondition(this, arg);
523 } 529 }
524 } 530 }
(...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after
1135 visitStatement(node.thenStatement); 1141 visitStatement(node.thenStatement);
1136 visitStatement(node.elseStatement); 1142 visitStatement(node.elseStatement);
1137 } 1143 }
1138 1144
1139 visitWhileTrue(WhileTrue node) { 1145 visitWhileTrue(WhileTrue node) {
1140 visitStatement(node.body); 1146 visitStatement(node.body);
1141 } 1147 }
1142 1148
1143 visitWhileCondition(WhileCondition node) { 1149 visitWhileCondition(WhileCondition node) {
1144 visitExpression(node.condition); 1150 visitExpression(node.condition);
1151 node.updates.forEach(visitExpression);
1145 visitStatement(node.body); 1152 visitStatement(node.body);
1146 visitStatement(node.next); 1153 visitStatement(node.next);
1147 } 1154 }
1148 1155
1149 visitExpressionStatement(ExpressionStatement inputNode) { 1156 visitExpressionStatement(ExpressionStatement inputNode) {
1150 // Iterate over chains of expression statements to avoid deep recursion. 1157 // Iterate over chains of expression statements to avoid deep recursion.
1151 Statement node = inputNode; 1158 Statement node = inputNode;
1152 while (node is ExpressionStatement) { 1159 while (node is ExpressionStatement) {
1153 ExpressionStatement stmt = node; 1160 ExpressionStatement stmt = node;
1154 visitExpression(stmt.expression); 1161 visitExpression(stmt.expression);
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
1366 return node; 1373 return node;
1367 } 1374 }
1368 1375
1369 visitWhileTrue(WhileTrue node) { 1376 visitWhileTrue(WhileTrue node) {
1370 node.body = visitStatement(node.body); 1377 node.body = visitStatement(node.body);
1371 return node; 1378 return node;
1372 } 1379 }
1373 1380
1374 visitWhileCondition(WhileCondition node) { 1381 visitWhileCondition(WhileCondition node) {
1375 node.condition = visitExpression(node.condition); 1382 node.condition = visitExpression(node.condition);
1383 _replaceExpressions(node.updates);
1376 node.body = visitStatement(node.body); 1384 node.body = visitStatement(node.body);
1377 node.next = visitStatement(node.next); 1385 node.next = visitStatement(node.next);
1378 return node; 1386 return node;
1379 } 1387 }
1380 1388
1381 visitExpressionStatement(ExpressionStatement node) { 1389 visitExpressionStatement(ExpressionStatement node) {
1382 // Iterate over chains of expression statements to avoid deep recursion. 1390 // Iterate over chains of expression statements to avoid deep recursion.
1383 Statement first = node; 1391 Statement first = node;
1384 while (true) { 1392 while (true) {
1385 node.expression = visitExpression(node.expression); 1393 node.expression = visitExpression(node.expression);
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
1526 1534
1527 /// Number of uses of the current fallthrough target. 1535 /// Number of uses of the current fallthrough target.
1528 int get useCount => _stack.last.useCount; 1536 int get useCount => _stack.last.useCount;
1529 1537
1530 /// Indicate that a statement will fall through to the current fallthrough 1538 /// Indicate that a statement will fall through to the current fallthrough
1531 /// target. 1539 /// target.
1532 void use() { 1540 void use() {
1533 ++_stack.last.useCount; 1541 ++_stack.last.useCount;
1534 } 1542 }
1535 } 1543 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698