OLD | NEW |
---|---|
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 part of resolution; | 5 part of resolution; |
6 | 6 |
7 /// [ResolutionRegistry] collects all resolution information. It stores node | 7 /// [ResolutionRegistry] collects all resolution information. It stores node |
8 /// related information in a [TreeElements] mapping and registers calls with | 8 /// related information in a [TreeElements] mapping and registers calls with |
9 /// [Backend], [World] and [Enqueuer]. | 9 /// [Backend], [World] and [Enqueuer]. |
10 // TODO(johnniwinther): Split this into an interface and implementation class. | 10 // TODO(johnniwinther): Split this into an interface and implementation class. |
11 class ResolutionRegistry extends Registry { | 11 |
12 class EagerRegistry implements Registry { | |
12 final Compiler compiler; | 13 final Compiler compiler; |
13 final TreeElementMapping mapping; | 14 final TreeElementMapping mapping; |
14 | 15 |
16 EagerRegistry(this.compiler, this.mapping); | |
17 | |
18 ResolutionEnqueuer get world => compiler.enqueuer.resolution; | |
19 | |
20 @override | |
21 bool get isForResolution => true; | |
22 | |
23 @override | |
24 Iterable<Element> get otherDependencies => mapping.otherDependencies; | |
25 | |
26 @override | |
27 void registerDependency(Element element) { | |
28 mapping.registerDependency(element); | |
29 } | |
30 | |
31 @override | |
32 void registerDynamicGetter(Selector selector) { | |
33 world.registerDynamicGetter(selector); | |
34 } | |
35 | |
36 @override | |
37 void registerDynamicInvocation(Selector selector) { | |
38 world.registerDynamicInvocation(selector); | |
39 } | |
40 | |
41 @override | |
42 void registerDynamicSetter(Selector selector) { | |
43 world.registerDynamicSetter(selector); | |
44 } | |
45 | |
46 @override | |
47 void registerGetOfStaticFunction(FunctionElement element) { | |
48 world.registerGetOfStaticFunction(element); | |
49 } | |
50 | |
51 @override | |
52 void registerInstantiation(InterfaceType type) { | |
53 // TODO(johnniwinther): Remove the need for passing `this`. | |
54 world.registerInstantiatedType(type, this); | |
55 } | |
56 | |
57 @override | |
58 void registerStaticInvocation(Element element) { | |
59 registerDependency(element); | |
60 world.registerStaticUse(element); | |
61 } | |
62 } | |
63 | |
64 class ResolutionWorldImpact implements WorldImpact { | |
65 final Registry registry; | |
66 Setlet<Selector> _dynamicInvocations; | |
67 Setlet<Selector> _dynamicGetters; | |
68 Setlet<Selector> _dynamicSetters; | |
69 Setlet<InterfaceType> _instantiatedTypes; | |
70 Setlet<Element> _staticUses; | |
71 Setlet<DartType> _checkedTypes; | |
72 Setlet<MethodElement> _closurizedFunctions; | |
73 | |
74 ResolutionWorldImpact(Compiler compiler, TreeElementMapping mapping) | |
75 : this.registry = new EagerRegistry(compiler, mapping); | |
76 | |
77 void registerDynamicGetter(Selector selector) { | |
78 if (_dynamicGetters == null) { | |
79 _dynamicGetters = new Setlet<Selector>(); | |
80 } | |
81 _dynamicGetters.add(selector); | |
82 } | |
83 | |
84 @override | |
85 Iterable<Selector> get dynamicGetters { | |
86 return _dynamicGetters != null ? _dynamicGetters : const <Selector>[]; | |
87 } | |
88 | |
89 void registerDynamicInvocation(Selector selector) { | |
90 if (_dynamicInvocations == null) { | |
91 _dynamicInvocations = new Setlet<Selector>(); | |
92 } | |
93 _dynamicInvocations.add(selector); | |
94 } | |
95 | |
96 @override | |
97 Iterable<Selector> get dynamicInvocations { | |
98 return _dynamicInvocations != null | |
99 ? _dynamicInvocations : const <Selector>[]; | |
100 } | |
101 | |
102 void registerDynamicSetter(Selector selector) { | |
103 if (_dynamicSetters == null) { | |
104 _dynamicSetters = new Setlet<Selector>(); | |
105 } | |
106 _dynamicSetters.add(selector); | |
107 } | |
108 | |
109 @override | |
110 Iterable<Selector> get dynamicSetters { | |
111 return _dynamicSetters != null ? _dynamicSetters : const <Selector>[]; | |
112 } | |
113 | |
114 void registerInstantiatedType(InterfaceType type) { | |
115 // TODO(johnniwinther): Enable this when registration doesn't require a | |
116 // [Registry]. | |
117 throw new UnsupportedError( | |
118 'Lazy registration of instantiated not supported.'); | |
119 if (_instantiatedTypes == null) { | |
120 _instantiatedTypes = new Setlet<InterfaceType>(); | |
121 } | |
122 _instantiatedTypes.add(type); | |
123 } | |
124 | |
125 @override | |
126 Iterable<InterfaceType> get instantiatedTypes { | |
127 return _instantiatedTypes != null | |
128 ? _instantiatedTypes : const <InterfaceType>[]; | |
129 } | |
130 | |
131 void registerStaticUse(Element element) { | |
132 if (_staticUses == null) { | |
133 _staticUses = new Setlet<Element>(); | |
134 } | |
135 _staticUses.add(element); | |
136 } | |
137 | |
138 @override | |
139 Iterable<Element> get staticUses { | |
140 return _staticUses != null ? _staticUses : const <Element>[]; | |
141 } | |
142 | |
143 void registerCheckedType(DartType type) { | |
144 if (_checkedTypes == null) { | |
145 _checkedTypes = new Setlet<DartType>(); | |
146 } | |
147 _checkedTypes.add(type); | |
148 } | |
149 | |
150 @override | |
151 Iterable<DartType> get checkedTypes { | |
152 return _checkedTypes != null | |
153 ? _checkedTypes : const <DartType>[]; | |
154 } | |
155 | |
156 void registerClosurizedFunction(MethodElement element) { | |
157 if (_closurizedFunctions == null) { | |
158 _closurizedFunctions = new Setlet<MethodElement>(); | |
159 } | |
160 _closurizedFunctions.add(element); | |
161 } | |
162 | |
163 @override | |
164 Iterable<MethodElement> get closurizedFunctions { | |
165 return _closurizedFunctions != null | |
166 ? _closurizedFunctions : const <MethodElement>[]; | |
167 } | |
168 } | |
169 | |
170 class ResolutionRegistry implements Registry { | |
171 final Compiler compiler; | |
172 final TreeElementMapping mapping; | |
173 final ResolutionWorldImpact worldImpact; | |
174 | |
15 ResolutionRegistry(Compiler compiler, Element element) | 175 ResolutionRegistry(Compiler compiler, Element element) |
16 : this.internal(compiler, _ensureTreeElements(element)); | 176 : this.internal(compiler, _ensureTreeElements(element)); |
17 | 177 |
18 ResolutionRegistry.internal(this.compiler, this.mapping); | 178 ResolutionRegistry.internal(Compiler compiler, TreeElementMapping mapping) |
179 : this.compiler = compiler, | |
180 this.mapping = mapping, | |
181 this.worldImpact = new ResolutionWorldImpact(compiler, mapping); | |
19 | 182 |
20 bool get isForResolution => true; | 183 bool get isForResolution => true; |
21 | 184 |
22 ResolutionEnqueuer get world => compiler.enqueuer.resolution; | 185 ResolutionEnqueuer get world => compiler.enqueuer.resolution; |
23 | 186 |
24 World get universe => compiler.world; | 187 World get universe => compiler.world; |
25 | 188 |
26 Backend get backend => compiler.backend; | 189 Backend get backend => compiler.backend; |
27 | 190 |
28 ////////////////////////////////////////////////////////////////////////////// | 191 ////////////////////////////////////////////////////////////////////////////// |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
183 void registerPotentialMutationIn(Node contextNode, VariableElement element, | 346 void registerPotentialMutationIn(Node contextNode, VariableElement element, |
184 Node mutationNode) { | 347 Node mutationNode) { |
185 mapping.registerPotentialMutationIn(contextNode, element, mutationNode); | 348 mapping.registerPotentialMutationIn(contextNode, element, mutationNode); |
186 } | 349 } |
187 | 350 |
188 ////////////////////////////////////////////////////////////////////////////// | 351 ////////////////////////////////////////////////////////////////////////////// |
189 // Various Backend/Enqueuer/World registration. | 352 // Various Backend/Enqueuer/World registration. |
190 ////////////////////////////////////////////////////////////////////////////// | 353 ////////////////////////////////////////////////////////////////////////////// |
191 | 354 |
192 void registerStaticUse(Element element) { | 355 void registerStaticUse(Element element) { |
193 world.registerStaticUse(element); | 356 worldImpact.registerStaticUse(element); |
194 } | 357 } |
195 | 358 |
196 void registerImplicitSuperCall(FunctionElement superConstructor) { | 359 void registerImplicitSuperCall(FunctionElement superConstructor) { |
197 universe.registerImplicitSuperCall(this, superConstructor); | 360 universe.registerImplicitSuperCall(this, superConstructor); |
198 } | 361 } |
199 | 362 |
363 // TODO(johnniwinther): Remove this. | |
364 // Use [registerInstantiatedType] of `rawType` instead. | |
365 @deprecated | |
200 void registerInstantiatedClass(ClassElement element) { | 366 void registerInstantiatedClass(ClassElement element) { |
201 world.registerInstantiatedClass(element, this); | 367 element.ensureResolved(compiler); |
368 registerInstantiatedType(element.rawType); | |
202 } | 369 } |
203 | 370 |
204 void registerLazyField() { | 371 void registerLazyField() { |
205 backend.resolutionCallbacks.onLazyField(this); | 372 backend.resolutionCallbacks.onLazyField(this); |
206 } | 373 } |
207 | 374 |
208 void registerMetadataConstant(MetadataAnnotation metadata, | 375 void registerMetadataConstant(MetadataAnnotation metadata, |
209 Element annotatedElement) { | 376 Element annotatedElement) { |
210 backend.registerMetadataConstant(metadata, annotatedElement, this); | 377 backend.registerMetadataConstant(metadata, annotatedElement, this); |
211 } | 378 } |
212 | 379 |
213 void registerThrowRuntimeError() { | 380 void registerThrowRuntimeError() { |
214 backend.resolutionCallbacks.onThrowRuntimeError(this); | 381 backend.resolutionCallbacks.onThrowRuntimeError(this); |
215 } | 382 } |
216 | 383 |
217 void registerTypeVariableBoundCheck() { | 384 void registerTypeVariableBoundCheck() { |
218 backend.resolutionCallbacks.onTypeVariableBoundCheck(this); | 385 backend.resolutionCallbacks.onTypeVariableBoundCheck(this); |
219 } | 386 } |
220 | 387 |
221 void registerThrowNoSuchMethod() { | 388 void registerThrowNoSuchMethod() { |
222 backend.resolutionCallbacks.onThrowNoSuchMethod(this); | 389 backend.resolutionCallbacks.onThrowNoSuchMethod(this); |
223 } | 390 } |
224 | 391 |
225 void registerIsCheck(DartType type) { | 392 void registerIsCheck(DartType type) { |
226 world.registerIsCheck(type, this); | 393 worldImpact.registerCheckedType(type); |
227 backend.resolutionCallbacks.onIsCheck(type, this); | 394 backend.resolutionCallbacks.onIsCheck(type, this); |
228 } | 395 } |
229 | 396 |
230 void registerAsCheck(DartType type) { | 397 void registerAsCheck(DartType type) { |
231 registerIsCheck(type); | 398 registerIsCheck(type); |
232 backend.resolutionCallbacks.onAsCheck(type, this); | 399 backend.resolutionCallbacks.onAsCheck(type, this); |
233 } | 400 } |
234 | 401 |
235 void registerClosure(LocalFunctionElement element) { | 402 void registerClosure(LocalFunctionElement element) { |
236 world.registerClosure(element, this); | 403 world.registerClosure(element, this); |
237 } | 404 } |
238 | 405 |
239 void registerSuperUse(Node node) { | 406 void registerSuperUse(Node node) { |
240 mapping.addSuperUse(node); | 407 mapping.addSuperUse(node); |
241 } | 408 } |
242 | 409 |
243 void registerDynamicInvocation(Selector selector) { | 410 void registerDynamicInvocation(Selector selector) { |
244 world.registerDynamicInvocation(selector); | 411 worldImpact.registerDynamicInvocation(selector); |
245 } | 412 } |
246 | 413 |
247 void registerSuperNoSuchMethod() { | 414 void registerSuperNoSuchMethod() { |
248 backend.resolutionCallbacks.onSuperNoSuchMethod(this); | 415 backend.resolutionCallbacks.onSuperNoSuchMethod(this); |
249 } | 416 } |
250 | 417 |
251 void registerClassUsingVariableExpression(ClassElement element) { | 418 void registerClassUsingVariableExpression(ClassElement element) { |
252 backend.registerClassUsingVariableExpression(element); | 419 backend.registerClassUsingVariableExpression(element); |
253 } | 420 } |
254 | 421 |
255 void registerTypeVariableExpression() { | 422 void registerTypeVariableExpression() { |
256 backend.resolutionCallbacks.onTypeVariableExpression(this); | 423 backend.resolutionCallbacks.onTypeVariableExpression(this); |
257 } | 424 } |
258 | 425 |
259 void registerTypeLiteral(Send node, DartType type) { | 426 void registerTypeLiteral(Send node, DartType type) { |
260 mapping.setType(node, type); | 427 mapping.setType(node, type); |
261 backend.resolutionCallbacks.onTypeLiteral(type, this); | 428 backend.resolutionCallbacks.onTypeLiteral(type, this); |
262 world.registerInstantiatedClass(compiler.typeClass, this); | 429 world.registerInstantiatedType(compiler.coreTypes.typeType, this); |
263 } | 430 } |
264 | 431 |
265 void registerMapLiteral(Node node, DartType type, bool isConstant) { | 432 void registerMapLiteral(Node node, DartType type, bool isConstant) { |
266 setType(node, type); | 433 setType(node, type); |
267 backend.resolutionCallbacks.onMapLiteral(this, type, isConstant); | 434 backend.resolutionCallbacks.onMapLiteral(this, type, isConstant); |
268 } | 435 } |
269 | 436 |
270 // TODO(johnniwinther): Remove the [ResolverVisitor] dependency. Its only | 437 // TODO(johnniwinther): Remove the [ResolverVisitor] dependency. Its only |
271 // needed to lookup types in the current scope. | 438 // needed to lookup types in the current scope. |
272 void registerJsCall(Node node, ResolverVisitor visitor) { | 439 void registerJsCall(Node node, ResolverVisitor visitor) { |
273 world.registerJsCall(node, visitor); | 440 world.registerJsCall(node, visitor); |
274 } | 441 } |
275 | 442 |
276 // TODO(johnniwinther): Remove the [ResolverVisitor] dependency. Its only | 443 // TODO(johnniwinther): Remove the [ResolverVisitor] dependency. Its only |
277 // needed to lookup types in the current scope. | 444 // needed to lookup types in the current scope. |
278 void registerJsEmbeddedGlobalCall(Node node, ResolverVisitor visitor) { | 445 void registerJsEmbeddedGlobalCall(Node node, ResolverVisitor visitor) { |
279 world.registerJsEmbeddedGlobalCall(node, visitor); | 446 world.registerJsEmbeddedGlobalCall(node, visitor); |
280 } | 447 } |
281 | 448 |
282 // TODO(johnniwinther): Remove the [ResolverVisitor] dependency. Its only | 449 // TODO(johnniwinther): Remove the [ResolverVisitor] dependency. Its only |
283 // needed to lookup types in the current scope. | 450 // needed to lookup types in the current scope. |
284 void registerJsBuiltinCall(Node node, ResolverVisitor visitor) { | 451 void registerJsBuiltinCall(Node node, ResolverVisitor visitor) { |
285 world.registerJsBuiltinCall(node, visitor); | 452 world.registerJsBuiltinCall(node, visitor); |
286 } | 453 } |
287 | 454 |
288 void registerGetOfStaticFunction(FunctionElement element) { | 455 void registerGetOfStaticFunction(FunctionElement element) { |
289 world.registerGetOfStaticFunction(element); | 456 worldImpact.registerClosurizedFunction(element); |
457 //world.registerGetOfStaticFunction(element); | |
karlklose
2015/06/01 10:50:24
Remove code in comments (also below).
Johnni Winther
2015/06/01 11:50:37
Done.
| |
290 } | 458 } |
291 | 459 |
292 void registerDynamicGetter(Selector selector) { | 460 void registerDynamicGetter(Selector selector) { |
293 world.registerDynamicGetter(selector); | 461 worldImpact.registerDynamicGetter(selector); |
462 //world.registerDynamicGetter(selector); | |
294 } | 463 } |
295 | 464 |
296 void registerDynamicSetter(Selector selector) { | 465 void registerDynamicSetter(Selector selector) { |
297 world.registerDynamicSetter(selector); | 466 worldImpact.registerDynamicSetter(selector); |
467 //world.registerDynamicSetter(selector); | |
298 } | 468 } |
299 | 469 |
300 void registerConstSymbol(String name) { | 470 void registerConstSymbol(String name) { |
301 backend.registerConstSymbol(name, this); | 471 backend.registerConstSymbol(name, this); |
302 } | 472 } |
303 | 473 |
304 void registerSymbolConstructor() { | 474 void registerSymbolConstructor() { |
305 backend.resolutionCallbacks.onSymbolConstructor(this); | 475 backend.resolutionCallbacks.onSymbolConstructor(this); |
306 } | 476 } |
307 | 477 |
308 void registerInstantiatedType(InterfaceType type) { | 478 void registerInstantiatedType(InterfaceType type) { |
479 //worldImpact.registerInstantiatedType(type); | |
309 world.registerInstantiatedType(type, this); | 480 world.registerInstantiatedType(type, this); |
310 } | 481 } |
311 | 482 |
312 void registerAbstractClassInstantiation() { | 483 void registerAbstractClassInstantiation() { |
313 backend.resolutionCallbacks.onAbstractClassInstantiation(this); | 484 backend.resolutionCallbacks.onAbstractClassInstantiation(this); |
314 } | 485 } |
315 | 486 |
316 void registerNewSymbol() { | 487 void registerNewSymbol() { |
317 backend.registerNewSymbol(this); | 488 backend.registerNewSymbol(this); |
318 } | 489 } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
355 } | 526 } |
356 | 527 |
357 void registerDependency(Element element) { | 528 void registerDependency(Element element) { |
358 mapping.registerDependency(element); | 529 mapping.registerDependency(element); |
359 } | 530 } |
360 | 531 |
361 Setlet<Element> get otherDependencies => mapping.otherDependencies; | 532 Setlet<Element> get otherDependencies => mapping.otherDependencies; |
362 | 533 |
363 void registerStaticInvocation(Element element) { | 534 void registerStaticInvocation(Element element) { |
364 if (element == null) return; | 535 if (element == null) return; |
365 world.addToWorkList(element); | 536 registerStaticUse(element); |
366 registerDependency(element); | |
367 } | 537 } |
368 | 538 |
369 void registerInstantiation(InterfaceType type) { | 539 void registerInstantiation(InterfaceType type) { |
540 //worldImpact.registerInstantiatedType(type); | |
370 world.registerInstantiatedType(type, this); | 541 world.registerInstantiatedType(type, this); |
371 } | 542 } |
372 | 543 |
373 void registerAssert(Send node) { | 544 void registerAssert(Send node) { |
374 mapping.setAssert(node); | 545 mapping.setAssert(node); |
375 backend.resolutionCallbacks.onAssert(node, this); | 546 backend.resolutionCallbacks.onAssert(node, this); |
376 } | 547 } |
377 | 548 |
378 bool isAssert(Send node) { | 549 bool isAssert(Send node) { |
379 return mapping.isAssert(node); | 550 return mapping.isAssert(node); |
380 } | 551 } |
381 | 552 |
382 void registerSendStructure(Send node, SendStructure sendStructure) { | 553 void registerSendStructure(Send node, SendStructure sendStructure) { |
383 mapping.setSendStructure(node, sendStructure); | 554 mapping.setSendStructure(node, sendStructure); |
384 } | 555 } |
385 | 556 |
386 void registerAsyncMarker(FunctionElement element) { | 557 void registerAsyncMarker(FunctionElement element) { |
387 backend.registerAsyncMarker(element, world, this); | 558 backend.registerAsyncMarker(element, world, this); |
388 } | 559 } |
389 | 560 |
390 void registerAsyncForIn(AsyncForIn node) { | 561 void registerAsyncForIn(AsyncForIn node) { |
391 backend.resolutionCallbacks.onAsyncForIn(node, this); | 562 backend.resolutionCallbacks.onAsyncForIn(node, this); |
392 } | 563 } |
393 } | 564 } |
OLD | NEW |