Index: dart/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart |
diff --git a/dart/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/dart/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart |
index 0102e9157fb0452b167be2498ebe9409e5e0b838..46bece00e25882af8f425bd6c3452d96de5c5024 100644 |
--- a/dart/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart |
+++ b/dart/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart |
@@ -892,7 +892,9 @@ class JavaScriptBackend extends Backend { |
..add(jsNumberClass); |
} |
- void addInterceptors(ClassElement cls, Enqueuer enqueuer) { |
+ void addInterceptors(ClassElement cls, |
+ Enqueuer enqueuer, |
+ TreeElements elements) { |
if (enqueuer.isResolutionQueue) { |
cls.ensureResolved(compiler); |
cls.forEachMember((ClassElement classElement, Element member) { |
@@ -902,7 +904,7 @@ class JavaScriptBackend extends Backend { |
}, |
includeSuperMembers: true); |
} |
- enqueuer.registerInstantiatedClass(cls); |
+ enqueuer.registerInstantiatedClass(cls, elements); |
} |
void registerSpecializedGetInterceptor(Set<ClassElement> classes) { |
@@ -927,7 +929,9 @@ class JavaScriptBackend extends Backend { |
argumentTypes.registerDynamicInvocation(types, new Selector.noSuchMethod()); |
} |
- void registerInstantiatedClass(ClassElement cls, Enqueuer enqueuer) { |
+ void registerInstantiatedClass(ClassElement cls, |
+ Enqueuer enqueuer, |
+ TreeElements elements) { |
if (!seenAnyClass) { |
initializeNoSuchMethod(); |
seenAnyClass = true; |
@@ -951,38 +955,38 @@ class JavaScriptBackend extends Backend { |
enqueuer.registerStaticUse( |
compiler.findHelper(const SourceString('iae'))); |
} else if (cls == compiler.functionClass) { |
- enqueuer.registerInstantiatedClass(compiler.closureClass); |
+ enqueuer.registerInstantiatedClass(compiler.closureClass, elements); |
} else if (cls == compiler.mapClass) { |
// The backend will use a literal list to initialize the entries |
// of the map. |
- enqueuer.registerInstantiatedClass(compiler.listClass); |
- enqueuer.registerInstantiatedClass(mapLiteralClass); |
- enqueueInResolution(getMapMaker()); |
+ enqueuer.registerInstantiatedClass(compiler.listClass, elements); |
+ enqueuer.registerInstantiatedClass(mapLiteralClass, elements); |
+ enqueueInResolution(getMapMaker(), elements); |
} |
} |
ClassElement result = null; |
if (cls == compiler.stringClass) { |
- addInterceptors(jsStringClass, enqueuer); |
+ addInterceptors(jsStringClass, enqueuer, elements); |
} else if (cls == compiler.listClass) { |
- addInterceptors(jsArrayClass, enqueuer); |
- enqueuer.registerInstantiatedClass(jsFixedArrayClass); |
- enqueuer.registerInstantiatedClass(jsExtendableArrayClass); |
+ addInterceptors(jsArrayClass, enqueuer, elements); |
+ enqueuer.registerInstantiatedClass(jsFixedArrayClass, elements); |
+ enqueuer.registerInstantiatedClass(jsExtendableArrayClass, elements); |
} else if (cls == compiler.intClass) { |
- addInterceptors(jsIntClass, enqueuer); |
- addInterceptors(jsNumberClass, enqueuer); |
+ addInterceptors(jsIntClass, enqueuer, elements); |
+ addInterceptors(jsNumberClass, enqueuer, elements); |
} else if (cls == compiler.doubleClass) { |
- addInterceptors(jsDoubleClass, enqueuer); |
- addInterceptors(jsNumberClass, enqueuer); |
+ addInterceptors(jsDoubleClass, enqueuer, elements); |
+ addInterceptors(jsNumberClass, enqueuer, elements); |
} else if (cls == compiler.functionClass) { |
- addInterceptors(jsFunctionClass, enqueuer); |
+ addInterceptors(jsFunctionClass, enqueuer, elements); |
} else if (cls == compiler.boolClass) { |
- addInterceptors(jsBoolClass, enqueuer); |
+ addInterceptors(jsBoolClass, enqueuer, elements); |
} else if (cls == compiler.nullClass) { |
- addInterceptors(jsNullClass, enqueuer); |
+ addInterceptors(jsNullClass, enqueuer, elements); |
} else if (cls == compiler.numClass) { |
- addInterceptors(jsIntClass, enqueuer); |
- addInterceptors(jsDoubleClass, enqueuer); |
- addInterceptors(jsNumberClass, enqueuer); |
+ addInterceptors(jsIntClass, enqueuer, elements); |
+ addInterceptors(jsDoubleClass, enqueuer, elements); |
+ addInterceptors(jsNumberClass, enqueuer, elements); |
} else if (cls == compiler.mapClass) { |
} |
@@ -991,7 +995,7 @@ class JavaScriptBackend extends Backend { |
cls.forEachLocalMember((Element member) { |
if (!member.isInstanceMember() || !member.isField()) return; |
DartType type = member.computeType(compiler); |
- enqueuer.registerIsCheck(type); |
+ enqueuer.registerIsCheck(type, elements); |
}); |
} |
} |
@@ -1006,11 +1010,12 @@ class JavaScriptBackend extends Backend { |
} |
} |
- void enqueueHelpers(ResolutionEnqueuer world) { |
+ void enqueueHelpers(ResolutionEnqueuer world, TreeElements elements) { |
jsIndexingBehaviorInterface = |
compiler.findHelper(const SourceString('JavaScriptIndexingBehavior')); |
if (jsIndexingBehaviorInterface != null) { |
- world.registerIsCheck(jsIndexingBehaviorInterface.computeType(compiler)); |
+ world.registerIsCheck(jsIndexingBehaviorInterface.computeType(compiler), |
+ elements); |
} |
if (compiler.enableTypeAssertions) { |
@@ -1023,55 +1028,58 @@ class JavaScriptBackend extends Backend { |
} |
} |
- void registerStringInterpolation() { |
- enqueueInResolution(getStringInterpolationHelper()); |
+ void registerStringInterpolation(TreeElements elements) { |
+ enqueueInResolution(getStringInterpolationHelper(), elements); |
} |
- void registerCatchStatement() { |
- enqueueInResolution(getExceptionUnwrapper()); |
+ void registerCatchStatement(TreeElements elements) { |
+ enqueueInResolution(getExceptionUnwrapper(), elements); |
} |
- void registerThrow() { |
- enqueueInResolution(getThrowHelper()); |
+ void registerThrow(TreeElements elements) { |
+ enqueueInResolution(getThrowHelper(), elements); |
} |
- void registerLazyField() { |
- enqueueInResolution(getCyclicThrowHelper()); |
+ void registerLazyField(TreeElements elements) { |
+ enqueueInResolution(getCyclicThrowHelper(), elements); |
} |
- void registerTypeLiteral() { |
- enqueueInResolution(getCreateRuntimeType()); |
+ void registerTypeLiteral(TreeElements elements) { |
+ enqueueInResolution(getCreateRuntimeType(), elements); |
} |
- void registerStackTraceInCatch() { |
- enqueueInResolution(getTraceFromException()); |
+ void registerStackTraceInCatch(TreeElements elements) { |
+ enqueueInResolution(getTraceFromException(), elements); |
} |
- void registerSetRuntimeType() { |
- enqueueInResolution(getSetRuntimeTypeInfo()); |
+ void registerSetRuntimeType(TreeElements elements) { |
+ enqueueInResolution(getSetRuntimeTypeInfo(), elements); |
} |
- void registerGetRuntimeTypeArgument() { |
- enqueueInResolution(getGetRuntimeTypeArgument()); |
+ void registerGetRuntimeTypeArgument(TreeElements elements) { |
+ enqueueInResolution(getGetRuntimeTypeArgument(), elements); |
} |
- void registerRuntimeType() { |
- enqueueInResolution(getSetRuntimeTypeInfo()); |
- enqueueInResolution(getGetRuntimeTypeInfo()); |
- enqueueInResolution(getGetRuntimeTypeArgument()); |
- compiler.enqueuer.resolution.registerInstantiatedClass(compiler.listClass); |
+ void registerRuntimeType(TreeElements elements) { |
+ enqueueInResolution(getSetRuntimeTypeInfo(), elements); |
+ enqueueInResolution(getGetRuntimeTypeInfo(), elements); |
+ enqueueInResolution(getGetRuntimeTypeArgument(), elements); |
+ compiler.enqueuer.resolution.registerInstantiatedClass( |
+ compiler.listClass, elements); |
} |
- void registerIsCheck(DartType type, Enqueuer world) { |
- world.registerInstantiatedClass(compiler.boolClass); |
+ void registerIsCheck(DartType type, Enqueuer world, TreeElements elements) { |
+ world.registerInstantiatedClass(compiler.boolClass, elements); |
bool isTypeVariable = type.kind == TypeKind.TYPE_VARIABLE; |
if (!type.isRaw || isTypeVariable) { |
- enqueueInResolution(getSetRuntimeTypeInfo()); |
- enqueueInResolution(getGetRuntimeTypeInfo()); |
- enqueueInResolution(getGetRuntimeTypeArgument()); |
- enqueueInResolution(getCheckArguments()); |
- if (isTypeVariable) enqueueInResolution(getGetObjectIsSubtype()); |
- world.registerInstantiatedClass(compiler.listClass); |
+ enqueueInResolution(getSetRuntimeTypeInfo(), elements); |
+ enqueueInResolution(getGetRuntimeTypeInfo(), elements); |
+ enqueueInResolution(getGetRuntimeTypeArgument(), elements); |
+ enqueueInResolution(getCheckArguments(), elements); |
+ if (isTypeVariable) { |
+ enqueueInResolution(getGetObjectIsSubtype(), elements); |
+ } |
+ world.registerInstantiatedClass(compiler.listClass, elements); |
} |
// [registerIsCheck] is also called for checked mode checks, so we |
// need to register checked mode helpers. |
@@ -1091,46 +1099,55 @@ class JavaScriptBackend extends Backend { |
} |
} |
- void registerAsCheck(DartType type) { |
+ void registerAsCheck(DartType type, TreeElements elements) { |
Element e = getCheckedModeHelper(type, typeCast: true); |
- enqueueInResolution(e); |
+ enqueueInResolution(e, elements); |
// We also need the native variant of the check (for DOM types). |
e = getNativeCheckedModeHelper(type, typeCast: true); |
- enqueueInResolution(e); |
+ enqueueInResolution(e, elements); |
} |
- void registerThrowNoSuchMethod() { |
- enqueueInResolution(getThrowNoSuchMethod()); |
+ void registerThrowNoSuchMethod(TreeElements elements) { |
+ enqueueInResolution(getThrowNoSuchMethod(), elements); |
} |
- void registerThrowRuntimeError() { |
- enqueueInResolution(getThrowRuntimeError()); |
+ void registerThrowRuntimeError(TreeElements elements) { |
+ enqueueInResolution(getThrowRuntimeError(), elements); |
} |
- void registerAbstractClassInstantiation() { |
- enqueueInResolution(getThrowAbstractClassInstantiationError()); |
+ void registerAbstractClassInstantiation(TreeElements elements) { |
+ enqueueInResolution(getThrowAbstractClassInstantiationError(), elements); |
} |
- void registerFallThroughError() { |
- enqueueInResolution(getFallThroughError()); |
+ void registerFallThroughError(TreeElements elements) { |
+ enqueueInResolution(getFallThroughError(), elements); |
} |
- void registerSuperNoSuchMethod() { |
- enqueueInResolution(getCreateInvocationMirror()); |
+ void registerSuperNoSuchMethod(TreeElements elements) { |
+ enqueueInResolution(getCreateInvocationMirror(), elements); |
enqueueInResolution( |
- compiler.objectClass.lookupLocalMember(Compiler.NO_SUCH_METHOD)); |
- compiler.enqueuer.resolution.registerInstantiatedClass(compiler.listClass); |
+ compiler.objectClass.lookupLocalMember(Compiler.NO_SUCH_METHOD), |
+ elements); |
+ compiler.enqueuer.resolution.registerInstantiatedClass( |
+ compiler.listClass, elements); |
} |
- void enqueueInResolution(Element e) { |
- if (e != null) compiler.enqueuer.resolution.addToWorkList(e); |
+ void enqueueInResolution(Element e, TreeElements elements) { |
+ if (e == null) return; |
+ ResolutionEnqueuer enqueuer = compiler.enqueuer.resolution; |
+ enqueuer.addToWorkList(e); |
+ elements.registerDependency(e); |
} |
- void registerConstantMap() { |
+ void registerConstantMap(TreeElements elements) { |
Element e = compiler.findHelper(const SourceString('ConstantMap')); |
- if (e != null) compiler.enqueuer.resolution.registerInstantiatedClass(e); |
+ if (e != null) { |
+ compiler.enqueuer.resolution.registerInstantiatedClass(e, elements); |
+ } |
e = compiler.findHelper(const SourceString('ConstantProtoMap')); |
- if (e != null) compiler.enqueuer.resolution.registerInstantiatedClass(e); |
+ if (e != null) { |
+ compiler.enqueuer.resolution.registerInstantiatedClass(e, elements); |
+ } |
} |
void codegen(CodegenWorkItem work) { |