Chromium Code Reviews| Index: sdk/lib/_internal/compiler/implementation/deferred_load.dart |
| diff --git a/sdk/lib/_internal/compiler/implementation/deferred_load.dart b/sdk/lib/_internal/compiler/implementation/deferred_load.dart |
| index 53eca9743ed7c90cbebcf36cd64e57b6d68b5c56..22653c3a429fe43a8bc939e2ebaa1556aa2b8dce 100644 |
| --- a/sdk/lib/_internal/compiler/implementation/deferred_load.dart |
| +++ b/sdk/lib/_internal/compiler/implementation/deferred_load.dart |
| @@ -83,21 +83,23 @@ class DeferredLoadTask extends CompilerTask { |
| new LinkedHashMap<LibraryElement, Set<Element>>(); |
| Set<Element> eagerElements = new LinkedHashSet<Element>(); |
| - // Iterate through the local members of the main script. Create |
| + // Iterate through live local members of the main script. Create |
| // a root-set of elements that must be loaded eagerly |
| // (everything that is directly referred to from the main |
| // script, but not imported from a deferred library), as well as |
| // root-sets for deferred libraries. |
| mainApp.forEachLocalMember((Element e) { |
| - for (Element dependency in allElementsResolvedFrom(e)) { |
| - if (isExplicitlyDeferred(dependency)) { |
| - Set<Element> deferredElementsFromLibrary = |
| - deferredElements.putIfAbsent( |
| - dependency.getLibrary(), |
| - () => new LinkedHashSet<Element>()); |
| - deferredElementsFromLibrary.add(dependency); |
| - } else if (dependency.getLibrary() != mainApp) { |
| - eagerElements.add(dependency.implementation); |
| + if (compiler.enqueuer.resolution.isLive(e)) { |
| + for (Element dependency in allElementsResolvedFrom(e)) { |
| + if (isExplicitlyDeferred(dependency)) { |
| + Set<Element> deferredElementsFromLibrary = |
| + deferredElements.putIfAbsent( |
| + dependency.getLibrary(), |
| + () => new LinkedHashSet<Element>()); |
| + deferredElementsFromLibrary.add(dependency); |
| + } else if (dependency.getLibrary() != mainApp) { |
| + eagerElements.add(dependency.implementation); |
| + } |
| } |
| } |
| }); |
| @@ -153,22 +155,25 @@ class DeferredLoadTask extends CompilerTask { |
| // If we see a class, add everything its instance members refer |
| // to. Static members are not relevant. |
| ClassElement cls = element.declaration; |
| - cls.forEachLocalMember((Element e) { |
| - if (!e.isInstanceMember()) return; |
| - result.addAll(DependencyCollector.collect(e.implementation, compiler)); |
| - }); |
| - if (cls.implementation != cls) { |
| - // TODO(ahe): Why doesn't ClassElement.forEachLocalMember do this? |
| - cls.implementation.forEachLocalMember((Element e) { |
| + // Make sure that class has been used - type has been computed. |
| + if (cls.thisType != null) { |
|
ahe
2013/08/08 11:36:51
Can you revert this part of the change now?
|
| + cls.forEachLocalMember((Element e) { |
| if (!e.isInstanceMember()) return; |
| - result.addAll(DependencyCollector.collect(e.implementation, |
| - compiler)); |
| + result.addAll(DependencyCollector.collect(e.implementation, compiler)); |
| }); |
| + if (cls.implementation != cls) { |
| + // TODO(ahe): Why doesn't ClassElement.forEachLocalMember do this? |
| + cls.implementation.forEachLocalMember((Element e) { |
| + if (!e.isInstanceMember()) return; |
| + result.addAll(DependencyCollector.collect(e.implementation, |
| + compiler)); |
| + }); |
| + } |
| + for (var type in cls.allSupertypes) { |
| + result.add(type.element.implementation); |
| + } |
| + result.add(cls.implementation); |
| } |
| - for (var type in cls.allSupertypes) { |
| - result.add(type.element.implementation); |
| - } |
| - result.add(cls.implementation); |
| } else if (Elements.isStaticOrTopLevel(element) |
| || element.isConstructor()) { |
| result.addAll(DependencyCollector.collect(element, compiler)); |