Version 3.6.0-105.0.dev Merge 6995dc4447614ee9bb0f27f37cff664c5ff58867 into dev
diff --git a/.github/workflows/scorecards-analysis.yml b/.github/workflows/scorecards-analysis.yml index b688e04..487a5f7 100644 --- a/.github/workflows/scorecards-analysis.yml +++ b/.github/workflows/scorecards-analysis.yml
@@ -29,7 +29,7 @@ persist-credentials: false - name: "Run analysis" - uses: ossf/scorecard-action@dc50aa9510b46c811795eb24b2f1ba02a914e534 + uses: ossf/scorecard-action@62b2cac7ed8198b15735ed49ab1e5cf35480ba46 with: results_file: results.sarif results_format: sarif @@ -52,6 +52,6 @@ # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@4fa2a7953630fd2f3fb380f21be14ede0169dd4f + uses: github/codeql-action/upload-sarif@afb54ba388a7dca6ecae48f608c4ff05ff4cc77a with: sarif_file: results.sarif
diff --git a/pkg/dart2wasm/lib/async.dart b/pkg/dart2wasm/lib/async.dart index ff526b1..deeca32 100644 --- a/pkg/dart2wasm/lib/async.dart +++ b/pkg/dart2wasm/lib/async.dart
@@ -115,8 +115,8 @@ // (1) Create async state. - final asyncStateLocal = function - .addLocal(w.RefType(asyncSuspendStateInfo.struct, nullable: false)); + final asyncStateLocal = + b.addLocal(w.RefType(asyncSuspendStateInfo.struct, nullable: false)); // AsyncResumeFun _resume b.global_get(translator.makeFunctionRef(resumeFun)); @@ -157,7 +157,7 @@ b.struct_get( asyncSuspendStateInfo.struct, FieldIndex.asyncSuspendStateCompleter); translator.convertType( - function, + b, asyncSuspendStateInfo.struct.fields[5].type.unpacked, completerFutureGetterType.inputs[0]); call(translator.completerFuture.getterReference); @@ -171,17 +171,19 @@ // Set the current Wasm function for the code generator to the inner // function of the `async`, which is to contain the body. function = resumeFun; + b = resumeFun.body; + functionType = resumeFun.type; // Set up locals for contexts and `this`. thisLocal = null; Context? localContext = context; while (localContext != null) { if (!localContext.isEmpty) { - localContext.currentLocal = function - .addLocal(w.RefType.def(localContext.struct, nullable: true)); + localContext.currentLocal = + b.addLocal(w.RefType.def(localContext.struct, nullable: true)); if (localContext.containsThis) { assert(thisLocal == null); - thisLocal = function.addLocal(localContext + thisLocal = b.addLocal(localContext .struct.fields[localContext.thisFieldIndex].type.unpacked .withNullability(false)); translator.globals.instantiateDummyValue(b, thisLocal!.type); @@ -375,7 +377,7 @@ setVariable(awaitValueVar, () { b.local_get(_awaitValueLocal); translator.convertType( - function, _awaitValueLocal.type, translateType(awaitValueVar.type)); + b, _awaitValueLocal.type, translateType(awaitValueVar.type)); }); } }
diff --git a/pkg/dart2wasm/lib/closures.dart b/pkg/dart2wasm/lib/closures.dart index c565f2c..d91107b 100644 --- a/pkg/dart2wasm/lib/closures.dart +++ b/pkg/dart2wasm/lib/closures.dart
@@ -529,7 +529,7 @@ // Cast context reference to actual context type. w.RefType contextType = w.RefType.def(contextStruct, nullable: false); - w.Local contextLocal = trampoline.addLocal(contextType); + w.Local contextLocal = b.addLocal(contextType); b.local_get(trampoline.locals[0]); b.ref_cast(contextType); b.local_tee(contextLocal); @@ -579,7 +579,7 @@ final w.RefType instantiationContextType = w.RefType.def(instantiationContextStruct, nullable: false); final w.Local instantiationContextLocal = - function.addLocal(instantiationContextType); + b.addLocal(instantiationContextType); b.local_get(instantiatedClosureLocal); b.struct_get(closureBaseStruct, FieldIndex.closureContext); b.ref_cast(instantiationContextType); @@ -590,7 +590,7 @@ instantiationContextStruct, FieldIndex.instantiationContextInner); // Push types - translator.makeArray(function, translator.typeArrayType, typeCount, + translator.makeArray(b, translator.typeArrayType, typeCount, (elementType, elementIdx) { b.local_get(instantiationContextLocal); b.struct_get(instantiationContextStruct, @@ -641,8 +641,8 @@ ib.end(); final instantiationFunction = m.functions.define(functionType, name); - w.Local preciseClosure = instantiationFunction.addLocal(genericClosureType); final b = instantiationFunction.body; + w.Local preciseClosure = b.addLocal(genericClosureType); // Parameters to the instantiation function final w.Local closureParam = instantiationFunction.locals[0]; @@ -703,8 +703,8 @@ final thisContext = function.locals[0]; final otherContext = function.locals[1]; - final thisContextLocal = function.addLocal(contextRefType); - final otherContextLocal = function.addLocal(contextRefType); + final thisContextLocal = b.addLocal(contextRefType); + final otherContextLocal = b.addLocal(contextRefType); // Call site (`_Closure._equals`) checks that closures are instantiations // of the same function, so we can assume they have the right instantiation @@ -751,7 +751,7 @@ final contextRefType = w.RefType.def(contextStructType, nullable: false); final thisContext = function.locals[0]; - final thisContextLocal = function.addLocal(contextRefType); + final thisContextLocal = b.addLocal(contextRefType); b.local_get(thisContext); b.ref_cast(contextRefType);
diff --git a/pkg/dart2wasm/lib/code_generator.dart b/pkg/dart2wasm/lib/code_generator.dart index 51e6f0b..6d96df2 100644 --- a/pkg/dart2wasm/lib/code_generator.dart +++ b/pkg/dart2wasm/lib/code_generator.dart
@@ -40,7 +40,8 @@ with ExpressionVisitor1DefaultMixin<w.ValueType, w.ValueType> implements InitializerVisitor<void>, StatementVisitor<void> { final Translator translator; - w.FunctionBuilder function; + w.FunctionType functionType; + w.InstructionsBuilder b; final Reference reference; late final List<w.Local> paramLocals; final w.Label? returnLabel; @@ -86,9 +87,8 @@ /// code for an inlined function by specifying the locals containing the /// parameters (instead of the function inputs) and the label to jump to on /// return (instead of emitting a `return` instruction). - CodeGenerator(this.translator, this.function, this.reference, - {List<w.Local>? paramLocals, this.returnLabel}) { - this.paramLocals = paramLocals ?? function.locals.toList(); + CodeGenerator(this.translator, this.functionType, this.b, this.reference, + {required this.paramLocals, this.returnLabel}) { intrinsifier = Intrinsifier(this); typeContext = StaticTypeContext(member, translator.typeEnvironment); } @@ -112,17 +112,16 @@ } else if (!isTypeChecker && isAsync) { return AsyncCodeGenerator(translator, function, reference); } else { - return CodeGenerator(translator, function, reference); + return CodeGenerator(translator, function.type, function.body, reference, + paramLocals: function.locals.toList()); } } w.ModuleBuilder get m => translator.m; - w.InstructionsBuilder get b => function.body; Member get member => reference.asMember; - List<w.ValueType> get outputs => - returnLabel?.targetTypes ?? function.type.outputs; + List<w.ValueType> get outputs => functionType.outputs; w.ValueType get returnType => translator.outputOrVoid(outputs); @@ -135,7 +134,7 @@ w.ValueType translateType(DartType type) => translator.translateType(type); w.Local addLocal(w.ValueType type) { - return function.addLocal(type); + return b.addLocal(type); } DartType dartTypeOf(Expression exp) { @@ -245,7 +244,7 @@ } if (intrinsifier.generateMemberIntrinsic( - reference, function, paramLocals, returnLabel)) { + reference, functionType, paramLocals, returnLabel)) { b.end(); return; } @@ -258,7 +257,6 @@ b.ref_null(w.HeapType.none); } translator.constants.instantiateConstant( - function, b, SymbolConstant(member.name.text, null), translator.classInfo[translator.symbolClass]!.nonNullableType); @@ -335,7 +333,7 @@ b.global_set(flag); } b.global_get(global); - translator.convertType(function, global.type.type, outputs.single); + translator.convertType(b, global.type.type, outputs.single); b.end(); } @@ -349,20 +347,20 @@ w.Local thisLocal = paramLocals[0]; w.RefType structType = w.RefType.def(struct, nullable: false); b.local_get(thisLocal); - translator.convertType(function, thisLocal.type, structType); + translator.convertType(b, thisLocal.type, structType); } if (reference.isImplicitGetter) { // Implicit getter getThis(); b.struct_get(struct, fieldIndex); - translator.convertType(function, fieldType, returnType); + translator.convertType(b, fieldType, returnType); } else { // Implicit setter w.Local valueLocal = paramLocals[1]; getThis(); b.local_get(valueLocal); - translator.convertType(function, valueLocal.type, fieldType); + translator.convertType(b, valueLocal.type, fieldType); b.struct_set(struct, fieldIndex); } b.end(); @@ -407,7 +405,7 @@ // have to handle sentinel before we can downcast the value. b.local_get(local); translator.constants.instantiateConstant( - function, b, ParameterInfo.defaultValueSentinel, local.type); + b, ParameterInfo.defaultValueSentinel, local.type); b.ref_eq(); b.if_(); wrap(variable.initializer!, local.type); @@ -424,7 +422,7 @@ if (!local.type.isSubtypeOf(incomingArgumentType)) { final newLocal = addLocal(incomingArgumentType); b.local_get(local); - translator.convertType(function, local.type, newLocal.type); + translator.convertType(b, local.type, newLocal.type); b.local_set(newLocal); local = newLocal; } @@ -438,7 +436,7 @@ if (!operand.type.isSubtypeOf(boxedType)) { final boxedOperand = addLocal(boxedType); b.local_get(operand); - translator.convertType(function, operand.type, boxedOperand.type); + translator.convertType(b, operand.type, boxedOperand.type); b.local_set(boxedOperand); operand = boxedOperand; } @@ -459,7 +457,7 @@ if (!variableType.isSubtypeOf(local.type)) { w.Local newLocal = addLocal(variableType); b.local_get(local); - translator.convertType(function, local.type, newLocal.type); + translator.convertType(b, local.type, newLocal.type); b.local_set(newLocal); local = newLocal; } @@ -490,7 +488,7 @@ parameterType.classNode == translator.wasmExternRefClass)) { w.Local newLocal = addLocal(translateType(parameterType)); b.local_get(local); - translator.convertType(function, local.type, newLocal.type); + translator.convertType(b, local.type, newLocal.type); b.local_set(newLocal); locals[parameter] = newLocal; } @@ -790,7 +788,7 @@ } /// Generate code for the body of a lambda. - w.BaseFunction generateLambda(Lambda lambda, Closures closures) { + void generateLambda(Lambda lambda, Closures closures) { // Initialize closure information from enclosing member. this.closures = closures; @@ -803,8 +801,6 @@ visitStatement(lambda.functionNode.body!); _implicitReturn(); b.end(); - - return function; } /// Initialize locals containing `this` in constructors and instance members. @@ -821,7 +817,7 @@ if (translator.needsConversion(thisLocal!.type, preciseThisType)) { preciseThisLocal = addLocal(preciseThisType); b.local_get(thisLocal!); - translator.convertType(function, thisLocal!.type, preciseThisType); + translator.convertType(b, thisLocal!.type, preciseThisType); b.local_set(preciseThisLocal!); } else { preciseThisLocal = thisLocal!; @@ -929,7 +925,7 @@ if (capture != null) { b.local_get(capture.context.currentLocal); b.local_get(local); - translator.convertType(function, local.type, capture.type); + translator.convertType(b, local.type, capture.type); b.struct_set(capture.context.struct, capture.fieldIndex); } }); @@ -938,7 +934,7 @@ if (capture != null) { b.local_get(capture.context.currentLocal); b.local_get(local); - translator.convertType(function, local.type, capture.type); + translator.convertType(b, local.type, capture.type); b.struct_set(capture.context.struct, capture.fieldIndex); } }); @@ -967,7 +963,7 @@ final oldFileOffset = setSourceMapFileOffset(node.fileOffset); try { w.ValueType resultType = node.accept1(this, expectedType); - translator.convertType(function, resultType, expectedType); + translator.convertType(b, resultType, expectedType); return expectedType; } catch (_) { _printLocation(node); @@ -1019,7 +1015,7 @@ } w.Label block = b.block(const [], targetFunctionType.outputs); b.comment("Inlined ${target.asMember}"); - CodeGenerator(translator, function, target, + CodeGenerator(translator, targetFunctionType, b, target, paramLocals: inlinedLocals, returnLabel: block) .generate(); return targetFunctionType.outputs; @@ -1213,7 +1209,6 @@ translator.classInfo[stringClass]!.nullableType; if (location != null) { translator.constants.instantiateConstant( - function, b, StringConstant(location.file.toString()), stringRefType, @@ -1225,7 +1220,6 @@ final String conditionString = sourceString.substring( node.conditionStartOffset, node.conditionEndOffset); translator.constants.instantiateConstant( - function, b, StringConstant(conditionString), stringRefType, @@ -1300,7 +1294,7 @@ b.local_get(thrownException); // Type test passed, downcast the exception to the expected type. translator.convertType( - function, + b, thrownException.type, translator.translateType(exceptionDeclaration.type), ); @@ -1452,7 +1446,7 @@ } else { if (returnValueLocal != null) { b.local_get(returnValueLocal!); - translator.convertType(function, returnValueLocal!.type, returnType); + translator.convertType(b, returnValueLocal!.type, returnType); } _returnFromFunction(); } @@ -1641,7 +1635,7 @@ if (expression != null) { wrap(expression, returnType); } else { - translator.convertType(function, voidMarker, returnType); + translator.convertType(b, voidMarker, returnType); } // If we are wrapped in a [TryFinally] node then we have to run finalizers @@ -1720,9 +1714,7 @@ : doneLabel; b.local_get(switchValueNullableLocal!); b.br_on_null(nullLabel); - translator.convertType( - function, - switchInfo.nullableType.withNullability(false), + translator.convertType(b, switchInfo.nullableType.withNullability(false), switchInfo.nonNullableType); b.local_set(switchValueNonNullableLocal); } @@ -1852,7 +1844,7 @@ // A user of `this` may have more precise type information, in which case // we downcast it here. b.local_get(thisLocal!); - translator.convertType(function, thisType, expectedType); + translator.convertType(b, thisType, expectedType); return expectedType; } @@ -2020,12 +2012,11 @@ // Evaluate receiver wrap(receiver, translator.topInfo.nullableType); - final nullableReceiverLocal = - function.addLocal(translator.topInfo.nullableType); + final nullableReceiverLocal = addLocal(translator.topInfo.nullableType); b.local_set(nullableReceiverLocal); // Evaluate type arguments. - final typeArgsLocal = function.addLocal( + final typeArgsLocal = addLocal( makeArray(translator.typeArrayType, typeArguments.length, (elementType, elementIdx) { translator.types.makeType(this, typeArguments[elementIdx]); @@ -2033,7 +2024,7 @@ b.local_set(typeArgsLocal); // Evaluate positional arguments - final positionalArgsLocal = function.addLocal(makeArray( + final positionalArgsLocal = addLocal(makeArray( translator.nullableObjectArrayType, positionalArguments.length, (elementType, elementIdx) { wrap(positionalArguments[elementIdx], elementType); @@ -2047,14 +2038,14 @@ final List<MapEntry<String, w.Local>> namedArgumentLocals = []; for (final namedArgument in namedArguments) { wrap(namedArgument.value, translator.topInfo.nullableType); - final argumentLocal = function.addLocal(translator.topInfo.nullableType); + final argumentLocal = addLocal(translator.topInfo.nullableType); b.local_set(argumentLocal); namedArgumentLocals.add(MapEntry(namedArgument.name, argumentLocal)); } namedArgumentLocals.sort((e1, e2) => e1.key.compareTo(e2.key)); // Create named argument array - final namedArgsLocal = function.addLocal( + final namedArgsLocal = addLocal( makeArray(translator.nullableObjectArrayType, namedArguments.length * 2, (elementType, elementIdx) { if (elementIdx % 2 == 0) { @@ -2062,7 +2053,7 @@ final w.ValueType symbolValueType = translator.classInfo[translator.symbolClass]!.nonNullableType; translator.constants.instantiateConstant( - function, b, SymbolConstant(name, null), symbolValueType); + b, SymbolConstant(name, null), symbolValueType); } else { final local = namedArgumentLocals[elementIdx ~/ 2].value; b.local_get(local); @@ -2077,8 +2068,8 @@ // invocation of `noSuchMethod` (done in [_callNoSuchMethod]), but we don't // have a `Null` class in dart2wasm so we throw directly. b.local_get(nullableReceiverLocal); - createInvocationObject(translator, function, forwarder.memberName, - typeArgsLocal, positionalArgsLocal, namedArgsLocal); + createInvocationObject(translator, b, forwarder.memberName, typeArgsLocal, + positionalArgsLocal, namedArgsLocal); call(translator.noSuchMethodErrorThrowWithInvocation.reference); b.unreachable(); @@ -2317,7 +2308,7 @@ @override w.ValueType visitStaticTearOff(StaticTearOff node, w.ValueType expectedType) { translator.constants.instantiateConstant( - function, b, StaticTearOffConstant(node.target), expectedType); + b, StaticTearOffConstant(node.target), expectedType); return expectedType; } @@ -2434,8 +2425,7 @@ // Evaluate receiver wrap(receiver, translator.topInfo.nullableType); - final nullableReceiverLocal = - function.addLocal(translator.topInfo.nullableType); + final nullableReceiverLocal = addLocal(translator.topInfo.nullableType); b.local_set(nullableReceiverLocal); final nullBlock = b.block([], [translator.topInfo.nonNullableType]); @@ -2445,7 +2435,7 @@ // invocation of `noSuchMethod` (done in [_callNoSuchMethod]), but we don't // have a `Null` class in dart2wasm so we throw directly. b.local_get(nullableReceiverLocal); - createGetterInvocationObject(translator, function, forwarder.memberName); + createGetterInvocationObject(translator, b, forwarder.memberName); call(translator.noSuchMethodErrorThrowWithInvocation.reference); b.unreachable(); @@ -2466,14 +2456,12 @@ // Evaluate receiver wrap(receiver, translator.topInfo.nullableType); - final nullableReceiverLocal = - function.addLocal(translator.topInfo.nullableType); + final nullableReceiverLocal = addLocal(translator.topInfo.nullableType); b.local_set(nullableReceiverLocal); // Evaluate positional arg wrap(value, translator.topInfo.nullableType); - final positionalArgLocal = - function.addLocal(translator.topInfo.nullableType); + final positionalArgLocal = addLocal(translator.topInfo.nullableType); b.local_set(positionalArgLocal); final nullBlock = b.block([], [translator.topInfo.nonNullableType]); @@ -2484,7 +2472,7 @@ // have a `Null` class in dart2wasm so we throw directly. b.local_get(nullableReceiverLocal); createSetterInvocationObject( - translator, function, forwarder.memberName, positionalArgLocal); + translator, b, forwarder.memberName, positionalArgLocal); call(translator.noSuchMethodErrorThrowWithInvocation.reference); b.unreachable(); @@ -2534,7 +2522,7 @@ wrap(node.receiver, translator.topInfo.nullableType); b.br_on_null(nullLabel); translator.convertType( - function, translator.topInfo.nullableType, signature.inputs[0]); + b, translator.topInfo.nullableType, signature.inputs[0]); }, (_, __) {}); b.br(doneLabel); b.end(); // nullLabel @@ -2888,7 +2876,7 @@ for (int i = positional.length; i < paramInfo.positional.length; i++) { final w.ValueType type = signature.inputs[signatureOffset + i]; translator.constants - .instantiateConstant(function, b, paramInfo.positional[i]!, type); + .instantiateConstant(b, paramInfo.positional[i]!, type); } // Named arguments final Map<String, w.Local> namedLocals = {}; @@ -2908,7 +2896,7 @@ b.local_get(namedLocal); } else { translator.constants - .instantiateConstant(function, b, paramInfo.named[name]!, type); + .instantiateConstant(b, paramInfo.named[name]!, type); } } } @@ -2994,43 +2982,41 @@ @override w.ValueType visitConstantExpression( ConstantExpression node, w.ValueType expectedType) { - translator.constants - .instantiateConstant(function, b, node.constant, expectedType); + translator.constants.instantiateConstant(b, node.constant, expectedType); return expectedType; } @override w.ValueType visitNullLiteral(NullLiteral node, w.ValueType expectedType) { - translator.constants - .instantiateConstant(function, b, NullConstant(), expectedType); + translator.constants.instantiateConstant(b, NullConstant(), expectedType); return expectedType; } @override w.ValueType visitStringLiteral(StringLiteral node, w.ValueType expectedType) { - translator.constants.instantiateConstant( - function, b, StringConstant(node.value), expectedType); + translator.constants + .instantiateConstant(b, StringConstant(node.value), expectedType); return expectedType; } @override w.ValueType visitBoolLiteral(BoolLiteral node, w.ValueType expectedType) { - translator.constants.instantiateConstant( - function, b, BoolConstant(node.value), expectedType); + translator.constants + .instantiateConstant(b, BoolConstant(node.value), expectedType); return expectedType; } @override w.ValueType visitIntLiteral(IntLiteral node, w.ValueType expectedType) { - translator.constants.instantiateConstant( - function, b, IntConstant(node.value), expectedType); + translator.constants + .instantiateConstant(b, IntConstant(node.value), expectedType); return expectedType; } @override w.ValueType visitDoubleLiteral(DoubleLiteral node, w.ValueType expectedType) { - translator.constants.instantiateConstant( - function, b, DoubleConstant(node.value), expectedType); + translator.constants + .instantiateConstant(b, DoubleConstant(node.value), expectedType); return expectedType; } @@ -3075,7 +3061,7 @@ w.ValueType makeArray(w.ArrayType arrayType, int length, void Function(w.ValueType, int) generateItem) { - return translator.makeArray(function, arrayType, length, generateItem); + return translator.makeArray(b, arrayType, length, generateItem); } @override @@ -3224,7 +3210,7 @@ b.struct_get(info.struct, fieldIndex); resultType = info.struct.fields[fieldIndex].type.unpacked; } - translator.convertType(function, resultType, types.nonNullableTypeType); + translator.convertType(b, resultType, types.nonNullableTypeType); return types.nonNullableTypeType; } @@ -3425,8 +3411,8 @@ /// This function will be called by a setter forwarder in a dynamic set to /// type check the setter argument before calling the actual setter. void _generateFieldSetterTypeCheckerMethod() { - final receiverLocal = function.locals[0]; - final positionalArgLocal = function.locals[1]; + final receiverLocal = paramLocals[0]; + final positionalArgLocal = paramLocals[1]; _initializeThis(member.reference); @@ -3454,11 +3440,10 @@ if (member_ is Field) { int fieldIndex = translator.fieldIndex[member_]!; b.local_get(receiverLocal); - translator.convertType( - function, receiverLocal.type, info.nonNullableType); + translator.convertType(b, receiverLocal.type, info.nonNullableType); b.local_get(argLocal); - translator.convertType(function, argLocal.type, - info.struct.fields[fieldIndex].type.unpacked); + translator.convertType( + b, argLocal.type, info.struct.fields[fieldIndex].type.unpacked); b.struct_set(info.struct, fieldIndex); } else { final setterProcedure = member_ as Procedure; @@ -3467,9 +3452,9 @@ final setterWasmInputs = setterProcedureWasmType.inputs; assert(setterWasmInputs.length == 2); b.local_get(receiverLocal); - translator.convertType(function, receiverLocal.type, setterWasmInputs[0]); + translator.convertType(b, receiverLocal.type, setterWasmInputs[0]); b.local_get(argLocal); - translator.convertType(function, argLocal.type, setterWasmInputs[1]); + translator.convertType(b, argLocal.type, setterWasmInputs[1]); call(setterProcedure.reference); } @@ -3482,10 +3467,10 @@ /// This function will be called by an invocation forwarder in a dynamic /// invocation to type check parameters before calling the actual method. void _generateProcedureTypeCheckerMethod() { - final receiverLocal = function.locals[0]; - final typeArgsLocal = function.locals[1]; - final positionalArgsLocal = function.locals[2]; - final namedArgsLocal = function.locals[3]; + final receiverLocal = paramLocals[0]; + final typeArgsLocal = paramLocals[1]; + final positionalArgsLocal = paramLocals[2]; + final namedArgsLocal = paramLocals[3]; _initializeThis(member.reference); @@ -3605,7 +3590,7 @@ final List<w.ValueType> memberWasmInputs = memberWasmFunctionType.inputs; b.local_get(receiverLocal); - translator.convertType(function, receiverLocal.type, memberWasmInputs[0]); + translator.convertType(b, receiverLocal.type, memberWasmInputs[0]); for (final typeParam in memberTypeParams) { b.local_get(typeLocals[typeParam]!); @@ -3618,8 +3603,8 @@ b.local_get(listLocal); b.i32_const(listIdx); b.array_get(translator.nullableObjectArrayType); - translator.convertType(function, translator.topInfo.nullableType, - memberWasmInputs[wasmInputIdx]); + translator.convertType( + b, translator.topInfo.nullableType, memberWasmInputs[wasmInputIdx]); } for (int positionalParamIdx = 0; @@ -3639,7 +3624,7 @@ call(member.reference); translator.convertType( - function, + b, translator.outputOrVoid(memberWasmFunctionType.outputs), translator.topInfo.nullableType); @@ -3697,8 +3682,8 @@ DartType bound, ) { b.local_get(typeLocal); - final boundLocal = function - .addLocal(translator.classInfo[translator.typeClass]!.nonNullableType); + final boundLocal = + b.addLocal(translator.classInfo[translator.typeClass]!.nonNullableType); types.makeType(this, bound); b.local_tee(boundLocal); call(translator.isTypeSubtype.reference); @@ -3743,7 +3728,7 @@ final printFunction = translator.functions.getFunction(translator.printToConsole.reference); translator.constants.instantiateConstant( - function, b, StringConstant(s), printFunction.type.inputs[0]); + b, StringConstant(s), printFunction.type.inputs[0]); b.call(printFunction); } @@ -3877,11 +3862,11 @@ compare = (switchExprLocal, pushCaseExpr) { final caseExprType = pushCaseExpr(); translator.convertType( - codeGen.function, caseExprType, equalsMemberSignature.inputs[0]); + codeGen.b, caseExprType, equalsMemberSignature.inputs[0]); codeGen.b.local_get(switchExprLocal); - translator.convertType(codeGen.function, switchExprLocal.type, - equalsMemberSignature.inputs[1]); + translator.convertType( + codeGen.b, switchExprLocal.type, equalsMemberSignature.inputs[1]); codeGen.call(equalsMember.reference); }; @@ -4017,7 +4002,7 @@ return; } - w.Local classId = addLocal(w.NumType.i32, isParameter: false); + w.Local classId = addLocal(w.NumType.i32); local_set(classId); final done = block([], outputs); @@ -4092,7 +4077,7 @@ return; } - w.Local classId = addLocal(w.NumType.i32, isParameter: false); + w.Local classId = addLocal(w.NumType.i32); local_set(classId); final done = block([], outputs); for (final (:range, :value) in ranges) { @@ -4242,8 +4227,7 @@ w.Local cloneFunctionLevelContext( Closures closures, Context context, FunctionNode functionNode) { final w.Local srcContext = context.currentLocal; - final w.Local destContext = - addLocal(context.currentLocal.type, isParameter: false); + final w.Local destContext = addLocal(context.currentLocal.type); struct_new_default(context.struct); local_set(destContext);
diff --git a/pkg/dart2wasm/lib/constants.dart b/pkg/dart2wasm/lib/constants.dart index d1525f6..05e3a59 100644 --- a/pkg/dart2wasm/lib/constants.dart +++ b/pkg/dart2wasm/lib/constants.dart
@@ -28,8 +28,7 @@ bool get isLazy => function != null; } -typedef ConstantCodeGenerator = void Function( - w.FunctionBuilder?, w.InstructionsBuilder); +typedef ConstantCodeGenerator = void Function(w.InstructionsBuilder); /// Handles the creation of Dart constants. /// @@ -130,10 +129,10 @@ } /// Emit code to push a constant onto the stack. - void instantiateConstant(w.BaseFunction? function, w.InstructionsBuilder b, - Constant constant, w.ValueType expectedType) { + void instantiateConstant( + w.InstructionsBuilder b, Constant constant, w.ValueType expectedType) { if (expectedType == translator.voidMarker) return; - ConstantInstantiator(this, function, b, expectedType).instantiate(constant); + ConstantInstantiator(this, b, expectedType).instantiate(constant); } InstanceConstant _lowerTypeConstant(DartType type) { @@ -293,12 +292,10 @@ class ConstantInstantiator extends ConstantVisitor<w.ValueType> with ConstantVisitorDefaultMixin<w.ValueType> { final Constants constants; - final w.BaseFunction? function; final w.InstructionsBuilder b; final w.ValueType expectedType; - ConstantInstantiator( - this.constants, this.function, this.b, this.expectedType); + ConstantInstantiator(this.constants, this.b, this.expectedType); Translator get translator => constants.translator; w.ModuleBuilder get m => translator.m; @@ -453,9 +450,9 @@ global.initializer.end(); w.FunctionType ftype = m.types.defineFunction(const [], [type]); final function = m.functions.define(ftype, "$constant"); - generator(function, function.body); - w.Local temp = function.addLocal(type); final b2 = function.body; + generator(b2); + w.Local temp = b2.addLocal(type); b2.local_tee(temp); b2.global_set(global); b2.local_get(temp); @@ -467,7 +464,7 @@ assert(!constants.currentlyCreating); constants.currentlyCreating = true; final global = m.globals.define(w.GlobalType(type, mutable: false)); - generator(null, global.initializer); + generator(global.initializer); global.initializer.end(); constants.currentlyCreating = false; @@ -481,7 +478,7 @@ @override ConstantInfo? visitBoolConstant(BoolConstant constant) { ClassInfo info = translator.classInfo[translator.boxedBoolClass]!; - return createConstant(constant, info.nonNullableType, (function, b) { + return createConstant(constant, info.nonNullableType, (b) { b.i32_const(info.classId); b.i32_const(constant.value ? 1 : 0); b.struct_new(info.struct); @@ -491,7 +488,7 @@ @override ConstantInfo? visitIntConstant(IntConstant constant) { ClassInfo info = translator.classInfo[translator.boxedIntClass]!; - return createConstant(constant, info.nonNullableType, (function, b) { + return createConstant(constant, info.nonNullableType, (b) { b.i32_const(info.classId); b.i64_const(constant.value); b.struct_new(info.struct); @@ -501,7 +498,7 @@ @override ConstantInfo? visitDoubleConstant(DoubleConstant constant) { ClassInfo info = translator.classInfo[translator.boxedDoubleClass]!; - return createConstant(constant, info.nonNullableType, (function, b) { + return createConstant(constant, info.nonNullableType, (b) { b.i32_const(info.classId); b.f64_const(constant.value); b.struct_new(info.struct); @@ -512,7 +509,7 @@ ConstantInfo? visitStringConstant(StringConstant constant) { if (translator.options.jsCompatibility) { ClassInfo info = translator.classInfo[translator.jsStringClass]!; - return createConstant(constant, info.nonNullableType, (function, b) { + return createConstant(constant, info.nonNullableType, (b) { b.i32_const(info.classId); b.i32_const(initialIdentityHash); b.global_get(translator.getInternalizedStringGlobal(constant.value)); @@ -526,7 +523,7 @@ translator.functions.recordClassAllocation(info.classId); w.RefType type = info.nonNullableType; bool lazy = constant.value.length > maxArrayNewFixedLength; - return createConstant(constant, type, lazy: lazy, (function, b) { + return createConstant(constant, type, lazy: lazy, (b) { w.ArrayType arrayType = (info.struct.fields[FieldIndex.stringArray].type as w.RefType) .heapType as w.ArrayType; @@ -605,13 +602,13 @@ args = supertype.typeArguments; } - return createConstant(constant, type, lazy: lazy, (function, b) { + return createConstant(constant, type, lazy: lazy, (b) { b.i32_const(info.classId); b.i32_const(initialIdentityHash); for (int i = baseFieldCount; i < fieldCount; i++) { Constant subConstant = subConstants[i]!; constants.instantiateConstant( - function, b, subConstant, info.struct.fields[i].type.unpacked); + b, subConstant, info.struct.fields[i].type.unpacked); } b.struct_new(info.struct); }); @@ -631,7 +628,7 @@ } return createConstant(constant, w.RefType.def(arrayType, nullable: false), - lazy: lazy, (function, b) { + lazy: lazy, (b) { if (tooLargeForArrayNewFixed) { // We will initialize the array with one of the elements (using // `array.new`) and update the fields. @@ -653,8 +650,8 @@ } w.Local arrayLocal = - function!.addLocal(w.RefType.def(arrayType, nullable: false)); - constants.instantiateConstant(function, b, initialElement, elementType); + b.addLocal(w.RefType.def(arrayType, nullable: false)); + constants.instantiateConstant(b, initialElement, elementType); b.i32_const(elements.length); b.array_new(arrayType); b.local_set(arrayLocal); @@ -674,7 +671,7 @@ b.local_get(arrayLocal); b.i32_const(startInclusive); - constants.instantiateConstant(function, b, value, elementType); + constants.instantiateConstant(b, value, elementType); if (count > 1) { b.i32_const(count); b.array_fill(arrayType); @@ -685,7 +682,7 @@ b.local_get(arrayLocal); } else { for (Constant element in elements) { - constants.instantiateConstant(function, b, element, elementType); + constants.instantiateConstant(b, element, elementType); } b.array_new_fixed(arrayType, elements.length); } @@ -705,35 +702,33 @@ ClassInfo info = translator.classInfo[translator.immutableListClass]!; translator.functions.recordClassAllocation(info.classId); w.RefType type = info.nonNullableType; - return createConstant(constant, type, lazy: lazy, (function, b) { + return createConstant(constant, type, lazy: lazy, (b) { w.ArrayType arrayType = translator.listArrayType; w.ValueType elementType = arrayType.elementType.type.unpacked; int length = constant.entries.length; b.i32_const(info.classId); b.i32_const(initialIdentityHash); constants.instantiateConstant( - function, b, typeArgConstant, constants.typeInfo.nullableType); + b, typeArgConstant, constants.typeInfo.nullableType); b.i64_const(length); if (lazy) { // Allocate array and set each entry to the corresponding sub-constant. w.Local arrayLocal = - function!.addLocal(w.RefType.def(arrayType, nullable: false)); + b.addLocal(w.RefType.def(arrayType, nullable: false)); b.i32_const(length); b.array_new_default(arrayType); b.local_set(arrayLocal); for (int i = 0; i < length; i++) { b.local_get(arrayLocal); b.i32_const(i); - constants.instantiateConstant( - function, b, constant.entries[i], elementType); + constants.instantiateConstant(b, constant.entries[i], elementType); b.array_set(arrayType); } b.local_get(arrayLocal); } else { // Push all sub-constants on the stack and initialize array from them. for (int i = 0; i < length; i++) { - constants.instantiateConstant( - function, b, constant.entries[i], elementType); + constants.instantiateConstant(b, constant.entries[i], elementType); } b.array_new_fixed(arrayType, length); } @@ -822,7 +817,7 @@ ClosureImplementation closure = translator.getTearOffClosure(member); w.StructType struct = closure.representation.closureStruct; w.RefType type = w.RefType.def(struct, nullable: false); - return createConstant(constant, type, (function, b) { + return createConstant(constant, type, (b) { ClassInfo info = translator.closureInfo; translator.functions.recordClassAllocation(info.classId); @@ -831,7 +826,7 @@ b.global_get(translator.globals.dummyStructGlobal); // Dummy context b.global_get(closure.vtable); constants.instantiateConstant( - function, b, functionTypeConstant, types.nonNullableTypeType); + b, functionTypeConstant, types.nonNullableTypeType); b.struct_new(struct); }); } @@ -880,8 +875,7 @@ b.local_get(closureLocal); final InstanceConstant typeArgs = constants.makeTypeArray(constant.types); - constants.instantiateConstant( - function, b, typeArgs, typeArgsListLocal.type); + constants.instantiateConstant(b, typeArgs, typeArgsListLocal.type); b.local_get(posArgsListLocal); b.local_get(namedArgsListLocal); b.call(tearOffClosure.dynamicCallEntry); @@ -895,7 +889,7 @@ // a constant while creating another one. final w.BaseFunction dynamicCallEntry = makeDynamicCallEntry(); - return createConstant(constant, type, (function, b) { + return createConstant(constant, type, (b) { ClassInfo info = translator.closureInfo; translator.functions.recordClassAllocation(info.classId); @@ -964,7 +958,7 @@ makeVtable(); constants.instantiateConstant( - function, b, functionTypeConstant, this.types.nonNullableTypeType); + b, functionTypeConstant, this.types.nonNullableTypeType); b.struct_new(struct); }); } @@ -982,11 +976,10 @@ .classInfo[translator.coreTypes.stringClass]!.repr.nonNullableType; StringConstant nameConstant = StringConstant(constant.name); bool lazy = ensureConstant(nameConstant)?.isLazy ?? false; - return createConstant(constant, info.nonNullableType, lazy: lazy, - (function, b) { + return createConstant(constant, info.nonNullableType, lazy: lazy, (b) { b.i32_const(info.classId); b.i32_const(initialIdentityHash); - constants.instantiateConstant(function, b, nameConstant, stringType); + constants.instantiateConstant(b, nameConstant, stringType); b.struct_new(info.struct); }); } @@ -1005,12 +998,12 @@ } return createConstant(constant, recordClassInfo.nonNullableType, - lazy: false, (function, b) { + lazy: false, (b) { b.i32_const(recordClassInfo.classId); b.i32_const(initialIdentityHash); for (Constant argument in arguments) { constants.instantiateConstant( - function, b, argument, translator.topInfo.nullableType); + b, argument, translator.topInfo.nullableType); } b.struct_new(recordClassInfo.struct); });
diff --git a/pkg/dart2wasm/lib/dynamic_forwarders.dart b/pkg/dart2wasm/lib/dynamic_forwarders.dart index 9fec783..811c849 100644 --- a/pkg/dart2wasm/lib/dynamic_forwarders.dart +++ b/pkg/dart2wasm/lib/dynamic_forwarders.dart
@@ -123,17 +123,14 @@ translator.functions.getFunction(targetReference); b.local_get(receiverLocal); translator.convertType( - function, receiverLocal.type, targetFunction.type.inputs.first); + b, receiverLocal.type, targetFunction.type.inputs.first); b.call(targetFunction); // Box return value if needed - translator.convertType(function, targetFunction.type.outputs.single, + translator.convertType(b, targetFunction.type.outputs.single, _kind.functionType(translator).outputs.single); }, () { - generateNoSuchMethodCall( - translator, - function, - () => b.local_get(receiverLocal), - () => createGetterInvocationObject(translator, function, memberName)); + generateNoSuchMethodCall(translator, b, () => b.local_get(receiverLocal), + () => createGetterInvocationObject(translator, b, memberName)); }); b.return_(); @@ -164,10 +161,10 @@ }, () { generateNoSuchMethodCall( translator, - function, + b, () => b.local_get(receiverLocal), () => createSetterInvocationObject( - translator, function, memberName, positionalArgLocal)); + translator, b, memberName, positionalArgLocal)); b.drop(); // drop noSuchMethod return value b.local_get(positionalArgLocal); @@ -185,12 +182,12 @@ final positionalArgsLocal = function.locals[2]; // ref WasmArray final namedArgsLocal = function.locals[3]; // ref WasmArray - final classIdLocal = function.addLocal(w.NumType.i32); + final classIdLocal = b.addLocal(w.NumType.i32); // Continuation of this block calls `noSuchMethod` on the receiver. final noSuchMethodBlock = b.block(); - final numArgsLocal = function.addLocal(w.NumType.i32); + final numArgsLocal = b.addLocal(w.NumType.i32); final methodSelectors = translator.dispatchTable.dynamicMethodSelectors(memberName); @@ -277,13 +274,13 @@ w.Local? adjustedPositionalArgsLocal; if (nRequired != nTotal) { adjustedPositionalArgsLocal = - function.addLocal(translator.nullableObjectArrayTypeRef); + b.addLocal(translator.nullableObjectArrayTypeRef); b.i32_const(nTotal); b.array_new_default(translator.nullableObjectArrayType); b.local_set(adjustedPositionalArgsLocal); // Copy passed arguments - final argIdxLocal = function.addLocal(w.NumType.i32); + final argIdxLocal = b.addLocal(w.NumType.i32); b.i32_const(0); b.local_set(argIdxLocal); @@ -319,8 +316,8 @@ b.local_get(adjustedPositionalArgsLocal); b.i32_const(optionalParamIdx); - translator.constants.instantiateConstant( - function, b, param, translator.topInfo.nullableType); + translator.constants + .instantiateConstant(b, param, translator.topInfo.nullableType); b.array_set(translator.nullableObjectArrayType); b.end(); } @@ -339,12 +336,12 @@ b.br_if(noSuchMethodBlock); } else { adjustedNamedArgsLocal = - function.addLocal(translator.nullableObjectArrayTypeRef); + b.addLocal(translator.nullableObjectArrayTypeRef); b.i32_const(targetMemberParamInfo.named.length); b.array_new_default(translator.nullableObjectArrayType); b.local_set(adjustedNamedArgsLocal); - final namedParameterIdxLocal = function.addLocal( + final namedParameterIdxLocal = b.addLocal( translator.classInfo[translator.boxedIntClass]!.nullableType); final remainingNamedArgsLocal = numArgsLocal; @@ -378,7 +375,6 @@ b.local_get(namedArgsLocal); translator.constants.instantiateConstant( - function, b, SymbolConstant(name, null), translator.classInfo[translator.symbolClass]!.nonNullableType); @@ -411,7 +407,7 @@ b.local_get(namedArgsLocal); b.local_get(namedParameterIdxLocal); translator.convertType( - function, namedParameterIdxLocal.type, w.NumType.i64); + b, namedParameterIdxLocal.type, w.NumType.i64); b.i32_wrap_i64(); b.array_get(translator.nullableObjectArrayType); @@ -427,14 +423,12 @@ if (functionNodeDefaultValue != null) { // Used by the member, has a default value translator.constants.instantiateConstant( - function, b, (functionNodeDefaultValue as ConstantExpression).constant, translator.topInfo.nullableType); } else { // Not used by the member translator.constants.instantiateConstant( - function, b, paramInfoDefaultValue!, translator.topInfo.nullableType, @@ -449,7 +443,7 @@ b.local_get(namedArgsLocal); b.local_get(namedParameterIdxLocal); translator.convertType( - function, namedParameterIdxLocal.type, w.NumType.i64); + b, namedParameterIdxLocal.type, w.NumType.i64); b.i32_wrap_i64(); b.array_get(translator.nullableObjectArrayType); b.array_set(translator.nullableObjectArrayType); @@ -480,7 +474,7 @@ final getterSelectors = translator.dispatchTable.dynamicGetterSelectors(memberName); - final getterValueLocal = function.addLocal(translator.topInfo.nullableType); + final getterValueLocal = b.addLocal(translator.topInfo.nullableType); for (final selector in getterSelectors) { for (final (:range, :target) in selector.targetRanges) { for (int classId = range.start; classId <= range.end; ++classId) { @@ -513,9 +507,9 @@ // Get field value b.local_get(receiverLocal); translator.convertType( - function, receiverLocal.type, targetFunction.type.inputs.first); + b, receiverLocal.type, targetFunction.type.inputs.first); b.call(targetFunction); - translator.convertType(function, targetFunction.type.outputs.single, + translator.convertType(b, targetFunction.type.outputs.single, translator.topInfo.nullableType); b.local_tee(getterValueLocal); @@ -546,14 +540,14 @@ final closureBaseType = w.RefType.def( translator.closureLayouter.closureBaseStruct, nullable: false); - final closureLocal = function.addLocal(closureBaseType); + final closureLocal = b.addLocal(closureBaseType); b.local_get(receiverLocal); b.ref_cast(closureBaseType); b.local_set(closureLocal); generateDynamicFunctionCall( translator, - function, + b, closureLocal, typeArgsLocal, positionalArgsLocal, @@ -571,10 +565,10 @@ // Unable to find a matching member, call `noSuchMethod` generateNoSuchMethodCall( translator, - function, + b, () => b.local_get(receiverLocal), - () => createInvocationObject(translator, function, memberName, - typeArgsLocal, positionalArgsLocal, namedArgsLocal)); + () => createInvocationObject(translator, b, memberName, typeArgsLocal, + positionalArgsLocal, namedArgsLocal)); b.end(); } @@ -616,7 +610,7 @@ /// [noSuchMethodBlock] is used as the `br` target when the shape check fails. void generateDynamicFunctionCall( Translator translator, - w.FunctionBuilder function, + w.InstructionsBuilder b, w.Local closureLocal, w.Local typeArgsLocal, w.Local posArgsLocal, @@ -627,11 +621,9 @@ assert(posArgsLocal.type == translator.nullableObjectArrayTypeRef); assert(namedArgsLocal.type == translator.nullableObjectArrayTypeRef); - final b = function.body; - // Read the `_FunctionType` field final functionTypeLocal = - function.addLocal(translator.closureLayouter.functionTypeType); + b.addLocal(translator.closureLayouter.functionTypeType); b.local_get(closureLocal); b.struct_get(translator.closureLayouter.closureBaseStruct, FieldIndex.closureRuntimeType); @@ -691,17 +683,12 @@ void createInvocationObject( Translator translator, - w.FunctionBuilder function, + w.InstructionsBuilder b, String memberName, w.Local typeArgsLocal, w.Local positionalArgsLocal, w.Local namedArgsLocal) { - final b = function.body; - - translator.constants.instantiateConstant( - function, - b, - SymbolConstant(memberName, null), + translator.constants.instantiateConstant(b, SymbolConstant(memberName, null), translator.classInfo[translator.symbolClass]!.nonNullableType); b.local_get(typeArgsLocal); @@ -719,15 +706,10 @@ void createGetterInvocationObject( Translator translator, - w.FunctionBuilder function, + w.InstructionsBuilder b, String memberName, ) { - final b = function.body; - - translator.constants.instantiateConstant( - function, - b, - SymbolConstant(memberName, null), + translator.constants.instantiateConstant(b, SymbolConstant(memberName, null), translator.classInfo[translator.symbolClass]!.nonNullableType); b.call(translator.functions @@ -736,18 +718,13 @@ void createSetterInvocationObject( Translator translator, - w.FunctionBuilder function, + w.InstructionsBuilder b, String memberName, w.Local positionalArgLocal, ) { - final b = function.body; - memberName = '$memberName='; - translator.constants.instantiateConstant( - function, - b, - SymbolConstant(memberName, null), + translator.constants.instantiateConstant(b, SymbolConstant(memberName, null), translator.classInfo[translator.symbolClass]!.nonNullableType); b.local_get(positionalArgLocal); @@ -757,12 +734,10 @@ void generateNoSuchMethodCall( Translator translator, - w.FunctionBuilder function, + w.InstructionsBuilder b, void Function() pushReceiver, void Function() pushInvocationObject, ) { - final b = function.body; - final SelectorInfo noSuchMethodSelector = translator.dispatchTable .selectorForTarget(translator.objectNoSuchMethod.reference); translator.functions.recordSelectorUse(noSuchMethodSelector); @@ -775,7 +750,7 @@ final invocationFactory = translator.functions .getFunction(translator.invocationGenericMethodFactory.reference); - translator.convertType(function, invocationFactory.type.outputs[0], + translator.convertType(b, invocationFactory.type.outputs[0], noSuchMethodSelector.signature.inputs[1]); // `noSuchMethod` can have extra parameters as long as they are optional. @@ -786,10 +761,7 @@ positionalArgIdx += 1) { final positionalParameterValue = noSuchMethodParamInfo.positional[positionalArgIdx]!; - translator.constants.instantiateConstant( - function, - b, - positionalParameterValue, + translator.constants.instantiateConstant(b, positionalParameterValue, noSuchMethodWasmFunctionType.inputs[wasmArgIdx]); wasmArgIdx += 1; } @@ -798,7 +770,7 @@ for (String namedParameterName in noSuchMethodParamInfo.names) { final namedParameterValue = noSuchMethodParamInfo.named[namedParameterName]!; - translator.constants.instantiateConstant(function, b, namedParameterValue, + translator.constants.instantiateConstant(b, namedParameterValue, noSuchMethodWasmFunctionType.inputs[wasmArgIdx]); wasmArgIdx += 1; }
diff --git a/pkg/dart2wasm/lib/globals.dart b/pkg/dart2wasm/lib/globals.dart index 4ce65fb..e9a3897 100644 --- a/pkg/dart2wasm/lib/globals.dart +++ b/pkg/dart2wasm/lib/globals.dart
@@ -149,7 +149,7 @@ final global = m.globals.define(w.GlobalType(type, mutable: !field.isFinal)); translator.constants - .instantiateConstant(null, global.initializer, init, type); + .instantiateConstant(global.initializer, init, type); global.initializer.end(); return global; } else {
diff --git a/pkg/dart2wasm/lib/intrinsics.dart b/pkg/dart2wasm/lib/intrinsics.dart index 497f846..df7261e 100644 --- a/pkg/dart2wasm/lib/intrinsics.dart +++ b/pkg/dart2wasm/lib/intrinsics.dart
@@ -164,7 +164,7 @@ // int.bitlength if (cls == translator.coreTypes.intClass && name == 'bitLength') { - w.Local temp = codeGen.function.addLocal(w.NumType.i64); + w.Local temp = b.addLocal(w.NumType.i64); b.i64_const(64); codeGen.wrap(receiver, w.NumType.i64); b.local_tee(temp); @@ -537,21 +537,21 @@ .translateStorageType(types.rtt.typeRowDisplacementOffsetsType) .unpacked; translator.constants.instantiateConstant( - null, b, types.rtt.typeRowDisplacementOffsets, type); + b, types.rtt.typeRowDisplacementOffsets, type); return type; case "_typeRowDisplacementTable": final type = translator .translateStorageType(types.rtt.typeRowDisplacementTableType) .unpacked; - translator.constants.instantiateConstant( - null, b, types.rtt.typeRowDisplacementTable, type); + translator.constants + .instantiateConstant(b, types.rtt.typeRowDisplacementTable, type); return type; case "_typeRowDisplacementSubstTable": final type = translator .translateStorageType(types.rtt.typeRowDisplacementSubstTableType) .unpacked; translator.constants.instantiateConstant( - null, b, types.rtt.typeRowDisplacementSubstTable, type); + b, types.rtt.typeRowDisplacementSubstTable, type); return type; case "_typeNames": final type = @@ -560,7 +560,7 @@ b.ref_null((type as w.RefType).heapType); } else { translator.constants - .instantiateConstant(null, b, types.rtt.typeNames, type); + .instantiateConstant(b, types.rtt.typeNames, type); } return type; } @@ -652,8 +652,8 @@ final sourceArrayRefType = w.RefType.def(arrayType, nullable: false); - final sourceArrayLocal = codeGen.addLocal(sourceArrayRefType); - final newArrayLocal = codeGen.addLocal(sourceArrayRefType); + final sourceArrayLocal = b.addLocal(sourceArrayRefType); + final newArrayLocal = b.addLocal(sourceArrayRefType); codeGen.wrap(sourceArray, sourceArrayRefType); b.local_tee(sourceArrayLocal); @@ -1033,7 +1033,7 @@ b.array_new_default(arrayType); } else { // Initialize to the provided value - w.Local lengthTemp = codeGen.addLocal(w.NumType.i32); + w.Local lengthTemp = b.addLocal(w.NumType.i32); b.local_set(lengthTemp); codeGen.wrap(initialValue, arrayType.elementType.type.unpacked); b.local_get(lengthTemp); @@ -1164,8 +1164,7 @@ ClassInfo receiverInfo = translator.classInfo[translator.listBaseClass]!; codeGen.wrap( node.arguments.positional.single, receiverInfo.nonNullableType); - w.Local receiverLocal = - codeGen.function.addLocal(receiverInfo.nonNullableType); + w.Local receiverLocal = b.addLocal(receiverInfo.nonNullableType); b.local_set(receiverLocal); ClassInfo newInfo = translator.classInfo[newClass]!; @@ -1227,7 +1226,7 @@ assert(receiver.name.text == "call"); w.RefType receiverType = translator.translateType(dartTypeOf(receiver.receiver)) as w.RefType; - w.Local temp = codeGen.addLocal(receiverType); + w.Local temp = b.addLocal(receiverType); codeGen.wrap(receiver.receiver, receiverType); b.local_set(temp); w.FunctionType functionType = receiverType.heapType as w.FunctionType; @@ -1256,7 +1255,7 @@ [receiver.arguments.types.single]); w.RefType receiverType = translator.translateType(wasmFunctionType) as w.RefType; - w.Local tableIndex = codeGen.addLocal(w.NumType.i32); + w.Local tableIndex = b.addLocal(w.NumType.i32); codeGen.wrap(receiver.arguments.positional.single, w.NumType.i32); b.local_set(tableIndex); w.FunctionType functionType = receiverType.heapType as w.FunctionType; @@ -1273,7 +1272,7 @@ } /// Generate Wasm function for an intrinsic member. - bool generateMemberIntrinsic(Reference target, w.FunctionBuilder function, + bool generateMemberIntrinsic(Reference target, w.FunctionType functionType, List<w.Local> paramLocals, w.Label? returnLabel) { Member member = target.asMember; if (member is! Procedure) return false; @@ -1309,7 +1308,7 @@ ClassInfo boolInfo = translator.classInfo[translator.boxedBoolClass]!; ClassInfo intInfo = translator.classInfo[translator.boxedIntClass]!; ClassInfo doubleInfo = translator.classInfo[translator.boxedDoubleClass]!; - w.Local cid = function.addLocal(w.NumType.i32); + w.Local cid = b.addLocal(w.NumType.i32); // If the references are identical, return true. b.local_get(first); @@ -1400,8 +1399,7 @@ if (member.enclosingLibrary == translator.coreTypes.coreLibrary && name == "identityHashCode") { final w.Local arg = paramLocals[0]; - final w.Local nonNullArg = - function.addLocal(translator.topInfo.nonNullableType); + final w.Local nonNullArg = b.addLocal(translator.topInfo.nonNullableType); final List<int> classIds = translator.valueClasses.keys .map((cls) => translator.classInfo[cls]!.classId) .toList() @@ -1454,7 +1452,7 @@ Class cls = member.enclosingClass!; ClassInfo classInfo = translator.classInfo[cls]!; w.ArrayType arrayType = - (function.type.outputs.single as w.RefType).heapType as w.ArrayType; + (functionType.outputs.single as w.RefType).heapType as w.ArrayType; w.Local object = paramLocals[0]; w.Local preciseObject = codeGen.addLocal(classInfo.nonNullableType); b.local_get(object); @@ -1478,63 +1476,63 @@ CodeGenCallback? code = _unaryOperatorMap[intType]![op]; if (code != null) { w.ValueType resultType = _unaryResultMap[op] ?? intType; - w.ValueType inputType = function.type.inputs.single; - w.ValueType outputType = function.type.outputs.single; - b.local_get(function.locals[0]); - translator.convertType(function, inputType, intType); + w.ValueType inputType = functionType.inputs.single; + w.ValueType outputType = functionType.outputs.single; + b.local_get(paramLocals[0]); + translator.convertType(b, inputType, intType); code(codeGen); - translator.convertType(function, resultType, outputType); + translator.convertType(b, resultType, outputType); return true; } } else if (functionNode.requiredParameterCount == 1) { CodeGenCallback? code = _binaryOperatorMap[intType]![intType]![op]; if (code != null) { - w.ValueType leftType = function.type.inputs[0]; - w.ValueType rightType = function.type.inputs[1]; - w.ValueType outputType = function.type.outputs.single; + w.ValueType leftType = functionType.inputs[0]; + w.ValueType rightType = functionType.inputs[1]; + w.ValueType outputType = functionType.outputs.single; if (rightType == intType) { // int parameter - b.local_get(function.locals[0]); - translator.convertType(function, leftType, intType); - b.local_get(function.locals[1]); + b.local_get(paramLocals[0]); + translator.convertType(b, leftType, intType); + b.local_get(paramLocals[1]); code(codeGen); if (!isComparison(op)) { - translator.convertType(function, intType, outputType); + translator.convertType(b, intType, outputType); } return true; } // num parameter ClassInfo intInfo = translator.classInfo[translator.boxedIntClass]!; w.Label intArg = b.block(const [], [intInfo.nonNullableType]); - b.local_get(function.locals[1]); - b.br_on_cast(intArg, function.locals[1].type as w.RefType, + b.local_get(paramLocals[1]); + b.br_on_cast(intArg, paramLocals[1].type as w.RefType, intInfo.nonNullableType); // double argument b.drop(); - b.local_get(function.locals[0]); - translator.convertType(function, leftType, intType); + b.local_get(paramLocals[0]); + translator.convertType(b, leftType, intType); b.f64_convert_i64_s(); - b.local_get(function.locals[1]); - translator.convertType(function, rightType, doubleType); + b.local_get(paramLocals[1]); + translator.convertType(b, rightType, doubleType); // Inline double op CodeGenCallback doubleCode = _binaryOperatorMap[doubleType]![doubleType]![op]!; doubleCode(codeGen); if (!isComparison(op)) { - translator.convertType(function, doubleType, outputType); + translator.convertType(b, doubleType, outputType); } b.return_(); b.end(); // int argument - translator.convertType(function, intInfo.nonNullableType, intType); - w.Local rightTemp = function.addLocal(intType); + translator.convertType(b, intInfo.nonNullableType, intType); + w.Local rightTemp = b.addLocal(intType); b.local_set(rightTemp); - b.local_get(function.locals[0]); - translator.convertType(function, leftType, intType); + b.local_get(paramLocals[0]); + translator.convertType(b, leftType, intType); b.local_get(rightTemp); code(codeGen); if (!isComparison(op)) { - translator.convertType(function, intType, outputType); + translator.convertType(b, intType, outputType); } return true; } @@ -1549,12 +1547,12 @@ CodeGenCallback? code = _unaryOperatorMap[doubleType]![op]; if (code != null) { w.ValueType resultType = _unaryResultMap[op] ?? doubleType; - w.ValueType inputType = function.type.inputs.single; - w.ValueType outputType = function.type.outputs.single; - b.local_get(function.locals[0]); - translator.convertType(function, inputType, doubleType); + w.ValueType inputType = functionType.inputs.single; + w.ValueType outputType = functionType.outputs.single; + b.local_get(paramLocals[0]); + translator.convertType(b, inputType, doubleType); code(codeGen); - translator.convertType(function, resultType, outputType); + translator.convertType(b, resultType, outputType); return true; } } @@ -1562,26 +1560,26 @@ if (member.enclosingClass == translator.closureClass && name == "_isInstantiationClosure") { - assert(function.locals.length == 1); - b.local_get(function.locals[0]); // ref _Closure + assert(paramLocals.length == 1); + b.local_get(paramLocals[0]); // ref _Closure b.emitInstantiationClosureCheck(translator); return true; } if (member.enclosingClass == translator.closureClass && name == "_instantiatedClosure") { - assert(function.locals.length == 1); - b.local_get(function.locals[0]); // ref _Closure + assert(paramLocals.length == 1); + b.local_get(paramLocals[0]); // ref _Closure b.emitGetInstantiatedClosure(translator); return true; } if (member.enclosingClass == translator.closureClass && name == "_instantiationClosureTypeHash") { - assert(function.locals.length == 1); + assert(paramLocals.length == 1); // Instantiation context, to be passed to the hash function. - b.local_get(function.locals[0]); // ref _Closure + b.local_get(paramLocals[0]); // ref _Closure b.ref_cast(w.RefType(translator.closureLayouter.closureBaseStruct, nullable: false)); b.struct_get(translator.closureLayouter.closureBaseStruct, @@ -1591,7 +1589,7 @@ nullable: false)); // Hash function. - b.local_get(function.locals[0]); // ref _Closure + b.local_get(paramLocals[0]); // ref _Closure b.emitGetInstantiatedClosure(translator); b.emitGetClosureVtable(translator); b.ref_cast(w.RefType.def( @@ -1607,7 +1605,7 @@ if (member.enclosingClass == translator.closureClass && name == "_instantiationClosureTypeEquals") { - assert(function.locals.length == 2); + assert(paramLocals.length == 2); final w.StructType closureBaseStruct = translator.closureLayouter.closureBaseStruct; @@ -1616,17 +1614,17 @@ translator.closureLayouter.instantiationContextBaseStruct, nullable: false); - b.local_get(function.locals[0]); // ref _Closure + b.local_get(paramLocals[0]); // ref _Closure b.ref_cast(w.RefType(closureBaseStruct, nullable: false)); b.struct_get(closureBaseStruct, FieldIndex.closureContext); b.ref_cast(instantiationContextBase); - b.local_get(function.locals[1]); // ref _Closure + b.local_get(paramLocals[1]); // ref _Closure b.ref_cast(w.RefType(closureBaseStruct, nullable: false)); b.struct_get(closureBaseStruct, FieldIndex.closureContext); b.ref_cast(instantiationContextBase); - b.local_get(function.locals[0]); + b.local_get(paramLocals[0]); b.emitGetInstantiatedClosure(translator); b.emitGetClosureVtable(translator); b.ref_cast(w.RefType.def( @@ -1643,55 +1641,53 @@ if (member.enclosingClass == translator.closureClass && name == "_isInstanceTearOff") { - assert(function.locals.length == 1); - b.local_get(function.locals[0]); // ref _Closure + assert(paramLocals.length == 1); + b.local_get(paramLocals[0]); // ref _Closure b.emitTearOffCheck(translator); return true; } if (member.enclosingClass == translator.closureClass && name == "_instanceTearOffReceiver") { - assert(function.locals.length == 1); - b.local_get(function.locals[0]); // ref _Closure + assert(paramLocals.length == 1); + b.local_get(paramLocals[0]); // ref _Closure b.emitGetTearOffReceiver(translator); return true; } if (member.enclosingClass == translator.closureClass && name == "_vtable") { - assert(function.locals.length == 1); - b.local_get(function.locals[0]); // ref _Closure + assert(paramLocals.length == 1); + b.local_get(paramLocals[0]); // ref _Closure b.emitGetClosureVtable(translator); return true; } if (member.enclosingClass == translator.coreTypes.functionClass && name == "apply") { - assert(function.type.inputs.length == 3); + assert(functionType.inputs.length == 3); - final closureLocal = function.locals[0]; // ref #ClosureBase - final posArgsNullableLocal = function.locals[1]; // ref null Object - final namedArgsLocal = function.locals[2]; // ref null Object + final closureLocal = paramLocals[0]; // ref #ClosureBase + final posArgsNullableLocal = paramLocals[1]; // ref null Object + final namedArgsLocal = paramLocals[2]; // ref null Object // Create empty type arguments array. - final typeArgsLocal = function.addLocal(translator.makeArray(function, - translator.typeArrayType, 0, (elementType, elementIndex) {})); + final typeArgsLocal = b.addLocal(translator.makeArray( + b, translator.typeArrayType, 0, (elementType, elementIndex) {})); b.local_set(typeArgsLocal); // Create empty list for positional args if the argument is null - final posArgsLocal = - function.addLocal(translator.nullableObjectArrayTypeRef); + final posArgsLocal = b.addLocal(translator.nullableObjectArrayTypeRef); b.local_get(posArgsNullableLocal); b.ref_is_null(); b.if_([], [translator.nullableObjectArrayTypeRef]); translator.makeArray( - function, translator.nullableObjectArrayType, 0, (_, __) {}); + b, translator.nullableObjectArrayType, 0, (_, __) {}); b.else_(); // List argument may be a custom list type, convert it to `WasmListBase` // with `WasmListBase.of`. translator.constants.instantiateConstant( - function, b, TypeLiteralConstant(DynamicType()), translator.types.nonNullableTypeType, @@ -1706,33 +1702,33 @@ // Convert named argument map to list, to be passed to shape and type // checkers and the dynamic call entry. final namedArgsListLocal = - function.addLocal(translator.nullableObjectArrayTypeRef); + b.addLocal(translator.nullableObjectArrayTypeRef); b.local_get(namedArgsLocal); codeGen.call(translator.namedParameterMapToArray.reference); b.local_set(namedArgsListLocal); final noSuchMethodBlock = b.block(); - generateDynamicFunctionCall(translator, function, closureLocal, - typeArgsLocal, posArgsLocal, namedArgsListLocal, noSuchMethodBlock); + generateDynamicFunctionCall(translator, b, closureLocal, typeArgsLocal, + posArgsLocal, namedArgsListLocal, noSuchMethodBlock); b.return_(); b.end(); // noSuchMethodBlock generateNoSuchMethodCall( translator, - function, + b, () => b.local_get(closureLocal), - () => createInvocationObject(translator, function, "call", - typeArgsLocal, posArgsLocal, namedArgsListLocal)); + () => createInvocationObject(translator, b, "call", typeArgsLocal, + posArgsLocal, namedArgsListLocal)); return true; } // Error._throw if (member.enclosingClass == translator.errorClass && name == "_throw") { - final objectLocal = function.locals[0]; // ref #Top - final stackTraceLocal = function.locals[1]; // ref Object + final objectLocal = paramLocals[0]; // ref #Top + final stackTraceLocal = paramLocals[1]; // ref Object final notErrorBlock = b.block([], [objectLocal.type]); @@ -1744,7 +1740,7 @@ b.br_on_cast_fail( notErrorBlock, objectLocal.type as w.RefType, errorRefType); - final errorLocal = function.addLocal(errorRefType); + final errorLocal = b.addLocal(errorRefType); b.local_tee(errorLocal); b.struct_get(errorClassInfo.struct, stackTraceFieldIndex);
diff --git a/pkg/dart2wasm/lib/state_machine.dart b/pkg/dart2wasm/lib/state_machine.dart index 29bef15..cc0d292e 100644 --- a/pkg/dart2wasm/lib/state_machine.dart +++ b/pkg/dart2wasm/lib/state_machine.dart
@@ -7,6 +7,7 @@ import 'closures.dart'; import 'code_generator.dart'; +import 'translator.dart'; /// Placement of a control flow graph target within a statement. This /// distinction is necessary since some statements need to have two targets @@ -308,12 +309,13 @@ /// Call this right before terminating a CFG block. void _terminateTryBlocks() { int nextHandlerIdx = _handlers.length - 1; + final b = codeGen.b; for (final int nCoveredHandlers in _tryBlockNumHandlers.reversed) { - final stackTraceLocal = codeGen - .addLocal(codeGen.translator.stackTraceInfo.repr.nonNullableType); + final stackTraceLocal = + b.addLocal(codeGen.translator.stackTraceInfo.repr.nonNullableType); final exceptionLocal = - codeGen.addLocal(codeGen.translator.topInfo.nonNullableType); + b.addLocal(codeGen.translator.topInfo.nonNullableType); void generateCatchBody() { // Set continuations of finalizers that can be reached by this `catch` @@ -321,26 +323,25 @@ for (int i = 0; i < nCoveredHandlers; i += 1) { final handler = _handlers[nextHandlerIdx - i]; if (handler is Finalizer) { - handler.setContinuationRethrow( - () => codeGen.b.local_get(exceptionLocal), - () => codeGen.b.local_get(stackTraceLocal)); + handler.setContinuationRethrow(() => b.local_get(exceptionLocal), + () => b.local_get(stackTraceLocal)); } } // Set the untyped "current exception" variable. Catch blocks will do the // type tests as necessary using this variable and set their exception // and stack trace locals. - codeGen.setSuspendStateCurrentException( - () => codeGen.b.local_get(exceptionLocal)); + codeGen + .setSuspendStateCurrentException(() => b.local_get(exceptionLocal)); codeGen.setSuspendStateCurrentStackTrace( - () => codeGen.b.local_get(stackTraceLocal)); + () => b.local_get(stackTraceLocal)); codeGen._jumpToTarget(_handlers[nextHandlerIdx].target); } - codeGen.b.catch_(codeGen.translator.exceptionTag); - codeGen.b.local_set(stackTraceLocal); - codeGen.b.local_set(exceptionLocal); + b.catch_(codeGen.translator.exceptionTag); + b.local_set(stackTraceLocal); + b.local_set(exceptionLocal); generateCatchBody(); @@ -355,21 +356,21 @@ } if (canHandleJSExceptions) { - codeGen.b.catch_all(); + b.catch_all(); // We can't inspect the thrown object in a `catch_all` and get a stack // trace, so we just attach the current stack trace. codeGen.call(codeGen.translator.stackTraceCurrent.reference); - codeGen.b.local_set(stackTraceLocal); + b.local_set(stackTraceLocal); // We create a generic JavaScript error. codeGen.call(codeGen.translator.javaScriptErrorFactory.reference); - codeGen.b.local_set(exceptionLocal); + b.local_set(exceptionLocal); generateCatchBody(); } - codeGen.b.end(); // end catch + b.end(); // end catch nextHandlerIdx -= nCoveredHandlers; } @@ -568,7 +569,12 @@ /// /// This is used to compile `async` and `sync*` functions. abstract class StateMachineCodeGenerator extends CodeGenerator { - StateMachineCodeGenerator(super.translator, super.function, super.reference); + w.FunctionBuilder function; + + StateMachineCodeGenerator( + Translator translator, this.function, Reference reference) + : super(translator, function.type, function.body, reference, + paramLocals: function.locals.toList()); /// Targets of the CFG, indexed by target index. late final List<StateTarget> targets; @@ -615,12 +621,11 @@ } @override - w.BaseFunction generateLambda(Lambda lambda, Closures closures) { + void generateLambda(Lambda lambda, Closures closures) { this.closures = closures; setSourceMapSource(lambda.functionNodeSource); setupLambdaParametersAndContexts(lambda); _generateBodies(lambda.functionNode); - return function; } void _generateBodies(FunctionNode functionNode) { @@ -832,8 +837,8 @@ b.local_get(switchValueNullableLocal); b.ref_as_non_null(); // Unbox if necessary - translator.convertType(function, switchValueNullableLocal.type, - switchValueNonNullableLocal.type); + translator.convertType( + b, switchValueNullableLocal.type, switchValueNonNullableLocal.type); b.local_set(switchValueNonNullableLocal); } @@ -950,7 +955,7 @@ setVariable(catch_.exception!, () { getSuspendStateCurrentException(); // Type test already passed, convert the exception. - translator.convertType(function, translator.topInfo.nullableType, + translator.convertType(b, translator.topInfo.nullableType, translator.translateType(catch_.exception!.type)); }); setVariable(catch_.stackTrace!, () => getSuspendStateCurrentStackTrace()); @@ -1215,6 +1220,6 @@ /// Same as [_getVariable], but boxes the value if it's not already boxed. void _getVariableBoxed(VariableDeclaration variable) { final varType = _getVariable(variable); - translator.convertType(function, varType, translator.topInfo.nullableType); + translator.convertType(b, varType, translator.topInfo.nullableType); } }
diff --git a/pkg/dart2wasm/lib/sync_star.dart b/pkg/dart2wasm/lib/sync_star.dart index 3e8eece..38ff310 100644 --- a/pkg/dart2wasm/lib/sync_star.dart +++ b/pkg/dart2wasm/lib/sync_star.dart
@@ -142,17 +142,19 @@ // Set the current Wasm function for the code generator to the inner // function of the `sync*`, which is to contain the body. function = resumeFun; + b = resumeFun.body; + functionType = resumeFun.type; // Set up locals for contexts and `this`. thisLocal = null; Context? localContext = context; while (localContext != null) { if (!localContext.isEmpty) { - localContext.currentLocal = function - .addLocal(w.RefType.def(localContext.struct, nullable: true)); + localContext.currentLocal = + b.addLocal(w.RefType.def(localContext.struct, nullable: true)); if (localContext.containsThis) { assert(thisLocal == null); - thisLocal = function.addLocal(localContext + thisLocal = b.addLocal(localContext .struct.fields[localContext.thisFieldIndex].type.unpacked .withNullability(false)); translator.globals.instantiateDummyValue(b, thisLocal!.type);
diff --git a/pkg/dart2wasm/lib/translator.dart b/pkg/dart2wasm/lib/translator.dart index 45b222b..ecb0bc9 100644 --- a/pkg/dart2wasm/lib/translator.dart +++ b/pkg/dart2wasm/lib/translator.dart
@@ -374,8 +374,8 @@ codeGen.generate(); if (options.printWasm) { - print(codeGen.function.type); - print(codeGen.function.body.trace); + print(function.type); + print(function.body.trace); } // The constructor allocator, initializer, and body functions all @@ -385,10 +385,11 @@ // constructor initializer methods are generated. if (member is! Constructor || reference.isInitializerReference) { for (Lambda lambda in codeGen.closures.lambdas.values) { - w.BaseFunction lambdaFunction = CodeGenerator.forFunction( - this, lambda.functionNode, lambda.function, reference) + final lambdaFunction = lambda.function; + CodeGenerator.forFunction( + this, lambda.functionNode, lambdaFunction, reference) .generateLambda(lambda, codeGen.closures); - _printFunction(lambdaFunction, "$canonicalName (closure)"); + _printFunction(function, "$canonicalName (closure)"); } } @@ -826,9 +827,7 @@ return (from == voidMarker) ^ (to == voidMarker) || !from.isSubtypeOf(to); } - void convertType( - w.FunctionBuilder function, w.ValueType from, w.ValueType to) { - final b = function.body; + void convertType(w.InstructionsBuilder b, w.ValueType from, w.ValueType to) { if (from == voidMarker || to == voidMarker) { if (from != voidMarker) { b.drop(); @@ -856,7 +855,7 @@ // Boxing ClassInfo info = classInfo[boxedClasses[from]!]!; assert(info.struct.isSubtypeOf(to.heapType)); - w.Local temp = function.addLocal(from); + w.Local temp = b.addLocal(from); b.local_set(temp); b.i32_const(info.classId); b.local_get(temp); @@ -1117,10 +1116,8 @@ return null; } - w.ValueType makeArray(w.FunctionBuilder function, w.ArrayType arrayType, + w.ValueType makeArray(w.InstructionsBuilder b, w.ArrayType arrayType, int length, void Function(w.ValueType, int) generateItem) { - final b = function.body; - final w.ValueType elementType = arrayType.elementType.type.unpacked; final arrayTypeRef = w.RefType.def(arrayType, nullable: false); @@ -1129,7 +1126,7 @@ b.i32_const(length); b.array_new_default(arrayType); if (length > 0) { - final w.Local arrayLocal = function.addLocal(arrayTypeRef); + final w.Local arrayLocal = b.addLocal(arrayTypeRef); b.local_set(arrayLocal); for (int i = 0; i < length; i++) { b.local_get(arrayLocal); @@ -1216,7 +1213,7 @@ w.Local receiver = trampoline.locals[0]; b.local_get(receiver); translator.convertType( - trampoline, receiver.type, target.type.inputs[targetIndex++]); + b, receiver.type, target.type.inputs[targetIndex++]); } int argIndex = 1; for (int i = 0; i < typeCount; i++) { @@ -1227,11 +1224,10 @@ if (i < posArgCount) { w.Local arg = trampoline.locals[argIndex++]; b.local_get(arg); - translator.convertType( - trampoline, arg.type, target.type.inputs[targetIndex++]); + translator.convertType(b, arg.type, target.type.inputs[targetIndex++]); } else { - translator.constants.instantiateConstant(trampoline, b, - paramInfo.positional[i]!, target.type.inputs[targetIndex++]); + translator.constants.instantiateConstant( + b, paramInfo.positional[i]!, target.type.inputs[targetIndex++]); } } int argNameIndex = 0; @@ -1240,12 +1236,11 @@ if (argNameIndex < argNames.length && argNames[argNameIndex] == argName) { w.Local arg = trampoline.locals[argIndex++]; b.local_get(arg); - translator.convertType( - trampoline, arg.type, target.type.inputs[targetIndex++]); + translator.convertType(b, arg.type, target.type.inputs[targetIndex++]); argNameIndex++; } else { - translator.constants.instantiateConstant(trampoline, b, - paramInfo.named[argName]!, target.type.inputs[targetIndex++]); + translator.constants.instantiateConstant( + b, paramInfo.named[argName]!, target.type.inputs[targetIndex++]); } } assert(argIndex == trampoline.type.inputs.length); @@ -1254,9 +1249,7 @@ b.call(target); - translator.convertType( - trampoline, - translator.outputOrVoid(target.type.outputs), + translator.convertType(b, translator.outputOrVoid(target.type.outputs), translator.outputOrVoid(trampoline.type.outputs)); b.end(); } @@ -1308,11 +1301,10 @@ // Get context, downcast it to expected type b.local_get(closureLocal); - translator.convertType(function, closureLocal.type, closureBaseType); + translator.convertType(b, closureLocal.type, closureBaseType); b.struct_get(translator.closureLayouter.closureBaseStruct, FieldIndex.closureContext); - translator.convertType( - function, closureContextType, targetInputs[inputIdx]); + translator.convertType(b, closureContextType, targetInputs[inputIdx]); inputIdx += 1; } @@ -1322,7 +1314,7 @@ b.i32_const(typeIdx); b.array_get(translator.typeArrayType); translator.convertType( - function, translator.topInfo.nullableType, targetInputs[inputIdx]); + b, translator.topInfo.nullableType, targetInputs[inputIdx]); inputIdx += 1; } @@ -1344,12 +1336,12 @@ b.i32_const(posIdx); b.array_get(translator.nullableObjectArrayType); b.else_(); - translator.constants.instantiateConstant(function, b, - paramInfo.positional[posIdx]!, translator.topInfo.nullableType); + translator.constants.instantiateConstant( + b, paramInfo.positional[posIdx]!, translator.topInfo.nullableType); b.end(); } translator.convertType( - function, translator.topInfo.nullableType, targetInputs[inputIdx]); + b, translator.topInfo.nullableType, targetInputs[inputIdx]); inputIdx += 1; } @@ -1364,7 +1356,7 @@ return null; } - final namedArgValueIndexLocal = function + final namedArgValueIndexLocal = b .addLocal(translator.classInfo[translator.boxedIntClass]!.nullableType); for (String paramName in paramInfo.names) { @@ -1375,7 +1367,6 @@ // Get passed value b.local_get(namedArgsListLocal); translator.constants.instantiateConstant( - function, b, SymbolConstant(paramName, null), translator.classInfo[translator.symbolClass]!.nonNullableType); @@ -1387,12 +1378,11 @@ // Shape check passed, parameter must be passed b.local_get(namedArgsListLocal); b.local_get(namedArgValueIndexLocal); - translator.convertType( - function, namedArgValueIndexLocal.type, w.NumType.i64); + translator.convertType(b, namedArgValueIndexLocal.type, w.NumType.i64); b.i32_wrap_i64(); b.array_get(translator.nullableObjectArrayType); translator.convertType( - function, + b, translator.nullableObjectArrayType.elementType.type.unpacked, target.type.inputs[inputIdx]); } else { @@ -1403,14 +1393,12 @@ if (functionNodeDefaultValue != null) { // Used by the member, has a default value translator.constants.instantiateConstant( - function, b, (functionNodeDefaultValue as ConstantExpression).constant, translator.topInfo.nullableType); } else { // Not used by the member translator.constants.instantiateConstant( - function, b, paramInfoDefaultValue!, translator.topInfo.nullableType, @@ -1419,22 +1407,19 @@ b.else_(); // value index not null b.local_get(namedArgsListLocal); b.local_get(namedArgValueIndexLocal); - translator.convertType( - function, namedArgValueIndexLocal.type, w.NumType.i64); + translator.convertType(b, namedArgValueIndexLocal.type, w.NumType.i64); b.i32_wrap_i64(); b.array_get(translator.nullableObjectArrayType); b.end(); translator.convertType( - function, translator.topInfo.nullableType, targetInputs[inputIdx]); + b, translator.topInfo.nullableType, targetInputs[inputIdx]); } inputIdx += 1; } b.call(target); - translator.convertType( - function, - translator.outputOrVoid(target.type.outputs), + translator.convertType(b, translator.outputOrVoid(target.type.outputs), translator.outputOrVoid(function.type.outputs)); b.end(); // end function @@ -1503,8 +1488,8 @@ ), name); final b = function.body; - translator.constants.instantiateConstant(function, b, - TypeLiteralConstant(type), translator.types.nonNullableTypeType); + translator.constants.instantiateConstant( + b, TypeLiteralConstant(type), translator.types.nonNullableTypeType); for (int i = 1; i < wasmTarget.type.inputs.length; ++i) { b.local_get(b.locals[i - 1]); } @@ -1531,10 +1516,10 @@ ), name); final b = function.body; - translator.constants.instantiateConstant(function, b, - TypeLiteralConstant(type1), translator.types.nonNullableTypeType); - translator.constants.instantiateConstant(function, b, - TypeLiteralConstant(type2), translator.types.nonNullableTypeType); + translator.constants.instantiateConstant( + b, TypeLiteralConstant(type1), translator.types.nonNullableTypeType); + translator.constants.instantiateConstant( + b, TypeLiteralConstant(type2), translator.types.nonNullableTypeType); for (int i = 2; i < wasmTarget.type.inputs.length; ++i) { b.local_get(b.locals[i - 2]); }
diff --git a/pkg/dart2wasm/lib/types.dart b/pkg/dart2wasm/lib/types.dart index 6032c0a..e70b8b2 100644 --- a/pkg/dart2wasm/lib/types.dart +++ b/pkg/dart2wasm/lib/types.dart
@@ -168,7 +168,7 @@ /// stack. void _makeTypeArray(CodeGenerator codeGen, Iterable<DartType> types) { if (types.every(isTypeConstant)) { - translator.constants.instantiateConstant(codeGen.function, codeGen.b, + translator.constants.instantiateConstant(codeGen.b, translator.constants.makeTypeArray(types), typeArrayExpectedType); } else { for (DartType type in types) { @@ -194,7 +194,7 @@ type.named.map((t) => StringConstant(t.name)).toList()); translator.constants.instantiateConstant( - codeGen.function, codeGen.b, names, recordTypeNamesFieldExpectedType); + codeGen.b, names, recordTypeNamesFieldExpectedType); _makeTypeArray( codeGen, type.positional.followedBy(type.named.map((t) => t.type))); } @@ -267,7 +267,6 @@ // WasmArray<_NamedParameter> namedParameters if (type.namedParameters.every((n) => isTypeConstant(n.type))) { translator.constants.instantiateConstant( - codeGen.function, b, translator.constants.makeNamedParametersArray(type), namedParametersExpectedType); @@ -291,8 +290,8 @@ } w.ValueType namedParametersListType = codeGen.makeArrayFromExpressions(expressions, namedParameterType); - translator.convertType(codeGen.function, namedParametersListType, - namedParametersExpectedType); + translator.convertType( + b, namedParametersListType, namedParametersExpectedType); } } @@ -305,7 +304,7 @@ final b = codeGen.b; if (isTypeConstant(type)) { translator.constants.instantiateConstant( - codeGen.function, b, TypeLiteralConstant(type), nonNullableTypeType); + b, TypeLiteralConstant(type), nonNullableTypeType); return nonNullableTypeType; } // All of the singleton types represented by canonical objects should be @@ -385,8 +384,7 @@ b.comment("type check against $testedAgainstType"); w.Local? operandTemp; if (translator.options.verifyTypeChecks) { - operandTemp = - b.addLocal(translator.topInfo.nullableType, isParameter: false); + operandTemp = b.addLocal(translator.topInfo.nullableType); b.local_tee(operandTemp); } final (typeToCheck, :checkArguments) = @@ -431,8 +429,8 @@ if (location != null) { w.FunctionType verifyFunctionType = translator.signatureForDirectCall( translator.verifyOptimizedTypeCheck.reference); - translator.constants.instantiateConstant(codeGen.function, b, - StringConstant('$location'), verifyFunctionType.inputs.last); + translator.constants.instantiateConstant( + b, StringConstant('$location'), verifyFunctionType.inputs.last); } else { b.ref_null(w.HeapType.none); } @@ -458,7 +456,7 @@ return translator.translateType(testedAgainstType); } - w.Local operand = b.addLocal(boxedOperandType, isParameter: false); + w.Local operand = b.addLocal(boxedOperandType); b.local_tee(operand); late List<w.ValueType> outputsToDrop; @@ -609,7 +607,7 @@ final b = function.body; w.Local operand = b.locals[0]; - w.Local boolTemp = function.addLocal(w.NumType.i32); + w.Local boolTemp = b.addLocal(w.NumType.i32); final w.Label resultLabel = b.block(const [], const [w.NumType.i32]); if (operandIsNullable) { @@ -617,7 +615,7 @@ b.local_get(operand); b.br_on_null(nullLabel); final nonNullableOperand = - function.addLocal(translator.topInfo.nonNullableType); + b.addLocal(translator.topInfo.nonNullableType); b.local_get(operand); b.ref_cast(nonNullableOperand.type as w.RefType); b.local_set(nonNullableOperand); @@ -644,7 +642,7 @@ // Otherwise we have to check each argument. // Call Object._getArguments() - w.Local typeArguments = function.addLocal(typeArrayExpectedType); + w.Local typeArguments = b.addLocal(typeArrayExpectedType); b.local_get(operand); b.call(translator.functions .getFunction(translator.objectGetTypeArguments.reference)); @@ -778,8 +776,8 @@ } } else { b.local_get(b.locals[0]); - translator.constants.instantiateConstant(function, b, - TypeLiteralConstant(testedAgainstType), nonNullableTypeType); + translator.constants.instantiateConstant( + b, TypeLiteralConstant(testedAgainstType), nonNullableTypeType); b.call(translator.functions .getFunction(translator.throwAsCheckError.reference)); } @@ -788,7 +786,7 @@ b.end(); b.local_get(b.locals[0]); - translator.convertType(function, argumentType, returnType); + translator.convertType(b, argumentType, returnType); b.return_(); b.end();
diff --git a/pkg/front_end/presubmit_helper.dart b/pkg/front_end/presubmit_helper.dart index cd97221..5df71cc 100644 --- a/pkg/front_end/presubmit_helper.dart +++ b/pkg/front_end/presubmit_helper.dart
@@ -16,7 +16,7 @@ // Expect something like /full/path/to/sdk/pkg/some_dir/whatever/else if (args.length != 1) throw "Need exactly one argument."; - final List<String> changedFiles = getChangedFiles(); + final List<String> changedFiles = getChangedFiles(collectUncommitted: false); String callerPath = args[0].replaceAll("\\", "/"); if (!_shouldRun(changedFiles, callerPath)) { return; @@ -291,7 +291,18 @@ /// Queries git about changes against upstream, or origin/main if no upstream is /// set. This is similar (but different), I believe, to what /// `git cl presubmit` does. -List<String> getChangedFiles() { +List<String> getChangedFiles({required bool collectUncommitted}) { + Set<String> paths = {}; + void collectChanges(ProcessResult processResult) { + for (String line in processResult.stdout.toString().split("\n")) { + List<String> split = line.split("\t"); + if (split.length != 2) continue; + if (split[0] == 'D') continue; // Don't check deleted files. + String path = split[1].trim().replaceAll("\\", "/"); + paths.add(path); + } + } + ProcessResult result = Process.runSync( "git", [ @@ -300,7 +311,7 @@ "diff", "--name-status", "--no-renames", - "@{u}...HEAD" + "@{u}...HEAD", ], runInShell: true); if (result.exitCode != 0) { @@ -312,23 +323,31 @@ "diff", "--name-status", "--no-renames", - "origin/main...HEAD" + "origin/main...HEAD", ], runInShell: true); } if (result.exitCode != 0) { throw "Failure"; } + collectChanges(result); - List<String> paths = []; - for (String line in result.stdout.toString().split("\n")) { - List<String> split = line.split("\t"); - if (split.length != 2) continue; - if (split[0] == 'D') continue; // Don't check deleted files. - String path = split[1].trim().replaceAll("\\", "/"); - paths.add(path); + if (collectUncommitted) { + result = Process.runSync( + "git", + [ + "-c", + "core.quotePath=false", + "diff", + "--name-status", + "--no-renames", + "HEAD", + ], + runInShell: true); + collectChanges(result); } - return paths; + + return paths.toList(); } /// If [inner] is a dir or file inside [outer] this returns the index into
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt index 9041a7e6..23cfea6 100644 --- a/pkg/front_end/test/spell_checking_list_tests.txt +++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -838,6 +838,7 @@ unawaited unbreak uncaught +uncommitted uncompiled unconverted uncover
diff --git a/pkg/front_end/tool/format_cl.dart b/pkg/front_end/tool/format_cl.dart index f6622fa..c6fbb6b 100644 --- a/pkg/front_end/tool/format_cl.dart +++ b/pkg/front_end/tool/format_cl.dart
@@ -11,7 +11,8 @@ Future<void> main() async { Uri executable = getDartExecutable(); - final List<String> allChangedFiles = getChangedFiles(); + final List<String> allChangedFiles = + getChangedFiles(collectUncommitted: true); if (allChangedFiles.isEmpty) { print("No changes in CL."); return;
diff --git a/pkg/wasm_builder/lib/src/builder/function.dart b/pkg/wasm_builder/lib/src/builder/function.dart index 4fe8eca..77b5554 100644 --- a/pkg/wasm_builder/lib/src/builder/function.dart +++ b/pkg/wasm_builder/lib/src/builder/function.dart
@@ -15,16 +15,9 @@ FunctionBuilder(ModuleBuilder module, super.index, super.type, [super.functionName]) { - body = InstructionsBuilder(module, type.outputs); - for (ir.ValueType paramType in type.inputs) { - body.addLocal(paramType, isParameter: true); - } + body = InstructionsBuilder(module, type.inputs, type.outputs); } - /// Add a local variable to the function. - ir.Local addLocal(ir.ValueType type) => - body.addLocal(type, isParameter: false); - @override ir.DefinedFunction forceBuild() => ir.DefinedFunction(body.build(), finalizableIndex, type, functionName);
diff --git a/pkg/wasm_builder/lib/src/builder/global.dart b/pkg/wasm_builder/lib/src/builder/global.dart index b7b8749..d5d7f90 100644 --- a/pkg/wasm_builder/lib/src/builder/global.dart +++ b/pkg/wasm_builder/lib/src/builder/global.dart
@@ -10,7 +10,7 @@ GlobalBuilder(ModuleBuilder module, super.index, super.type, [super.globalName]) - : initializer = InstructionsBuilder(module, [type.type]); + : initializer = InstructionsBuilder(module, [], [type.type]); @override ir.DefinedGlobal forceBuild() =>
diff --git a/pkg/wasm_builder/lib/src/builder/instructions.dart b/pkg/wasm_builder/lib/src/builder/instructions.dart index ba4cd00..9b34531 100644 --- a/pkg/wasm_builder/lib/src/builder/instructions.dart +++ b/pkg/wasm_builder/lib/src/builder/instructions.dart
@@ -147,10 +147,14 @@ final Map<ir.Instruction, StackTrace>? _stackTraces; /// Create a new instruction sequence. - InstructionsBuilder(this.module, List<ir.ValueType> outputs) + InstructionsBuilder( + this.module, List<ir.ValueType> inputs, List<ir.ValueType> outputs) : _stackTraces = module.watchPoints.isNotEmpty ? {} : null, _sourceMappings = module.sourceMapUrl == null ? null : [] { _labelStack.add(Expression(const [], outputs)); + for (ir.ValueType paramType in inputs) { + _addParameter(paramType); + } } /// Whether the instruction sequence has been completed by the final `end`. @@ -173,10 +177,17 @@ } } - ir.Local addLocal(ir.ValueType type, {required bool isParameter}) { + ir.Local _addParameter(ir.ValueType type) { final local = ir.Local(locals.length, type); locals.add(local); - _localInitialized.add(isParameter || type.defaultable); + _localInitialized.add(true); + return local; + } + + ir.Local addLocal(ir.ValueType type) { + final local = ir.Local(locals.length, type); + locals.add(local); + _localInitialized.add(type.defaultable); return local; }
diff --git a/tools/VERSION b/tools/VERSION index a2fc125..4f2a1a3 100644 --- a/tools/VERSION +++ b/tools/VERSION
@@ -27,5 +27,5 @@ MAJOR 3 MINOR 6 PATCH 0 -PRERELEASE 104 +PRERELEASE 105 PRERELEASE_PATCH 0