Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1856)

Unified Diff: dart/sdk/lib/_internal/compiler/implementation/enqueue.dart

Issue 16817002: Be smarter about when disabling tree-shaking. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Address comments Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: dart/sdk/lib/_internal/compiler/implementation/enqueue.dart
diff --git a/dart/sdk/lib/_internal/compiler/implementation/enqueue.dart b/dart/sdk/lib/_internal/compiler/implementation/enqueue.dart
index a1a2ed2533e485fea898cd4e681b02d854adb746..736732c97f428908ac752ffa1405729126545d77 100644
--- a/dart/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/dart/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -62,7 +62,6 @@ class EnqueueTask extends CompilerTask {
compiler.libraries.values.forEach(addMemberByName);
}
-
String get name => 'Enqueue';
EnqueueTask(Compiler compiler)
@@ -95,6 +94,8 @@ abstract class Enqueuer {
EnqueueTask task;
native.NativeEnqueuer nativeEnqueuer; // Set by EnqueueTask
+ bool hasEnqueuedEverything = false;
+
Enqueuer(this.name, this.compiler,
ItemCompilationContext itemCompilationContextCreator())
: this.itemCompilationContextCreator = itemCompilationContextCreator;
@@ -342,40 +343,42 @@ abstract class Enqueuer {
for (var link = task.allElementsByName[name];
link != null && !link.isEmpty;
link = link.tail) {
- Element element = link.head;
- if (Elements.isUnresolved(element)) {
- // Ignore.
- } else if (element.isConstructor()) {
- ClassElement cls = element.declaration.getEnclosingClass();
- registerInstantiatedType(cls.rawType, elements);
- registerStaticUse(element.declaration);
- } else if (element.impliesType()) {
- // Don't enqueue classes, typedefs, and type variables.
- } else if (Elements.isStaticOrTopLevel(element)) {
- registerStaticUse(element.declaration);
- } else if (element.isInstanceMember()) {
- if (element.isFunction()) {
- int arity =
- element.asFunctionElement().requiredParameterCount(compiler);
- Selector selector =
- new Selector.call(element.name, element.getLibrary(), arity);
- registerInvocation(element.name, selector);
- } else if (element.isSetter()) {
- Selector selector =
- new Selector.setter(element.name, element.getLibrary());
- registerInvokedSetter(element.name, selector);
- } else if (element.isGetter()) {
- Selector selector =
- new Selector.getter(element.name, element.getLibrary());
- registerInvokedGetter(element.name, selector);
- } else if (element.isField()) {
- Selector selector =
- new Selector.setter(element.name, element.getLibrary());
- registerInvokedSetter(element.name, selector);
- selector =
- new Selector.getter(element.name, element.getLibrary());
- registerInvokedGetter(element.name, selector);
- }
+ pretendElementWasUsed(link.head, elements);
+ }
+ }
+
+ void pretendElementWasUsed(Element element, TreeElements elements) {
+ if (Elements.isUnresolved(element)) {
+ // Ignore.
+ } else if (element.isConstructor()) {
+ ClassElement cls = element.declaration.getEnclosingClass();
+ registerInstantiatedType(cls.rawType, elements);
+ registerStaticUse(element.declaration);
+ } else if (element.impliesType()) {
+ // Don't enqueue classes, typedefs, and type variables.
+ } else if (Elements.isStaticOrTopLevel(element)) {
+ registerStaticUse(element.declaration);
+ } else if (element.isInstanceMember()) {
+ if (element.isFunction()) {
+ int arity =
+ element.asFunctionElement().requiredParameterCount(compiler);
+ Selector selector =
+ new Selector.call(element.name, element.getLibrary(), arity);
+ registerInvocation(element.name, selector);
+ } else if (element.isSetter()) {
+ Selector selector =
+ new Selector.setter(element.name, element.getLibrary());
+ registerInvokedSetter(element.name, selector);
+ } else if (element.isGetter()) {
+ Selector selector =
+ new Selector.getter(element.name, element.getLibrary());
+ registerInvokedGetter(element.name, selector);
+ } else if (element.isField()) {
+ Selector selector =
+ new Selector.setter(element.name, element.getLibrary());
+ registerInvokedSetter(element.name, selector);
+ selector = new Selector.getter(element.name, element.getLibrary());
+ registerInvokedGetter(element.name, selector);
}
}
}
@@ -384,6 +387,18 @@ abstract class Enqueuer {
void registerNewSymbol(TreeElements elements) {
}
+ void enqueueEverything() {
+ if (hasEnqueuedEverything) return;
+ compiler.log('Enqueuing everything');
+ task.ensureAllElementsByName();
+ for (Link link in task.allElementsByName.values) {
+ for (Element element in link) {
+ pretendElementWasUsed(element, compiler.globalDependencies);
+ }
+ }
+ hasEnqueuedEverything = true;
+ }
+
processLink(Map<String, Link<Element>> map,
SourceString n,
bool f(Element e)) {
@@ -456,6 +471,7 @@ abstract class Enqueuer {
if (element == null) return;
assert(invariant(element, element.isDeclaration));
addToWorkList(element);
+ compiler.backend.registerStaticUse(element, this);
}
void registerGetOfStaticFunction(FunctionElement element) {

Powered by Google App Engine
This is Rietveld 408576698