Skip to content

Commit 18a44b3

Browse files
alexmarkovCommit Queue
authored andcommitted
[vm, dynamic_modules] Support required named parameters in function types
TEST=language/nnbd/subtyping/function_type_required_params_test Change-Id: I050f8fdd331985512f204b265d81c7deec0d67fe Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/415640 Commit-Queue: Alexander Markov <[email protected]> Reviewed-by: Slava Egorov <[email protected]>
1 parent fe5086d commit 18a44b3

File tree

7 files changed

+156
-87
lines changed

7 files changed

+156
-87
lines changed

pkg/dart2bytecode/docs/bytecode.md

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,8 @@ type FunctionType extends Type {
349349
UInt functionTypeFlags = (hasOptionalPositionalParams,
350350
hasOptionalNamedParams,
351351
hasTypeParams,
352-
hasEnclosingTypeParameters);
352+
hasEnclosingTypeParameters,
353+
hasParameterFlags);
353354
354355
if hasEnclosingTypeParameters
355356
UInt numEnclosingTypeParameters;
@@ -364,6 +365,11 @@ type FunctionType extends Type {
364365
365366
Type[] positionalParameters;
366367
NameAndType[] namedParameters;
368+
369+
if hasParameterFlags
370+
// For named parameters: (isRequired)
371+
List<UInt> parameterFlags;
372+
367373
PackedObject returnType;
368374
}
369375
@@ -569,7 +575,7 @@ type FunctionDeclaration {
569575
570576
NameAndType[numParameters] parameters;
571577
if hasParameterFlags
572-
// (isCovariant, isCovariantByClass, isFinal, isRequired)
578+
// For named parameters: (isRequired)
573579
List<UInt> parameterFlags;
574580
575581
PackedObject returnType;
@@ -599,7 +605,7 @@ type Code {
599605
hasDefaultFunctionTypeArgs, hasLocalVariables)
600606
601607
if hasParameterFlags
602-
// (isCovariant, isCovariantByClass, isFinal, isRequired)
608+
// For all parameters: (isCovariant, isCovariantByClass)
603609
List<UInt> flags;
604610
605611
if hasForwardingStubTarget
@@ -660,8 +666,8 @@ type ClosureDeclaration {
660666
NameAndType[numParameters] parameters;
661667
662668
if hasParameterFlags
663-
// (isCovariant, isCovariantByClass, isFinal, isRequired)
664-
List<UInt> flags;
669+
// For named parameters: (isRequired)
670+
List<UInt> parameterFlags;
665671
666672
PackedObject returnType;
667673
}

pkg/dart2bytecode/lib/bytecode_generator.dart

Lines changed: 10 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,12 @@ import 'generics.dart'
4141
import 'local_variable_table.dart' show LocalVariableTable;
4242
import 'local_vars.dart' show LocalVariables;
4343
import 'object_table.dart'
44-
show ObjectHandle, ObjectTable, NameAndType, topLevelClassName;
44+
show
45+
ObjectHandle,
46+
ObjectTable,
47+
NameAndType,
48+
ParameterFlags,
49+
topLevelClassName;
4550
import 'options.dart' show BytecodeOptions;
4651
import 'recognized_methods.dart' show RecognizedMethods;
4752
import 'source_positions.dart' show LineStarts, SourcePositions;
@@ -689,9 +694,8 @@ class BytecodeGenerator extends RecursiveVisitor {
689694
for (var param in function.namedParameters) {
690695
parameters.add(getParameterDeclaration(param));
691696
}
692-
// We only need the required flags when loading the function declaration.
693697
final parameterFlags =
694-
getParameterFlags(function, mask: ParameterDeclaration.isRequiredFlag);
698+
ParameterFlags.getFunctionFlags(function, isCode: false);
695699
if (parameterFlags != null) {
696700
flags |= FunctionDeclaration.hasParameterFlagsFlag;
697701
}
@@ -752,43 +756,6 @@ class BytecodeGenerator extends RecursiveVisitor {
752756
return new ParameterDeclaration(nameHandle, typeHandle);
753757
}
754758

755-
// Most uses of parameter flags in the VM only nee a subset of the flags,
756-
// so the optional [mask] argument allows the caller to specify the subset
757-
// that should be retained.
758-
List<int>? getParameterFlags(FunctionNode function, {int mask = -1}) {
759-
int getFlags(VariableDeclaration variable, int mask) {
760-
int flags = 0;
761-
if (variable.isCovariantByDeclaration) {
762-
flags |= ParameterDeclaration.isCovariantFlag;
763-
}
764-
if (variable.isCovariantByClass) {
765-
flags |= ParameterDeclaration.isCovariantByClassFlag;
766-
}
767-
if (variable.isFinal) {
768-
flags |= ParameterDeclaration.isFinalFlag;
769-
}
770-
if (variable.isRequired) {
771-
flags |= ParameterDeclaration.isRequiredFlag;
772-
}
773-
return flags & mask;
774-
}
775-
776-
final List<int> paramFlags = <int>[];
777-
for (var param in function.positionalParameters) {
778-
paramFlags.add(getFlags(param, mask));
779-
}
780-
for (var param in function.namedParameters) {
781-
paramFlags.add(getFlags(param, mask));
782-
}
783-
784-
for (int flags in paramFlags) {
785-
if (flags != 0) {
786-
return paramFlags;
787-
}
788-
}
789-
return null;
790-
}
791-
792759
@override
793760
void defaultMember(Member node) {
794761
final bool hasCode = _hasCode(node);
@@ -1774,16 +1741,12 @@ class BytecodeGenerator extends RecursiveVisitor {
17741741
int? forwardingStubTargetCpIndex = null;
17751742
int? defaultFunctionTypeArgsCpIndex = null;
17761743

1777-
// We don't need the required flag when loading the code, but do need
1778-
// all other parameter flags.
1779-
final parameterFlagMask = ~ParameterDeclaration.isRequiredFlag;
1780-
17811744
if (node is Constructor) {
17821745
parameterFlags =
1783-
getParameterFlags(node.function, mask: parameterFlagMask);
1746+
ParameterFlags.getFunctionFlags(node.function, isCode: true);
17841747
} else if (node is Procedure) {
17851748
parameterFlags =
1786-
getParameterFlags(node.function, mask: parameterFlagMask);
1749+
ParameterFlags.getFunctionFlags(node.function, isCode: true);
17871750

17881751
if (node.isForwardingStub) {
17891752
forwardingStubTargetCpIndex = cp.addObjectRef(node.stubTarget);
@@ -2496,9 +2459,8 @@ class BytecodeGenerator extends RecursiveVisitor {
24962459
typeParameters = getTypeParametersDeclaration(function.typeParameters);
24972460
}
24982461

2499-
// We only need the required flags when loading the closure declaration.
25002462
final parameterFlags =
2501-
getParameterFlags(function, mask: ParameterDeclaration.isRequiredFlag);
2463+
ParameterFlags.getFunctionFlags(function, isCode: false);
25022464
if (parameterFlags != null) {
25032465
flags |= ClosureDeclaration.hasParameterFlagsFlag;
25042466
}

pkg/dart2bytecode/lib/declarations.dart

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,12 @@ import 'disassembler.dart' show BytecodeDisassembler;
1919
import 'exceptions.dart' show ExceptionsTable;
2020
import 'local_variable_table.dart' show LocalVariableTable;
2121
import 'object_table.dart'
22-
show ObjectTable, ObjectHandle, NameAndType, TypeParameterDeclaration;
22+
show
23+
ObjectTable,
24+
ObjectHandle,
25+
NameAndType,
26+
ParameterFlags,
27+
TypeParameterDeclaration;
2328
import 'source_positions.dart' show LineStarts, SourcePositions;
2429

2530
class LibraryDeclaration extends BytecodeDeclaration {
@@ -505,7 +510,7 @@ class FunctionDeclaration {
505510
final TypeParametersDeclaration? typeParameters;
506511
final int numRequiredParameters;
507512
final List<ParameterDeclaration> parameters;
508-
// Only contains the required flag for parameters when present.
513+
// Only contains the required flag for named parameters when present.
509514
final List<int>? parameterFlags;
510515
final ObjectHandle returnType;
511516
final ObjectHandle? nativeName;
@@ -745,12 +750,6 @@ class TypeParametersDeclaration {
745750
}
746751

747752
class ParameterDeclaration {
748-
// Parameter flags are written separately (in Code).
749-
static const isCovariantFlag = 1 << 0;
750-
static const isCovariantByClassFlag = 1 << 1;
751-
static const isFinalFlag = 1 << 2;
752-
static const isRequiredFlag = 1 << 3;
753-
754753
final ObjectHandle name;
755754
final ObjectHandle type;
756755

@@ -788,8 +787,7 @@ class Code extends BytecodeDeclaration {
788787
final LocalVariableTable? localVariables;
789788
final List<ObjectHandle> nullableFields;
790789
final List<ClosureDeclaration> closures;
791-
// Contains all parameter flags except for the required flags, which are
792-
// kept instead in the FunctionDeclaration and ClosureDeclaration.
790+
// Covariant and CovariantByClass flags for all parameters.
793791
final List<int>? parameterFlags;
794792
final int? forwardingStubTargetCpIndex;
795793
final int? defaultFunctionTypeArgsCpIndex;
@@ -953,7 +951,7 @@ class ClosureDeclaration {
953951
final int numRequiredParams;
954952
final int numNamedParams;
955953
final List<NameAndType> parameters;
956-
// Only contains the required flag for parameters when present.
954+
// Only contains the required flag for named parameters when present.
957955
final List<int>? parameterFlags;
958956
final ObjectHandle returnType;
959957
ClosureCode? code;
@@ -1061,7 +1059,7 @@ class ClosureDeclaration {
10611059
sb.write(', ');
10621060
}
10631061
// We only store the required flag for ClosureDeclarations.
1064-
if (flags != null && flags[i] != 0) {
1062+
if (flags != null && (flags[i] & ParameterFlags.isRequiredFlag) != 0) {
10651063
sb.write('required ');
10661064
}
10671065
sb.write(params[i]);
@@ -1088,21 +1086,14 @@ class ClosureDeclaration {
10881086
sb.write(' type-params $typeParameters');
10891087
}
10901088
sb.write(' (');
1091-
final requiredFlags = (flags & hasParameterFlagsFlag) != 0
1092-
? parameterFlags!.sublist(0, numRequiredParams)
1093-
: null;
1094-
_writeParamsToBuffer(
1095-
sb, parameters.sublist(0, numRequiredParams), requiredFlags);
1089+
_writeParamsToBuffer(sb, parameters.sublist(0, numRequiredParams), null);
10961090
if (numRequiredParams != parameters.length) {
10971091
if (numRequiredParams > 0) {
10981092
sb.write(', ');
10991093
}
11001094
sb.write(numNamedParams > 0 ? '{ ' : '[ ');
1101-
final optionalFlags = (flags & hasParameterFlagsFlag) != 0
1102-
? parameterFlags!.sublist(numRequiredParams)
1103-
: null;
11041095
_writeParamsToBuffer(
1105-
sb, parameters.sublist(numRequiredParams), optionalFlags);
1096+
sb, parameters.sublist(numRequiredParams), parameterFlags);
11061097
sb.write(numNamedParams > 0 ? ' }' : ' ]');
11071098
}
11081099
sb.write(') -> ');

0 commit comments

Comments
 (0)