Skip to content

Commit

Permalink
Version 3.4.0-4.0.dev
Browse files Browse the repository at this point in the history
Merge 3343b7a into dev
  • Loading branch information
Dart CI committed Jan 5, 2024
2 parents ddd240c + 3343b7a commit e8aa66f
Show file tree
Hide file tree
Showing 22 changed files with 421 additions and 213 deletions.
2 changes: 1 addition & 1 deletion DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ vars = {

# co19 is a cipd package automatically generated for each co19 commit.
# Use tests/co19/update.sh to update this hash.
"co19_rev": "89ec72cfbf8de66ce8190433d6bcdfdaf3599e23",
"co19_rev": "cd23849a5bf84a73466b5107e23bb04cf3d9b38a",

# The internal benchmarks to use. See go/dart-benchmarks-internal
"benchmarks_internal_rev": "f048a4a853e3062056d39c3db100acdde42f16d6",
Expand Down
79 changes: 59 additions & 20 deletions pkg/dart2wasm/lib/code_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1778,7 +1778,42 @@ class CodeGenerator extends ExpressionVisitor1<w.ValueType, w.ValueType>
_lookupSuperTarget(node.interfaceTarget, setter: false).reference;
w.FunctionType targetFunctionType =
translator.functions.getFunctionType(target);
w.ValueType receiverType = targetFunctionType.inputs.first;
w.ValueType receiverType = targetFunctionType.inputs[0];

// When calling `==` and the argument is potentially nullable, check if the
// argument is `null`.
if (node.name.text == '==') {
assert(node.arguments.positional.length == 1);
assert(node.arguments.named.isEmpty);
final argument = node.arguments.positional[0];
if (dartTypeOf(argument).isPotentiallyNullable) {
w.Label resultBlock = b.block(const [], const [w.NumType.i32]);

w.ValueType argumentType = targetFunctionType.inputs[1];
// `==` arguments are non-nullable.
assert(argumentType.nullable == false);

final argumentNullBlock = b.block(const [], const []);

visitThis(receiverType);
wrap(argument, argumentType.withNullability(true));
b.br_on_null(argumentNullBlock);

final resultType = translator.outputOrVoid(call(target));
// `super ==` should return bool.
assert(resultType == w.NumType.i32);
b.br(resultBlock);

b.end(); // argumentNullBlock

b.i32_const(0); // false
b.br(resultBlock);

b.end(); // resultBlock
return w.NumType.i32;
}
}

visitThis(receiverType);
_visitArguments(node.arguments, target, 1);
return translator.outputOrVoid(call(target));
Expand Down Expand Up @@ -1873,12 +1908,11 @@ class CodeGenerator extends ExpressionVisitor1<w.ValueType, w.ValueType>
b.local_set(typeArgsLocal);

// Evaluate positional arguments
makeList(DynamicType(), positionalArguments.length,
final positionalArgsLocal = function.addLocal(makeArray(
translator.nullableObjectArrayType, positionalArguments.length,
(elementType, elementIdx) {
wrap(positionalArguments[elementIdx], elementType);
}, isGrowable: false);
final positionalArgsLocal = function.addLocal(
translator.classInfo[translator.fixedLengthListClass]!.nonNullableType);
}));
b.local_set(positionalArgsLocal);

// Evaluate named arguments. The arguments need to be evaluated in the
Expand All @@ -1894,9 +1928,10 @@ class CodeGenerator extends ExpressionVisitor1<w.ValueType, w.ValueType>
}
namedArgumentLocals.sort((e1, e2) => e1.key.compareTo(e2.key));

