Chromium Code Reviews| Index: pkg/compiler/lib/src/js_emitter/code_emitter_task.dart |
| diff --git a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart |
| index cb89790eea7031cb1e743f59335b690126b797a4..e3adfdf5a9efe2d79635cb7814f298b86e06bedf 100644 |
| --- a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart |
| +++ b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart |
| @@ -22,6 +22,7 @@ class CodeEmitterTask extends CompilerTask { |
| Emitter emitter; |
| final Set<ClassElement> neededClasses = new Set<ClassElement>(); |
| + Set<ClassElement> rtiOnlyNeededClasses; |
|
karlklose
2015/07/07 13:40:37
Maybe 'classesOnlyNeededForRti'?
floitsch
2015/07/07 13:48:37
Done.
|
| final Map<OutputUnit, List<ClassElement>> outputClassLists = |
| new Map<OutputUnit, List<ClassElement>>(); |
| final Map<OutputUnit, List<ConstantValue>> outputConstantLists = |
| @@ -211,7 +212,7 @@ class CodeEmitterTask extends CompilerTask { |
| } |
| } |
| for (ClassElement cls in neededClasses) { |
| - final onlyForRti = typeTestRegistry.rtiNeededClasses.contains(cls); |
| + final onlyForRti = rtiOnlyNeededClasses.contains(cls); |
| if (!onlyForRti) { |
| backend.retainMetadataOf(cls); |
| oldEmitter.classEmitter.visitFields(cls, false, |
| @@ -253,7 +254,7 @@ class CodeEmitterTask extends CompilerTask { |
| } |
| /// Compute all the classes and typedefs that must be emitted. |
| - void computeNeededDeclarations() { |
| + void computeNeededDeclarations(Set<ClassElement> rtiNeededClasses) { |
| // Compute needed typedefs. |
| typedefsNeededForReflection = Elements.sortedByPosition( |
| compiler.world.allTypedefs |
| @@ -297,13 +298,9 @@ class CodeEmitterTask extends CompilerTask { |
| // these are thought to not have been instantiated, so we neeed to be able |
| // to identify them later and make sure we only emit "empty shells" without |
| // fields, etc. |
| - typeTestRegistry.computeRtiNeededClasses(); |
| + rtiOnlyNeededClasses = rtiNeededClasses.difference(neededClasses); |
| - // TODO(floitsch): either change the name, or get the rti-classes |
| - // differently. |
| - typeTestRegistry.rtiNeededClasses.removeAll(neededClasses); |
| - // rtiNeededClasses now contains only the "empty shells". |
| - neededClasses.addAll(typeTestRegistry.rtiNeededClasses); |
| + neededClasses.addAll(rtiOnlyNeededClasses); |
| // TODO(18175, floitsch): remove once issue 18175 is fixed. |
| if (neededClasses.contains(backend.jsIntClass)) { |
| @@ -330,7 +327,7 @@ class CodeEmitterTask extends CompilerTask { |
| for (ClassElement element in sortedClasses) { |
| if (Elements.isNativeOrExtendsNative(element) && |
| - !typeTestRegistry.rtiNeededClasses.contains(element)) { |
| + !rtiOnlyNeededClasses.contains(element)) { |
| // For now, native classes and related classes cannot be deferred. |
| nativeClassesAndSubclasses.add(element); |
| assert(invariant(element, |
| @@ -390,8 +387,10 @@ class CodeEmitterTask extends CompilerTask { |
| // Compute the required type checks to know which classes need a |
| // 'is$' method. |
| typeTestRegistry.computeRequiredTypeChecks(); |
| + // Compute the classes needed by RTI. |
| + Set<ClassElement> rtiClasses = typeTestRegistry.computeRtiNeededClasses(); |
| - computeNeededDeclarations(); |
| + computeNeededDeclarations(rtiClasses); |
| computeNeededConstants(); |
| computeNeededStatics(); |
| computeNeededStaticNonFinalFields(); |