Chromium Code Reviews| 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 '../common.dart'; | 5 import '../common.dart'; |
| 6 import '../common/names.dart'; | 6 import '../common/names.dart'; |
| 7 import '../compiler.dart'; | 7 import '../compiler.dart'; |
| 8 import '../constants/expressions.dart'; | 8 import '../constants/expressions.dart'; |
| 9 import '../constants/values.dart'; | 9 import '../constants/values.dart'; |
| 10 import '../elements/elements.dart'; | 10 import '../elements/elements.dart'; |
| 11 import '../elements/entities.dart'; | 11 import '../elements/entities.dart'; |
| 12 import '../resolution/tree_elements.dart'; | 12 import '../resolution/tree_elements.dart'; |
| 13 import '../tree/nodes.dart' as ast; | 13 import '../tree/nodes.dart' as ast; |
| 14 import '../types/types.dart'; | 14 import '../types/types.dart'; |
| 15 import '../util/util.dart'; | |
| 16 import '../world.dart'; | 15 import '../world.dart'; |
| 17 import 'builder.dart'; | 16 import 'builder.dart'; |
| 18 import 'builder_kernel.dart'; | 17 import 'builder_kernel.dart'; |
| 19 import 'inferrer_engine.dart'; | 18 import 'inferrer_engine.dart'; |
| 20 import 'type_graph_nodes.dart'; | 19 import 'type_graph_nodes.dart'; |
| 21 import 'type_system.dart'; | 20 import 'type_system.dart'; |
| 22 | 21 |
| 23 class AstInferrerEngine extends InferrerEngineImpl<ast.Node> { | 22 class AstInferrerEngine extends InferrerEngineImpl<ast.Node> { |
| 24 AstInferrerEngine(Compiler compiler, ClosedWorld closedWorld, | 23 AstInferrerEngine(Compiler compiler, ClosedWorld closedWorld, |
| 25 ClosedWorldRefiner closedWorldRefiner, FunctionEntity mainElement) | 24 ClosedWorldRefiner closedWorldRefiner, FunctionEntity mainElement) |
| 26 : super(compiler, closedWorld, closedWorldRefiner, mainElement, | 25 : super(compiler, closedWorld, closedWorldRefiner, mainElement, |
| 27 const TypeSystemStrategyImpl()); | 26 const TypeSystemStrategyImpl()); |
| 28 | 27 |
| 29 GlobalTypeInferenceElementData<ast.Node> createElementData() => | 28 GlobalTypeInferenceElementData<ast.Node> createElementData() => |
| 30 new AstGlobalTypeInferenceElementData(); | 29 new AstGlobalTypeInferenceElementData(); |
| 31 | 30 |
| 32 void analyzeAllElements() { | 31 int computeMemberSize(MemberEntity member) => resolvedAstBucket(member); |
| 33 sortResolvedAsts().forEach((ResolvedAst resolvedAst) { | 32 |
| 34 if (compiler.shouldPrintProgress) { | 33 ast.Node computeMemberBody(covariant MemberElement member) { |
| 35 reporter.log('Added $addedInGraph elements in inferencing graph.'); | 34 ResolvedAst resolvedAst = member.resolvedAst; |
| 36 compiler.progress.reset(); | 35 ast.Node body; |
| 37 } | 36 if (resolvedAst.kind == ResolvedAstKind.PARSED) { |
| 38 // This also forces the creation of the [ElementTypeInformation] to ensure | 37 body = resolvedAst.body; |
| 39 // it is in the graph. | 38 } |
| 40 MemberElement member = resolvedAst.element; | 39 return body; |
| 41 ast.Node body; | |
| 42 if (resolvedAst.kind == ResolvedAstKind.PARSED) { | |
| 43 body = resolvedAst.body; | |
| 44 } | |
| 45 types.withMember(member, () => analyze(member, body, null)); | |
| 46 }); | |
| 47 reporter.log('Added $addedInGraph elements in inferencing graph.'); | |
| 48 } | 40 } |
| 49 | 41 |
| 50 void forEachParameter( | 42 void forEachParameter( |
| 51 covariant MethodElement method, void f(Local parameter)) { | 43 covariant MethodElement method, void f(Local parameter)) { |
| 52 MethodElement implementation = method.implementation; | 44 MethodElement implementation = method.implementation; |
| 53 implementation.functionSignature | 45 implementation.functionSignature |
| 54 .forEachParameter((FormalElement _parameter) { | 46 .forEachParameter((FormalElement _parameter) { |
| 55 ParameterElement parameter = _parameter; | 47 ParameterElement parameter = _parameter; |
| 56 f(parameter); | 48 f(parameter); |
| 57 }); | 49 }); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 96 failedAt( | 88 failedAt( |
| 97 field, | 89 field, |
| 98 "Constant expression without value: " | 90 "Constant expression without value: " |
| 99 "${constant.toStructuredText()}.")); | 91 "${constant.toStructuredText()}.")); |
| 100 } | 92 } |
| 101 return value; | 93 return value; |
| 102 } | 94 } |
| 103 return null; | 95 return null; |
| 104 } | 96 } |
| 105 | 97 |
| 106 // Sorts the resolved elements by size. We do this for this inferrer | 98 /// Computes a 'size' of [_element] based on the number of selectors in the |
| 107 // to get the same results for [ListTracer] compared to the | 99 /// associated [TreeElements]. This is used for sorting member for the type |
| 108 // [SimpleTypesInferrer]. | 100 /// inference work-queue. |
| 109 Iterable<ResolvedAst> sortResolvedAsts() { | 101 // TODO(johnniwinther): This is brittle and cannot be translated in the |
| 110 int max = 0; | 102 // kernel based inference. Find a more stable a reproducable size measure. |
| 111 Map<int, Setlet<ResolvedAst>> methodSizes = <int, Setlet<ResolvedAst>>{}; | 103 static int resolvedAstBucket(_element) { |
|
Siggi Cherem (dart-lang)
2017/08/08 00:30:46
rename to resolveAstApproxSize?
Johnni Winther
2017/08/09 08:10:45
Done.
| |
| 112 compiler.enqueuer.resolution.processedEntities.forEach((_element) { | 104 MemberElement element = _element; |
| 113 MemberElement element = _element; | 105 ResolvedAst resolvedAst = element.resolvedAst; |
| 114 ResolvedAst resolvedAst = element.resolvedAst; | 106 element = element.implementation; |
| 115 element = element.implementation; | 107 if (resolvedAst.kind == ResolvedAstKind.PARSED) { |
| 116 if (element.impliesType) return; | 108 TreeElementMapping mapping = resolvedAst.elements; |
| 117 assert( | 109 return mapping.getSelectorCount(); |
| 118 element.isField || | |
| 119 element.isFunction || | |
| 120 element.isConstructor || | |
| 121 element.isGetter || | |
| 122 element.isSetter, | |
| 123 failedAt(element, 'Unexpected element kind: ${element.kind}')); | |
| 124 if (element.isAbstract) return; | |
| 125 // Put the other operators in buckets by length, later to be added in | |
| 126 // length order. | |
| 127 int length = 0; | |
| 128 if (resolvedAst.kind == ResolvedAstKind.PARSED) { | |
| 129 TreeElementMapping mapping = resolvedAst.elements; | |
| 130 length = mapping.getSelectorCount(); | |
| 131 } | |
| 132 max = length > max ? length : max; | |
| 133 Setlet<ResolvedAst> set = | |
| 134 methodSizes.putIfAbsent(length, () => new Setlet<ResolvedAst>()); | |
| 135 set.add(resolvedAst); | |
| 136 }); | |
| 137 | |
| 138 List<ResolvedAst> result = <ResolvedAst>[]; | |
| 139 for (int i = 0; i <= max; i++) { | |
| 140 Setlet<ResolvedAst> set = methodSizes[i]; | |
| 141 if (set != null) result.addAll(set); | |
| 142 } | 110 } |
| 143 return result; | 111 return 0; |
| 144 } | 112 } |
| 145 } | 113 } |
| 146 | 114 |
| 147 class TypeSystemStrategyImpl implements TypeSystemStrategy<ast.Node> { | 115 class TypeSystemStrategyImpl implements TypeSystemStrategy<ast.Node> { |
| 148 const TypeSystemStrategyImpl(); | 116 const TypeSystemStrategyImpl(); |
| 149 | 117 |
| 150 @override | 118 @override |
| 151 MemberTypeInformation createMemberTypeInformation( | 119 MemberTypeInformation createMemberTypeInformation( |
| 152 covariant MemberElement member) { | 120 covariant MemberElement member) { |
| 153 assert(member.isDeclaration, failedAt(member)); | 121 assert(member.isDeclaration, failedAt(member)); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 237 @override | 205 @override |
| 238 bool checkPhiNode(ast.Node node) { | 206 bool checkPhiNode(ast.Node node) { |
| 239 return true; | 207 return true; |
| 240 } | 208 } |
| 241 | 209 |
| 242 @override | 210 @override |
| 243 bool checkClassEntity(covariant ClassElement cls) { | 211 bool checkClassEntity(covariant ClassElement cls) { |
| 244 return cls.isDeclaration; | 212 return cls.isDeclaration; |
| 245 } | 213 } |
| 246 } | 214 } |
| OLD | NEW |