Index: sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart |
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart b/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart |
index 86662f7dcb798a5ba86b62cd839375bd13f04499..94d80bbefb40412dff112ce33b0d676bdeb285f7 100644 |
--- a/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart |
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart |
@@ -842,14 +842,19 @@ abstract class InferrerVisitor |
} else if ("&&" == op.source) { |
conditionIsSimple = false; |
bool oldAccumulateIsChecks = accumulateIsChecks; |
- accumulateIsChecks = true; |
- if (isChecks == null) isChecks = <Send>[]; |
+ List<Send> oldIsChecks = isChecks; |
+ if (!accumulateIsChecks) { |
+ accumulateIsChecks = true; |
+ isChecks = <Send>[]; |
+ } |
visit(node.receiver); |
- accumulateIsChecks = oldAccumulateIsChecks; |
- if (!accumulateIsChecks) isChecks = null; |
LocalsHandler<T> saved = locals; |
locals = new LocalsHandler<T>.from(locals, node); |
updateIsChecks(isChecks, usePositive: true); |
+ if (!oldAccumulateIsChecks) { |
+ accumulateIsChecks = false; |
+ isChecks = oldIsChecks; |
+ } |
visit(node.arguments.head); |
saved.mergeDiamondFlow(locals, null); |
locals = saved; |
@@ -857,10 +862,10 @@ abstract class InferrerVisitor |
} else if ("||" == op.source) { |
conditionIsSimple = false; |
List<Send> tests = <Send>[]; |
- handleCondition(node.receiver, tests); |
+ bool isSimple = handleCondition(node.receiver, tests); |
LocalsHandler<T> saved = locals; |
locals = new LocalsHandler<T>.from(locals, node); |
- updateIsChecks(tests, usePositive: false); |
+ if (isSimple) updateIsChecks(tests, usePositive: false); |
bool oldAccumulateIsChecks = accumulateIsChecks; |
accumulateIsChecks = false; |
visit(node.arguments.head); |