import Builder from '../Builder.js' import * as assert from '../assert.js' const pageSize = 64 * 1024; const numPages = 10; { const builder = (new Builder()) .Type().End() .Import() .Memory("imp", "mem", {initial: numPages}) .Function("imp", "func", { params: ["i32"] }) .End() .Function().End() .Export().Function("foo").End() .Code() .Function("foo", {params: ["i32", "i32"]}) .GetLocal(0) .I32Const(0) .I32Eq() .If("void", b => b.GetLocal(1) .GetLocal(0) .I32Store(2, 0) .Br(0) .Else() .GetLocal(0) .Call(0) .Br(0) ) .End() .End(); const bin = builder.WebAssembly().get(); const module = new WebAssembly.Module(bin); const imp = { imp: { mem: new WebAssembly.Memory({initial: numPages}), func: continuation } }; const foo = new WebAssembly.Instance(module, imp).exports.foo; const address = numPages*pageSize + 1; function continuation(x) { foo(x - 1, address); } for (let i = 0; i < 5000; i++) assert.throws(() => foo(6, address), WebAssembly.RuntimeError, "Out of bounds memory access"); }