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

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: Fixed unit tests. 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..a526f409913b320c66d91abdf5a17716a0b5de3f 100644
--- a/dart/sdk/lib/_internal/compiler/implementation/universe/universe.dart
+++ b/dart/sdk/lib/_internal/compiler/implementation/universe/universe.dart
@@ -184,17 +184,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.
Johnni Winther 2013/12/05 11:49:56 How?
ahe 2013/12/06 15:57:54 I think I fixed that below :-)
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 +216,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 +607,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