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

Side by Side Diff: pkg/compiler/lib/src/inferrer/ast_inferrer_engine.dart

Issue 2999513003: Extract sorting method from AstInferrerEngine. (Closed)
Patch Set: Updated cf. comments Created 3 years, 4 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
« no previous file with comments | « no previous file | pkg/compiler/lib/src/inferrer/inferrer_engine.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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) => resolveAstApproxSize(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
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 resolveAstApproxSize(_element) {
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
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 }
OLDNEW
« no previous file with comments | « no previous file | pkg/compiler/lib/src/inferrer/inferrer_engine.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698