Skip to content

Commit f9abd48

Browse files
osa1Commit Queue
authored and
Commit Queue
committed
[dart2wasm] Add type parameter defaults to runtime function types
New passing tests: - language/function/call_generic_test - language/generic/function_bounds_test/01 - language/generic/function_bounds_test/03 Fixes #50992 Change-Id: I4f5e94a939661f6afb4dd78d74c5f7b0ef129cc4 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/283022 Reviewed-by: Aske Simon Christensen <[email protected]> Commit-Queue: Ömer Ağacan <[email protected]>
1 parent 48219d6 commit f9abd48

File tree

4 files changed

+33
-5
lines changed

4 files changed

+33
-5
lines changed

pkg/dart2wasm/lib/class_info.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class FieldIndex {
3434
static const instantiationContextTypeArgumentsBase = 1;
3535
static const typeIsDeclaredNullable = 2;
3636
static const interfaceTypeTypeArguments = 4;
37-
static const functionTypeNamedParameters = 8;
37+
static const functionTypeNamedParameters = 9;
3838
static const recordTypeNames = 3;
3939
static const recordTypeFieldTypes = 4;
4040
static const typedListBaseLength = 2;

pkg/dart2wasm/lib/constants.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,8 @@ class ConstantCreator extends ConstantVisitor<ConstantInfo?> {
717717
int typeParameterOffset = types.computeFunctionTypeParameterOffset(type);
718718
ListConstant typeParameterBoundsConstant = constants
719719
.makeTypeList(type.typeParameters.map((p) => p.bound).toList());
720+
ListConstant typeParameterDefaultsConstant = constants
721+
.makeTypeList(type.typeParameters.map((p) => p.defaultType).toList());
720722
TypeLiteralConstant returnTypeConstant =
721723
TypeLiteralConstant(type.returnType);
722724
ListConstant positionalParametersConstant =
@@ -726,6 +728,7 @@ class ConstantCreator extends ConstantVisitor<ConstantInfo?> {
726728
ListConstant namedParametersConstant =
727729
constants.makeNamedParametersList(type);
728730
ensureConstant(typeParameterBoundsConstant);
731+
ensureConstant(typeParameterDefaultsConstant);
729732
ensureConstant(returnTypeConstant);
730733
ensureConstant(positionalParametersConstant);
731734
ensureConstant(requiredParameterCountConstant);
@@ -737,6 +740,8 @@ class ConstantCreator extends ConstantVisitor<ConstantInfo?> {
737740
b.i64_const(typeParameterOffset);
738741
constants.instantiateConstant(
739742
function, b, typeParameterBoundsConstant, types.typeListExpectedType);
743+
constants.instantiateConstant(function, b, typeParameterDefaultsConstant,
744+
types.typeListExpectedType);
740745
constants.instantiateConstant(
741746
function, b, returnTypeConstant, types.nonNullableTypeType);
742747
constants.instantiateConstant(function, b, positionalParametersConstant,

pkg/dart2wasm/lib/types.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,8 +385,18 @@ class Types {
385385
w.Instructions b = codeGen.b;
386386
b.i32_const(encodedNullability(type));
387387
b.i64_const(typeParameterOffset);
388+
389+
// List<_Type> typeParameterBounds
388390
_makeTypeList(codeGen, type.typeParameters.map((p) => p.bound).toList());
391+
392+
// List<_Type> typeParameterDefaults
393+
_makeTypeList(
394+
codeGen, type.typeParameters.map((p) => p.defaultType).toList());
395+
396+
// _Type returnType
389397
makeType(codeGen, type.returnType);
398+
399+
// List<_Type> positionalParameters
390400
if (type.positionalParameters.every(_isTypeConstant)) {
391401
translator.constants.instantiateConstant(
392402
codeGen.function,
@@ -396,7 +406,11 @@ class Types {
396406
} else {
397407
_makeTypeList(codeGen, type.positionalParameters);
398408
}
409+
410+
// int requiredParameterCount
399411
b.i64_const(type.requiredParameterCount);
412+
413+
// List<_NamedParameter> namedParameters
400414
if (type.namedParameters.every((n) => _isTypeConstant(n.type))) {
401415
translator.constants.instantiateConstant(
402416
codeGen.function,

sdk/lib/_internal/wasm/lib/type.dart

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@ class _FunctionType extends _Type {
316316
// representations that don't have this overhead in the common case.
317317
final int typeParameterOffset;
318318
final List<_Type> typeParameterBounds;
319+
final List<_Type> typeParameterDefaults;
319320
final _Type returnType;
320321
final List<_Type> positionalParameters;
321322
final int requiredParameterCount;
@@ -325,6 +326,7 @@ class _FunctionType extends _Type {
325326
const _FunctionType(
326327
this.typeParameterOffset,
327328
this.typeParameterBounds,
329+
this.typeParameterDefaults,
328330
this.returnType,
329331
this.positionalParameters,
330332
this.requiredParameterCount,
@@ -335,6 +337,7 @@ class _FunctionType extends _Type {
335337
_Type get _asNonNullable => _FunctionType(
336338
typeParameterOffset,
337339
typeParameterBounds,
340+
typeParameterDefaults,
338341
returnType,
339342
positionalParameters,
340343
requiredParameterCount,
@@ -345,6 +348,7 @@ class _FunctionType extends _Type {
345348
_Type get _asNullable => _FunctionType(
346349
typeParameterOffset,
347350
typeParameterBounds,
351+
typeParameterDefaults,
348352
returnType,
349353
positionalParameters,
350354
requiredParameterCount,
@@ -682,6 +686,12 @@ class _TypeUniverse {
682686
.map((type) =>
683687
substituteTypeArgument(type, substitutions, rootFunction))
684688
.toList(),
689+
isRoot
690+
? const []
691+
: functionType.typeParameterDefaults
692+
.map((type) =>
693+
substituteTypeArgument(type, substitutions, rootFunction))
694+
.toList(),
685695
substituteTypeArgument(
686696
functionType.returnType, substitutions, rootFunction),
687697
functionType.positionalParameters
@@ -1032,10 +1042,9 @@ bool _checkClosureShape(_FunctionType functionType, List<_Type> typeArguments,
10321042
List<Object?> positionalArguments, List<dynamic> namedArguments) {
10331043
// Check type args, add default types to the type list if its empty
10341044
if (typeArguments.isEmpty) {
1035-
// TODO(50992): Default values of type parameters are not available in
1036-
// runtime
1037-
typeArguments.addAll(functionType.typeParameterBounds);
1038-
} else if (typeArguments.length != functionType.typeParameterBounds.length) {
1045+
typeArguments.addAll(functionType.typeParameterDefaults);
1046+
} else if (typeArguments.length !=
1047+
functionType.typeParameterDefaults.length) {
10391048
return false;
10401049
}
10411050

0 commit comments

Comments
 (0)