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

Unified Diff: pkg/compiler/lib/src/js_emitter/program_builder.dart

Issue 928203003: Implement Function.apply in the new emitter. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Minor fix Created 5 years, 10 months 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: 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,
« no previous file with comments | « pkg/compiler/lib/src/js_emitter/new_emitter/model_emitter.dart ('k') | sdk/lib/_internal/compiler/js_lib/core_patch.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698