Chromium Code Reviews| 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 4891f82539d21174cd5ed519dc1bcb6444559fb6..78ca1b2fd0aafbe094a98e6a5c37644b71727bb3 100644 |
| --- a/pkg/compiler/lib/src/js_emitter/program_builder.dart |
| +++ b/pkg/compiler/lib/src/js_emitter/program_builder.dart |
| @@ -504,6 +504,8 @@ class ProgramBuilder { |
| ? namer.getNameOfAliasedSuperMember(element) |
| : null; |
| + js.Expression functionType; |
|
floitsch
2015/02/20 11:00:11
Declare the variable closer to its use.
zarah
2015/02/20 12:59:32
Done.
|
| + |
| if (isNotApplyTarget) { |
| canTearOff = false; |
| } else { |
| @@ -544,6 +546,10 @@ class ProgramBuilder { |
| memberType = element.type; |
| } |
| + if (canTearOff || canBeReflected) { |
| + functionType = _generateFunctionType(memberType); |
| + } |
| + |
| int requiredParameterCount; |
| var /* List | Map */ optionalParameterDefaultValues; |
| if (canBeApplied || canBeReflected) { |
| @@ -559,7 +565,17 @@ class ProgramBuilder { |
| isClosure: isClosure, aliasName: aliasName, |
| canBeApplied: canBeApplied, canBeReflected: canBeReflected, |
| requiredParameterCount: requiredParameterCount, |
| - optionalParameterDefaultValues: optionalParameterDefaultValues); |
| + optionalParameterDefaultValues: optionalParameterDefaultValues, |
| + functionType: functionType); |
| + } |
| + |
| + js.Expression _generateFunctionType(DartType type) { |
| + if (type.containsTypeVariables) { |
| + js.Expression thisAccess = js.js(r'this.$receiver'); |
| + return backend.rti.getSignatureEncoding(type, thisAccess); |
| + } else { |
| + return js.number(backend.emitter.metadataCollector.reifyType(type)); |
| + } |
| } |
| List<ParameterStubMethod> _generateParameterStubs(FunctionElement element, |
| @@ -692,6 +708,8 @@ class ProgramBuilder { |
| String tearOffName = |
| needsTearOff ? namer.getStaticClosureName(element) : null; |
| + js.Expression functionType; |
| + |
| String callName = null; |
| if (needsTearOff) { |
| Selector callSelector = |
| @@ -699,6 +717,11 @@ class ProgramBuilder { |
| callName = namer.invocationName(callSelector); |
| } |
| + DartType type = element.type; |
| + if (needsTearOff || canBeReflected) { |
| + functionType = _generateFunctionType(type); |
| + } |
| + |
| int requiredParameterCount; |
| var /* List | Map */ optionalParameterDefaultValues; |
| if (canBeApplied || canBeReflected) { |
| @@ -713,14 +736,15 @@ class ProgramBuilder { |
| return new StaticDartMethod(element, |
| name, _registry.registerHolder(holder), code, |
| _generateParameterStubs(element, needsTearOff), |
| - callName, element.type, |
| + callName, type, |
| needsTearOff: needsTearOff, |
| tearOffName: tearOffName, |
| canBeApplied: canBeApplied, |
| canBeReflected: canBeReflected, |
| requiredParameterCount: requiredParameterCount, |
| optionalParameterDefaultValues: |
| - optionalParameterDefaultValues); |
| + optionalParameterDefaultValues, |
| + functionType: functionType); |
| } |
| void _registerConstants(OutputUnit outputUnit, |