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 |