// Create named argument list
makeList(DynamicType(), namedArguments.length * 2,
(elementType, elementIdx) {
// Create named argument array
final namedArgsLocal = function.addLocal(
makeArray(translator.nullableObjectArrayType, namedArguments.length * 2,
(elementType, elementIdx) {
if (elementIdx % 2 == 0) {
final name = namedArgumentLocals[elementIdx ~/ 2].key;
final w.ValueType symbolValueType =
Expand All @@ -1907,9 +1942,7 @@ class CodeGenerator extends ExpressionVisitor1<w.ValueType, w.ValueType>
final local = namedArgumentLocals[elementIdx ~/ 2].value;
b.local_get(local);
}
}, isGrowable: false);
final namedArgsLocal = function.addLocal(
translator.classInfo[translator.fixedLengthListClass]!.nonNullableType);
}));
b.local_set(namedArgsLocal);

final nullBlock = b.block([], [translator.topInfo.nonNullableType]);
Expand Down Expand Up @@ -2938,14 +2971,18 @@ class CodeGenerator extends ExpressionVisitor1<w.ValueType, w.ValueType>

w.ValueType makeArrayFromExpressions(
List<Expression> expressions, InterfaceType elementType) {
return translator.makeArray(
function,
translator.arrayTypeForDartType(elementType),
expressions.length, (w.ValueType elementType, int i) {
wrap(expressions[i], elementType);
return makeArray(
translator.arrayTypeForDartType(elementType), expressions.length,
(w.ValueType type, int i) {
wrap(expressions[i], type);
});
}

w.ValueType makeArray(w.ArrayType arrayType, int length,
void Function(w.ValueType, int) generateItem) {
return translator.makeArray(function, arrayType, length, generateItem);
}

@override
w.ValueType visitMapLiteral(MapLiteral node, w.ValueType expectedType) {
types.makeType(this, node.keyType);
Expand Down Expand Up @@ -3421,7 +3458,8 @@ class CodeGenerator extends ExpressionVisitor1<w.ValueType, w.ValueType>
param.name!,
() {
b.local_get(positionalArgsLocal);
translator.indexList(b, (b) => b.i32_const(positionalParamIdx));
b.i32_const(positionalParamIdx);
b.array_get(translator.nullableObjectArrayType);
},
() {
types.makeType(this, param.type);
Expand Down Expand Up @@ -3455,8 +3493,8 @@ class CodeGenerator extends ExpressionVisitor1<w.ValueType, w.ValueType>
param.name!,
() {
b.local_get(namedArgsLocal);
translator.indexList(b,
(b) => b.i32_const(mapNamedParameterToArrayIndex(param.name!)));
b.i32_const(mapNamedParameterToArrayIndex(param.name!));
b.array_get(translator.nullableObjectArrayType);
},
() {
types.makeType(this, param.type);
Expand Down Expand Up @@ -3484,7 +3522,8 @@ class CodeGenerator extends ExpressionVisitor1<w.ValueType, w.ValueType>

void pushArgument(w.Local listLocal, int listIdx, int wasmInputIdx) {
b.local_get(listLocal);
translator.indexList(b, (b) => b.i32_const(listIdx));
b.i32_const(listIdx);
b.array_get(translator.nullableObjectArrayType);
translator.convertType(function, translator.topInfo.nullableType,
memberWasmInputs[wasmInputIdx]);
}
Expand Down
119 changes: 50 additions & 69 deletions pkg/dart2wasm/lib/dynamic_forwarders.dart
Original file line number Diff line number Diff line change
Expand Up @@ -201,8 +201,8 @@ class Forwarder {

final receiverLocal = function.locals[0]; // ref #Top
final typeArgsLocal = function.locals[1]; // ref _ListBase
final positionalArgsLocal = function.locals[2]; // ref _ListBase
final namedArgsLocal = function.locals[3]; // ref _ListBase
final positionalArgsLocal = function.locals[2]; // ref WasmArray
final namedArgsLocal = function.locals[3]; // ref WasmArray

final classIdLocal = function.addLocal(w.NumType.i32);

Expand Down Expand Up @@ -302,7 +302,7 @@ class Forwarder {
// positionalArgs.length >= nRequired &&
// positionalArgs.length <= nTotal
b.local_get(positionalArgsLocal);
translator.getListLength(b);
b.array_len();
b.local_tee(numArgsLocal);
b.i32_const(nRequired);
b.i32_ge_u();
Expand All @@ -316,9 +316,10 @@ class Forwarder {
// Add default values of optional positional parameters if needed
w.Local? adjustedPositionalArgsLocal;
if (nRequired != nTotal) {
adjustedPositionalArgsLocal = function.addLocal(translator
.classInfo[translator.growableListClass]!.nonNullableType);
_makeEmptyGrowableList(translator, function, nTotal);
adjustedPositionalArgsLocal =
function.addLocal(translator.nullableObjectArrayTypeRef);
b.i32_const(nTotal);
b.array_new_default(translator.nullableObjectArrayType);
b.local_set(adjustedPositionalArgsLocal);

// Copy passed arguments
Expand All @@ -332,11 +333,11 @@ class Forwarder {
b.i32_lt_u();
b.if_();
b.local_get(adjustedPositionalArgsLocal);
b.local_get(argIdxLocal);
b.local_get(positionalArgsLocal);
translator.indexList(b, (b) => b.local_get(argIdxLocal));
b.call(translator.functions
.getFunction(translator.growableListAdd.reference));
b.drop();
b.local_get(argIdxLocal);
b.array_get(translator.nullableObjectArrayType);
b.array_set(translator.nullableObjectArrayType);
b.local_get(argIdxLocal);
b.i32_const(1);
b.i32_add();
Expand All @@ -353,17 +354,14 @@ class Forwarder {
b.i32_const(optionalParamIdx);
b.i32_le_u();
b.if_();
b.local_get(adjustedPositionalArgsLocal);

final param = targetMemberParamInfo.positional[optionalParamIdx]!;

b.local_get(adjustedPositionalArgsLocal);
b.i32_const(optionalParamIdx);
translator.constants.instantiateConstant(
function, b, param, translator.topInfo.nullableType);

b.call(translator.functions
.getFunction(translator.growableListAdd.reference));
b.drop();

b.array_set(translator.nullableObjectArrayType);
b.end();
}
}
Expand All @@ -375,23 +373,23 @@ class Forwarder {
if (targetMemberParamInfo.named.isEmpty) {
// namedArgs.length == 0
b.local_get(namedArgsLocal);
translator.getListLength(b);
b.array_len();
b.i32_eqz();
b.i32_eqz();
b.br_if(noSuchMethodBlock);
} else {
adjustedNamedArgsLocal = function.addLocal(translator
.classInfo[translator.growableListClass]!.nonNullableType);
_makeEmptyGrowableList(
translator, function, targetMemberParamInfo.named.length);
adjustedNamedArgsLocal =
function.addLocal(translator.nullableObjectArrayTypeRef);
b.i32_const(targetMemberParamInfo.named.length);
b.array_new_default(translator.nullableObjectArrayType);
b.local_set(adjustedNamedArgsLocal);

final namedParameterIdxLocal = function.addLocal(
translator.classInfo[translator.boxedIntClass]!.nullableType);

final remainingNamedArgsLocal = numArgsLocal;
b.local_get(namedArgsLocal);
translator.getListLength(b);
b.array_len();
b.i32_const(1);
b.i32_shr_u();
b.local_set(remainingNamedArgsLocal);
Expand All @@ -409,7 +407,10 @@ class Forwarder {
return null;
}

for (final name in targetMemberParamInfo.names) {
for (int nameIdx = 0;
nameIdx < targetMemberParamInfo.names.length;
++nameIdx) {
final String name = targetMemberParamInfo.names[nameIdx];
final Constant? paramInfoDefaultValue =
targetMemberParamInfo.named[name]!;
final Expression? functionNodeDefaultValue =
Expand Down Expand Up @@ -441,23 +442,27 @@ class Forwarder {
paramInfoDefaultValue == null) {
// Required parameter missing
b.br_if(noSuchMethodBlock);

// Copy provided named parameter.

b.local_get(adjustedNamedArgsLocal);
b.i32_const(nameIdx);

b.local_get(namedArgsLocal);
translator.indexList(b, (b) {
b.local_get(namedParameterIdxLocal);
translator.convertType(
function, namedParameterIdxLocal.type, w.NumType.i64);
b.i32_wrap_i64();
});
b.call(translator.functions
.getFunction(translator.growableListAdd.reference));
b.drop();
b.local_get(namedParameterIdxLocal);
translator.convertType(
function, namedParameterIdxLocal.type, w.NumType.i64);
b.i32_wrap_i64();
b.array_get(translator.nullableObjectArrayType);

b.array_set(translator.nullableObjectArrayType);
} else {
// Optional, either has a default in the member or not used by
// the member
b.if_();

b.local_get(adjustedNamedArgsLocal);
b.i32_const(nameIdx);

if (functionNodeDefaultValue != null) {
// Used by the member, has a default value
Expand All @@ -475,24 +480,19 @@ class Forwarder {
translator.topInfo.nullableType,
);
}

b.call(translator.functions
.getFunction(translator.growableListAdd.reference));
b.drop();
b.array_set(translator.nullableObjectArrayType);

b.else_();

b.local_get(adjustedNamedArgsLocal);
b.i32_const(nameIdx);
b.local_get(namedArgsLocal);
translator.indexList(b, (b) {
b.local_get(namedParameterIdxLocal);
translator.convertType(
function, namedParameterIdxLocal.type, w.NumType.i64);
b.i32_wrap_i64();
});
b.call(translator.functions
.getFunction(translator.growableListAdd.reference));
b.drop();
b.local_get(namedParameterIdxLocal);
translator.convertType(
function, namedParameterIdxLocal.type, w.NumType.i64);
b.i32_wrap_i64();
b.array_get(translator.nullableObjectArrayType);
b.array_set(translator.nullableObjectArrayType);

b.end();
}
Expand Down Expand Up @@ -676,8 +676,8 @@ void generateDynamicFunctionCall(
final listArgumentType =
translator.classInfo[translator.listBaseClass]!.nonNullableType;
assert(typeArgsLocal.type == listArgumentType);
assert(posArgsLocal.type == listArgumentType);
assert(namedArgsLocal.type == listArgumentType);
assert(posArgsLocal.type == translator.nullableObjectArrayTypeRef);
assert(namedArgsLocal.type == translator.nullableObjectArrayTypeRef);

final b = function.body;

Expand Down Expand Up @@ -744,9 +744,11 @@ void createInvocationObject(

b.local_get(typeArgsLocal);
b.local_get(positionalArgsLocal);
b.call(translator.functions
.getFunction(translator.positionalParametersToList.reference));
b.local_get(namedArgsLocal);
b.call(translator.functions
.getFunction(translator.namedParameterListToMap.reference));
.getFunction(translator.namedParametersToMap.reference));
b.call(translator.functions
.getFunction(translator.invocationGenericMethodFactory.reference));
}
Expand Down Expand Up @@ -853,27 +855,6 @@ void generateNoSuchMethodCall(
b.call_indirect(noSuchMethodWasmFunctionType);
}

void _makeEmptyGrowableList(
Translator translator, w.FunctionBuilder function, int capacity) {
final b = function.body;
Class cls = translator.growableListClass;
ClassInfo info = translator.classInfo[cls]!;
translator.functions.allocateClass(info.classId);
w.ArrayType arrayType = translator.listArrayType;

b.i32_const(info.classId);
b.i32_const(initialIdentityHash);
translator.constants.instantiateConstant(
function,
b,
TypeLiteralConstant(DynamicType()),
translator.classInfo[translator.typeClass]!.nonNullableType);
b.i64_const(0); // _length
b.i32_const(capacity);
b.array_new_default(arrayType); // _data
b.struct_new(info.struct);
}

class ClassIdRange {
final int start;
final int end; // inclusive
Expand Down
Loading

0 comments on commit e8aa66f

Please sign in to comment.