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

Unified Diff: sdk/lib/_internal/compiler/implementation/enqueue.dart

Issue 12334070: Support runtime check of function types. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix status files Created 7 years, 6 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: sdk/lib/_internal/compiler/implementation/enqueue.dart
diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
index a1a2ed2533e485fea898cd4e681b02d854adb746..a4c34ccbd1dcf655ff395c6708d28a5ab7274112 100644
--- a/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -231,10 +231,16 @@ abstract class Enqueuer {
if (member.name == Compiler.NO_SUCH_METHOD) {
enableNoSuchMethod(member);
}
+ if (member.name == Compiler.CALL_OPERATOR_NAME) {
+ if (!cls.typeVariables.isEmpty) {
karlklose 2013/06/19 14:37:05 Join the two conditions.
Johnni Winther 2013/06/21 12:19:15 Done.
+ registerGenericCallMethod(member, compiler.globalDependencies);
+ }
+ }
// If there is a property access with the same name as a method we
// need to emit the method.
if (universe.hasInvokedGetter(member, compiler)) {
- // We will emit a closure, so make sure the bound closure class is
+ registerClosure(member, compiler.globalDependencies);
+ // We will emit a closure, so make sure the closure class is
// generated.
registerInstantiatedClass(compiler.boundClosureClass,
// Precise dependency is not important here.
@@ -390,11 +396,12 @@ abstract class Enqueuer {
String memberName = n.slowToString();
Link<Element> members = map[memberName];
if (members != null) {
+ map[memberName] = const Link<Element>();
LinkBuilder<Element> remaining = new LinkBuilder<Element>();
for (; !members.isEmpty; members = members.tail) {
if (!f(members.head)) remaining.addLast(members.head);
}
- map[memberName] = remaining.toLink();
+ map[memberName] = remaining.toLink(map[memberName]);
karlklose 2013/06/19 14:37:05 Isn't the constant empty link already the default
Johnni Winther 2013/06/21 12:19:15 Comment added.
}
}
@@ -409,6 +416,9 @@ abstract class Enqueuer {
void handleUnseenSelector(SourceString methodName, Selector selector) {
processInstanceMembers(methodName, (Element member) {
if (selector.appliesUnnamed(member, compiler)) {
+ if (member.isFunction() && selector.isGetter()) {
+ registerClosure(member, compiler.globalDependencies);
+ }
if (member.isField() && member.getEnclosingClass().isNative()) {
if (selector.isGetter() || selector.isCall()) {
nativeEnqueuer.registerFieldLoad(member);
@@ -519,12 +529,12 @@ abstract class Enqueuer {
}
void registerIsCheck(DartType type, TreeElements elements) {
+ type = universe.registerIsCheck(type, compiler);
// 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, elements);
}
@@ -542,6 +552,23 @@ abstract class Enqueuer {
compiler.backend.registerAsCheck(type, elements);
}
+ void registerGenericCallMethod(Element element, TreeElements elements) {
+ compiler.backend.registerGenericCallMethod(element, this, elements);
+ universe.genericCallMethods.add(element);
+ }
+
+ void registerClosure(Element element, TreeElements elements) {
karlklose 2013/06/19 14:37:05 'registerClosurizedMember'?
Johnni Winther 2013/06/21 12:19:15 Done.
+ if (element.computeType(compiler).containsTypeVariables) {
+ registerGenericClosure(element, elements);
+ }
+ universe.closurizedMembers.add(element);
+ }
+
+ void registerGenericClosure(Element element, TreeElements elements) {
karlklose 2013/06/19 14:37:05 'registerClosurizedGenericMember'?
Johnni Winther 2013/06/21 12:19:15 Done.
+ compiler.backend.registerGenericClosure(element, this, elements);
+ universe.closurizedGenericMembers.add(element);
+ }
+
void forEach(f(WorkItem work));
void forEachPostProcessTask(f(PostProcessTask work)) {}
@@ -636,7 +663,7 @@ class ResolutionEnqueuer extends Enqueuer {
// runtime type.
compiler.enabledRuntimeType = true;
// TODO(ahe): Record precise dependency here.
- compiler.backend.registerRuntimeType(compiler.globalDependencies);
+ compiler.backend.registerRuntimeType(this, compiler.globalDependencies);
} else if (element == compiler.functionApplyMethod) {
compiler.enabledFunctionApply = true;
} else if (element == compiler.invokeOnMethod) {

Powered by Google App Engine
This is Rietveld 408576698