61 lines
1.7 KiB
JavaScript
61 lines
1.7 KiB
JavaScript
// 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");
|