print_origin("generate_memory_init.js");
function mem_test(instruction, expected_result_vector) {
print(
`
(module
(memory (export "memory0") 1 1)
(data (i32.const 2) "\\03\\01\\04\\01")
(data "\\02\\07\\01\\08")
(data (i32.const 12) "\\07\\05\\02\\03\\06")
(data "\\05\\09\\02\\07\\06")
(func (export "test")
${instruction})
(func (export "load8_u") (param i32) (result i32)
(i32.load8_u (local.get 0))))
(invoke "test")
`);
for (let i = 0; i < expected_result_vector.length; i++) {
print(`(assert_return (invoke "load8_u" (i32.const ${i})) (i32.const ${expected_result_vector[i]}))`);
}
}
const e = 0;
mem_test("(nop)",
[e,e,3,1,4, 1,e,e,e,e, e,e,7,5,2, 3,6,e,e,e, e,e,e,e,e, e,e,e,e,e]);
mem_test("(memory.init 1 (i32.const 7) (i32.const 0) (i32.const 4))",
[e,e,3,1,4, 1,e,2,7,1, 8,e,7,5,2, 3,6,e,e,e, e,e,e,e,e, e,e,e,e,e]);
mem_test("(memory.init 3 (i32.const 15) (i32.const 1) (i32.const 3))",
[e,e,3,1,4, 1,e,e,e,e, e,e,7,5,2, 9,2,7,e,e, e,e,e,e,e, e,e,e,e,e]);
mem_test(`(memory.init 1 (i32.const 7) (i32.const 0) (i32.const 4))
(data.drop 1)
(memory.init 3 (i32.const 15) (i32.const 1) (i32.const 3))
(data.drop 3)
(memory.copy (i32.const 20) (i32.const 15) (i32.const 5))
(memory.copy (i32.const 21) (i32.const 29) (i32.const 1))
(memory.copy (i32.const 24) (i32.const 10) (i32.const 1))
(memory.copy (i32.const 13) (i32.const 11) (i32.const 4))
(memory.copy (i32.const 19) (i32.const 20) (i32.const 5))`,
[e,e,3,1,4, 1,e,2,7,1, 8,e,7,e,7, 5,2,7,e,9, e,7,e,8,8, e,e,e,e,e]);
let PREAMBLE =
`(memory 1)
(data "\\37")`;
print(
`(assert_invalid
(module
(func (export "test")
(data.drop 0)))
"unknown data segment")
`);
print(
`(assert_invalid
(module
${PREAMBLE}
(func (export "test")
(data.drop 4)))
"unknown data segment")
`);
print(
`(module
${PREAMBLE}
(func (export "test")
(data.drop 0)
(data.drop 0)))
(invoke "test")
`);
print(
`(module
${PREAMBLE}
(func (export "test")
(data.drop 0)
(memory.init 0 (i32.const 1234) (i32.const 1) (i32.const 1))))
(assert_trap (invoke "test") "out of bounds memory access")
`);
print(
`(module
(memory 1)
(data (i32.const 0) "\\37")
(func (export "test")
(memory.init 0 (i32.const 1234) (i32.const 1) (i32.const 1))))
(assert_trap (invoke "test") "out of bounds memory access")
`);
print(
`(assert_invalid
(module
(func (export "test")
(memory.init 1 (i32.const 1234) (i32.const 1) (i32.const 1))))
"unknown memory 0")
`);
print(
`(assert_invalid
(module
${PREAMBLE}
(func (export "test")
(memory.init 1 (i32.const 1234) (i32.const 1) (i32.const 1))))
"unknown data segment 1")
`);
print(
`(module
${PREAMBLE}
(func (export "test")
(memory.init 0 (i32.const 1) (i32.const 0) (i32.const 1))
(memory.init 0 (i32.const 1) (i32.const 0) (i32.const 1))))
(invoke "test")
`);
print(
`(module
${PREAMBLE}
(func (export "test")
(memory.init 0 (i32.const 1234) (i32.const 0) (i32.const 5))))
(assert_trap (invoke "test") "out of bounds memory access")
`);
print(
`(module
${PREAMBLE}
(func (export "test")
(memory.init 0 (i32.const 1234) (i32.const 2) (i32.const 3))))
(assert_trap (invoke "test") "out of bounds memory access")
`);
print(
`(module
${PREAMBLE}
(func (export "test")
(memory.init 0 (i32.const 0xFFFE) (i32.const 1) (i32.const 3))))
(assert_trap (invoke "test") "out of bounds memory access")
`);
print(
`(module
${PREAMBLE}
(func (export "test")
(memory.init 0 (i32.const 1234) (i32.const 4) (i32.const 0))))
(assert_trap (invoke "test") "out of bounds memory access")
`);
print(
`(module
${PREAMBLE}
(func (export "test")
(memory.init 0 (i32.const 1234) (i32.const 1) (i32.const 0))))
(invoke "test")
`);
print(
`(module
${PREAMBLE}
(func (export "test")
(memory.init 0 (i32.const 0x10001) (i32.const 0) (i32.const 0))))
(assert_trap (invoke "test") "out of bounds memory access")
`);
print(
`(module
${PREAMBLE}
(func (export "test")
(memory.init 0 (i32.const 0x10000) (i32.const 0) (i32.const 0))))
(invoke "test")
`);
print(
`(module
${PREAMBLE}
(func (export "test")
(memory.init 0 (i32.const 0x10000) (i32.const 1) (i32.const 0))))
(invoke "test")
`);
print(
`(module
${PREAMBLE}
(func (export "test")
(memory.init 0 (i32.const 0x10001) (i32.const 4) (i32.const 0))))
(assert_trap (invoke "test") "out of bounds memory access")
`);
{
const tys = ['i32', 'f32', 'i64', 'f64'];
for (let ty1 of tys) {
for (let ty2 of tys) {
for (let ty3 of tys) {
if (ty1 == 'i32' && ty2 == 'i32' && ty3 == 'i32')
continue; print(
`(assert_invalid
(module
${PREAMBLE}
(func (export "test")
(memory.init 0 (${ty1}.const 1) (${ty2}.const 1) (${ty3}.const 1))))
"type mismatch")
`);
}}}
}
const mem_init_len = 16;
function mem_init(min, max, shared, backup, write) {
print(
`(module
(memory ${min} ${max} ${shared})
(data "\\42\\42\\42\\42\\42\\42\\42\\42\\42\\42\\42\\42\\42\\42\\42\\42")
${checkRangeCode()}
(func (export "run") (param $offs i32) (param $len i32)
(memory.init 0 (local.get $offs) (i32.const 0) (local.get $len))))
`);
let offs = min*PAGESIZE - backup;
print(
`(assert_trap (invoke "run" (i32.const ${offs}) (i32.const ${write}))
"out of bounds memory access")
`);
checkRange(0, min, 0);
}
mem_init(1, 1, "", Math.floor(mem_init_len/2), mem_init_len);
mem_init(1, 1, "", Math.floor(mem_init_len/2)+1, mem_init_len);
if (WITH_SHARED_MEMORY) {
mem_init(2, 4, "shared", Math.floor(mem_init_len/2), mem_init_len);
mem_init(2, 4, "shared", Math.floor(mem_init_len/2)+1, mem_init_len);
}
mem_init(1, 1, "", mem_init_len*4, mem_init_len*2-2);
mem_init(1, 1, "", mem_init_len*4-1, mem_init_len*2-1);
if (WITH_SHARED_MEMORY) {
mem_init(2, 4, "shared", mem_init_len*4, mem_init_len*2-2);
mem_init(2, 4, "shared", mem_init_len*4-1, mem_init_len*2-1);
}
mem_init(1, "", "", Math.floor(mem_init_len/2), 0xFFFFFF00);
mem_init(1, "", "", PAGESIZE, 0xFFFFFFFC);
print(
`
(module
(memory 1)
;; 65 data segments. 64 is the smallest positive number that is encoded
;; differently as a signed LEB.
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "")
(func (memory.init 64 (i32.const 0) (i32.const 0) (i32.const 0))))`)