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

Unified Diff: pkg/compiler/lib/src/js_backend/enqueuer.dart

Issue 2531303002: Decouple WorkItem from Compiler (Closed)
Patch Set: Updated cf. comments. Created 4 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
Index: pkg/compiler/lib/src/js_backend/enqueuer.dart
diff --git a/pkg/compiler/lib/src/js_backend/enqueuer.dart b/pkg/compiler/lib/src/js_backend/enqueuer.dart
index 07c1f0602355b74e1cb11d86ce8a81896071867a..c0b028c951ed01490cd7bf6f8e475e9f657e9650 100644
--- a/pkg/compiler/lib/src/js_backend/enqueuer.dart
+++ b/pkg/compiler/lib/src/js_backend/enqueuer.dart
@@ -43,7 +43,7 @@ import '../util/util.dart' show Setlet;
import '../world.dart';
/// [Enqueuer] which is specific to code generation.
-class CodegenEnqueuer implements Enqueuer {
+class CodegenEnqueuer extends EnqueuerImpl {
final String name;
@deprecated
final Compiler _compiler; // TODO(ahe): Remove this dependency.
@@ -70,7 +70,7 @@ class CodegenEnqueuer implements Enqueuer {
nativeEnqueuer = compiler.backend.nativeCodegenEnqueuer(),
this.name = 'codegen enqueuer',
this._compiler = compiler {
- impactVisitor = new _EnqueuerImpactVisitor(this);
+ impactVisitor = new EnqueuerImplImpactVisitor(this);
}
CodegenWorldBuilder get universe => _universe;
@@ -86,8 +86,6 @@ class CodegenEnqueuer implements Enqueuer {
/// Returns [:true:] if this enqueuer is the resolution enqueuer.
bool get isResolutionQueue => false;
- QueueFilter get filter => _compiler.enqueuerFilter;
-
DiagnosticReporter get reporter => _compiler.reporter;
/**
@@ -116,15 +114,15 @@ class CodegenEnqueuer implements Enqueuer {
throw new SpannableAssertionFailure(
element, "Codegen work list is closed. Trying to add $element");
}
- queue.add(new CodegenWorkItem(_compiler, element));
+ queue.add(new CodegenWorkItem(backend, element));
// TODO(sigmund): add other missing dependencies (internals, selectors
// enqueued after allocations).
_compiler.dumpInfoTask
.registerDependency(_compiler.currentElement, element);
}
- void applyImpact(ImpactStrategy impactStrategy, WorldImpact worldImpact,
- {Element impactSource}) {
+ void applyImpact(WorldImpact worldImpact, {Element impactSource}) {
+ if (worldImpact.isEmpty) return;
impactStrategy.visitImpact(
impactSource, worldImpact, impactVisitor, impactUse);
}
@@ -141,7 +139,8 @@ class CodegenEnqueuer implements Enqueuer {
_universe.registerTypeInstantiation(type,
isNative: isNative,
byMirrors: mirrorUsage, onImplemented: (ClassElement cls) {
- backend.registerImplementedClass(cls, this);
+ applyImpact(
+ backend.registerImplementedClass(cls, forResolution: false));
});
if (nativeUsage) {
nativeEnqueuer.onInstantiatedType(type);
@@ -155,7 +154,7 @@ class CodegenEnqueuer implements Enqueuer {
}
bool checkNoEnqueuedInvokedInstanceMethods() {
- return filter.checkNoEnqueuedInvokedInstanceMethods(this);
+ return strategy.checkEnqueuerConsistency(this);
}
void processInstantiatedClassMembers(ClassElement cls) {
@@ -272,7 +271,8 @@ class CodegenEnqueuer implements Enqueuer {
// We only tell the backend once that [superclass] was instantiated, so
// any additional dependencies must be treated as global
// dependencies.
- backend.registerInstantiatedClass(superclass, this);
+ applyImpact(backend.registerInstantiatedClass(superclass,
+ forResolution: false));
}
ClassElement superclass = cls;
@@ -356,11 +356,11 @@ class CodegenEnqueuer implements Enqueuer {
assert(invariant(element, element.isDeclaration,
message: "Element ${element} is not the declaration."));
_universe.registerStaticUse(staticUse);
- backend.registerStaticUse(this, element);
+ applyImpact(backend.registerStaticUse(element, forResolution: false));
bool addElement = true;
switch (staticUse.kind) {
case StaticUseKind.STATIC_TEAR_OFF:
- backend.registerGetOfStaticFunction(this);
+ applyImpact(backend.registerGetOfStaticFunction());
break;
case StaticUseKind.FIELD_GET:
case StaticUseKind.FIELD_SET:
@@ -374,11 +374,12 @@ class CodegenEnqueuer implements Enqueuer {
case StaticUseKind.SUPER_FIELD_SET:
case StaticUseKind.SUPER_TEAR_OFF:
case StaticUseKind.GENERAL:
+ case StaticUseKind.DIRECT_USE:
break;
case StaticUseKind.CONSTRUCTOR_INVOKE:
case StaticUseKind.CONST_CONSTRUCTOR_INVOKE:
case StaticUseKind.REDIRECTION:
- registerTypeUse(new TypeUse.instantiation(staticUse.type));
+ registerTypeUseInternal(new TypeUse.instantiation(staticUse.type));
break;
case StaticUseKind.DIRECT_INVOKE:
_registerInstanceMethod(staticUse.element);
@@ -390,6 +391,10 @@ class CodegenEnqueuer implements Enqueuer {
}
void registerTypeUse(TypeUse typeUse) {
+ strategy.processTypeUse(this, typeUse);
+ }
+
+ void registerTypeUseInternal(TypeUse typeUse) {
DartType type = typeUse.type;
switch (typeUse.kind) {
case TypeUseKind.INSTANTIATION:
@@ -425,22 +430,29 @@ class CodegenEnqueuer implements Enqueuer {
}
void registerCallMethodWithFreeTypeVariables(Element element) {
- backend.registerCallMethodWithFreeTypeVariables(element, this);
+ applyImpact(backend.registerCallMethodWithFreeTypeVariables(element,
+ forResolution: false));
}
void registerClosurizedMember(TypedElement element) {
assert(element.isInstanceMember);
if (element.type.containsTypeVariables) {
- backend.registerClosureWithFreeTypeVariables(element, this);
+ applyImpact(backend.registerClosureWithFreeTypeVariables(element,
+ forResolution: false));
}
- backend.registerBoundClosure(this);
+ applyImpact(backend.registerBoundClosure());
}
void forEach(void f(WorkItem work)) {
do {
while (queue.isNotEmpty) {
// TODO(johnniwinther): Find an optimal process order.
- filter.processWorkItem(f, queue.removeLast());
+ WorkItem work = queue.removeLast();
+ if (!isProcessed(work.element)) {
+ strategy.processWorkItem(f, work);
+ // TODO(johnniwinther): Register the processed element here. This
+ // is currently a side-effect of calling `work.run`.
+ }
}
List recents = recentClasses.toList(growable: false);
recentClasses.clear();
@@ -491,7 +503,7 @@ class CodegenEnqueuer implements Enqueuer {
void registerNoSuchMethod(Element element) {
if (!enabledNoSuchMethod && backend.enabledNoSuchMethod) {
- backend.enableNoSuchMethod(this);
+ applyImpact(backend.enableNoSuchMethod());
enabledNoSuchMethod = true;
}
}
@@ -531,24 +543,3 @@ void removeFromSet(Map<String, Set<Element>> map, Element element) {
if (set == null) return;
set.remove(element);
}
-
-class _EnqueuerImpactVisitor implements WorldImpactVisitor {
- final CodegenEnqueuer enqueuer;
-
- _EnqueuerImpactVisitor(this.enqueuer);
-
- @override
- void visitDynamicUse(DynamicUse dynamicUse) {
- enqueuer.registerDynamicUse(dynamicUse);
- }
-
- @override
- void visitStaticUse(StaticUse staticUse) {
- enqueuer.registerStaticUse(staticUse);
- }
-
- @override
- void visitTypeUse(TypeUse typeUse) {
- enqueuer.registerTypeUse(typeUse);
- }
-}
« no previous file with comments | « pkg/compiler/lib/src/js_backend/backend_impact.dart ('k') | pkg/compiler/lib/src/js_backend/lookup_map_analysis.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698