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

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

Issue 3002313002: Use KernelTypeGraphBuilder in KernelInferrerEngine (Closed)
Patch Set: Created 3 years, 3 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
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 'package:kernel/ast.dart' as ir; 5 import 'package:kernel/ast.dart' as ir;
6 6
7 import '../closure.dart';
8 import '../common.dart';
9 import '../common_elements.dart';
7 import '../compiler.dart'; 10 import '../compiler.dart';
8 import '../constants/values.dart'; 11 import '../constants/values.dart';
9 import '../elements/entities.dart'; 12 import '../elements/entities.dart';
13 import '../elements/types.dart';
14 import '../kernel/element_map.dart';
15 import '../js_model/locals.dart';
10 import '../types/types.dart'; 16 import '../types/types.dart';
11 import '../world.dart'; 17 import '../world.dart';
18 import 'builder_kernel.dart';
12 import 'inferrer_engine.dart'; 19 import 'inferrer_engine.dart';
13 import 'type_graph_inferrer.dart'; 20 import 'type_graph_inferrer.dart';
14 import 'type_graph_nodes.dart'; 21 import 'type_graph_nodes.dart';
15 import 'type_system.dart'; 22 import 'type_system.dart';
16 23
17 class KernelTypeGraphInferrer extends TypeGraphInferrer<ir.Node> { 24 class KernelTypeGraphInferrer extends TypeGraphInferrer<ir.Node> {
18 final Compiler _compiler; 25 final Compiler _compiler;
26 final KernelToElementMapForBuilding _elementMap;
27 final GlobalLocalsMap _globalLocalsMap;
28 final ClosureDataLookup<ir.Node> _closureDataLookup;
19 29
20 KernelTypeGraphInferrer(this._compiler, ClosedWorld closedWorld, 30 KernelTypeGraphInferrer(
21 ClosedWorldRefiner closedWorldRefiner, {bool disableTypeInference: false}) 31 this._compiler,
32 this._elementMap,
33 this._globalLocalsMap,
34 this._closureDataLookup,
35 ClosedWorld closedWorld,
36 ClosedWorldRefiner closedWorldRefiner,
37 {bool disableTypeInference: false})
22 : super(closedWorld, closedWorldRefiner, 38 : super(closedWorld, closedWorldRefiner,
23 disableTypeInference: disableTypeInference); 39 disableTypeInference: disableTypeInference);
24 40
25 @override 41 @override
26 InferrerEngine<ir.Node> createInferrerEngineFor(FunctionEntity main) { 42 InferrerEngine<ir.Node> createInferrerEngineFor(FunctionEntity main) {
27 return new KernelInferrerEngine( 43 return new KernelInferrerEngine(_compiler, _elementMap, _globalLocalsMap,
28 _compiler, closedWorld, closedWorldRefiner, main); 44 _closureDataLookup, closedWorld, closedWorldRefiner, main);
29 } 45 }
30 46
31 @override 47 @override
32 GlobalTypeInferenceResults createResults() { 48 GlobalTypeInferenceResults createResults() {
33 return new KernelGlobalTypeInferenceResults(this, closedWorld); 49 return new KernelGlobalTypeInferenceResults(this, closedWorld);
34 } 50 }
35 } 51 }
36 52
37 class KernelGlobalTypeInferenceResults 53 class KernelGlobalTypeInferenceResults
38 extends GlobalTypeInferenceResults<ir.Node> { 54 extends GlobalTypeInferenceResults<ir.Node> {
(...skipping 15 matching lines...) Expand all
54 } 70 }
55 71
56 GlobalTypeInferenceParameterResult<ir.Node> createParameterResult( 72 GlobalTypeInferenceParameterResult<ir.Node> createParameterResult(
57 TypeGraphInferrer<ir.Node> inferrer, Local parameter) { 73 TypeGraphInferrer<ir.Node> inferrer, Local parameter) {
58 return new GlobalTypeInferenceParameterResultImpl<ir.Node>( 74 return new GlobalTypeInferenceParameterResultImpl<ir.Node>(
59 parameter, inferrer, dynamicType); 75 parameter, inferrer, dynamicType);
60 } 76 }
61 } 77 }
62 78
63 class KernelInferrerEngine extends InferrerEngineImpl<ir.Node> { 79 class KernelInferrerEngine extends InferrerEngineImpl<ir.Node> {
64 KernelInferrerEngine(Compiler compiler, ClosedWorld closedWorld, 80 final KernelToElementMapForBuilding _elementMap;
65 ClosedWorldRefiner closedWorldRefiner, FunctionEntity mainElement) 81 final GlobalLocalsMap _globalLocalsMap;
66 : super(compiler, closedWorld, closedWorldRefiner, mainElement, 82 final ClosureDataLookup<ir.Node> _closureDataLookup;
67 const KernelTypeSystemStrategy()); 83
84 KernelInferrerEngine(
85 Compiler compiler,
86 this._elementMap,
87 this._globalLocalsMap,
88 this._closureDataLookup,
89 ClosedWorld closedWorld,
90 ClosedWorldRefiner closedWorldRefiner,
91 FunctionEntity mainElement)
92 : super(
93 compiler,
94 closedWorld,
95 closedWorldRefiner,
96 mainElement,
97 new KernelTypeSystemStrategy(
98 _elementMap, _globalLocalsMap, _closureDataLookup));
68 99
69 @override 100 @override
70 ConstantValue getFieldConstant(FieldEntity field) { 101 ConstantValue getFieldConstant(FieldEntity field) {
71 throw new UnimplementedError('KernelInferrerEngine.getFieldConstant'); 102 throw new UnimplementedError('KernelInferrerEngine.getFieldConstant');
72 } 103 }
73 104
74 @override 105 @override
75 bool isFieldInitializerPotentiallyNull( 106 bool isFieldInitializerPotentiallyNull(
76 FieldEntity field, ir.Node initializer) { 107 FieldEntity field, ir.Node initializer) {
77 throw new UnimplementedError( 108 throw new UnimplementedError(
78 'KernelInferrerEngine.isFieldInitializerPotentiallyNull'); 109 'KernelInferrerEngine.isFieldInitializerPotentiallyNull');
79 } 110 }
80 111
81 @override 112 @override
82 TypeInformation computeMemberTypeInformation( 113 TypeInformation computeMemberTypeInformation(
83 MemberEntity member, ir.Node body) { 114 MemberEntity member, ir.Node body) {
84 throw new UnimplementedError( 115 KernelTypeGraphBuilder visitor =
85 'KernelInferrerEngine.computeMemberTypeInformation'); 116 new KernelTypeGraphBuilder(member, compiler, _elementMap, this);
117 return visitor.run();
86 } 118 }
87 119
88 @override 120 @override
89 FunctionEntity lookupCallMethod(ClassEntity cls) { 121 FunctionEntity lookupCallMethod(ClassEntity cls) {
90 throw new UnimplementedError('KernelInferrerEngine.lookupCallMethod'); 122 throw new UnimplementedError('KernelInferrerEngine.lookupCallMethod');
91 } 123 }
92 124
93 @override 125 @override
94 void forEachParameter(FunctionEntity method, void f(Local parameter)) { 126 void forEachParameter(FunctionEntity method, void f(Local parameter)) {
95 throw new UnimplementedError('KernelInferrerEngine.forEachParameter'); 127 throw new UnimplementedError('KernelInferrerEngine.forEachParameter');
96 } 128 }
97 129
98 @override 130 @override
99 ir.Node computeMemberBody(MemberEntity member) { 131 ir.Node computeMemberBody(MemberEntity member) {
100 throw new UnimplementedError('KernelInferrerEngine.computeMemberBody'); 132 MemberDefinition definition = _elementMap.getMemberDefinition(member);
133 switch (definition.kind) {
134 case MemberKind.regular:
135 ir.Member node = definition.node;
136 if (node is ir.Field) {
137 return node.initializer;
138 } else if (node is ir.Procedure) {
139 return node.function;
140 }
141 break;
142 case MemberKind.constructor:
143 case MemberKind.constructorBody:
144 ir.Member node = definition.node;
145 if (node is ir.Constructor) {
146 return node.function;
147 } else if (node is ir.Procedure) {
148 return node.function;
149 }
150 break;
151 case MemberKind.closureCall:
152 ir.Member node = definition.node;
153 if (node is ir.FunctionDeclaration) {
154 return node.function;
155 } else if (node is ir.FunctionExpression) {
156 return node.function;
157 }
158 break;
159 case MemberKind.closureField:
160 break;
161 }
162 failedAt(member, 'Unexpected member definition: $definition.');
163 return null;
101 } 164 }
102 165
103 @override 166 @override
104 int computeMemberSize(MemberEntity member) { 167 int computeMemberSize(MemberEntity member) {
105 throw new UnimplementedError('KernelInferrerEngine.computeMemberSize'); 168 // TODO(johnniwinther): Find an ordering that can be shared between the
169 // front ends.
170 return 0;
106 } 171 }
107 172
108 @override 173 @override
109 GlobalTypeInferenceElementData<ir.Node> createElementData() { 174 GlobalTypeInferenceElementData<ir.Node> createElementData() {
110 throw new UnimplementedError('KernelInferrerEngine.createElementData'); 175 throw new UnimplementedError('KernelInferrerEngine.createElementData');
111 } 176 }
112 } 177 }
113 178
114 class KernelTypeSystemStrategy implements TypeSystemStrategy<ir.Node> { 179 class KernelTypeSystemStrategy implements TypeSystemStrategy<ir.Node> {
115 const KernelTypeSystemStrategy(); 180 KernelToElementMapForBuilding _elementMap;
181 GlobalLocalsMap _globalLocalsMap;
182 ClosureDataLookup<ir.Node> _closureDataLookup;
183
184 KernelTypeSystemStrategy(
185 this._elementMap, this._globalLocalsMap, this._closureDataLookup);
186
187 ElementEnvironment get _elementEnvironment => _elementMap.elementEnvironment;
116 188
117 @override 189 @override
118 bool checkClassEntity(ClassEntity cls) => true; 190 bool checkClassEntity(ClassEntity cls) => true;
119 191
120 @override 192 @override
121 bool checkMapNode(ir.Node node) => true; 193 bool checkMapNode(ir.Node node) => true;
122 194
123 @override 195 @override
124 bool checkListNode(ir.Node node) => true; 196 bool checkListNode(ir.Node node) => true;
125 197
126 @override 198 @override
127 bool checkLoopPhiNode(ir.Node node) => true; 199 bool checkLoopPhiNode(ir.Node node) => true;
128 200
129 @override 201 @override
130 bool checkPhiNode(ir.Node node) => true; 202 bool checkPhiNode(ir.Node node) => true;
131 203
132 @override 204 @override
133 void forEachParameter(FunctionEntity function, void f(Local parameter)) { 205 void forEachParameter(FunctionEntity function, void f(Local parameter)) {
134 throw new UnimplementedError('KernelTypeSystemStrategy.forEachParameter'); 206 throw new UnimplementedError('KernelTypeSystemStrategy.forEachParameter');
135 } 207 }
136 208
137 @override 209 @override
138 ParameterTypeInformation createParameterTypeInformation( 210 ParameterTypeInformation createParameterTypeInformation(
139 Local parameter, TypeSystem<ir.Node> types) { 211 Local parameter, TypeSystem<ir.Node> types) {
140 throw new UnimplementedError( 212 MemberEntity context = parameter.memberContext;
141 'KernelTypeSystemStrategy.createParameterTypeInformation'); 213 KernelToLocalsMap localsMap = _globalLocalsMap.getLocalsMap(context);
214 ir.FunctionNode functionNode =
215 localsMap.getFunctionNodeForParameter(parameter);
216 DartType type =
217 _elementMap.getDartType(localsMap.getParameterType(parameter));
218 MemberEntity member;
219 bool isClosure = false;
220 if (functionNode.parent is ir.Member) {} else if (functionNode.parent
Siggi Cherem (dart-lang) 2017/08/28 22:16:41 if (x) {} else if (y) => if (!x && y) ?
Johnni Winther 2017/08/29 07:59:03 It should have been: if (functionNode.parent is
221 is ir.FunctionExpression ||
222 functionNode.parent is ir.FunctionDeclaration) {
223 ClosureRepresentationInfo info =
224 _closureDataLookup.getClosureInfo(functionNode.parent);
225 member = info.callMethod;
226 isClosure = true;
227 }
228 MemberTypeInformation memberTypeInformation =
229 types.getInferredTypeOfMember(member);
230 if (isClosure) {
231 return new ParameterTypeInformation.localFunction(
232 memberTypeInformation, parameter, type, member);
233 } else if (member.isInstanceMember) {
234 return new ParameterTypeInformation.instanceMember(memberTypeInformation,
235 parameter, type, member, new ParameterAssignments());
236 } else {
237 return new ParameterTypeInformation.static(
238 memberTypeInformation, parameter, type, member);
239 }
142 } 240 }
143 241
144 @override 242 @override
145 MemberTypeInformation createMemberTypeInformation(MemberEntity member) { 243 MemberTypeInformation createMemberTypeInformation(MemberEntity member) {
146 throw new UnimplementedError( 244 if (member.isField) {
147 'KernelTypeSystemStrategy.createParameterTypeInformation'); 245 FieldEntity field = member;
246 DartType type = _elementEnvironment.getFieldType(field);
247 return new FieldTypeInformation(field, type);
248 } else if (member.isGetter) {
249 FunctionEntity getter = member;
250 DartType type = _elementEnvironment.getFunctionType(getter);
251 return new GetterTypeInformation(getter, type);
252 } else if (member.isSetter) {
253 FunctionEntity setter = member;
254 return new SetterTypeInformation(setter);
255 } else if (member.isFunction) {
256 FunctionEntity method = member;
257 DartType type = _elementEnvironment.getFunctionType(method);
258 return new MethodTypeInformation(method, type);
259 } else {
260 ConstructorEntity constructor = member;
261 if (constructor.isFactoryConstructor) {
262 DartType type = _elementEnvironment.getFunctionType(constructor);
263 return new FactoryConstructorTypeInformation(constructor, type);
264 } else {
265 return new GenerativeConstructorTypeInformation(constructor);
266 }
267 }
148 } 268 }
149 } 269 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/inferrer/inferrer_engine.dart ('k') | pkg/compiler/lib/src/inferrer/locals_handler.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698