Source code

Revision control

Copy as Markdown

Other Tools

// |jit-test| skip-if: !wasmCustomPageSizesEnabled()
load(libdir + "wasm-binary.js");
wasmValidateText(`(module
(memory 0 1 (pagesize 1))
)
`);
wasmValidateText(`(module
(memory 0 1 (pagesize 65536))
)
`);
// Missing page size.
assertErrorMessage(() => wasmEvalBinary(moduleWithSections([ {name:memoryId, body:[0x01, 0x08, 0x00]} ])), WebAssembly.CompileError, /failed to decode custom page size/);
// Too many bytes after page size.
assertErrorMessage(() => wasmEvalBinary(moduleWithSections([ {name:memoryId, body:[0x01, 0x08, 0x00, 0x10, 0x01]} ])), WebAssembly.CompileError, /byte size mismatch in memory section/);
// Tables shouldn't have page sizes.
assertErrorMessage(() => wasmEvalBinary(moduleWithSections([ {name:tableId, body:[0x01, FuncRefCode, 0x08, 0x00, 0x10]} ])), WebAssembly.CompileError, /unexpected bits set in flags: 8/);
function checkInvalidPageSize(pageSize) {
assertErrorMessage(() => wasmValidateText(`(module
(memory 0 1 (pagesize ${pageSize}))
)`),
WebAssembly.CompileError, /bad custom page size/);
}
checkInvalidPageSize(8);
checkInvalidPageSize(128);
checkInvalidPageSize(131072);
wasmValidateText(`(module
(memory 0 65536 (pagesize 1))
)
`);
wasmValidateText(`(module
(memory i32 0 65536 (pagesize 65536))
)
`);
wasmValidateText(`(module
(memory i32 0 4_294_967_295 (pagesize 1))
)
`);
wasmValidateText(`(module
(memory i64 0 4_294_967_296 (pagesize 1))
)
`);
wasmValidateText(`(module
(memory i64 0 9_007_199_254_740_991 (pagesize 1))
)
`);
function maxPageCount(pageSize) {
if (pageSize === 1)
return 0xffffffff;
return 1 << (32 - Math.log2(pageSize));
}
function maxPageCount64(pageSize) {
if (pageSize === 1)
return BigInt(Number.MAX_SAFE_INTEGER);
return (1n << (53n - BigInt(Math.log2(pageSize)))) - 1n;
}
function checkPageCount(pageSize, pageCount) {
function check() {
return wasmValidateText(`(module
(memory 0 ${pageCount} (pagesize ${pageSize}))
)`);
}
if (pageCount <= maxPageCount(pageSize))
check();
else if (pageCount > 0xffffffff) {
// In this case, a u64 is encoded instead of a u32 and a decoding
// error raises this exception.
assertErrorMessage(check, WebAssembly.CompileError,
/expected maximum length/);
}
else
assertErrorMessage(check, WebAssembly.CompileError,
/maximum memory size too big/);
}
function checkPageCount64(pageSize, pageCount) {
function check() {
return wasmValidateText(`(module
(memory i64 0 ${pageCount} (pagesize ${pageSize}))
)`);
}
if (pageCount <= maxPageCount64(pageSize))
check();
else {
assertErrorMessage(check, WebAssembly.CompileError,
/maximum memory size too big/);
}
}
for (pageSize of [1, 65536])
for (pageCount of [0, 1, 42, maxPageCount(pageSize)-1,
maxPageCount(pageSize),
maxPageCount(pageSize)+1,
0xffffffff])
checkPageCount(pageSize, pageCount);
for (pageSize of [1, 65536])
for (pageCount of [0n, 1n, 42n, maxPageCount64(pageSize)-1n,
maxPageCount64(pageSize),
maxPageCount64(pageSize)+1n])
checkPageCount64(pageSize, pageCount);