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

Side by Side Diff: sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart

Issue 181783006: Fix bad type-inferrence for is-checks in logical and/or expressions. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Add another test. Created 6 years, 10 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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 inferrer_visitor; 5 library inferrer_visitor;
6 6
7 import '../dart2jslib.dart' hide Selector, TypedSelector; 7 import '../dart2jslib.dart' hide Selector, TypedSelector;
8 import '../dart_types.dart'; 8 import '../dart_types.dart';
9 import '../elements/elements.dart'; 9 import '../elements/elements.dart';
10 import '../tree/tree.dart'; 10 import '../tree/tree.dart';
(...skipping 840 matching lines...) Expand 10 before | Expand all | Expand 10 after
851 LocalsHandler<T> saved = locals; 851 LocalsHandler<T> saved = locals;
852 locals = new LocalsHandler<T>.from(locals, node); 852 locals = new LocalsHandler<T>.from(locals, node);
853 updateIsChecks(isChecks, usePositive: true); 853 updateIsChecks(isChecks, usePositive: true);
854 visit(node.arguments.head); 854 visit(node.arguments.head);
855 saved.mergeDiamondFlow(locals, null); 855 saved.mergeDiamondFlow(locals, null);
856 locals = saved; 856 locals = saved;
857 return types.boolType; 857 return types.boolType;
858 } else if ("||" == op.source) { 858 } else if ("||" == op.source) {
859 conditionIsSimple = false; 859 conditionIsSimple = false;
860 List<Send> tests = <Send>[]; 860 List<Send> tests = <Send>[];
861 handleCondition(node.receiver, tests); 861 bool isSimple = handleCondition(node.receiver, tests);
862 LocalsHandler<T> saved = locals; 862 LocalsHandler<T> saved = locals;
863 locals = new LocalsHandler<T>.from(locals, node); 863 locals = new LocalsHandler<T>.from(locals, node);
864 updateIsChecks(tests, usePositive: false); 864 if (isSimple) updateIsChecks(tests, usePositive: false);
865 bool oldAccumulateIsChecks = accumulateIsChecks; 865 bool oldAccumulateIsChecks = accumulateIsChecks;
866 accumulateIsChecks = false; 866 accumulateIsChecks = false;
867 isChecks = null; 867 isChecks = null;
868 visit(node.arguments.head); 868 visit(node.arguments.head);
869 accumulateIsChecks = oldAccumulateIsChecks; 869 accumulateIsChecks = oldAccumulateIsChecks;
870 saved.mergeDiamondFlow(locals, null); 870 saved.mergeDiamondFlow(locals, null);
871 locals = saved; 871 locals = saved;
872 return types.boolType; 872 return types.boolType;
873 } else if ("!" == op.source) { 873 } else if ("!" == op.source) {
874 bool oldAccumulateIsChecks = accumulateIsChecks; 874 bool oldAccumulateIsChecks = accumulateIsChecks;
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after
1208 return type; 1208 return type;
1209 } 1209 }
1210 1210
1211 T visitCascade(Cascade node) { 1211 T visitCascade(Cascade node) {
1212 // Ignore the result of the cascade send and return the type of the cascade 1212 // Ignore the result of the cascade send and return the type of the cascade
1213 // receiver. 1213 // receiver.
1214 visit(node.expression); 1214 visit(node.expression);
1215 return cascadeReceiverStack.removeLast(); 1215 return cascadeReceiverStack.removeLast();
1216 } 1216 }
1217 } 1217 }
OLDNEW
« no previous file with comments | « no previous file | tests/compiler/dart2js/simple_inferrer_and_or_test.dart » ('j') | tests/language/logical_expression3_test.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698