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

Unified Diff: pkg/compiler/lib/src/enqueue.dart

Issue 1424923004: Add StaticUse for more precise registration of statically known element use. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comments. Created 5 years, 1 month 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
« no previous file with comments | « pkg/compiler/lib/src/deferred_load.dart ('k') | pkg/compiler/lib/src/js_backend/backend.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/enqueue.dart
diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
index 8f56ed6827cf30b36ed22331af05c42be81a7a62..7053afa568b656a2cae83978eadf3002a47f596b 100644
--- a/pkg/compiler/lib/src/enqueue.dart
+++ b/pkg/compiler/lib/src/enqueue.dart
@@ -51,6 +51,9 @@ import 'types/types.dart' show
import 'universe/selector.dart' show
Selector;
import 'universe/universe.dart';
+import 'universe/use.dart' show
+ StaticUse,
+ StaticUseKind;
import 'universe/world_impact.dart' show
WorldImpact;
import 'util/util.dart' show
@@ -161,9 +164,7 @@ abstract class Enqueuer {
/// Apply the [worldImpact] of processing [element] to this enqueuer.
void applyImpact(Element element, WorldImpact worldImpact) {
// TODO(johnniwinther): Optimize the application of the world impact.
- worldImpact.dynamicInvocations.forEach(registerDynamicInvocation);
- worldImpact.dynamicGetters.forEach(registerDynamicGetter);
- worldImpact.dynamicSetters.forEach(registerDynamicSetter);
+ worldImpact.dynamicUses.forEach(registerDynamicUse);
worldImpact.staticUses.forEach(registerStaticUse);
worldImpact.instantiatedTypes.forEach(registerInstantiatedType);
worldImpact.isChecks.forEach(registerIsCheck);
@@ -172,11 +173,9 @@ abstract class Enqueuer {
worldImpact.checkedModeChecks.forEach(registerIsCheck);
}
worldImpact.onCatchTypes.forEach(registerIsCheck);
- worldImpact.closurizedFunctions.forEach(registerGetOfStaticFunction);
worldImpact.closures.forEach(registerClosure);
}
- // TODO(johnniwinther): Remove the need for passing the [registry].
void registerInstantiatedType(InterfaceType type,
{bool mirrorUsage: false}) {
task.measure(() {
@@ -346,25 +345,9 @@ abstract class Enqueuer {
});
}
- void registerInvocation(UniverseSelector selector) {
+ void registerDynamicUse(UniverseSelector selector) {
task.measure(() {
- if (universe.registerInvocation(selector)) {
- handleUnseenSelector(selector);
- }
- });
- }
-
- void registerInvokedGetter(UniverseSelector selector) {
- task.measure(() {
- if (universe.registerInvokedGetter(selector)) {
- handleUnseenSelector(selector);
- }
- });
- }
-
- void registerInvokedSetter(UniverseSelector selector) {
- task.measure(() {
- if (universe.registerInvokedSetter(selector)) {
+ if (universe.registerDynamicUse(selector)) {
handleUnseenSelector(selector);
}
});
@@ -401,7 +384,7 @@ abstract class Enqueuer {
this,
compiler.mirrorDependencies,
mirrorUsage: true);
- registerStaticUse(ctor.declaration);
+ registerStaticUse(new StaticUse.foreignUse(ctor.declaration));
}
}
@@ -418,19 +401,19 @@ abstract class Enqueuer {
typedef.ensureResolved(resolution);
compiler.world.allTypedefs.add(element);
} else if (Elements.isStaticOrTopLevel(element)) {
- registerStaticUse(element.declaration);
+ registerStaticUse(new StaticUse.foreignUse(element.declaration));
} else if (element.isInstanceMember) {
// We need to enqueue all members matching this one in subclasses, as
// well.
// TODO(herhut): Use TypedSelector.subtype for enqueueing
UniverseSelector selector = new UniverseSelector(
new Selector.fromElement(element), null);
- registerSelectorUse(selector);
+ registerDynamicUse(selector);
if (element.isField) {
UniverseSelector selector = new UniverseSelector(
new Selector.setter(new Name(
element.name, element.library, isSetter: true)), null);
- registerInvokedSetter(selector);
+ registerDynamicUse(selector);
}
}
}
@@ -576,7 +559,7 @@ abstract class Enqueuer {
}
void handleUnseenSelector(UniverseSelector universeSelector) {
- strategy.processSelector(this, universeSelector);
+ strategy.processDynamicUse(this, universeSelector);
}
void handleUnseenSelectorInternal(UniverseSelector universeSelector) {
@@ -626,60 +609,34 @@ abstract class Enqueuer {
*
* Invariant: [element] must be a declaration element.
*/
- void registerStaticUse(Element element) {
- if (element == null) return;
- strategy.processStaticUse(this, element);
+ void registerStaticUse(StaticUse staticUse) {
+ strategy.processStaticUse(this, staticUse);
}
- void registerStaticUseInternal(Element element) {
+ void registerStaticUseInternal(StaticUse staticUse) {
+ Element element = staticUse.element;
assert(invariant(element, element.isDeclaration,
message: "Element ${element} is not the declaration."));
- if (Elements.isStaticOrTopLevel(element) && element.isField) {
- universe.registerStaticFieldUse(element);
- }
- addToWorkList(element);
+ universe.registerStaticUse(staticUse);
compiler.backend.registerStaticUse(element, this);
- }
-
- void registerGetOfStaticFunction(FunctionElement element) {
- registerStaticUse(element);
- compiler.backend.registerGetOfStaticFunction(this);
- universe.staticFunctionsNeedingGetter.add(element);
- }
-
- void registerDynamicInvocation(UniverseSelector selector) {
- assert(selector != null);
- registerInvocation(selector);
- }
-
- void registerSelectorUse(UniverseSelector universeSelector) {
- if (universeSelector.selector.isGetter) {
- registerInvokedGetter(universeSelector);
- } else if (universeSelector.selector.isSetter) {
- registerInvokedSetter(universeSelector);
- } else {
- registerInvocation(universeSelector);
+ bool addElement = true;
+ switch (staticUse.kind) {
+ case StaticUseKind.STATIC_TEAR_OFF:
+ compiler.backend.registerGetOfStaticFunction(this);
+ break;
+ case StaticUseKind.FIELD_GET:
+ case StaticUseKind.FIELD_SET:
+ // TODO(johnniwinther): Avoid this. Currently [FIELD_GET] and
+ // [FIELD_SET] contains [BoxFieldElement]s which we cannot enqueue.
+ addElement = false;
+ break;
+ case StaticUseKind.SUPER_TEAR_OFF:
+ case StaticUseKind.GENERAL:
+ break;
+ }
+ if (addElement) {
+ addToWorkList(element);
}
- }
-
- void registerDynamicGetter(UniverseSelector selector) {
- registerInvokedGetter(selector);
- }
-
- void registerDynamicSetter(UniverseSelector selector) {
- registerInvokedSetter(selector);
- }
-
- void registerGetterForSuperMethod(Element element) {
- universe.methodsNeedingSuperGetter.add(element);
- }
-
- void registerFieldGetter(Element element) {
- universe.fieldGetters.add(element);
- }
-
- void registerFieldSetter(Element element) {
- universe.fieldSetters.add(element);
}
void registerIsCheck(DartType type) {
@@ -1036,11 +993,11 @@ class EnqueuerStrategy {
/// Process a class instantiated in live code.
void processInstantiatedClass(Enqueuer enqueuer, ClassElement cls) {}
- /// Process an element statically accessed in live code.
- void processStaticUse(Enqueuer enqueuer, Element element) {}
+ /// Process a static use of and element in live code.
+ void processStaticUse(Enqueuer enqueuer, StaticUse staticUse) {}
/// Process a selector for a call site in live code.
- void processSelector(Enqueuer enqueuer, UniverseSelector selector) {}
+ void processDynamicUse(Enqueuer enqueuer, UniverseSelector dynamicUse) {}
}
class TreeShakingEnqueuerStrategy implements EnqueuerStrategy {
@@ -1052,12 +1009,12 @@ class TreeShakingEnqueuerStrategy implements EnqueuerStrategy {
}
@override
- void processStaticUse(Enqueuer enqueuer, Element element) {
- enqueuer.registerStaticUseInternal(element);
+ void processStaticUse(Enqueuer enqueuer, StaticUse staticUse) {
+ enqueuer.registerStaticUseInternal(staticUse);
}
@override
- void processSelector(Enqueuer enqueuer, UniverseSelector selector) {
- enqueuer.handleUnseenSelectorInternal(selector);
+ void processDynamicUse(Enqueuer enqueuer, UniverseSelector dynamicUse) {
+ enqueuer.handleUnseenSelectorInternal(dynamicUse);
}
}
« no previous file with comments | « pkg/compiler/lib/src/deferred_load.dart ('k') | pkg/compiler/lib/src/js_backend/backend.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698