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 library js_backend.backend.resolution_listener; | 5 library js_backend.backend.resolution_listener; |
6 | 6 |
7 import '../common/names.dart' show Identifiers, Uris; | 7 import '../common/names.dart' show Identifiers, Uris; |
8 import '../common/resolution.dart' show Resolution; | |
9 import '../common_elements.dart' show CommonElements, ElementEnvironment; | 8 import '../common_elements.dart' show CommonElements, ElementEnvironment; |
10 import '../elements/elements.dart'; | 9 import '../elements/elements.dart'; |
11 import '../elements/entities.dart'; | 10 import '../elements/entities.dart'; |
12 import '../elements/types.dart'; | 11 import '../elements/types.dart'; |
13 import '../enqueue.dart' show Enqueuer, EnqueuerListener; | 12 import '../enqueue.dart' show Enqueuer, EnqueuerListener; |
14 import '../kernel/task.dart'; | 13 import '../kernel/task.dart'; |
15 import '../native/enqueue.dart'; | 14 import '../native/enqueue.dart'; |
16 import '../options.dart' show CompilerOptions; | 15 import '../options.dart' show CompilerOptions; |
17 import '../universe/call_structure.dart' show CallStructure; | 16 import '../universe/call_structure.dart' show CallStructure; |
18 import '../universe/use.dart' show StaticUse, TypeUse; | 17 import '../universe/use.dart' show StaticUse, TypeUse; |
19 import '../universe/world_impact.dart' | 18 import '../universe/world_impact.dart' |
20 show WorldImpact, WorldImpactBuilder, WorldImpactBuilderImpl; | 19 show WorldImpact, WorldImpactBuilder, WorldImpactBuilderImpl; |
21 import 'backend.dart'; | 20 import 'backend.dart'; |
22 import 'backend_helpers.dart'; | 21 import 'backend_helpers.dart'; |
23 import 'backend_impact.dart'; | 22 import 'backend_impact.dart'; |
24 import 'backend_usage.dart'; | 23 import 'backend_usage.dart'; |
25 import 'checked_mode_helpers.dart'; | 24 import 'checked_mode_helpers.dart'; |
26 import 'custom_elements_analysis.dart'; | 25 import 'custom_elements_analysis.dart'; |
27 import 'interceptor_data.dart'; | 26 import 'interceptor_data.dart'; |
28 import 'lookup_map_analysis.dart' show LookupMapLibraryAccess; | 27 import 'lookup_map_analysis.dart' show LookupMapLibraryAccess; |
29 import 'mirrors_analysis.dart'; | 28 import 'mirrors_analysis.dart'; |
30 import 'mirrors_data.dart'; | 29 import 'mirrors_data.dart'; |
31 import 'native_data.dart' show NativeData; | 30 import 'native_data.dart' show NativeData; |
32 import 'no_such_method_registry.dart'; | 31 import 'no_such_method_registry.dart'; |
33 import 'type_variable_handler.dart'; | 32 import 'type_variable_handler.dart'; |
34 | 33 |
35 class ResolutionEnqueuerListener extends EnqueuerListener { | 34 class ResolutionEnqueuerListener extends EnqueuerListener { |
36 // TODO(johnniwinther): Avoid the need for accessing through [_backend]. | 35 // TODO(johnniwinther): Avoid the need for this. |
37 final JavaScriptBackend _backend; | 36 final KernelTask _kernelTask; |
38 | 37 |
39 final CompilerOptions _options; | 38 final CompilerOptions _options; |
40 final CommonElements _commonElements; | 39 final CommonElements _commonElements; |
41 final BackendHelpers _helpers; | 40 final BackendHelpers _helpers; |
42 final BackendImpacts _impacts; | 41 final BackendImpacts _impacts; |
43 final ElementEnvironment _elementEnvironment; | 42 final ElementEnvironment _elementEnvironment; |
44 | 43 |
45 final NativeData _nativeData; | 44 final NativeData _nativeData; |
46 final InterceptorDataBuilder _interceptorData; | 45 final InterceptorDataBuilder _interceptorData; |
47 final BackendUsageBuilder _backendUsage; | 46 final BackendUsageBuilder _backendUsage; |
48 final RuntimeTypesNeedBuilder _rtiNeedBuilder; | 47 final RuntimeTypesNeedBuilder _rtiNeedBuilder; |
49 final MirrorsData _mirrorsData; | 48 final MirrorsData _mirrorsData; |
50 | 49 |
51 final NoSuchMethodRegistry _noSuchMethodRegistry; | 50 final NoSuchMethodRegistry _noSuchMethodRegistry; |
52 final CustomElementsResolutionAnalysis _customElementsAnalysis; | 51 final CustomElementsResolutionAnalysis _customElementsAnalysis; |
53 final LookupMapLibraryAccess _lookupMapLibraryAccess; | 52 final LookupMapLibraryAccess _lookupMapLibraryAccess; |
54 final MirrorsAnalysis _mirrorsAnalysis; | 53 final MirrorsAnalysis _mirrorsAnalysis; |
| 54 final TypeVariableAnalysis _typeVariableAnalysis; |
55 | 55 |
56 final NativeResolutionEnqueuer _nativeEnqueuer; | 56 final NativeResolutionEnqueuer _nativeEnqueuer; |
57 | 57 |
58 /// True when we enqueue the loadLibrary code. | 58 /// True when we enqueue the loadLibrary code. |
59 bool _isLoadLibraryFunctionResolved = false; | 59 bool _isLoadLibraryFunctionResolved = false; |
| 60 |
60 ResolutionEnqueuerListener( | 61 ResolutionEnqueuerListener( |
61 this._backend, | 62 this._kernelTask, |
62 this._options, | 63 this._options, |
63 this._elementEnvironment, | 64 this._elementEnvironment, |
64 this._commonElements, | 65 this._commonElements, |
65 this._helpers, | 66 this._helpers, |
66 this._impacts, | 67 this._impacts, |
67 this._nativeData, | 68 this._nativeData, |
68 this._interceptorData, | 69 this._interceptorData, |
69 this._backendUsage, | 70 this._backendUsage, |
70 this._rtiNeedBuilder, | 71 this._rtiNeedBuilder, |
71 this._mirrorsData, | 72 this._mirrorsData, |
72 this._noSuchMethodRegistry, | 73 this._noSuchMethodRegistry, |
73 this._customElementsAnalysis, | 74 this._customElementsAnalysis, |
74 this._lookupMapLibraryAccess, | 75 this._lookupMapLibraryAccess, |
75 this._mirrorsAnalysis, | 76 this._mirrorsAnalysis, |
| 77 this._typeVariableAnalysis, |
76 this._nativeEnqueuer); | 78 this._nativeEnqueuer); |
77 | 79 |
78 // TODO(johnniwinther): Avoid the need for these. | |
79 Resolution get _resolution => _backend.resolution; | |
80 KernelTask get _kernelTask => _backend.kernelTask; | |
81 | |
82 // TODO(johnniwinther): Change this to a final field. Currently breaks | |
83 // `kernel/closed_world_test`. | |
84 TypeVariableAnalysis get _typeVariableAnalysis => | |
85 _backend.typeVariableAnalysis; | |
86 | |
87 void _registerBackendImpact( | 80 void _registerBackendImpact( |
88 WorldImpactBuilder builder, BackendImpact impact) { | 81 WorldImpactBuilder builder, BackendImpact impact) { |
89 impact.registerImpact(builder, _elementEnvironment); | 82 impact.registerImpact(builder, _elementEnvironment); |
90 _backendUsage.processBackendImpact(impact); | 83 _backendUsage.processBackendImpact(impact); |
91 } | 84 } |
92 | 85 |
93 void _addInterceptors(ClassElement cls, WorldImpactBuilder impactBuilder) { | 86 void _addInterceptors(ClassElement cls, WorldImpactBuilder impactBuilder) { |
94 cls.ensureResolved(_resolution); | |
95 _interceptorData.addInterceptors(cls); | 87 _interceptorData.addInterceptors(cls); |
96 impactBuilder.registerTypeUse(new TypeUse.instantiation(cls.rawType)); | 88 impactBuilder.registerTypeUse(new TypeUse.instantiation(cls.rawType)); |
97 _backendUsage.registerBackendClassUse(cls); | 89 _backendUsage.registerBackendClassUse(cls); |
98 } | 90 } |
99 | 91 |
100 @override | 92 @override |
101 WorldImpact registerClosurizedMember(MemberElement element) { | 93 WorldImpact registerClosurizedMember(MemberElement element) { |
102 WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl(); | 94 WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl(); |
103 _backendUsage.processBackendImpact(_impacts.memberClosure); | 95 _backendUsage.processBackendImpact(_impacts.memberClosure); |
104 impactBuilder | 96 impactBuilder |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 _addInterceptors(_helpers.jsNumberClass, impactBuilder); | 352 _addInterceptors(_helpers.jsNumberClass, impactBuilder); |
361 } else if (cls == _helpers.jsJavaScriptObjectClass) { | 353 } else if (cls == _helpers.jsJavaScriptObjectClass) { |
362 _addInterceptors(_helpers.jsJavaScriptObjectClass, impactBuilder); | 354 _addInterceptors(_helpers.jsJavaScriptObjectClass, impactBuilder); |
363 } else if (cls == _helpers.jsPlainJavaScriptObjectClass) { | 355 } else if (cls == _helpers.jsPlainJavaScriptObjectClass) { |
364 _addInterceptors(_helpers.jsPlainJavaScriptObjectClass, impactBuilder); | 356 _addInterceptors(_helpers.jsPlainJavaScriptObjectClass, impactBuilder); |
365 } else if (cls == _helpers.jsUnknownJavaScriptObjectClass) { | 357 } else if (cls == _helpers.jsUnknownJavaScriptObjectClass) { |
366 _addInterceptors(_helpers.jsUnknownJavaScriptObjectClass, impactBuilder); | 358 _addInterceptors(_helpers.jsUnknownJavaScriptObjectClass, impactBuilder); |
367 } else if (cls == _helpers.jsJavaScriptFunctionClass) { | 359 } else if (cls == _helpers.jsJavaScriptFunctionClass) { |
368 _addInterceptors(_helpers.jsJavaScriptFunctionClass, impactBuilder); | 360 _addInterceptors(_helpers.jsJavaScriptFunctionClass, impactBuilder); |
369 } else if (_nativeData.isNativeOrExtendsNative(cls)) { | 361 } else if (_nativeData.isNativeOrExtendsNative(cls)) { |
370 _addInterceptorsForNativeClassMembers(cls); | 362 _interceptorData.addInterceptorsForNativeClassMembers(cls); |
371 } else if (cls == _helpers.jsIndexingBehaviorInterface) { | 363 } else if (cls == _helpers.jsIndexingBehaviorInterface) { |
372 _registerBackendImpact(impactBuilder, _impacts.jsIndexingBehavior); | 364 _registerBackendImpact(impactBuilder, _impacts.jsIndexingBehavior); |
373 } | 365 } |
374 | 366 |
375 _customElementsAnalysis.registerInstantiatedClass(cls); | 367 _customElementsAnalysis.registerInstantiatedClass(cls); |
376 return impactBuilder; | 368 return impactBuilder; |
377 } | 369 } |
378 | 370 |
379 void _addInterceptorsForNativeClassMembers(ClassElement cls) { | |
380 cls.ensureResolved(_resolution); | |
381 _interceptorData.addInterceptorsForNativeClassMembers(cls); | |
382 } | |
383 | |
384 @override | 371 @override |
385 WorldImpact registerImplementedClass(ClassEntity cls) { | 372 WorldImpact registerImplementedClass(ClassEntity cls) { |
386 return _processClass(cls); | 373 return _processClass(cls); |
387 } | 374 } |
388 | 375 |
389 @override | 376 @override |
390 WorldImpact registerInstantiatedClass(ClassEntity cls) { | 377 WorldImpact registerInstantiatedClass(ClassEntity cls) { |
391 return _processClass(cls); | 378 return _processClass(cls); |
392 } | 379 } |
393 | 380 |
(...skipping 12 matching lines...) Expand all Loading... |
406 | 393 |
407 if (JavaScriptBackend.TRACE_CALLS) { | 394 if (JavaScriptBackend.TRACE_CALLS) { |
408 _registerBackendImpact(impactBuilder, _impacts.traceHelper); | 395 _registerBackendImpact(impactBuilder, _impacts.traceHelper); |
409 } | 396 } |
410 _registerBackendImpact(impactBuilder, _impacts.assertUnreachable); | 397 _registerBackendImpact(impactBuilder, _impacts.assertUnreachable); |
411 _registerCheckedModeHelpers(impactBuilder); | 398 _registerCheckedModeHelpers(impactBuilder); |
412 return impactBuilder; | 399 return impactBuilder; |
413 } | 400 } |
414 | 401 |
415 void _registerCheckedModeHelpers(WorldImpactBuilder impactBuilder) { | 402 void _registerCheckedModeHelpers(WorldImpactBuilder impactBuilder) { |
416 // We register all the _helpers in the _resolution queue. | 403 // We register all the _helpers in the resolution queue. |
417 // TODO(13155): Find a way to register fewer _helpers. | 404 // TODO(13155): Find a way to register fewer _helpers. |
418 List<FunctionEntity> staticUses = <FunctionEntity>[]; | 405 List<FunctionEntity> staticUses = <FunctionEntity>[]; |
419 for (CheckedModeHelper helper in CheckedModeHelpers.helpers) { | 406 for (CheckedModeHelper helper in CheckedModeHelpers.helpers) { |
420 staticUses.add(helper.getStaticUse(_helpers).element); | 407 staticUses.add(helper.getStaticUse(_helpers).element); |
421 } | 408 } |
422 _registerBackendImpact( | 409 _registerBackendImpact( |
423 impactBuilder, new BackendImpact(globalUses: staticUses)); | 410 impactBuilder, new BackendImpact(globalUses: staticUses)); |
424 } | 411 } |
425 | 412 |
426 void logSummary(void log(String message)) { | 413 void logSummary(void log(String message)) { |
427 _nativeEnqueuer.logSummary(log); | 414 _nativeEnqueuer.logSummary(log); |
428 } | 415 } |
429 } | 416 } |
OLD | NEW |