| Index: pkg/compiler/lib/src/cps_ir/type_propagation.dart
|
| diff --git a/pkg/compiler/lib/src/cps_ir/type_propagation.dart b/pkg/compiler/lib/src/cps_ir/type_propagation.dart
|
| index c537e219d748dc1c64836c8da7605190620a1a13..99a816ce2cf7ff01cb3cb419472c3ee8171e4223 100644
|
| --- a/pkg/compiler/lib/src/cps_ir/type_propagation.dart
|
| +++ b/pkg/compiler/lib/src/cps_ir/type_propagation.dart
|
| @@ -77,7 +77,7 @@ class TypeMaskSystem {
|
| bool methodUsesReceiverArgument(FunctionElement function) {
|
| assert(backend.isInterceptedMethod(function));
|
| ClassElement clazz = function.enclosingClass.declaration;
|
| - return clazz.isSubclassOf(backend.jsInterceptorClass) ||
|
| + return clazz.isSubclassOf(backend.jsInterceptorClass) ||
|
| classWorld.isUsedAsMixin(clazz);
|
| }
|
|
|
| @@ -829,12 +829,14 @@ class TransformingVisitor extends LeafVisitor {
|
| AbstractBool boolifiedValue = lattice.boolify(conditionValue);
|
|
|
| if (boolifiedValue == AbstractBool.True) {
|
| + replaceSubtree(falseCont.body, new Unreachable());
|
| InvokeContinuation invoke = new InvokeContinuation(trueCont, []);
|
| replaceSubtree(node, invoke);
|
| push(invoke);
|
| return;
|
| }
|
| if (boolifiedValue == AbstractBool.False) {
|
| + replaceSubtree(trueCont.body, new Unreachable());
|
| InvokeContinuation invoke = new InvokeContinuation(falseCont, []);
|
| replaceSubtree(node, invoke);
|
| push(invoke);
|
| @@ -2117,7 +2119,7 @@ class TypePropagationVisitor implements Visitor {
|
| setValue(node.parameters[0],
|
| nonConstant(typeSystem.getReceiverType(node.element)));
|
| } else {
|
| - setValue(node.thisParameter,
|
| + setValue(node.thisParameter,
|
| nonConstant(typeSystem.getReceiverType(node.element)));
|
| setValue(node.parameters[0], nonConstant());
|
| }
|
| @@ -2395,23 +2397,20 @@ class TypePropagationVisitor implements Visitor {
|
| void visitBranch(Branch node) {
|
| IsTrue isTrue = node.condition;
|
| AbstractValue conditionCell = getValue(isTrue.value.definition);
|
| -
|
| - if (conditionCell.isNothing) {
|
| - return; // And come back later.
|
| - } else if (conditionCell.isNonConst) {
|
| - setReachable(node.trueContinuation.definition);
|
| - setReachable(node.falseContinuation.definition);
|
| - } else if (conditionCell.isConstant && !conditionCell.constant.isBool) {
|
| - // Treat non-bool constants in condition as non-const since they result
|
| - // in type errors in checked mode.
|
| - // TODO(jgruber): Default to false in unchecked mode.
|
| - setReachable(node.trueContinuation.definition);
|
| - setReachable(node.falseContinuation.definition);
|
| - setValue(isTrue.value.definition, nonConstant(typeSystem.boolType));
|
| - } else if (conditionCell.isConstant && conditionCell.constant.isBool) {
|
| - BoolConstantValue boolConstant = conditionCell.constant;
|
| - setReachable((boolConstant.isTrue) ?
|
| - node.trueContinuation.definition : node.falseContinuation.definition);
|
| + AbstractBool boolifiedValue = lattice.boolify(conditionCell);
|
| + switch (boolifiedValue) {
|
| + case AbstractBool.Nothing:
|
| + break;
|
| + case AbstractBool.True:
|
| + setReachable(node.trueContinuation.definition);
|
| + break;
|
| + case AbstractBool.False:
|
| + setReachable(node.falseContinuation.definition);
|
| + break;
|
| + case AbstractBool.Maybe:
|
| + setReachable(node.trueContinuation.definition);
|
| + setReachable(node.falseContinuation.definition);
|
| + break;
|
| }
|
| }
|
|
|
|
|