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

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

Issue 27524003: Generate tear-off closures dynamically. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 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: dart/sdk/lib/_internal/compiler/implementation/universe/universe.dart
diff --git a/dart/sdk/lib/_internal/compiler/implementation/universe/universe.dart b/dart/sdk/lib/_internal/compiler/implementation/universe/universe.dart
index 73bbb9f579f424c1906d6619ae487cc0120c2af4..68a2a3ea2e0964aa704d137d66185e24b31c7911 100644
--- a/dart/sdk/lib/_internal/compiler/implementation/universe/universe.dart
+++ b/dart/sdk/lib/_internal/compiler/implementation/universe/universe.dart
@@ -192,17 +192,31 @@ class Selector {
}
factory Selector.fromElement(Element element, Compiler compiler) {
+ // TODO(ahe): This method doesn't work as one might expect if there are
+ // optional arguments.
String name = element.name;
if (element.isFunction()) {
- int arity = element.asFunctionElement().requiredParameterCount(compiler);
if (name == '[]') {
return new Selector.index();
} else if (name == '[]=') {
return new Selector.indexSet();
- } else if (Elements.operatorNameToIdentifier(name) != name) {
- return new Selector(SelectorKind.OPERATOR, name, null, arity);
+ }
+ FunctionSignature signature =
+ element.asFunctionElement().computeSignature(compiler);
+ int arity = signature.parameterCount;
+ List<String> namedArguments = null;
+ if (signature.optionalParametersAreNamed) {
+ namedArguments =
+ signature.orderedOptionalParameters.map((e) => e.name).toList();
+ }
+ if (Elements.operatorNameToIdentifier(name) != name) {
+ // Operators cannot have named arguments, however, that doesn't prevent
+ // a user from declaring such an operator.
+ return new Selector(
+ SelectorKind.OPERATOR, name, null, arity, namedArguments);
} else {
- return new Selector.call(name, element.getLibrary(), arity);
+ return new Selector.call(
+ name, element.getLibrary(), arity, namedArguments);
}
} else if (element.isSetter()) {
return new Selector.setter(name, element.getLibrary());
@@ -210,6 +224,9 @@ class Selector {
return new Selector.getter(name, element.getLibrary());
} else if (element.isField()) {
return new Selector.getter(name, element.getLibrary());
+ } else {
+ throw new SpannableAssertionFailure(
+ element, "Can't get selector from $element");
}
}
@@ -599,6 +616,8 @@ class Selector {
Selector extendIfReachesAll(Compiler compiler) {
return new TypedSelector(compiler.typesTask.dynamicType, this);
}
+
+ Selector toCallSelector() => new Selector.callClosureFrom(this);
}
class TypedSelector extends Selector {

Powered by Google App Engine
This is Rietveld 408576698