Source code

Revision control

Copy as Markdown

Other Tools

// Tests for tag section support
load(libdir + "wasm-binary.js");
function wasmEval(code, imports) {
new WebAssembly.Instance(new WebAssembly.Module(code), imports).exports;
}
function wasmError(code, errorType, regexp) {
assertErrorMessage(() => wasmEval(code, {}), errorType, regexp);
}
const emptyType = { args: [], ret: VoidCode };
const badExnType = { args: [], ret: I32Code };
wasmEvalText(`
(module
(type (func (param i32)))
(tag $exn (type 0)))
`);
wasmError(
moduleWithSections([
sigSection([emptyType]),
memorySection(0),
{ name: tagId, body: [] },
]),
WebAssembly.CompileError,
/expected number of tags/
);
wasmError(
moduleWithSections([
sigSection([emptyType]),
memorySection(0),
{ name: tagId, body: [1, 1] },
]),
WebAssembly.CompileError,
/illegal tag kind/
);
wasmError(
moduleWithSections([
sigSection([emptyType]),
memorySection(0),
{ name: tagId, body: [1, 0] },
]),
WebAssembly.CompileError,
/expected function index in tag/
);
wasmEval(
moduleWithSections([
sigSection([emptyType]),
memorySection(0),
tagSection([{ type: 0 }]),
])
);
wasmError(
moduleWithSections([
sigSection([badExnType]),
memorySection(0),
tagSection([{ type: 0 }]),
]),
WebAssembly.CompileError,
/tag function types must not return anything/
);
wasmError(
moduleWithSections([
sigSection([emptyType]),
memorySection(0),
tagSection([{ type: 1 }]),
]),
WebAssembly.CompileError,
/function type index in tag out of bounds/
);
wasmError(
moduleWithSections([
sigSection([emptyType]),
tagSection([{ type: 0 }]),
memorySection(0),
]),
WebAssembly.CompileError,
/expected custom section/
);
(() => {
const body = [1];
body.push(...string("mod"));
body.push(...string("exn"));
body.push(...varU32(TagCode));
wasmError(
moduleWithSections([
sigSection([emptyType]),
{ name: importId, body: body },
]),
WebAssembly.CompileError,
/expected tag kind/
);
body.push(...varU32(0));
wasmError(
moduleWithSections([
sigSection([emptyType]),
{ name: importId, body: body },
]),
WebAssembly.CompileError,
/expected function index in tag/
);
body.push(...varU32(1));
wasmError(
moduleWithSections([
sigSection([emptyType]),
{ name: importId, body: body },
]),
WebAssembly.CompileError,
/function type index in tag out of bounds/
);
})();
wasmEval(
moduleWithSections([
sigSection([emptyType]),
memorySection(0),
tagSection([{ type: 0 }]),
exportSection([{ tagIndex: 0, name: "exn" }]),
])
);
wasmError(
moduleWithSections([
sigSection([emptyType]),
memorySection(0),
tagSection([{ type: 0 }]),
exportSection([{ tagIndex: 1, name: "exn" }]),
]),
WebAssembly.CompileError,
/exported tag index out of bounds/
);
(() => {
const body = [1];
body.push(...string("exn"));
body.push(...varU32(TagCode));
wasmError(
moduleWithSections([
sigSection([emptyType]),
memorySection(0),
tagSection([{ type: 0 }]),
{ name: exportId, body: body },
]),
WebAssembly.CompileError,
/expected tag index/
);
})();