Skip to content

Commit

Permalink
[js-api] Tidy up rethrow identity test
Browse files Browse the repository at this point in the history
This makes some cosmetic changes to the identity-preserving `rethrow`
test added in WebAssembly#253. This is to prepare for adding the same set of tests
for a Wasm-defined-and-exported tag, as requrested in
WebAssembly#253 (comment).
  • Loading branch information
aheejin committed Feb 17, 2023
1 parent 0e8b841 commit 04a6ed7
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 24 deletions.
53 changes: 31 additions & 22 deletions test/js-api/exception/identity.tentative.any.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,59 +3,68 @@
// 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);

// Tag defined in JavaScript and imported into Wasm
const jsTag = new WebAssembly.Tag({ parameters: ["i32"] });
const jsTagIndex = builder.addImportedTag("module", "jsTag", kSig_v_i)
const jsTagExn = new WebAssembly.Exception(jsTag, [42]);
const jsTagExnSamePayload = new WebAssembly.Exception(jsTag, [42]);
const jsTagExnDiffPayload = new WebAssembly.Exception(jsTag, [53]);
const throwJSTagExnIndex = builder.addImport("module", "throwJSTagExn", kSig_v_v);

const imports = {
module: {
jsfunc: function() { throw exn; },
tag: tag
throwJSTagExn: function() { throw jsTagExn; },
jsTag: jsTag
}
};

builder
.addFunction("catch_rethrow", kSig_v_v)
.addFunction("catch_js_tag_rethrow", kSig_v_v)
.addBody([
kExprTry, kWasmStmt,
kExprCallFunction, jsfuncIndex,
kExprCatch, tagIndex,
kExprCallFunction, throwJSTagExnIndex,
kExprCatch, jsTagIndex,
kExprDrop,
kExprRethrow, 0x00,
kExprEnd
])
.exportFunc();

builder
.addFunction("catch_all_rethrow", kSig_v_v)
.addFunction("catch_all_js_tag_rethrow", kSig_v_v)
.addBody([
kExprTry, kWasmStmt,
kExprCallFunction, jsfuncIndex,
kExprCallFunction, throwJSTagExnIndex,
kExprCatchAll,
kExprRethrow, 0x00,
kExprEnd
])
.exportFunc();

const buffer = builder.toBuffer();

// The exception object's identity should be preserved throw 'rethrow's in
// Wasm code. Do tests with a tag defined in JS.
WebAssembly.instantiate(buffer, imports).then(result => {
try {
result.instance.exports.catch_rethrow();
result.instance.exports.catch_js_tag_rethrow();
} catch (e) {
assert_equals(e, exn);
assert_not_equals(e, exn_same_payload);
assert_not_equals(e, exn_diff_payload);
assert_equals(e, jsTagExn);
assert_equals(e.getArg(jsTag, 0), jsTagExn.getArg(jsTag, 0));
// Even if they have the same payload, they are different objects, so they
// shouldn't compare equal.
assert_not_equals(e, jsTagExnSamePayload);
assert_not_equals(e, jsTagExnDiffPayload);
}
try {
result.instance.exports.catch_all_rethrow();
result.instance.exports.catch_all_js_tag_rethrow();
} catch (e) {
assert_equals(e, exn);
assert_not_equals(e, exn_same_payload);
assert_not_equals(e, exn_diff_payload);
assert_equals(e, jsTagExn);
assert_equals(e.getArg(jsTag, 0), jsTagExn.getArg(jsTag, 0));
assert_not_equals(e, jsTagExnSamePayload);
assert_not_equals(e, jsTagExnDiffPayload);
}
});
}, "Identity check");
4 changes: 2 additions & 2 deletions test/js-api/wasm-module-builder.js
Original file line number Diff line number Diff line change
Expand Up @@ -754,9 +754,9 @@ class WasmModuleBuilder {

addTag(type) {
let type_index = (typeof type) == "number" ? type : this.addType(type);
let except_index = this.tags.length + this.num_imported_tags;
let tag_index = this.tags.length + this.num_imported_tags;
this.tags.push(type_index);
return except_index;
return tag_index;
}

addFunction(name, type) {
Expand Down

0 comments on commit 04a6ed7

Please sign in to comment.