@@ -1109,7 +1109,7 @@ class Translator with KernelNodes {
11091109 compilationQueue.add (CompilationTask (
11101110 function,
11111111 _ClosureDynamicEntryGenerator (
1112- this , target, paramInfo, name, function)));
1112+ this , functionNode, target, paramInfo, name, function)));
11131113 return function;
11141114 }
11151115
@@ -2048,13 +2048,14 @@ class _ClosureTrampolineGenerator implements CodeGenerator {
20482048/// entries.
20492049class _ClosureDynamicEntryGenerator implements CodeGenerator {
20502050 final Translator translator;
2051+ final FunctionNode functionNode;
20512052 final w.BaseFunction target;
20522053 final ParameterInfo paramInfo;
20532054 final String name;
20542055 final w.FunctionBuilder function;
20552056
2056- _ClosureDynamicEntryGenerator (
2057- this .translator, this .target, this . paramInfo, this .name, this .function);
2057+ _ClosureDynamicEntryGenerator (this .translator, this .functionNode, this .target,
2058+ this .paramInfo, this .name, this .function);
20582059
20592060 @override
20602061 void generate (w.InstructionsBuilder b, List <w.Local > paramLocals,
@@ -2063,6 +2064,8 @@ class _ClosureDynamicEntryGenerator implements CodeGenerator {
20632064
20642065 final b = function.body;
20652066
2067+ final int typeCount = functionNode.typeParameters.length;
2068+
20662069 final closureLocal = function.locals[0 ];
20672070 final typeArgsListLocal = function.locals[1 ];
20682071 final posArgsListLocal = function.locals[2 ];
@@ -2096,7 +2099,7 @@ class _ClosureDynamicEntryGenerator implements CodeGenerator {
20962099 }
20972100
20982101 // Push type arguments
2099- for (int typeIdx = 0 ; typeIdx < paramInfo.typeParamCount ; typeIdx += 1 ) {
2102+ for (int typeIdx = 0 ; typeIdx < typeCount ; typeIdx += 1 ) {
21002103 b.local_get (typeArgsListLocal);
21012104 b.i32_const (typeIdx);
21022105 b.array_get (translator.typeArrayType);
@@ -2132,11 +2135,22 @@ class _ClosureDynamicEntryGenerator implements CodeGenerator {
21322135
21332136 // Push named arguments
21342137
2138+ Expression ? initializerForNamedParamInMember (String paramName) {
2139+ for (int i = 0 ; i < functionNode.namedParameters.length; i += 1 ) {
2140+ if (functionNode.namedParameters[i].name == paramName) {
2141+ return functionNode.namedParameters[i].initializer;
2142+ }
2143+ }
2144+ return null ;
2145+ }
2146+
21352147 final namedArgValueIndexLocal = b
21362148 .addLocal (translator.classInfo[translator.boxedIntClass]! .nullableType);
21372149
21382150 for (String paramName in paramInfo.names) {
21392151 final Constant ? paramInfoDefaultValue = paramInfo.named[paramName];
2152+ final Expression ? functionNodeDefaultValue =
2153+ initializerForNamedParamInMember (paramName);
21402154
21412155 // Get passed value
21422156 b.local_get (namedArgsListLocal);
@@ -2147,7 +2161,7 @@ class _ClosureDynamicEntryGenerator implements CodeGenerator {
21472161 translator.callReference (translator.getNamedParameterIndex.reference, b);
21482162 b.local_set (namedArgValueIndexLocal);
21492163
2150- if (paramInfoDefaultValue == null ) {
2164+ if (functionNodeDefaultValue == null && paramInfoDefaultValue == null ) {
21512165 // Shape check passed, parameter must be passed
21522166 b.local_get (namedArgsListLocal);
21532167 b.local_get (namedArgValueIndexLocal);
@@ -2163,8 +2177,20 @@ class _ClosureDynamicEntryGenerator implements CodeGenerator {
21632177 b.local_get (namedArgValueIndexLocal);
21642178 b.ref_is_null ();
21652179 b.if_ ([], [translator.topType]);
2166- translator.constants.instantiateConstant (
2167- b, paramInfoDefaultValue, translator.topType);
2180+ if (functionNodeDefaultValue != null ) {
2181+ // Used by the member, has a default value
2182+ translator.constants.instantiateConstant (
2183+ b,
2184+ (functionNodeDefaultValue as ConstantExpression ).constant,
2185+ translator.topType);
2186+ } else {
2187+ // Not used by the member
2188+ translator.constants.instantiateConstant (
2189+ b,
2190+ paramInfoDefaultValue! ,
2191+ translator.topType,
2192+ );
2193+ }
21682194 b.else_ (); // value index not null
21692195 b.local_get (namedArgsListLocal);
21702196 b.local_get (namedArgValueIndexLocal);
0 commit comments