| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 dart2js.js_emitter.program_builder; | 5 part of dart2js.js_emitter.program_builder; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * Generates the code for all used classes in the program. Static fields (even | 8 * Generates the code for all used classes in the program. Static fields (even |
| 9 * in classes) are ignored, since they can be treated as non-class elements. | 9 * in classes) are ignored, since they can be treated as non-class elements. |
| 10 * | 10 * |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 if (backend.isTreeShakingDisabled) return (ClassElement cls) => true; | 71 if (backend.isTreeShakingDisabled) return (ClassElement cls) => true; |
| 72 | 72 |
| 73 Set<ClassElement> unneededClasses = new Set<ClassElement>(); | 73 Set<ClassElement> unneededClasses = new Set<ClassElement>(); |
| 74 // The [Bool] class is not marked as abstract, but has a factory | 74 // The [Bool] class is not marked as abstract, but has a factory |
| 75 // constructor that always throws. We never need to emit it. | 75 // constructor that always throws. We never need to emit it. |
| 76 unneededClasses.add(commonElements.boolClass); | 76 unneededClasses.add(commonElements.boolClass); |
| 77 | 77 |
| 78 // Go over specialized interceptors and then constants to know which | 78 // Go over specialized interceptors and then constants to know which |
| 79 // interceptors are needed. | 79 // interceptors are needed. |
| 80 Set<ClassElement> needed = new Set<ClassElement>(); | 80 Set<ClassElement> needed = new Set<ClassElement>(); |
| 81 backend.specializedGetInterceptors | 81 backend.interceptorData.specializedGetInterceptors |
| 82 .forEach((_, Iterable<ClassElement> elements) { | 82 .forEach((_, Iterable<ClassElement> elements) { |
| 83 needed.addAll(elements); | 83 needed.addAll(elements); |
| 84 }); | 84 }); |
| 85 | 85 |
| 86 // Add interceptors referenced by constants. | 86 // Add interceptors referenced by constants. |
| 87 needed.addAll(computeInterceptorsReferencedFromConstants()); | 87 needed.addAll(computeInterceptorsReferencedFromConstants()); |
| 88 | 88 |
| 89 // Add unneeded interceptors to the [unneededClasses] set. | 89 // Add unneeded interceptors to the [unneededClasses] set. |
| 90 for (ClassElement interceptor in backend.interceptedClasses) { | 90 for (ClassElement interceptor |
| 91 in backend.interceptorData.interceptedClasses) { |
| 91 if (!needed.contains(interceptor) && | 92 if (!needed.contains(interceptor) && |
| 92 interceptor != commonElements.objectClass) { | 93 interceptor != commonElements.objectClass) { |
| 93 unneededClasses.add(interceptor); | 94 unneededClasses.add(interceptor); |
| 94 } | 95 } |
| 95 } | 96 } |
| 96 | 97 |
| 97 // These classes are just helpers for the backend's type system. | 98 // These classes are just helpers for the backend's type system. |
| 98 unneededClasses.add(helpers.jsMutableArrayClass); | 99 unneededClasses.add(helpers.jsMutableArrayClass); |
| 99 unneededClasses.add(helpers.jsFixedArrayClass); | 100 unneededClasses.add(helpers.jsFixedArrayClass); |
| 100 unneededClasses.add(helpers.jsExtendableArrayClass); | 101 unneededClasses.add(helpers.jsExtendableArrayClass); |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 236 neededClasses.add(commonElements.boolClass); | 237 neededClasses.add(commonElements.boolClass); |
| 237 } | 238 } |
| 238 if (neededClasses.contains(helpers.jsArrayClass)) { | 239 if (neededClasses.contains(helpers.jsArrayClass)) { |
| 239 neededClasses.add(commonElements.listClass); | 240 neededClasses.add(commonElements.listClass); |
| 240 } | 241 } |
| 241 | 242 |
| 242 // 4. Finally, sort the classes. | 243 // 4. Finally, sort the classes. |
| 243 List<ClassElement> sortedClasses = Elements.sortedByPosition(neededClasses); | 244 List<ClassElement> sortedClasses = Elements.sortedByPosition(neededClasses); |
| 244 | 245 |
| 245 for (ClassElement element in sortedClasses) { | 246 for (ClassElement element in sortedClasses) { |
| 246 if (backend.isNativeOrExtendsNative(element) && | 247 if (backend.nativeData.isNativeOrExtendsNative(element) && |
| 247 !classesOnlyNeededForRti.contains(element)) { | 248 !classesOnlyNeededForRti.contains(element)) { |
| 248 // For now, native classes and related classes cannot be deferred. | 249 // For now, native classes and related classes cannot be deferred. |
| 249 nativeClassesAndSubclasses.add(element); | 250 nativeClassesAndSubclasses.add(element); |
| 250 assert( | 251 assert( |
| 251 invariant(element, !compiler.deferredLoadTask.isDeferred(element))); | 252 invariant(element, !compiler.deferredLoadTask.isDeferred(element))); |
| 252 outputClassLists | 253 outputClassLists |
| 253 .putIfAbsent(compiler.deferredLoadTask.mainOutputUnit, | 254 .putIfAbsent(compiler.deferredLoadTask.mainOutputUnit, |
| 254 () => new List<ClassElement>()) | 255 () => new List<ClassElement>()) |
| 255 .add(element); | 256 .add(element); |
| 256 } else { | 257 } else { |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 321 } | 322 } |
| 322 | 323 |
| 323 void collect() { | 324 void collect() { |
| 324 computeNeededDeclarations(); | 325 computeNeededDeclarations(); |
| 325 computeNeededConstants(); | 326 computeNeededConstants(); |
| 326 computeNeededStatics(); | 327 computeNeededStatics(); |
| 327 computeNeededStaticNonFinalFields(); | 328 computeNeededStaticNonFinalFields(); |
| 328 computeNeededLibraries(); | 329 computeNeededLibraries(); |
| 329 } | 330 } |
| 330 } | 331 } |
| OLD | NEW |