| Index: pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart
|
| diff --git a/pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart b/pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart
|
| index dd44f1d1ed49be4b095f471cb34a5376eb32ef0f..bfed37d7923afe3c90bb419dfd5bedc2ecd8dadf 100644
|
| --- a/pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart
|
| +++ b/pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart
|
| @@ -52,8 +52,7 @@ import '../../constants/values.dart' as values;
|
| ///
|
| /// !x ? y : false ==> !x && y
|
| ///
|
| -class LogicalRewriter extends RecursiveTransformer
|
| - implements Pass {
|
| +class LogicalRewriter extends RecursiveTransformer implements Pass {
|
| String get passName => 'Logical rewriter';
|
|
|
| @override
|
| @@ -68,20 +67,20 @@ class LogicalRewriter extends RecursiveTransformer
|
| /// This means it will ultimately translate to an empty statement.
|
| bool isFallthrough(Statement node) {
|
| return node is Break && isFallthroughBreak(node) ||
|
| - node is Continue && isFallthroughContinue(node) ||
|
| - node is Return && isFallthroughReturn(node);
|
| + node is Continue && isFallthroughContinue(node) ||
|
| + node is Return && isFallthroughReturn(node);
|
| }
|
|
|
| bool isFallthroughBreak(Break node) {
|
| Statement target = fallthrough.target;
|
| return node.target.binding.next == target ||
|
| - target is Break && target.target == node.target;
|
| + target is Break && target.target == node.target;
|
| }
|
|
|
| bool isFallthroughContinue(Continue node) {
|
| Statement target = fallthrough.target;
|
| return node.target.binding == target ||
|
| - target is Continue && target.target == node.target;
|
| + target is Continue && target.target == node.target;
|
| }
|
|
|
| bool isFallthroughReturn(Return node) {
|
| @@ -90,8 +89,8 @@ class LogicalRewriter extends RecursiveTransformer
|
|
|
| bool isTerminator(Statement node) {
|
| return (node is Jump || node is Return) && !isFallthrough(node) ||
|
| - (node is ExpressionStatement && node.next is Unreachable) ||
|
| - node is Throw;
|
| + (node is ExpressionStatement && node.next is Unreachable) ||
|
| + node is Throw;
|
| }
|
|
|
| Statement visitIf(If node) {
|
| @@ -123,7 +122,7 @@ class LogicalRewriter extends RecursiveTransformer
|
| // if (E) {} else {S} ==> if (!E) {S}
|
| bestThenBranch = ELSE;
|
| } else if (isFallthrough(node.elseStatement) &&
|
| - !isFallthrough(node.thenStatement)) {
|
| + !isFallthrough(node.thenStatement)) {
|
| // Keep the empty statement in the 'else' branch.
|
| // if (E) {S} else {}
|
| bestThenBranch = THEN;
|
| @@ -136,12 +135,12 @@ class LogicalRewriter extends RecursiveTransformer
|
| // if (E) {S1; return v}; S2
|
| bestThenBranch = THEN;
|
| } else if (isTerminator(node.elseStatement) &&
|
| - !isTerminator(node.thenStatement)) {
|
| + !isTerminator(node.thenStatement)) {
|
| // Put early termination in the 'then' branch to reduce nesting depth.
|
| // if (E) {S}; return v ==> if (!E) return v; S
|
| bestThenBranch = ELSE;
|
| } else if (isTerminator(node.thenStatement) &&
|
| - !isTerminator(node.elseStatement)) {
|
| + !isTerminator(node.elseStatement)) {
|
| // Keep early termination in the 'then' branch to reduce nesting depth.
|
| // if (E) {return v;} S
|
| bestThenBranch = THEN;
|
| @@ -160,7 +159,7 @@ class LogicalRewriter extends RecursiveTransformer
|
| // ==>
|
| // if (E) S2 else S1
|
| node.condition = makeCondition(node.condition, true,
|
| - liftNots: bestThenBranch == NEITHER);
|
| + liftNots: bestThenBranch == NEITHER);
|
| if (bestThenBranch == NEITHER && node.condition is Not) {
|
| node.condition = (node.condition as Not).operand;
|
| Statement tmp = node.thenStatement;
|
| @@ -269,15 +268,13 @@ class LogicalRewriter extends RecursiveTransformer
|
| // x ? y : 0 ==> x && y (if x is truthy or zero) (and so on...)
|
| if (matchesFalsyValue(node.condition, getConstant(node.elseExpression))) {
|
| return new LogicalOperator.and(
|
| - visitExpression(node.condition),
|
| - node.thenExpression);
|
| + visitExpression(node.condition), node.thenExpression);
|
| }
|
| // x ? true : y ==> x || y (if x is falsy or true)
|
| // x ? 1 : y ==> x || y (if x is falsy or one) (and so on...)
|
| if (matchesTruthyValue(node.condition, getConstant(node.thenExpression))) {
|
| return new LogicalOperator.or(
|
| - visitExpression(node.condition),
|
| - node.elseExpression);
|
| + visitExpression(node.condition), node.elseExpression);
|
| }
|
| // x ? y : true ==> !x || y
|
| if (isTrue(node.elseExpression)) {
|
| @@ -328,11 +325,11 @@ class LogicalRewriter extends RecursiveTransformer
|
| /// rewritten anyway.
|
| bool isBooleanValued(Expression e) {
|
| return isTrue(e) ||
|
| - isFalse(e) ||
|
| - e is Not ||
|
| - e is LogicalOperator && isBooleanValuedLogicalOperator(e) ||
|
| - e is ApplyBuiltinOperator && operatorReturnsBool(e.operator) ||
|
| - e is TypeOperator && isBooleanValuedTypeOperator(e);
|
| + isFalse(e) ||
|
| + e is Not ||
|
| + e is LogicalOperator && isBooleanValuedLogicalOperator(e) ||
|
| + e is ApplyBuiltinOperator && operatorReturnsBool(e.operator) ||
|
| + e is TypeOperator && isBooleanValuedTypeOperator(e);
|
| }
|
|
|
| bool isBooleanValuedLogicalOperator(LogicalOperator e) {
|
| @@ -368,14 +365,22 @@ class LogicalRewriter extends RecursiveTransformer
|
|
|
| BuiltinOperator negateBuiltin(BuiltinOperator operator) {
|
| switch (operator) {
|
| - case BuiltinOperator.StrictEq: return BuiltinOperator.StrictNeq;
|
| - case BuiltinOperator.StrictNeq: return BuiltinOperator.StrictEq;
|
| - case BuiltinOperator.LooseEq: return BuiltinOperator.LooseNeq;
|
| - case BuiltinOperator.LooseNeq: return BuiltinOperator.LooseEq;
|
| - case BuiltinOperator.IsNumber: return BuiltinOperator.IsNotNumber;
|
| - case BuiltinOperator.IsNotNumber: return BuiltinOperator.IsNumber;
|
| - case BuiltinOperator.IsInteger: return BuiltinOperator.IsNotInteger;
|
| - case BuiltinOperator.IsNotInteger: return BuiltinOperator.IsInteger;
|
| + case BuiltinOperator.StrictEq:
|
| + return BuiltinOperator.StrictNeq;
|
| + case BuiltinOperator.StrictNeq:
|
| + return BuiltinOperator.StrictEq;
|
| + case BuiltinOperator.LooseEq:
|
| + return BuiltinOperator.LooseNeq;
|
| + case BuiltinOperator.LooseNeq:
|
| + return BuiltinOperator.LooseEq;
|
| + case BuiltinOperator.IsNumber:
|
| + return BuiltinOperator.IsNotNumber;
|
| + case BuiltinOperator.IsNotNumber:
|
| + return BuiltinOperator.IsNumber;
|
| + case BuiltinOperator.IsInteger:
|
| + return BuiltinOperator.IsNotInteger;
|
| + case BuiltinOperator.IsNotInteger:
|
| + return BuiltinOperator.IsInteger;
|
| case BuiltinOperator.IsUnsigned32BitInteger:
|
| return BuiltinOperator.IsNotUnsigned32BitInteger;
|
| case BuiltinOperator.IsNotUnsigned32BitInteger:
|
| @@ -406,7 +411,7 @@ class LogicalRewriter extends RecursiveTransformer
|
| /// If [polarity] if false, the negated condition will be created instead.
|
| /// If [liftNots] is true (default) then Not expressions will be lifted toward
|
| /// the root of the condition so they can be eliminated by the caller.
|
| - Expression makeCondition(Expression e, bool polarity, {bool liftNots:true}) {
|
| + Expression makeCondition(Expression e, bool polarity, {bool liftNots: true}) {
|
| if (e is Not) {
|
| // !!E ==> E
|
| return makeCondition(e.operand, !polarity, liftNots: liftNots);
|
| @@ -453,27 +458,23 @@ class LogicalRewriter extends RecursiveTransformer
|
| }
|
| // x ? true : y ==> x || y
|
| if (isTrue(e.thenExpression)) {
|
| - return makeOr(makeCondition(e.condition, true),
|
| - e.elseExpression,
|
| - liftNots: liftNots);
|
| + return makeOr(makeCondition(e.condition, true), e.elseExpression,
|
| + liftNots: liftNots);
|
| }
|
| // x ? false : y ==> !x && y
|
| if (isFalse(e.thenExpression)) {
|
| - return makeAnd(makeCondition(e.condition, false),
|
| - e.elseExpression,
|
| - liftNots: liftNots);
|
| + return makeAnd(makeCondition(e.condition, false), e.elseExpression,
|
| + liftNots: liftNots);
|
| }
|
| // x ? y : true ==> !x || y
|
| if (isTrue(e.elseExpression)) {
|
| - return makeOr(makeCondition(e.condition, false),
|
| - e.thenExpression,
|
| - liftNots: liftNots);
|
| + return makeOr(makeCondition(e.condition, false), e.thenExpression,
|
| + liftNots: liftNots);
|
| }
|
| // x ? y : false ==> x && y
|
| if (isFalse(e.elseExpression)) {
|
| - return makeAnd(makeCondition(e.condition, true),
|
| - e.thenExpression,
|
| - liftNots: liftNots);
|
| + return makeAnd(makeCondition(e.condition, true), e.thenExpression,
|
| + liftNots: liftNots);
|
| }
|
|
|
| e.condition = makeCondition(e.condition, true);
|
|
|