1
0
mirror of https://github.com/dart-lang/sdk synced 2024-07-05 09:20:04 +00:00

[dart2wasm] Move type parameter bounds checks & parameter type check logic together with logic setting up variables

Change-Id: I47b8c1122f796b574281cfbd6f6f1049bdd0212b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/365221
Commit-Queue: Martin Kustermann <kustermann@google.com>
Reviewed-by: Slava Egorov <vegorov@google.com>
This commit is contained in:
Martin Kustermann 2024-05-02 12:44:30 +00:00 committed by Commit Queue
parent 74fbb380e2
commit 8ccb41284a
3 changed files with 28 additions and 60 deletions

View File

@ -580,8 +580,6 @@ class AsyncCodeGenerator extends CodeGenerator {
void generate() {
closures = Closures(translator, member);
setupParametersAndContexts(member.reference);
generateTypeChecks(member.function!.typeParameters, member.function!,
translator.paramInfoFor(reference));
_generateBodies(member.function!);
}

View File

@ -310,8 +310,21 @@ class CodeGenerator extends ExpressionVisitor1<w.ValueType, w.ValueType>
? member.enclosingClass.typeParameters
: member.function!.typeParameters;
for (int i = 0; i < typeParameters.length; i++) {
typeLocals[typeParameters[i]] = paramLocals[parameterOffset + i];
final typeParameter = typeParameters[i];
typeLocals[typeParameter] = paramLocals[parameterOffset + i];
}
if (!translator.options.omitImplicitTypeChecks) {
for (int i = 0; i < typeParameters.length; i++) {
final typeParameter = typeParameters[i];
if (typeParameter.isCovariantByClass &&
typeParameter.bound != translator.coreTypes.objectNullableRawType) {
_generateTypeArgumentBoundCheck(typeParameter.name!,
typeLocals[typeParameter]!, typeParameter.bound);
}
}
}
w.Local? tempLocalForType;
void setupParamLocal(
VariableDeclaration variable, int index, Constant? defaultValue) {
@ -332,6 +345,20 @@ class CodeGenerator extends ExpressionVisitor1<w.ValueType, w.ValueType>
b.local_set(local);
b.end();
}
if (!translator.options.omitImplicitTypeChecks) {
if (variable.isCovariantByClass || variable.isCovariantByDeclaration) {
final typeLocal = tempLocalForType ??= addLocal(
translator.classInfo[translator.typeClass]!.nonNullableType);
_generateArgumentTypeCheck(
variable.name!,
() => b.local_get(local),
() => types.makeType(this, variable.type),
local,
typeLocal,
);
}
}
}
List<VariableDeclaration> positional =
@ -485,52 +512,6 @@ class CodeGenerator extends ExpressionVisitor1<w.ValueType, w.ValueType>
return superclassFields.reversed.toList() + typeFields + orderedFieldLocals;
}
void generateTypeChecks(List<TypeParameter> typeParameters,
FunctionNode function, ParameterInfo paramInfo) {
if (translator.options.omitImplicitTypeChecks) {
return;
}
for (TypeParameter typeParameter in typeParameters) {
if (typeParameter.isCovariantByClass &&
typeParameter.bound != translator.coreTypes.objectNullableRawType) {
_generateTypeArgumentBoundCheck(typeParameter.name!,
typeLocals[typeParameter]!, typeParameter.bound);
}
}
// Local for the parameter type if any of the parameters need type checks
w.Local? parameterExpectedTypeLocal;
final int parameterOffset = thisLocal == null ? 0 : 1;
final int implicitParams = parameterOffset + paramInfo.typeParamCount;
void generateValueParameterCheck(VariableDeclaration variable, int index) {
if (!variable.isCovariantByClass && !variable.isCovariantByDeclaration) {
return;
}
final w.Local local = paramLocals[implicitParams + index];
final typeLocal = parameterExpectedTypeLocal ??=
addLocal(translator.classInfo[translator.typeClass]!.nonNullableType);
_generateArgumentTypeCheck(
variable.name!,
() => b.local_get(local),
() => types.makeType(this, variable.type),
local,
typeLocal,
);
}
final List<VariableDeclaration> positional = function.positionalParameters;
for (int i = 0; i < positional.length; i++) {
generateValueParameterCheck(positional[i], i);
}
final List<VariableDeclaration> named = function.namedParameters;
for (var param in named) {
generateValueParameterCheck(param, paramInfo.nameIndex[param.name]!);
}
}
List<w.Local> _getConstructorArgumentLocals(Reference target,
[reverse = false]) {
Constructor member = target.asConstructor;
@ -571,10 +552,6 @@ class CodeGenerator extends ExpressionVisitor1<w.ValueType, w.ValueType>
assert(member is! Constructor);
setupParametersAndContexts(member.reference);
final List<TypeParameter> typeParameters = member.function!.typeParameters;
generateTypeChecks(
typeParameters, member.function!, translator.paramInfoFor(reference));
Statement? body = member.function!.body;
if (body != null) {
visitStatement(body);
@ -590,11 +567,6 @@ class CodeGenerator extends ExpressionVisitor1<w.ValueType, w.ValueType>
void generateConstructorAllocator(Constructor member) {
setupParameters(member.reference);
final List<TypeParameter> typeParameters =
member.enclosingClass.typeParameters;
generateTypeChecks(
typeParameters, member.function, translator.paramInfoFor(reference));
w.FunctionType initializerMethodType =
translator.functions.getFunctionType(member.initializerReference);

View File

@ -209,8 +209,6 @@ class SyncStarCodeGenerator extends CodeGenerator {
void generate() {
closures = Closures(translator, member);
setupParametersAndContexts(member.reference);
generateTypeChecks(member.function!.typeParameters, member.function!,
translator.paramInfoFor(reference));
generateBodies(member.function!);
}