Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 824 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 835 } | 835 } |
| 836 } | 836 } |
| 837 | 837 |
| 838 T visitOperatorSend(Send node) { | 838 T visitOperatorSend(Send node) { |
| 839 Operator op = node.selector; | 839 Operator op = node.selector; |
| 840 if ("[]" == op.source) { | 840 if ("[]" == op.source) { |
| 841 return visitDynamicSend(node); | 841 return visitDynamicSend(node); |
| 842 } else if ("&&" == op.source) { | 842 } else if ("&&" == op.source) { |
| 843 conditionIsSimple = false; | 843 conditionIsSimple = false; |
| 844 bool oldAccumulateIsChecks = accumulateIsChecks; | 844 bool oldAccumulateIsChecks = accumulateIsChecks; |
| 845 assert(accumulateIsChecks || isChecks == null); | |
| 845 accumulateIsChecks = true; | 846 accumulateIsChecks = true; |
| 846 if (isChecks == null) isChecks = <Send>[]; | 847 if (isChecks == null) isChecks = <Send>[]; |
| 847 visit(node.receiver); | 848 visit(node.receiver); |
| 848 accumulateIsChecks = oldAccumulateIsChecks; | 849 accumulateIsChecks = oldAccumulateIsChecks; |
| 849 if (!accumulateIsChecks) isChecks = null; | 850 if (!accumulateIsChecks) isChecks = null; |
| 850 LocalsHandler<T> saved = locals; | 851 LocalsHandler<T> saved = locals; |
| 851 locals = new LocalsHandler<T>.from(locals, node); | 852 locals = new LocalsHandler<T>.from(locals, node); |
| 852 updateIsChecks(isChecks, usePositive: true); | 853 updateIsChecks(isChecks, usePositive: true); |
| 853 visit(node.arguments.head); | 854 visit(node.arguments.head); |
| 854 saved.mergeDiamondFlow(locals, null); | 855 saved.mergeDiamondFlow(locals, null); |
| 855 locals = saved; | 856 locals = saved; |
| 856 return types.boolType; | 857 return types.boolType; |
| 857 } else if ("||" == op.source) { | 858 } else if ("||" == op.source) { |
| 858 conditionIsSimple = false; | 859 conditionIsSimple = false; |
| 859 List<Send> tests = <Send>[]; | 860 List<Send> tests = <Send>[]; |
| 860 handleCondition(node.receiver, tests); | 861 handleCondition(node.receiver, tests); |
| 861 LocalsHandler<T> saved = locals; | 862 LocalsHandler<T> saved = locals; |
| 862 locals = new LocalsHandler<T>.from(locals, node); | 863 locals = new LocalsHandler<T>.from(locals, node); |
| 863 updateIsChecks(tests, usePositive: false); | 864 updateIsChecks(tests, usePositive: false); |
| 864 bool oldAccumulateIsChecks = accumulateIsChecks; | 865 bool oldAccumulateIsChecks = accumulateIsChecks; |
| 865 accumulateIsChecks = false; | 866 accumulateIsChecks = false; |
| 867 isChecks = null; | |
|
ngeoffray
2014/02/27 10:33:12
How about an abstraction:
bool stopAccumulatingIs
floitsch
2014/02/27 16:07:08
Added helper.
Changed the assert from the '&&' in
| |
| 866 visit(node.arguments.head); | 868 visit(node.arguments.head); |
| 867 accumulateIsChecks = oldAccumulateIsChecks; | 869 accumulateIsChecks = oldAccumulateIsChecks; |
| 868 saved.mergeDiamondFlow(locals, null); | 870 saved.mergeDiamondFlow(locals, null); |
| 869 locals = saved; | 871 locals = saved; |
| 870 return types.boolType; | 872 return types.boolType; |
| 871 } else if ("!" == op.source) { | 873 } else if ("!" == op.source) { |
| 872 bool oldAccumulateIsChecks = accumulateIsChecks; | 874 bool oldAccumulateIsChecks = accumulateIsChecks; |
| 873 accumulateIsChecks = false; | 875 accumulateIsChecks = false; |
|
floitsch
2014/02/27 16:07:08
Similar bug. (fixed in latest patch-set).
| |
| 874 node.visitChildren(this); | 876 node.visitChildren(this); |
| 875 accumulateIsChecks = oldAccumulateIsChecks; | 877 accumulateIsChecks = oldAccumulateIsChecks; |
| 876 return types.boolType; | 878 return types.boolType; |
| 877 } else if ("is" == op.source) { | 879 } else if ("is" == op.source) { |
| 878 potentiallyAddIsCheck(node); | 880 potentiallyAddIsCheck(node); |
| 879 node.visitChildren(this); | 881 node.visitChildren(this); |
| 880 return types.boolType; | 882 return types.boolType; |
| 881 } else if ("as" == op.source) { | 883 } else if ("as" == op.source) { |
| 882 T receiverType = visit(node.receiver); | 884 T receiverType = visit(node.receiver); |
| 883 DartType type = elements.getType(node.arguments.head); | 885 DartType type = elements.getType(node.arguments.head); |
| (...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1206 return type; | 1208 return type; |
| 1207 } | 1209 } |
| 1208 | 1210 |
| 1209 T visitCascade(Cascade node) { | 1211 T visitCascade(Cascade node) { |
| 1210 // 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 |
| 1211 // receiver. | 1213 // receiver. |
| 1212 visit(node.expression); | 1214 visit(node.expression); |
| 1213 return cascadeReceiverStack.removeLast(); | 1215 return cascadeReceiverStack.removeLast(); |
| 1214 } | 1216 } |
| 1215 } | 1217 } |
| OLD | NEW |