| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 import 'package:kernel/ast.dart' as ir; | 5 import 'package:kernel/ast.dart' as ir; |
| 6 | 6 |
| 7 import '../common.dart'; | 7 import '../common.dart'; |
| 8 import '../common/names.dart'; | 8 import '../common/names.dart'; |
| 9 import '../compiler.dart'; | 9 import '../compiler.dart'; |
| 10 import '../constants/expressions.dart'; | 10 import '../constants/expressions.dart'; |
| (...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 500 : new ElementGraphBuilder(element, resolvedAst, compiler, this); | 500 : new ElementGraphBuilder(element, resolvedAst, compiler, this); |
| 501 TypeInformation type; | 501 TypeInformation type; |
| 502 reporter.withCurrentElement(element, () { | 502 reporter.withCurrentElement(element, () { |
| 503 // ignore: UNDEFINED_METHOD | 503 // ignore: UNDEFINED_METHOD |
| 504 type = visitor.run(); | 504 type = visitor.run(); |
| 505 }); | 505 }); |
| 506 addedInGraph++; | 506 addedInGraph++; |
| 507 | 507 |
| 508 if (element.isField) { | 508 if (element.isField) { |
| 509 FieldElement fieldElement = element; | 509 FieldElement fieldElement = element; |
| 510 ast.Node node = resolvedAst.node; | |
| 511 ast.Node initializer = resolvedAst.body; | 510 ast.Node initializer = resolvedAst.body; |
| 512 if (element.isFinal || element.isConst) { | 511 if (element.isFinal || element.isConst) { |
| 513 // If [element] is final and has an initializer, we record | 512 // If [element] is final and has an initializer, we record |
| 514 // the inferred type. | 513 // the inferred type. |
| 515 if (resolvedAst.body != null) { | 514 if (resolvedAst.body != null) { |
| 516 if (type is! ListTypeInformation && type is! MapTypeInformation) { | 515 if (type is! ListTypeInformation && type is! MapTypeInformation) { |
| 517 // For non-container types, the constant handler does | 516 // For non-container types, the constant handler does |
| 518 // constant folding that could give more precise results. | 517 // constant folding that could give more precise results. |
| 519 ConstantExpression constant = fieldElement.constant; | 518 ConstantExpression constant = fieldElement.constant; |
| 520 if (constant != null) { | 519 if (constant != null) { |
| 521 ConstantValue value = | 520 ConstantValue value = |
| 522 compiler.backend.constants.getConstantValue(constant); | 521 compiler.backend.constants.getConstantValue(constant); |
| 523 if (value != null) { | 522 if (value != null) { |
| 524 if (value.isFunction) { | 523 if (value.isFunction) { |
| 525 FunctionConstantValue functionConstant = value; | 524 FunctionConstantValue functionConstant = value; |
| 526 MethodElement function = functionConstant.element; | 525 MethodElement function = functionConstant.element; |
| 527 type = types.allocateClosure(node, function); | 526 type = types.allocateClosure(function); |
| 528 } else { | 527 } else { |
| 529 // Although we might find a better type, we have to keep | 528 // Although we might find a better type, we have to keep |
| 530 // the old type around to ensure that we get a complete view | 529 // the old type around to ensure that we get a complete view |
| 531 // of the type graph and do not drop any flow edges. | 530 // of the type graph and do not drop any flow edges. |
| 532 TypeMask refinedType = computeTypeMask(closedWorld, value); | 531 TypeMask refinedType = computeTypeMask(closedWorld, value); |
| 533 assert(TypeMask.assertIsNormalized(refinedType, closedWorld)); | 532 assert(TypeMask.assertIsNormalized(refinedType, closedWorld)); |
| 534 type = new NarrowTypeInformation(type, refinedType); | 533 type = new NarrowTypeInformation(type, refinedType); |
| 535 types.allocatedTypes.add(type); | 534 types.allocatedTypes.add(type); |
| 536 } | 535 } |
| 537 } else { | 536 } else { |
| (...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 907 * [inLoop] tells whether the call happens in a loop. | 906 * [inLoop] tells whether the call happens in a loop. |
| 908 */ | 907 */ |
| 909 TypeInformation registerCalledSelector( | 908 TypeInformation registerCalledSelector( |
| 910 ast.Node node, | 909 ast.Node node, |
| 911 Selector selector, | 910 Selector selector, |
| 912 TypeMask mask, | 911 TypeMask mask, |
| 913 TypeInformation receiverType, | 912 TypeInformation receiverType, |
| 914 MemberElement caller, | 913 MemberElement caller, |
| 915 ArgumentsTypes arguments, | 914 ArgumentsTypes arguments, |
| 916 SideEffects sideEffects, | 915 SideEffects sideEffects, |
| 917 bool inLoop) { | 916 bool inLoop, |
| 917 bool isConditional) { |
| 918 if (selector.isClosureCall) { | 918 if (selector.isClosureCall) { |
| 919 return registerCalledClosure(node, selector, mask, receiverType, caller, | 919 return registerCalledClosure(node, selector, mask, receiverType, caller, |
| 920 arguments, sideEffects, inLoop); | 920 arguments, sideEffects, inLoop); |
| 921 } | 921 } |
| 922 | 922 |
| 923 closedWorld.locateMembers(selector, mask).forEach((_callee) { | 923 closedWorld.locateMembers(selector, mask).forEach((_callee) { |
| 924 MemberElement callee = _callee; | 924 MemberElement callee = _callee; |
| 925 updateSideEffects(sideEffects, selector, callee); | 925 updateSideEffects(sideEffects, selector, callee); |
| 926 }); | 926 }); |
| 927 | 927 |
| 928 CallSiteTypeInformation info = new DynamicCallSiteTypeInformation( | 928 CallSiteTypeInformation info = new DynamicCallSiteTypeInformation( |
| 929 types.currentMember, | 929 types.currentMember, |
| 930 node, | 930 node, |
| 931 caller, | 931 caller, |
| 932 selector, | 932 selector, |
| 933 mask, | 933 mask, |
| 934 receiverType, | 934 receiverType, |
| 935 arguments, | 935 arguments, |
| 936 inLoop); | 936 inLoop, |
| 937 isConditional); |
| 937 | 938 |
| 938 info.addToGraph(this); | 939 info.addToGraph(this); |
| 939 types.allocatedCalls.add(info); | 940 types.allocatedCalls.add(info); |
| 940 return info; | 941 return info; |
| 941 } | 942 } |
| 942 | 943 |
| 943 /** | 944 /** |
| 944 * Registers a call to await with an expression of type [argumentType] as | 945 * Registers a call to await with an expression of type [argumentType] as |
| 945 * argument. | 946 * argument. |
| 946 */ | 947 */ |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1115 /** | 1116 /** |
| 1116 * Records that the captured variable [local] is read. | 1117 * Records that the captured variable [local] is read. |
| 1117 */ | 1118 */ |
| 1118 void recordCapturedLocalRead(Local local) {} | 1119 void recordCapturedLocalRead(Local local) {} |
| 1119 | 1120 |
| 1120 /** | 1121 /** |
| 1121 * Records that the variable [local] is being updated. | 1122 * Records that the variable [local] is being updated. |
| 1122 */ | 1123 */ |
| 1123 void recordLocalUpdate(Local local, TypeInformation type) {} | 1124 void recordLocalUpdate(Local local, TypeInformation type) {} |
| 1124 } | 1125 } |
| OLD | NEW |