| // META: global=window,dedicatedworker,jsshell,shadowrealm |
| // META: script=/wasm/jsapi/assertions.js |
| // META: script=/wasm/jsapi/wasm-module-builder.js |
| |
| test(() => { |
| const tag = new WebAssembly.Tag({ parameters: ["i32"] }); |
| const exn = new WebAssembly.Exception(tag, [42]); |
| const exn_same_payload = new WebAssembly.Exception(tag, [42]); |
| const exn_diff_payload = new WebAssembly.Exception(tag, [53]); |
| |
| const builder = new WasmModuleBuilder(); |
| const jsfuncIndex = builder.addImport("module", "jsfunc", kSig_v_v); |
| const tagIndex = builder.addImportedTag("module", "tag", kSig_v_i); |
| const imports = { |
| module: { |
| jsfunc: function() { throw exn; }, |
| tag: tag |
| } |
| }; |
| |
| builder |
| .addFunction("catch_rethrow", kSig_v_v) |
| .addBody([ |
| kExprTry, kWasmStmt, |
| kExprCallFunction, jsfuncIndex, |
| kExprCatch, tagIndex, |
| kExprDrop, |
| kExprRethrow, 0x00, |
| kExprEnd |
| ]) |
| .exportFunc(); |
| |
| builder |
| .addFunction("catch_all_rethrow", kSig_v_v) |
| .addBody([ |
| kExprTry, kWasmStmt, |
| kExprCallFunction, jsfuncIndex, |
| kExprCatchAll, |
| kExprRethrow, 0x00, |
| kExprEnd |
| ]) |
| .exportFunc(); |
| |
| const buffer = builder.toBuffer(); |
| WebAssembly.instantiate(buffer, imports).then(result => { |
| try { |
| result.instance.exports.catch_rethrow(); |
| } catch (e) { |
| assert_equals(e, exn); |
| assert_not_equals(e, exn_same_payload); |
| assert_not_equals(e, exn_diff_payload); |
| } |
| try { |
| result.instance.exports.catch_all_rethrow(); |
| } catch (e) { |
| assert_equals(e, exn); |
| assert_not_equals(e, exn_same_payload); |
| assert_not_equals(e, exn_diff_payload); |
| } |
| }); |
| }, "Identity check"); |