mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 12:48:10 +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:
parent
74fbb380e2
commit
8ccb41284a
|
@ -580,8 +580,6 @@ class AsyncCodeGenerator extends CodeGenerator {
|
||||||
void generate() {
|
void generate() {
|
||||||
closures = Closures(translator, member);
|
closures = Closures(translator, member);
|
||||||
setupParametersAndContexts(member.reference);
|
setupParametersAndContexts(member.reference);
|
||||||
generateTypeChecks(member.function!.typeParameters, member.function!,
|
|
||||||
translator.paramInfoFor(reference));
|
|
||||||
_generateBodies(member.function!);
|
_generateBodies(member.function!);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -310,8 +310,21 @@ class CodeGenerator extends ExpressionVisitor1<w.ValueType, w.ValueType>
|
||||||
? member.enclosingClass.typeParameters
|
? member.enclosingClass.typeParameters
|
||||||
: member.function!.typeParameters;
|
: member.function!.typeParameters;
|
||||||
for (int i = 0; i < typeParameters.length; i++) {
|
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(
|
void setupParamLocal(
|
||||||
VariableDeclaration variable, int index, Constant? defaultValue) {
|
VariableDeclaration variable, int index, Constant? defaultValue) {
|
||||||
|
@ -332,6 +345,20 @@ class CodeGenerator extends ExpressionVisitor1<w.ValueType, w.ValueType>
|
||||||
b.local_set(local);
|
b.local_set(local);
|
||||||
b.end();
|
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 =
|
List<VariableDeclaration> positional =
|
||||||
|
@ -485,52 +512,6 @@ class CodeGenerator extends ExpressionVisitor1<w.ValueType, w.ValueType>
|
||||||
return superclassFields.reversed.toList() + typeFields + orderedFieldLocals;
|
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,
|
List<w.Local> _getConstructorArgumentLocals(Reference target,
|
||||||
[reverse = false]) {
|
[reverse = false]) {
|
||||||
Constructor member = target.asConstructor;
|
Constructor member = target.asConstructor;
|
||||||
|
@ -571,10 +552,6 @@ class CodeGenerator extends ExpressionVisitor1<w.ValueType, w.ValueType>
|
||||||
assert(member is! Constructor);
|
assert(member is! Constructor);
|
||||||
setupParametersAndContexts(member.reference);
|
setupParametersAndContexts(member.reference);
|
||||||
|
|
||||||
final List<TypeParameter> typeParameters = member.function!.typeParameters;
|
|
||||||
generateTypeChecks(
|
|
||||||
typeParameters, member.function!, translator.paramInfoFor(reference));
|
|
||||||
|
|
||||||
Statement? body = member.function!.body;
|
Statement? body = member.function!.body;
|
||||||
if (body != null) {
|
if (body != null) {
|
||||||
visitStatement(body);
|
visitStatement(body);
|
||||||
|
@ -590,11 +567,6 @@ class CodeGenerator extends ExpressionVisitor1<w.ValueType, w.ValueType>
|
||||||
void generateConstructorAllocator(Constructor member) {
|
void generateConstructorAllocator(Constructor member) {
|
||||||
setupParameters(member.reference);
|
setupParameters(member.reference);
|
||||||
|
|
||||||
final List<TypeParameter> typeParameters =
|
|
||||||
member.enclosingClass.typeParameters;
|
|
||||||
generateTypeChecks(
|
|
||||||
typeParameters, member.function, translator.paramInfoFor(reference));
|
|
||||||
|
|
||||||
w.FunctionType initializerMethodType =
|
w.FunctionType initializerMethodType =
|
||||||
translator.functions.getFunctionType(member.initializerReference);
|
translator.functions.getFunctionType(member.initializerReference);
|
||||||
|
|
||||||
|
|
|
@ -209,8 +209,6 @@ class SyncStarCodeGenerator extends CodeGenerator {
|
||||||
void generate() {
|
void generate() {
|
||||||
closures = Closures(translator, member);
|
closures = Closures(translator, member);
|
||||||
setupParametersAndContexts(member.reference);
|
setupParametersAndContexts(member.reference);
|
||||||
generateTypeChecks(member.function!.typeParameters, member.function!,
|
|
||||||
translator.paramInfoFor(reference));
|
|
||||||
generateBodies(member.function!);
|
generateBodies(member.function!);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue