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

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: Merged with r30954 Created 7 years 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 8e9d50615742e89fb4871c53f5868c93c9e61418..9475947540f1841c2f17f4f445dc151c1e3b968e 100644
--- a/dart/sdk/lib/_internal/compiler/implementation/universe/universe.dart
+++ b/dart/sdk/lib/_internal/compiler/implementation/universe/universe.dart
@@ -186,15 +186,27 @@ class Selector {
factory Selector.fromElement(Element element, Compiler compiler) {
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());
@@ -202,6 +214,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");
}
}
@@ -590,6 +605,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