| 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 import '../common_elements.dart' show CommonElements, ElementEnvironment; | 5 import '../common_elements.dart' show CommonElements, ElementEnvironment; |
| 6 import '../elements/elements.dart'; | 6 import '../elements/elements.dart'; |
| 7 import '../elements/entities.dart'; | 7 import '../elements/entities.dart'; |
| 8 import '../elements/resolution_types.dart'; | 8 import '../elements/resolution_types.dart'; |
| 9 import '../elements/types.dart'; | 9 import '../elements/types.dart'; |
| 10 import '../js_backend/backend_usage.dart' show BackendUsageBuilder; | 10 import '../js_backend/backend_usage.dart' show BackendUsageBuilder; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 final Set<ClassEntity> _registeredClasses = new Set<ClassEntity>(); | 44 final Set<ClassEntity> _registeredClasses = new Set<ClassEntity>(); |
| 45 final Set<ClassEntity> _unusedClasses = new Set<ClassEntity>(); | 45 final Set<ClassEntity> _unusedClasses = new Set<ClassEntity>(); |
| 46 | 46 |
| 47 bool get hasInstantiatedNativeClasses => !_registeredClasses.isEmpty; | 47 bool get hasInstantiatedNativeClasses => !_registeredClasses.isEmpty; |
| 48 | 48 |
| 49 /// Log message reported if all native types are used. | 49 /// Log message reported if all native types are used. |
| 50 String _allUsedMessage; | 50 String _allUsedMessage; |
| 51 | 51 |
| 52 final CompilerOptions _options; | 52 final CompilerOptions _options; |
| 53 final ElementEnvironment _elementEnvironment; | 53 final ElementEnvironment _elementEnvironment; |
| 54 final DartTypes _dartTypes; |
| 54 final CommonElements _commonElements; | 55 final CommonElements _commonElements; |
| 55 | 56 |
| 56 /// Subclasses of [NativeEnqueuerBase] are constructed by the backend. | 57 /// Subclasses of [NativeEnqueuerBase] are constructed by the backend. |
| 57 NativeEnqueuerBase( | 58 NativeEnqueuerBase(this._options, this._elementEnvironment, |
| 58 this._options, this._elementEnvironment, this._commonElements); | 59 this._commonElements, this._dartTypes); |
| 59 | 60 |
| 60 bool get enableLiveTypeAnalysis => _options.enableNativeLiveTypeAnalysis; | 61 bool get enableLiveTypeAnalysis => _options.enableNativeLiveTypeAnalysis; |
| 61 | 62 |
| 62 void onInstantiatedType(InterfaceType type) { | 63 void onInstantiatedType(InterfaceType type) { |
| 63 if (_unusedClasses.remove(type.element)) { | 64 if (_unusedClasses.remove(type.element)) { |
| 64 _registeredClasses.add(type.element); | 65 _registeredClasses.add(type.element); |
| 65 } | 66 } |
| 66 } | 67 } |
| 67 | 68 |
| 68 /// Register [classes] as natively instantiated in [impactBuilder]. | 69 /// Register [classes] as natively instantiated in [impactBuilder]. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 102 } | 103 } |
| 103 if (type is InterfaceType) { | 104 if (type is InterfaceType) { |
| 104 if (type == _commonElements.numType) { | 105 if (type == _commonElements.numType) { |
| 105 registerInstantiation(_commonElements.doubleType); | 106 registerInstantiation(_commonElements.doubleType); |
| 106 registerInstantiation(_commonElements.intType); | 107 registerInstantiation(_commonElements.intType); |
| 107 } else if (type == _commonElements.intType || | 108 } else if (type == _commonElements.intType || |
| 108 type == _commonElements.doubleType || | 109 type == _commonElements.doubleType || |
| 109 type == _commonElements.stringType || | 110 type == _commonElements.stringType || |
| 110 type == _commonElements.nullType || | 111 type == _commonElements.nullType || |
| 111 type == _commonElements.boolType || | 112 type == _commonElements.boolType || |
| 112 _elementEnvironment.isSubtype(type, | 113 _dartTypes.isSubtype(type, |
| 113 _elementEnvironment.getRawType(_commonElements.jsArrayClass))) { | 114 _elementEnvironment.getRawType(_commonElements.jsArrayClass))) { |
| 114 registerInstantiation(type); | 115 registerInstantiation(type); |
| 115 } | 116 } |
| 116 // TODO(johnniwinther): Improve spec string precision to handle type | 117 // TODO(johnniwinther): Improve spec string precision to handle type |
| 117 // arguments and implements relations that preserve generics. Currently | 118 // arguments and implements relations that preserve generics. Currently |
| 118 // we cannot distinguish between `List`, `List<dynamic>`, and | 119 // we cannot distinguish between `List`, `List<dynamic>`, and |
| 119 // `List<int>` and take all to mean `List<E>`; in effect not including | 120 // `List<int>` and take all to mean `List<E>`; in effect not including |
| 120 // any native subclasses of generic classes. | 121 // any native subclasses of generic classes. |
| 121 // TODO(johnniwinther,sra): Find and replace uses of `List` with the | 122 // TODO(johnniwinther,sra): Find and replace uses of `List` with the |
| 122 // actual implementation classes such as `JSArray` et al. | 123 // actual implementation classes such as `JSArray` et al. |
| 123 matchingClasses | 124 matchingClasses |
| 124 .addAll(_findUnusedClassesMatching((ClassEntity nativeClass) { | 125 .addAll(_findUnusedClassesMatching((ClassEntity nativeClass) { |
| 125 InterfaceType nativeType = | 126 InterfaceType nativeType = |
| 126 _elementEnvironment.getThisType(nativeClass); | 127 _elementEnvironment.getThisType(nativeClass); |
| 127 InterfaceType specType = | 128 InterfaceType specType = |
| 128 _elementEnvironment.getThisType(type.element); | 129 _elementEnvironment.getThisType(type.element); |
| 129 return _elementEnvironment.isSubtype(nativeType, specType); | 130 return _dartTypes.isSubtype(nativeType, specType); |
| 130 })); | 131 })); |
| 131 } else if (type.isDynamic) { | 132 } else if (type.isDynamic) { |
| 132 matchingClasses.addAll(_unusedClasses); | 133 matchingClasses.addAll(_unusedClasses); |
| 133 } else { | 134 } else { |
| 134 assert(type is VoidType); | 135 assert(type is VoidType); |
| 135 } | 136 } |
| 136 } | 137 } |
| 137 if (matchingClasses.isNotEmpty && _registeredClasses.isEmpty) { | 138 if (matchingClasses.isNotEmpty && _registeredClasses.isEmpty) { |
| 138 matchingClasses.addAll(_onFirstNativeClass(impactBuilder)); | 139 matchingClasses.addAll(_onFirstNativeClass(impactBuilder)); |
| 139 } | 140 } |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 final BackendUsageBuilder _backendUsageBuilder; | 189 final BackendUsageBuilder _backendUsageBuilder; |
| 189 | 190 |
| 190 /// The set of all native classes. Each native class is in [nativeClasses] | 191 /// The set of all native classes. Each native class is in [nativeClasses] |
| 191 /// and exactly one of [unusedClasses] and [registeredClasses]. | 192 /// and exactly one of [unusedClasses] and [registeredClasses]. |
| 192 final Set<ClassEntity> _nativeClasses = new Set<ClassEntity>(); | 193 final Set<ClassEntity> _nativeClasses = new Set<ClassEntity>(); |
| 193 | 194 |
| 194 NativeResolutionEnqueuer( | 195 NativeResolutionEnqueuer( |
| 195 CompilerOptions options, | 196 CompilerOptions options, |
| 196 ElementEnvironment elementEnvironment, | 197 ElementEnvironment elementEnvironment, |
| 197 CommonElements commonElements, | 198 CommonElements commonElements, |
| 199 DartTypes dartTypes, |
| 198 this._backendUsageBuilder, | 200 this._backendUsageBuilder, |
| 199 this._nativeClassFinder) | 201 this._nativeClassFinder) |
| 200 : super(options, elementEnvironment, commonElements); | 202 : super(options, elementEnvironment, commonElements, dartTypes); |
| 201 | 203 |
| 202 Iterable<ClassEntity> get nativeClassesForTesting => _nativeClasses; | 204 Iterable<ClassEntity> get nativeClassesForTesting => _nativeClasses; |
| 203 | 205 |
| 204 Iterable<ClassEntity> get registeredClassesForTesting => _registeredClasses; | 206 Iterable<ClassEntity> get registeredClassesForTesting => _registeredClasses; |
| 205 | 207 |
| 206 void _registerBackendUse(FunctionEntity element) { | 208 void _registerBackendUse(FunctionEntity element) { |
| 207 _backendUsageBuilder.registerBackendFunctionUse(element); | 209 _backendUsageBuilder.registerBackendFunctionUse(element); |
| 208 _backendUsageBuilder.registerGlobalFunctionDependency(element); | 210 _backendUsageBuilder.registerGlobalFunctionDependency(element); |
| 209 } | 211 } |
| 210 | 212 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 231 final CodeEmitterTask _emitter; | 233 final CodeEmitterTask _emitter; |
| 232 final NativeResolutionEnqueuer _resolutionEnqueuer; | 234 final NativeResolutionEnqueuer _resolutionEnqueuer; |
| 233 final NativeData _nativeData; | 235 final NativeData _nativeData; |
| 234 | 236 |
| 235 final Set<ClassEntity> _doneAddSubtypes = new Set<ClassEntity>(); | 237 final Set<ClassEntity> _doneAddSubtypes = new Set<ClassEntity>(); |
| 236 | 238 |
| 237 NativeCodegenEnqueuer( | 239 NativeCodegenEnqueuer( |
| 238 CompilerOptions options, | 240 CompilerOptions options, |
| 239 ElementEnvironment elementEnvironment, | 241 ElementEnvironment elementEnvironment, |
| 240 CommonElements commonElements, | 242 CommonElements commonElements, |
| 243 DartTypes dartTypes, |
| 241 this._emitter, | 244 this._emitter, |
| 242 this._resolutionEnqueuer, | 245 this._resolutionEnqueuer, |
| 243 this._nativeData) | 246 this._nativeData) |
| 244 : super(options, elementEnvironment, commonElements); | 247 : super(options, elementEnvironment, commonElements, dartTypes); |
| 245 | 248 |
| 246 WorldImpact processNativeClasses(Iterable<LibraryElement> libraries) { | 249 WorldImpact processNativeClasses(Iterable<LibraryElement> libraries) { |
| 247 WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl(); | 250 WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl(); |
| 248 _unusedClasses.addAll(_resolutionEnqueuer._nativeClasses); | 251 _unusedClasses.addAll(_resolutionEnqueuer._nativeClasses); |
| 249 | 252 |
| 250 if (!enableLiveTypeAnalysis) { | 253 if (!enableLiveTypeAnalysis) { |
| 251 _registerTypeUses( | 254 _registerTypeUses( |
| 252 impactBuilder, _resolutionEnqueuer._nativeClasses, 'forced'); | 255 impactBuilder, _resolutionEnqueuer._nativeClasses, 'forced'); |
| 253 } | 256 } |
| 254 | 257 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 305 emitter.directSubtypes.putIfAbsent(superclass, () => <ClassEntity>[]); | 308 emitter.directSubtypes.putIfAbsent(superclass, () => <ClassEntity>[]); |
| 306 directSubtypes.add(cls); | 309 directSubtypes.add(cls); |
| 307 } | 310 } |
| 308 | 311 |
| 309 void logSummary(void log(String message)) { | 312 void logSummary(void log(String message)) { |
| 310 super.logSummary(log); | 313 super.logSummary(log); |
| 311 log('Compiled ${_registeredClasses.length} native classes, ' | 314 log('Compiled ${_registeredClasses.length} native classes, ' |
| 312 '${_unusedClasses.length} native classes omitted.'); | 315 '${_unusedClasses.length} native classes omitted.'); |
| 313 } | 316 } |
| 314 } | 317 } |
| OLD | NEW |