Chromium Code Reviews| Index: dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
| diff --git a/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
| index ad1a2fe8e92d8043d34c85eab0b5cc8af693aeb9..9c9759fef4513cdf1f801ed7312450265cadbb56 100644 |
| --- a/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
| +++ b/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
| @@ -1143,11 +1143,14 @@ class CodeEmitterTask extends CompilerTask { |
| // possible stubs for this closure. |
| FunctionSignature signature = member.computeSignature(compiler); |
| Set<Selector> selectors = signature.optionalParametersAreNamed |
| - ? computeNamedSelectors(signature, member) |
| + ? computeNamedSelectors(member) |
|
ngeoffray
2013/07/24 17:40:16
computeNamedSelectors -> computeSeenNamedSelectors
ahe
2013/07/25 08:51:14
Done.
|
| : computeOptionalSelectors(signature, member); |
| for (Selector selector in selectors) { |
| addParameterStub(member, selector, defineStub, generatedStubNames); |
| } |
| + if (signature.optionalParametersAreNamed) { |
| + addCatchAllParameterStub(member, signature, defineStub); |
| + } |
| } else { |
| Set<Selector> selectors = compiler.codegenWorld.invokedNames[member.name]; |
| if (selectors == null) return; |
| @@ -1158,37 +1161,36 @@ class CodeEmitterTask extends CompilerTask { |
| } |
| } |
| - /** |
| - * Compute the set of possible selectors in the presence of named |
| - * parameters. |
| - */ |
| - Set<Selector> computeNamedSelectors(FunctionSignature signature, |
| - FunctionElement element) { |
| - Set<Selector> selectors = new Set<Selector>(); |
| - // Add the selector that does not have any optional argument. |
| - selectors.add(new Selector(SelectorKind.CALL, |
| - element.name, |
| - element.getLibrary(), |
| - signature.requiredParameterCount, |
| - <SourceString>[])); |
| + Set<Selector> computeNamedSelectors(FunctionElement element) { |
| + Set<Selector> selectors = compiler.codegenWorld.invokedNames[element.name]; |
| + if (selectors == null) return null; |
| + Set<Selector> result = new Set<Selector>(); |
| + for (Selector selector in selectors) { |
| + if (!selector.applies(element, compiler)) continue; |
| + result.add(selector); |
| + } |
| + return result; |
| + } |
| - // For each optional parameter, we iterator over the set of |
| - // already computed selectors and create new selectors with that |
| - // parameter now being passed. |
| - signature.forEachOptionalParameter((Element element) { |
| - Set<Selector> newSet = new Set<Selector>(); |
| - selectors.forEach((Selector other) { |
| - List<SourceString> namedArguments = [element.name]; |
| - namedArguments.addAll(other.namedArguments); |
| - newSet.add(new Selector(other.kind, |
| - other.name, |
| - other.library, |
| - other.argumentCount + 1, |
| - namedArguments)); |
| - }); |
| - selectors.addAll(newSet); |
| - }); |
| - return selectors; |
| + void addCatchAllParameterStub(FunctionElement member, |
| + FunctionSignature signature, |
| + DefineStubFunction defineStub) { |
| + // See Primities.applyFunction in js_helper.dart for details. |
| + var properties = []; |
|
ngeoffray
2013/07/24 17:40:16
List<jsAst.Node> properties = <jsAst.Node>[]
ahe
2013/07/25 08:51:14
Done.
|
| + for (Element element in signature.orderedOptionalParameters) { |
| + String jsName = backend.namer.safeName(element.name.slowToString()); |
| + Constant value = compiler.constantHandler.initialVariableValues[element]; |
| + jsAst.Expression reference = null; |
| + if (value == null) { |
| + reference = new jsAst.LiteralNull(); |
| + } else { |
| + reference = constantReference(value); |
| + } |
| + properties.add(new jsAst.Property(js.string(jsName), reference)); |
| + } |
| + defineStub( |
| + r'call$catchAll', |
|
ngeoffray
2013/07/24 17:40:16
You could also use the namer for that, similar to
ahe
2013/07/25 08:51:14
Added todo.
|
| + js.fun([], js.return_(new jsAst.ObjectInitializer(properties)))); |
| } |
| /** |