From 8ccb41284ae2e1063fa9137b6225314284aa45d7 Mon Sep 17 00:00:00 2001 From: Martin Kustermann Date: Thu, 2 May 2024 12:44:30 +0000 Subject: [PATCH] [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 Reviewed-by: Slava Egorov --- pkg/dart2wasm/lib/async.dart | 2 - pkg/dart2wasm/lib/code_generator.dart | 84 +++++++++------------------ pkg/dart2wasm/lib/sync_star.dart | 2 - 3 files changed, 28 insertions(+), 60 deletions(-) diff --git a/pkg/dart2wasm/lib/async.dart b/pkg/dart2wasm/lib/async.dart index f424045f4c6..e741372bbfe 100644 --- a/pkg/dart2wasm/lib/async.dart +++ b/pkg/dart2wasm/lib/async.dart @@ -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!); } diff --git a/pkg/dart2wasm/lib/code_generator.dart b/pkg/dart2wasm/lib/code_generator.dart index 91084f5ba16..8c6b0ec6696 100644 --- a/pkg/dart2wasm/lib/code_generator.dart +++ b/pkg/dart2wasm/lib/code_generator.dart @@ -310,8 +310,21 @@ class CodeGenerator extends ExpressionVisitor1 ? 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 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 positional = @@ -485,52 +512,6 @@ class CodeGenerator extends ExpressionVisitor1 return superclassFields.reversed.toList() + typeFields + orderedFieldLocals; } - void generateTypeChecks(List 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 positional = function.positionalParameters; - for (int i = 0; i < positional.length; i++) { - generateValueParameterCheck(positional[i], i); - } - - final List named = function.namedParameters; - for (var param in named) { - generateValueParameterCheck(param, paramInfo.nameIndex[param.name]!); - } - } - List _getConstructorArgumentLocals(Reference target, [reverse = false]) { Constructor member = target.asConstructor; @@ -571,10 +552,6 @@ class CodeGenerator extends ExpressionVisitor1 assert(member is! Constructor); setupParametersAndContexts(member.reference); - final List 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 void generateConstructorAllocator(Constructor member) { setupParameters(member.reference); - final List typeParameters = - member.enclosingClass.typeParameters; - generateTypeChecks( - typeParameters, member.function, translator.paramInfoFor(reference)); - w.FunctionType initializerMethodType = translator.functions.getFunctionType(member.initializerReference); diff --git a/pkg/dart2wasm/lib/sync_star.dart b/pkg/dart2wasm/lib/sync_star.dart index 6232d10563f..257dc31dfd0 100644 --- a/pkg/dart2wasm/lib/sync_star.dart +++ b/pkg/dart2wasm/lib/sync_star.dart @@ -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!); }