| Index: pkg/compiler/lib/src/tree_ir/optimization/pull_into_initializers.dart
|
| diff --git a/pkg/compiler/lib/src/tree_ir/optimization/pull_into_initializers.dart b/pkg/compiler/lib/src/tree_ir/optimization/pull_into_initializers.dart
|
| index e68c4886f93e76539efde5f24589ca176bd7790c..a19aeba06c03c33cc00e03756c3eb085d571587c 100644
|
| --- a/pkg/compiler/lib/src/tree_ir/optimization/pull_into_initializers.dart
|
| +++ b/pkg/compiler/lib/src/tree_ir/optimization/pull_into_initializers.dart
|
| @@ -2,6 +2,8 @@
|
| // for details. All rights reserved. Use of this source code is governed by a
|
| // BSD-style license that can be found in the LICENSE file.
|
|
|
| +library tree_ir.optimization.pull_into_initializers;
|
| +
|
| import 'optimization.dart' show Pass;
|
| import '../tree_ir_nodes.dart';
|
|
|
| @@ -46,17 +48,10 @@ import '../tree_ir_nodes.dart';
|
| /// [PullIntoInitializers] cannot pull `y` into an initializer because
|
| /// the impure expressions `foo()` and `bar()` would then be swapped.
|
| ///
|
| -class PullIntoInitializers implements Pass {
|
| +class PullIntoInitializers extends ExpressionVisitor<Expression>
|
| + implements Pass {
|
| String get passName => 'Pull into initializers';
|
|
|
| - void rewrite(RootNode node) {
|
| - node.replaceEachBody((Statement body) {
|
| - return new BodyRewriter().rewriteBody(node.parameters, body);
|
| - });
|
| - }
|
| -}
|
| -
|
| -class BodyRewriter extends ExpressionVisitor<Expression> {
|
| Set<Variable> assignedVariables = new Set<Variable>();
|
|
|
| /// The fragment between [first] and [last] holds the statements
|
| @@ -98,8 +93,9 @@ class BodyRewriter extends ExpressionVisitor<Expression> {
|
| return visitExpression(node);
|
| }
|
|
|
| - Statement rewriteBody(List<Variable> parameters, Statement body) {
|
| - assignedVariables.addAll(parameters);
|
| + void rewrite(FunctionDefinition node) {
|
| + Statement body = node.body;
|
| + assignedVariables.addAll(node.parameters);
|
|
|
| // [body] represents the first statement after the initializer block.
|
| // Repeatedly pull assignment statements into the initializer block.
|
| @@ -134,7 +130,8 @@ class BodyRewriter extends ExpressionVisitor<Expression> {
|
|
|
| append(body);
|
| assert(first != null); // Because we just appended the body.
|
| - return first;
|
| +
|
| + node.body = first;
|
| }
|
|
|
| void destroyVariableUse(VariableUse node) {
|
| @@ -255,7 +252,7 @@ class BodyRewriter extends ExpressionVisitor<Expression> {
|
| }
|
|
|
| void visitInnerFunction(FunctionDefinition node) {
|
| - node.body = new BodyRewriter().rewriteBody(node.parameters, node.body);
|
| + new PullIntoInitializers().rewrite(node);
|
| }
|
|
|
| Expression visitFunctionExpression(FunctionExpression node) {
|
| @@ -315,10 +312,6 @@ class BodyRewriter extends ExpressionVisitor<Expression> {
|
| return node;
|
| }
|
|
|
| - Expression visitReifyTypeVar(ReifyTypeVar node) {
|
| - return node;
|
| - }
|
| -
|
| Expression visitNot(Not node) {
|
| node.operand = visitExpression(node.operand);
|
| return node;
|
|
|