| // 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"); |