| Index: pkg/compiler/lib/src/js_emitter/program_builder.dart
|
| diff --git a/pkg/compiler/lib/src/js_emitter/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder.dart
|
| index 11ff02ef40c173541dbc7b2b1adde6431f4eb175..b765870212b0777ec136baef7725d2f44a14f308 100644
|
| --- a/pkg/compiler/lib/src/js_emitter/program_builder.dart
|
| +++ b/pkg/compiler/lib/src/js_emitter/program_builder.dart
|
| @@ -24,8 +24,11 @@ import 'js_emitter.dart' show
|
| RuntimeTypeGenerator,
|
| TypeTestProperties;
|
|
|
| +import '../elements/elements.dart' show ParameterElement;
|
| +
|
| import '../universe/universe.dart' show Universe;
|
| import '../deferred_load.dart' show DeferredLoadTask, OutputUnit;
|
| +import '../constants/expressions.dart' show ConstantExpression, ConstantValue;
|
|
|
| part 'registry.dart';
|
|
|
| @@ -458,6 +461,26 @@ class ProgramBuilder {
|
| }
|
| }
|
|
|
| + /* Map | List */ _computeParameterDefaultValues(FunctionSignature signature) {
|
| + var /* Map | List */ optionalParameterDefaultValues;
|
| + if (signature.optionalParametersAreNamed) {
|
| + optionalParameterDefaultValues = new Map<String, ConstantValue>();
|
| + signature.forEachOptionalParameter((ParameterElement parameter) {
|
| + ConstantExpression def =
|
| + backend.constants.getConstantForVariable(parameter);
|
| + optionalParameterDefaultValues[parameter.name] = def.value;
|
| + });
|
| + } else {
|
| + optionalParameterDefaultValues = <ConstantValue>[];
|
| + signature.forEachOptionalParameter((ParameterElement parameter) {
|
| + ConstantExpression def =
|
| + backend.constants.getConstantForVariable(parameter);
|
| + optionalParameterDefaultValues.add(def.value);
|
| + });
|
| + }
|
| + return optionalParameterDefaultValues;
|
| + }
|
| +
|
| DartMethod _buildMethod(FunctionElement element) {
|
| String name = namer.getNameOfInstanceMember(element);
|
| js.Expression code = backend.generatedCode[element];
|
| @@ -518,11 +541,22 @@ class ProgramBuilder {
|
| memberType = element.type;
|
| }
|
|
|
| + int requiredParameterCount;
|
| + var /* List | Map */ optionalParameterDefaultValues;
|
| + if (canBeApplied || canBeReflected) {
|
| + FunctionSignature signature = element.functionSignature;
|
| + requiredParameterCount = signature.requiredParameterCount;
|
| + optionalParameterDefaultValues =
|
| + _computeParameterDefaultValues(signature);
|
| + }
|
| +
|
| return new InstanceMethod(element, name, code,
|
| _generateParameterStubs(element, canTearOff), callName, memberType,
|
| needsTearOff: canTearOff, tearOffName: tearOffName,
|
| isClosure: isClosure, aliasName: aliasName,
|
| - canBeApplied: canBeApplied, canBeReflected: canBeReflected);
|
| + canBeApplied: canBeApplied, canBeReflected: canBeReflected,
|
| + requiredParameterCount: requiredParameterCount,
|
| + optionalParameterDefaultValues: optionalParameterDefaultValues);
|
| }
|
|
|
| List<ParameterStubMethod> _generateParameterStubs(FunctionElement element,
|
| @@ -662,6 +696,15 @@ class ProgramBuilder {
|
| callName = namer.invocationName(callSelector);
|
| }
|
|
|
| + int requiredParameterCount;
|
| + var /* List | Map */ optionalParameterDefaultValues;
|
| + if (canBeApplied || canBeReflected) {
|
| + FunctionSignature signature = element.functionSignature;
|
| + requiredParameterCount = signature.requiredParameterCount;
|
| + optionalParameterDefaultValues =
|
| + _computeParameterDefaultValues(signature);
|
| + }
|
| +
|
| // TODO(floitsch): we shouldn't update the registry in the middle of
|
| // building a static method.
|
| return new StaticDartMethod(element,
|
| @@ -671,7 +714,10 @@ class ProgramBuilder {
|
| needsTearOff: needsTearOff,
|
| tearOffName: tearOffName,
|
| canBeApplied: canBeApplied,
|
| - canBeReflected: canBeReflected);
|
| + canBeReflected: canBeReflected,
|
| + requiredParameterCount: requiredParameterCount,
|
| + optionalParameterDefaultValues:
|
| + optionalParameterDefaultValues);
|
| }
|
|
|
| void _registerConstants(OutputUnit outputUnit,
|
|
|