| 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/entities.dart'; | 6 import '../elements/entities.dart'; |
| 7 import '../elements/types.dart'; | 7 import '../elements/types.dart'; |
| 8 import '../js_backend/backend_usage.dart' show BackendUsageBuilder; | 8 import '../js_backend/backend_usage.dart' show BackendUsageBuilder; |
| 9 import '../js_backend/native_data.dart' show NativeData; | 9 import '../js_backend/native_data.dart' show NativeData; |
| 10 import '../js_emitter/js_emitter.dart' show CodeEmitterTask, NativeEmitter; | 10 import '../js_emitter/js_emitter.dart' show CodeEmitterTask, NativeEmitter; |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 CommonElements commonElements, | 196 CommonElements commonElements, |
| 197 DartTypes dartTypes, | 197 DartTypes dartTypes, |
| 198 this._backendUsageBuilder, | 198 this._backendUsageBuilder, |
| 199 this._nativeClassFinder) | 199 this._nativeClassFinder) |
| 200 : super(options, elementEnvironment, commonElements, dartTypes); | 200 : super(options, elementEnvironment, commonElements, dartTypes); |
| 201 | 201 |
| 202 Iterable<ClassEntity> get nativeClassesForTesting => _nativeClasses; | 202 Iterable<ClassEntity> get nativeClassesForTesting => _nativeClasses; |
| 203 | 203 |
| 204 Iterable<ClassEntity> get registeredClassesForTesting => _registeredClasses; | 204 Iterable<ClassEntity> get registeredClassesForTesting => _registeredClasses; |
| 205 | 205 |
| 206 Iterable<ClassEntity> get liveNativeClasses => _registeredClasses; |
| 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 |
| 211 WorldImpact processNativeClasses(Iterable<LibraryEntity> libraries) { | 213 WorldImpact processNativeClasses(Iterable<LibraryEntity> libraries) { |
| 212 WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl(); | 214 WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl(); |
| 213 Iterable<ClassEntity> nativeClasses = | 215 Iterable<ClassEntity> nativeClasses = |
| 214 _nativeClassFinder.computeNativeClasses(libraries); | 216 _nativeClassFinder.computeNativeClasses(libraries); |
| 215 _nativeClasses.addAll(nativeClasses); | 217 _nativeClasses.addAll(nativeClasses); |
| 216 _unusedClasses.addAll(nativeClasses); | 218 _unusedClasses.addAll(nativeClasses); |
| 217 if (!enableLiveTypeAnalysis) { | 219 if (!enableLiveTypeAnalysis) { |
| 218 _registerTypeUses(impactBuilder, _nativeClasses, 'forced'); | 220 _registerTypeUses(impactBuilder, _nativeClasses, 'forced'); |
| 219 } | 221 } |
| 220 return impactBuilder; | 222 return impactBuilder; |
| 221 } | 223 } |
| 222 | 224 |
| 223 void logSummary(void log(String message)) { | 225 void logSummary(void log(String message)) { |
| 224 super.logSummary(log); | 226 super.logSummary(log); |
| 225 log('Resolved ${_registeredClasses.length} native elements used, ' | 227 log('Resolved ${_registeredClasses.length} native elements used, ' |
| 226 '${_unusedClasses.length} native elements dead.'); | 228 '${_unusedClasses.length} native elements dead.'); |
| 227 } | 229 } |
| 228 } | 230 } |
| 229 | 231 |
| 230 class NativeCodegenEnqueuer extends NativeEnqueuerBase { | 232 class NativeCodegenEnqueuer extends NativeEnqueuerBase { |
| 231 final CodeEmitterTask _emitter; | 233 final CodeEmitterTask _emitter; |
| 232 final NativeResolutionEnqueuer _resolutionEnqueuer; | 234 final Iterable<ClassEntity> _nativeClasses; |
| 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, |
| 241 DartTypes dartTypes, | 243 DartTypes dartTypes, |
| 242 this._emitter, | 244 this._emitter, |
| 243 this._resolutionEnqueuer, | 245 this._nativeClasses, |
| 244 this._nativeData) | 246 this._nativeData) |
| 245 : super(options, elementEnvironment, commonElements, dartTypes); | 247 : super(options, elementEnvironment, commonElements, dartTypes); |
| 246 | 248 |
| 247 WorldImpact processNativeClasses(Iterable<LibraryEntity> libraries) { | 249 WorldImpact processNativeClasses(Iterable<LibraryEntity> libraries) { |
| 248 WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl(); | 250 WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl(); |
| 249 _unusedClasses.addAll(_resolutionEnqueuer._nativeClasses); | 251 _unusedClasses.addAll(_nativeClasses); |
| 250 | 252 |
| 251 if (!enableLiveTypeAnalysis) { | 253 if (!enableLiveTypeAnalysis) { |
| 252 _registerTypeUses( | 254 _registerTypeUses(impactBuilder, _nativeClasses, 'forced'); |
| 253 impactBuilder, _resolutionEnqueuer._nativeClasses, 'forced'); | |
| 254 } | 255 } |
| 255 | 256 |
| 256 // HACK HACK - add all the resolved classes. | 257 // HACK HACK - add all the resolved classes. |
| 257 Set<ClassEntity> matchingClasses = new Set<ClassEntity>(); | 258 Set<ClassEntity> matchingClasses = new Set<ClassEntity>(); |
| 258 for (ClassEntity classElement in _resolutionEnqueuer._registeredClasses) { | 259 for (ClassEntity classElement in _nativeClasses) { |
| 259 if (_unusedClasses.contains(classElement)) { | 260 if (_unusedClasses.contains(classElement)) { |
| 260 matchingClasses.add(classElement); | 261 matchingClasses.add(classElement); |
| 261 } | 262 } |
| 262 } | 263 } |
| 263 if (matchingClasses.isNotEmpty && _registeredClasses.isEmpty) { | 264 if (matchingClasses.isNotEmpty && _registeredClasses.isEmpty) { |
| 264 matchingClasses.addAll(_onFirstNativeClass(impactBuilder)); | 265 matchingClasses.addAll(_onFirstNativeClass(impactBuilder)); |
| 265 } | 266 } |
| 266 _registerTypeUses(impactBuilder, matchingClasses, 'was resolved'); | 267 _registerTypeUses(impactBuilder, matchingClasses, 'was resolved'); |
| 267 return impactBuilder; | 268 return impactBuilder; |
| 268 } | 269 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 307 emitter.directSubtypes.putIfAbsent(superclass, () => <ClassEntity>[]); | 308 emitter.directSubtypes.putIfAbsent(superclass, () => <ClassEntity>[]); |
| 308 directSubtypes.add(cls); | 309 directSubtypes.add(cls); |
| 309 } | 310 } |
| 310 | 311 |
| 311 void logSummary(void log(String message)) { | 312 void logSummary(void log(String message)) { |
| 312 super.logSummary(log); | 313 super.logSummary(log); |
| 313 log('Compiled ${_registeredClasses.length} native classes, ' | 314 log('Compiled ${_registeredClasses.length} native classes, ' |
| 314 '${_unusedClasses.length} native classes omitted.'); | 315 '${_unusedClasses.length} native classes omitted.'); |
| 315 } | 316 } |
| 316 } | 317 } |
| OLD | NEW |