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 615ffe8e2e10cc9b308168fa6887986d89af11b9..436011eda0502a652105f9fdefeffb9620db67e4 100644 |
--- a/dart/sdk/lib/_internal/compiler/implementation/enqueue.dart |
+++ b/dart/sdk/lib/_internal/compiler/implementation/enqueue.dart |
@@ -88,16 +88,16 @@ abstract class Enqueuer { |
void registerInstantiatedType(InterfaceType type) { |
universe.instantiatedTypes.add(type); |
- registerInstantiatedClass(type.element); |
+ registerInstantiatedClass(type.element, compiler.globalDependencies); |
} |
- void registerInstantiatedClass(ClassElement cls) { |
+ void registerInstantiatedClass(ClassElement cls, TreeElements elements) { |
if (universe.instantiatedClasses.contains(cls)) return; |
if (!cls.isAbstract(compiler)) { |
universe.instantiatedClasses.add(cls); |
} |
onRegisterInstantiatedClass(cls); |
- compiler.backend.registerInstantiatedClass(cls, this); |
+ compiler.backend.registerInstantiatedClass(cls, this, elements); |
} |
bool checkNoEnqueuedInvokedInstanceMethods() { |
@@ -150,7 +150,8 @@ abstract class Enqueuer { |
// We will emit a closure, so make sure the closure class is |
// generated. |
compiler.closureClass.ensureResolved(compiler); |
- registerInstantiatedClass(compiler.closureClass); |
+ registerInstantiatedClass(compiler.closureClass, |
+ compiler.globalDependencies); |
return addToWorkList(member); |
} |
} else if (member.kind == ElementKind.GETTER) { |
@@ -355,18 +356,18 @@ abstract class Enqueuer { |
universe.fieldSetters.add(element); |
} |
- void registerIsCheck(DartType type) { |
+ void registerIsCheck(DartType type, TreeElements elements) { |
// Even in checked mode, type annotations for return type and argument |
// types do not imply type checks, so there should never be a check |
// against the type variable of a typedef. |
assert(type.kind != TypeKind.TYPE_VARIABLE || |
!type.element.enclosingElement.isTypedef()); |
universe.isChecks.add(type); |
- compiler.backend.registerIsCheck(type, this); |
+ compiler.backend.registerIsCheck(type, this, elements); |
} |
void registerAsCheck(DartType type) { |
- registerIsCheck(type); |
+ registerIsCheck(type, compiler.globalDependencies); |
compiler.backend.registerAsCheck(type); |
} |
@@ -412,6 +413,9 @@ class ResolutionEnqueuer extends Enqueuer { |
element = cls.methodElement; |
} |
Element owner = element.getOutermostEnclosingMemberOrTopLevel(); |
+ if (owner == null) { |
+ owner = element; |
+ } |
return resolvedElements[owner.declaration]; |
} |
@@ -467,8 +471,11 @@ class ResolutionEnqueuer extends Enqueuer { |
void enableIsolateSupport(LibraryElement element) { |
compiler.isolateLibrary = element.patch; |
- addToWorkList( |
- compiler.isolateHelperLibrary.find(Compiler.START_ROOT_ISOLATE)); |
+ var startRootIsolate = |
+ compiler.isolateHelperLibrary.find(Compiler.START_ROOT_ISOLATE); |
+ addToWorkList(startRootIsolate); |
+ // TODO(ahe): This doesn't seem to be necessary. Why is that? |
+ compiler.globalDependencies.registerBackendDependency(startRootIsolate); |
addToWorkList(compiler.isolateHelperLibrary.find( |
const SourceString('_currentIsolate'))); |
addToWorkList(compiler.isolateHelperLibrary.find( |