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 simple_types_inferrer; | 5 library simple_types_inferrer; |
| 6 | 6 |
| 7 import '../closure.dart' show ClosureRepresentationInfo; | 7 import '../closure.dart' show ClosureRepresentationInfo; |
| 8 import '../common.dart'; | 8 import '../common.dart'; |
| 9 import '../common/names.dart' show Identifiers, Selectors; | 9 import '../common/names.dart' show Identifiers, Selectors; |
| 10 import '../compiler.dart' show Compiler; | 10 import '../compiler.dart' show Compiler; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 49 SemanticSendResolvedMixin<TypeInformation, dynamic>, | 49 SemanticSendResolvedMixin<TypeInformation, dynamic>, |
| 50 CompoundBulkMixin<TypeInformation, dynamic>, | 50 CompoundBulkMixin<TypeInformation, dynamic>, |
| 51 SetIfNullBulkMixin<TypeInformation, dynamic>, | 51 SetIfNullBulkMixin<TypeInformation, dynamic>, |
| 52 PrefixBulkMixin<TypeInformation, dynamic>, | 52 PrefixBulkMixin<TypeInformation, dynamic>, |
| 53 PostfixBulkMixin<TypeInformation, dynamic>, | 53 PostfixBulkMixin<TypeInformation, dynamic>, |
| 54 ErrorBulkMixin<TypeInformation, dynamic>, | 54 ErrorBulkMixin<TypeInformation, dynamic>, |
| 55 NewBulkMixin<TypeInformation, dynamic>, | 55 NewBulkMixin<TypeInformation, dynamic>, |
| 56 SetBulkMixin<TypeInformation, dynamic> | 56 SetBulkMixin<TypeInformation, dynamic> |
| 57 implements SemanticSendVisitor<TypeInformation, dynamic> { | 57 implements SemanticSendVisitor<TypeInformation, dynamic> { |
| 58 final Compiler compiler; | 58 final Compiler compiler; |
| 59 final AstElement analyzedElement; | 59 final ExecutableElement analyzedElement; |
| 60 final ResolvedAst resolvedAst; | 60 final ResolvedAst resolvedAst; |
| 61 final TypeSystem types; | 61 final TypeSystem types; |
| 62 final Map<JumpTarget, List<LocalsHandler>> breaksFor = | 62 final Map<JumpTarget, List<LocalsHandler>> breaksFor = |
| 63 new Map<JumpTarget, List<LocalsHandler>>(); | 63 new Map<JumpTarget, List<LocalsHandler>>(); |
| 64 final Map<JumpTarget, List<LocalsHandler>> continuesFor = | 64 final Map<JumpTarget, List<LocalsHandler>> continuesFor = |
| 65 new Map<JumpTarget, List<LocalsHandler>>(); | 65 new Map<JumpTarget, List<LocalsHandler>>(); |
| 66 LocalsHandler locals; | 66 LocalsHandler locals; |
| 67 final List<TypeInformation> cascadeReceiverStack = | 67 final List<TypeInformation> cascadeReceiverStack = |
| 68 new List<TypeInformation>(); | 68 new List<TypeInformation>(); |
| 69 | 69 |
| 70 TypeInformation returnType; | 70 TypeInformation returnType; |
| 71 bool visitingInitializers = false; | 71 bool visitingInitializers = false; |
| 72 bool isConstructorRedirect = false; | 72 bool isConstructorRedirect = false; |
| 73 bool seenSuperConstructorCall = false; | 73 bool seenSuperConstructorCall = false; |
| 74 SideEffects sideEffects = new SideEffects.empty(); | 74 SideEffects sideEffects = new SideEffects.empty(); |
| 75 final Element outermostElement; | 75 final MemberElement outermostElement; |
| 76 final InferrerEngine inferrer; | 76 final InferrerEngine inferrer; |
| 77 final Setlet<Entity> capturedVariables = new Setlet<Entity>(); | 77 final Setlet<Entity> capturedVariables = new Setlet<Entity>(); |
| 78 final GlobalTypeInferenceElementData inTreeData; | 78 final GlobalTypeInferenceElementData inTreeData; |
|
Siggi Cherem (dart-lang)
2017/06/29 21:40:09
rename to memberData like you did for the map in t
Johnni Winther
2017/06/30 08:14:50
Renamed to [memberData]. The builder is created fo
| |
| 79 | 79 |
| 80 ElementGraphBuilder.internal( | 80 ElementGraphBuilder.internal( |
| 81 AstElement analyzedElement, | 81 ExecutableElement analyzedElement, |
| 82 this.resolvedAst, | 82 this.resolvedAst, |
| 83 this.outermostElement, | 83 this.outermostElement, |
| 84 InferrerEngine inferrer, | 84 InferrerEngine inferrer, |
| 85 this.compiler, | 85 this.compiler, |
| 86 this.locals) | 86 this.locals) |
| 87 : this.analyzedElement = analyzedElement, | 87 : this.analyzedElement = analyzedElement, |
| 88 this.inferrer = inferrer, | 88 this.inferrer = inferrer, |
| 89 this.types = inferrer.types, | 89 this.types = inferrer.types, |
| 90 this.inTreeData = analyzedElement.isLocal | 90 this.inTreeData = inferrer.dataOfMember(analyzedElement.memberContext) { |
| 91 ? inferrer.dataOfLocalFunction(analyzedElement) | |
| 92 : inferrer.dataOfMember(analyzedElement) { | |
| 93 assert(outermostElement != null); | 91 assert(outermostElement != null); |
| 94 if (locals != null) return; | 92 if (locals != null) return; |
| 95 ast.Node node; | 93 ast.Node node; |
| 96 if (resolvedAst.kind == ResolvedAstKind.PARSED) { | 94 if (resolvedAst.kind == ResolvedAstKind.PARSED) { |
| 97 node = resolvedAst.node; | 95 node = resolvedAst.node; |
| 98 } | 96 } |
| 99 FieldInitializationScope fieldScope = | 97 FieldInitializationScope fieldScope = |
| 100 analyzedElement.isGenerativeConstructor | 98 analyzedElement.isGenerativeConstructor |
| 101 ? new FieldInitializationScope(types) | 99 ? new FieldInitializationScope(types) |
| 102 : null; | 100 : null; |
| 103 locals = | 101 locals = |
| 104 new LocalsHandler(inferrer, types, compiler.options, node, fieldScope); | 102 new LocalsHandler(inferrer, types, compiler.options, node, fieldScope); |
| 105 } | 103 } |
| 106 | 104 |
| 107 ElementGraphBuilder(AstElement element, ResolvedAst resolvedAst, | 105 ElementGraphBuilder(ExecutableElement element, ResolvedAst resolvedAst, |
| 108 Compiler compiler, InferrerEngine inferrer, [LocalsHandler handler]) | 106 Compiler compiler, InferrerEngine inferrer, [LocalsHandler handler]) |
| 109 : this.internal( | 107 : this.internal(element, resolvedAst, element.memberContext, inferrer, |
| 110 element, | 108 compiler, handler); |
| 111 resolvedAst, | |
| 112 element.outermostEnclosingMemberOrTopLevel.implementation, | |
| 113 inferrer, | |
| 114 compiler, | |
| 115 handler); | |
| 116 | 109 |
| 117 TreeElements get elements => resolvedAst.elements; | 110 TreeElements get elements => resolvedAst.elements; |
| 118 | 111 |
| 119 bool accumulateIsChecks = false; | 112 bool accumulateIsChecks = false; |
| 120 bool conditionIsSimple = false; | 113 bool conditionIsSimple = false; |
| 121 List<ast.Send> isChecks; | 114 List<ast.Send> isChecks; |
| 122 int loopLevel = 0; | 115 int loopLevel = 0; |
| 123 | 116 |
| 124 bool get inLoop => loopLevel > 0; | 117 bool get inLoop => loopLevel > 0; |
| 125 bool get isThisExposed { | 118 bool get isThisExposed { |
| (...skipping 2604 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2730 element, arguments, sideEffects, inLoop); | 2723 element, arguments, sideEffects, inLoop); |
| 2731 } | 2724 } |
| 2732 | 2725 |
| 2733 TypeInformation handleDynamicSend(ast.Node node, Selector selector, | 2726 TypeInformation handleDynamicSend(ast.Node node, Selector selector, |
| 2734 TypeMask mask, TypeInformation receiverType, ArgumentsTypes arguments) { | 2727 TypeMask mask, TypeInformation receiverType, ArgumentsTypes arguments) { |
| 2735 assert(receiverType != null); | 2728 assert(receiverType != null); |
| 2736 if (types.selectorNeedsUpdate(receiverType, mask)) { | 2729 if (types.selectorNeedsUpdate(receiverType, mask)) { |
| 2737 mask = receiverType == types.dynamicType | 2730 mask = receiverType == types.dynamicType |
| 2738 ? null | 2731 ? null |
| 2739 : types.newTypedSelector(receiverType, mask); | 2732 : types.newTypedSelector(receiverType, mask); |
| 2740 if (analyzedElement.isLocal) { | 2733 inferrer.updateSelectorInMember(outermostElement, node, selector, mask); |
| 2741 inferrer.updateSelectorInLocalFunction( | |
| 2742 analyzedElement, node, selector, mask); | |
| 2743 } else { | |
| 2744 inferrer.updateSelectorInMember(analyzedElement, node, selector, mask); | |
| 2745 } | |
| 2746 } | 2734 } |
| 2747 | 2735 |
| 2748 // If the receiver of the call is a local, we may know more about | 2736 // If the receiver of the call is a local, we may know more about |
| 2749 // its type by refining it with the potential targets of the | 2737 // its type by refining it with the potential targets of the |
| 2750 // calls. | 2738 // calls. |
| 2751 ast.Send send = node.asSend(); | 2739 ast.Send send = node.asSend(); |
| 2752 if (send != null) { | 2740 if (send != null) { |
| 2753 ast.Node receiver = send.receiver; | 2741 ast.Node receiver = send.receiver; |
| 2754 if (receiver != null) { | 2742 if (receiver != null) { |
| 2755 Element element = elements[receiver]; | 2743 Element element = elements[receiver]; |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2945 Selector moveNextSelector = Selectors.moveNext; | 2933 Selector moveNextSelector = Selectors.moveNext; |
| 2946 TypeMask moveNextMask = inTreeData.typeOfIteratorMoveNext(node); | 2934 TypeMask moveNextMask = inTreeData.typeOfIteratorMoveNext(node); |
| 2947 | 2935 |
| 2948 TypeInformation iteratorType = handleDynamicSend(node, iteratorSelector, | 2936 TypeInformation iteratorType = handleDynamicSend(node, iteratorSelector, |
| 2949 iteratorMask, expressionType, new ArgumentsTypes.empty()); | 2937 iteratorMask, expressionType, new ArgumentsTypes.empty()); |
| 2950 | 2938 |
| 2951 return handleForInLoop(node, iteratorType, currentSelector, currentMask, | 2939 return handleForInLoop(node, iteratorType, currentSelector, currentMask, |
| 2952 moveNextSelector, moveNextMask); | 2940 moveNextSelector, moveNextMask); |
| 2953 } | 2941 } |
| 2954 } | 2942 } |
| OLD | NEW |