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

Unified Diff: dart/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart

Issue 12525007: Record dependency information to implement first version of dependency (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rebased Created 7 years, 9 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/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) {

Powered by Google App Engine
This is Rietveld 408576698