// META: global=window,dedicatedworker,jsshell // META: script=/wasm/jsapi/wasm-module-builder.js let exports = {}; setup(() => { const builder = new WasmModuleBuilder(); const structIndex = builder.addStruct([makeField(kWasmI32, true)]); const arrayIndex = builder.addArray(kWasmI32, true); const structIndex2 = builder.addStruct([makeField(kWasmF32, true)]); const arrayIndex2 = builder.addArray(kWasmF32, true); const funcIndex = builder.addType({ params: [], results: [] }); const funcIndex2 = builder.addType({ params: [], results: [kWasmI32] }); const argFunctions = [ { name: "any", code: kWasmAnyRef }, { name: "eq", code: kWasmEqRef }, { name: "struct", code: kWasmStructRef }, { name: "array", code: kWasmArrayRef }, { name: "i31", code: kWasmI31Ref }, { name: "func", code: kWasmFuncRef }, { name: "extern", code: kWasmExternRef }, { name: "none", code: kWasmNullRef }, { name: "nofunc", code: kWasmNullFuncRef }, { name: "noextern", code: kWasmNullExternRef }, { name: "concreteStruct", code: structIndex }, { name: "concreteArray", code: arrayIndex }, { name: "concreteFunc", code: funcIndex }, ]; for (const desc of argFunctions) { builder .addFunction(desc.name + "Arg", makeSig_v_x(wasmRefType(desc.code))) .addBody([]) .exportFunc(); builder .addFunction(desc.name + "NullableArg", makeSig_v_x(wasmRefNullType(desc.code))) .addBody([]) .exportFunc(); } builder .addFunction("makeStruct", makeSig_r_v(wasmRefType(structIndex))) .addBody([...wasmI32Const(42), ...GCInstr(kExprStructNew), structIndex]) .exportFunc(); builder .addFunction("makeArray", makeSig_r_v(wasmRefType(arrayIndex))) .addBody([...wasmI32Const(5), ...wasmI32Const(42), ...GCInstr(kExprArrayNew), arrayIndex]) .exportFunc(); builder .addFunction("makeStruct2", makeSig_r_v(wasmRefType(structIndex2))) .addBody([...wasmF32Const(42), ...GCInstr(kExprStructNew), structIndex2]) .exportFunc(); builder .addFunction("makeArray2", makeSig_r_v(wasmRefType(arrayIndex2))) .addBody([...wasmF32Const(42), ...wasmI32Const(5), ...GCInstr(kExprArrayNew), arrayIndex2]) .exportFunc(); builder .addFunction("testFunc", funcIndex) .addBody([]) .exportFunc(); builder .addFunction("testFunc2", funcIndex2) .addBody([...wasmI32Const(42)]) .exportFunc(); const buffer = builder.toBuffer(); const module = new WebAssembly.Module(buffer); const instance = new WebAssembly.Instance(module, {}); exports = instance.exports; }); test(() => { exports.anyArg(exports.makeStruct()); exports.anyArg(exports.makeArray()); exports.anyArg(42); exports.anyArg(42n); exports.anyArg("foo"); exports.anyArg({}); exports.anyArg(() => {}); exports.anyArg(exports.testFunc); assert_throws_js(TypeError, () => exports.anyArg(null)); exports.anyNullableArg(null); exports.anyNullableArg(exports.makeStruct()); exports.anyNullableArg(exports.makeArray()); exports.anyNullableArg(42); exports.anyNullableArg(42n); exports.anyNullableArg("foo"); exports.anyNullableArg({}); exports.anyNullableArg(() => {}); exports.anyNullableArg(exports.testFunc); }, "anyref casts"); test(() => { exports.eqArg(exports.makeStruct()); exports.eqArg(exports.makeArray()); exports.eqArg(42); assert_throws_js(TypeError, () => exports.eqArg(42n)); assert_throws_js(TypeError, () => exports.eqArg("foo")); assert_throws_js(TypeError, () => exports.eqArg({})); assert_throws_js(TypeError, () => exports.eqArg(exports.testFunc)); assert_throws_js(TypeError, () => exports.eqArg(() => {})); assert_throws_js(TypeError, () => exports.eqArg(null)); exports.eqNullableArg(null); exports.eqNullableArg(exports.makeStruct()); exports.eqNullableArg(exports.makeArray()); exports.eqNullableArg(42); assert_throws_js(TypeError, () => exports.eqNullableArg(42n)); assert_throws_js(TypeError, () => exports.eqNullableArg("foo")); assert_throws_js(TypeError, () => exports.eqNullableArg({})); assert_throws_js(TypeError, () => exports.eqNullableArg(exports.testFunc)); assert_throws_js(TypeError, () => exports.eqNullableArg(() => {})); }, "eqref casts"); test(() => { exports.structArg(exports.makeStruct()); assert_throws_js(TypeError, () => exports.structArg(exports.makeArray())); assert_throws_js(TypeError, () => exports.structArg(42)); assert_throws_js(TypeError, () => exports.structArg(42n)); assert_throws_js(TypeError, () => exports.structArg("foo")); assert_throws_js(TypeError, () => exports.structArg({})); assert_throws_js(TypeError, () => exports.structArg(exports.testFunc)); assert_throws_js(TypeError, () => exports.structArg(() => {})); assert_throws_js(TypeError, () => exports.structArg(null)); exports.structNullableArg(null); exports.structNullableArg(exports.makeStruct()); assert_throws_js(TypeError, () => exports.structNullableArg(exports.makeArray())); assert_throws_js(TypeError, () => exports.structNullableArg(42)); assert_throws_js(TypeError, () => exports.structNullableArg(42n)); assert_throws_js(TypeError, () => exports.structNullableArg("foo")); assert_throws_js(TypeError, () => exports.structNullableArg({})); assert_throws_js(TypeError, () => exports.structNullableArg(exports.testFunc)); assert_throws_js(TypeError, () => exports.structNullableArg(() => {})); }, "structref casts"); test(() => { exports.arrayArg(exports.makeArray()); assert_throws_js(TypeError, () => exports.arrayArg(exports.makeStruct())); assert_throws_js(TypeError, () => exports.arrayArg(42)); assert_throws_js(TypeError, () => exports.arrayArg(42n)); assert_throws_js(TypeError, () => exports.arrayArg("foo")); assert_throws_js(TypeError, () => exports.arrayArg({})); assert_throws_js(TypeError, () => exports.arrayArg(exports.testFunc)); assert_throws_js(TypeError, () => exports.arrayArg(() => {})); assert_throws_js(TypeError, () => exports.arrayArg(null)); exports.arrayNullableArg(null); exports.arrayNullableArg(exports.makeArray()); assert_throws_js(TypeError, () => exports.arrayNullableArg(exports.makeStruct())); assert_throws_js(TypeError, () => exports.arrayNullableArg(42)); assert_throws_js(TypeError, () => exports.arrayNullableArg(42n)); assert_throws_js(TypeError, () => exports.arrayNullableArg("foo")); assert_throws_js(TypeError, () => exports.arrayNullableArg({})); assert_throws_js(TypeError, () => exports.arrayNullableArg(exports.testFunc)); assert_throws_js(TypeError, () => exports.arrayNullableArg(() => {})); }, "arrayref casts"); test(() => { exports.i31Arg(42); assert_throws_js(TypeError, () => exports.i31Arg(exports.makeStruct())); assert_throws_js(TypeError, () => exports.i31Arg(exports.makeArray())); assert_throws_js(TypeError, () => exports.i31Arg(42n)); assert_throws_js(TypeError, () => exports.i31Arg("foo")); assert_throws_js(TypeError, () => exports.i31Arg({})); assert_throws_js(TypeError, () => exports.i31Arg(exports.testFunc)); assert_throws_js(TypeError, () => exports.i31Arg(() => {})); assert_throws_js(TypeError, () => exports.i31Arg(null)); exports.i31NullableArg(null); exports.i31NullableArg(42); assert_throws_js(TypeError, () => exports.i31NullableArg(exports.makeStruct())); assert_throws_js(TypeError, () => exports.i31NullableArg(exports.makeArray())); assert_throws_js(TypeError, () => exports.i31NullableArg(42n)); assert_throws_js(TypeError, () => exports.i31NullableArg("foo")); assert_throws_js(TypeError, () => exports.i31NullableArg({})); assert_throws_js(TypeError, () => exports.i31NullableArg(exports.testFunc)); assert_throws_js(TypeError, () => exports.i31NullableArg(() => {})); }, "i31ref casts"); test(() => { exports.funcArg(exports.testFunc); assert_throws_js(TypeError, () => exports.funcArg(exports.makeStruct())); assert_throws_js(TypeError, () => exports.funcArg(exports.makeArray())); assert_throws_js(TypeError, () => exports.funcArg(42)); assert_throws_js(TypeError, () => exports.funcArg(42n)); assert_throws_js(TypeError, () => exports.funcArg("foo")); assert_throws_js(TypeError, () => exports.funcArg({})); assert_throws_js(TypeError, () => exports.funcArg(() => {})); assert_throws_js(TypeError, () => exports.funcArg(null)); exports.funcNullableArg(null); exports.funcNullableArg(exports.testFunc); assert_throws_js(TypeError, () => exports.funcNullableArg(exports.makeStruct())); assert_throws_js(TypeError, () => exports.funcNullableArg(exports.makeArray())); assert_throws_js(TypeError, () => exports.funcNullableArg(42)); assert_throws_js(TypeError, () => exports.funcNullableArg(42n)); assert_throws_js(TypeError, () => exports.funcNullableArg("foo")); assert_throws_js(TypeError, () => exports.funcNullableArg({})); assert_throws_js(TypeError, () => exports.funcNullableArg(() => {})); }, "funcref casts"); test(() => { exports.externArg(exports.makeArray()); exports.externArg(exports.makeStruct()); exports.externArg(42); exports.externArg(42n); exports.externArg("foo"); exports.externArg({}); exports.externArg(exports.testFunc); exports.externArg(() => {}); assert_throws_js(TypeError, () => exports.externArg(null)); exports.externNullableArg(null); exports.externNullableArg(exports.makeArray()); exports.externNullableArg(exports.makeStruct()); exports.externNullableArg(42); exports.externNullableArg(42n); exports.externNullableArg("foo"); exports.externNullableArg({}); exports.externNullableArg(exports.testFunc); exports.externNullableArg(() => {}); }, "externref casts"); test(() => { for (const nullfunc of [exports.noneArg, exports.nofuncArg, exports.noexternArg]) { assert_throws_js(TypeError, () => nullfunc(exports.makeStruct())); assert_throws_js(TypeError, () => nullfunc(exports.makeArray())); assert_throws_js(TypeError, () => nullfunc(42)); assert_throws_js(TypeError, () => nullfunc(42n)); assert_throws_js(TypeError, () => nullfunc("foo")); assert_throws_js(TypeError, () => nullfunc({})); assert_throws_js(TypeError, () => nullfunc(exports.testFunc)); assert_throws_js(TypeError, () => nullfunc(() => {})); assert_throws_js(TypeError, () => nullfunc(null)); } for (const nullfunc of [exports.noneNullableArg, exports.nofuncNullableArg, exports.noexternNullableArg]) { nullfunc(null); assert_throws_js(TypeError, () => nullfunc(exports.makeStruct())); assert_throws_js(TypeError, () => nullfunc(exports.makeArray())); assert_throws_js(TypeError, () => nullfunc(42)); assert_throws_js(TypeError, () => nullfunc(42n)); assert_throws_js(TypeError, () => nullfunc("foo")); assert_throws_js(TypeError, () => nullfunc({})); assert_throws_js(TypeError, () => nullfunc(exports.testFunc)); assert_throws_js(TypeError, () => nullfunc(() => {})); } }, "null casts"); test(() => { exports.concreteStructArg(exports.makeStruct()); assert_throws_js(TypeError, () => exports.concreteStructArg(exports.makeStruct2())); assert_throws_js(TypeError, () => exports.concreteStructArg(exports.makeArray())); assert_throws_js(TypeError, () => exports.concreteStructArg(42)); assert_throws_js(TypeError, () => exports.concreteStructArg(42n)); assert_throws_js(TypeError, () => exports.concreteStructArg("foo")); assert_throws_js(TypeError, () => exports.concreteStructArg({})); assert_throws_js(TypeError, () => exports.concreteStructArg(exports.testFunc)); assert_throws_js(TypeError, () => exports.concreteStructArg(() => {})); assert_throws_js(TypeError, () => exports.concreteStructArg(null)); exports.concreteStructNullableArg(null); exports.concreteStructNullableArg(exports.makeStruct()); assert_throws_js(TypeError, () => exports.concreteStructNullableArg(exports.makeStruct2())); assert_throws_js(TypeError, () => exports.concreteStructNullableArg(exports.makeArray())); assert_throws_js(TypeError, () => exports.concreteStructNullableArg(42)); assert_throws_js(TypeError, () => exports.concreteStructNullableArg(42n)); assert_throws_js(TypeError, () => exports.concreteStructNullableArg("foo")); assert_throws_js(TypeError, () => exports.concreteStructNullableArg({})); assert_throws_js(TypeError, () => exports.concreteStructNullableArg(exports.testFunc)); assert_throws_js(TypeError, () => exports.concreteStructNullableArg(() => {})); }, "concrete struct casts"); test(() => { exports.concreteArrayArg(exports.makeArray()); assert_throws_js(TypeError, () => exports.concreteArrayArg(exports.makeArray2())); assert_throws_js(TypeError, () => exports.concreteArrayArg(exports.makeStruct())); assert_throws_js(TypeError, () => exports.concreteArrayArg(42)); assert_throws_js(TypeError, () => exports.concreteArrayArg(42n)); assert_throws_js(TypeError, () => exports.concreteArrayArg("foo")); assert_throws_js(TypeError, () => exports.concreteArrayArg({})); assert_throws_js(TypeError, () => exports.concreteArrayArg(exports.testFunc)); assert_throws_js(TypeError, () => exports.concreteArrayArg(() => {})); assert_throws_js(TypeError, () => exports.concreteArrayArg(null)); exports.concreteArrayNullableArg(null); exports.concreteArrayNullableArg(exports.makeArray()); assert_throws_js(TypeError, () => exports.concreteArrayNullableArg(exports.makeArray2())); assert_throws_js(TypeError, () => exports.concreteArrayNullableArg(exports.makeStruct())); assert_throws_js(TypeError, () => exports.concreteArrayNullableArg(42)); assert_throws_js(TypeError, () => exports.concreteArrayNullableArg(42n)); assert_throws_js(TypeError, () => exports.concreteArrayNullableArg("foo")); assert_throws_js(TypeError, () => exports.concreteArrayNullableArg({})); assert_throws_js(TypeError, () => exports.concreteArrayNullableArg(exports.testFunc)); assert_throws_js(TypeError, () => exports.concreteArrayNullableArg(() => {})); }, "concrete array casts"); test(() => { exports.concreteFuncArg(exports.testFunc); assert_throws_js(TypeError, () => exports.concreteFuncArg(exports.testFunc2)); assert_throws_js(TypeError, () => exports.concreteFuncArg(exports.makeArray())); assert_throws_js(TypeError, () => exports.concreteFuncArg(exports.makeStruct())); assert_throws_js(TypeError, () => exports.concreteFuncArg(42)); assert_throws_js(TypeError, () => exports.concreteFuncArg(42n)); assert_throws_js(TypeError, () => exports.concreteFuncArg("foo")); assert_throws_js(TypeError, () => exports.concreteFuncArg({})); assert_throws_js(TypeError, () => exports.concreteFuncArg(() => {})); assert_throws_js(TypeError, () => exports.concreteFuncArg(null)); exports.concreteFuncNullableArg(null); exports.concreteFuncNullableArg(exports.testFunc); assert_throws_js(TypeError, () => exports.concreteFuncNullableArg(exports.testFunc2)); assert_throws_js(TypeError, () => exports.concreteFuncNullableArg(exports.makeArray())); assert_throws_js(TypeError, () => exports.concreteFuncNullableArg(exports.makeStruct())); assert_throws_js(TypeError, () => exports.concreteFuncNullableArg(42)); assert_throws_js(TypeError, () => exports.concreteFuncNullableArg(42n)); assert_throws_js(TypeError, () => exports.concreteFuncNullableArg("foo")); assert_throws_js(TypeError, () => exports.concreteFuncNullableArg({})); assert_throws_js(TypeError, () => exports.concreteFuncNullableArg(() => {})); }, "concrete func casts");