| //@ skip if $memoryLimited |
| |
| import Builder from '../Builder.js'; |
| import * as assert from '../assert.js'; |
| |
| function escape(){} |
| noInline(escape); |
| |
| for (let i = 0; i < 10; ++i) { |
| const max = 1024*2; |
| const memoryDescription = {initial: 0, maximum: max}; |
| const growMemoryAmount = 256; |
| |
| const builder = (new Builder()) |
| .Type().End() |
| .Import() |
| .Function("imp", "func", {params: [], ret: "void"}) |
| .Memory("imp", "memory", memoryDescription) |
| .End() |
| .Function().End() |
| .Export() |
| .Function("foo") |
| .End() |
| .Code() |
| .Function("foo", {params: [], ret: "i32"}) |
| .I32Const(1) |
| .I32Const(1) |
| .I32Const(1) |
| .I32Const(1) |
| .I32Const(1) |
| .I32Const(1) |
| .I32Const(1) |
| .I32Const(1) |
| .I32Const(1) |
| .I32Const(1) |
| .I32Const(1) |
| .I32Const(1) |
| .I32Const(1) |
| .I32Const(1) |
| .I32Const(1) |
| .I32Const(1) |
| .Call(2) |
| .I32Const(growMemoryAmount) |
| .GrowMemory(0) |
| .Return() |
| .End() |
| .Function("bar", {params: ["i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32"], ret: "void"}) |
| .Call(0) |
| .Return() |
| .End() |
| .End(); |
| |
| const bin = builder.WebAssembly().get(); |
| const module = new WebAssembly.Module(bin); |
| const memory = new WebAssembly.Memory(memoryDescription); |
| |
| function func() { } |
| |
| const instance = new WebAssembly.Instance(module, {imp: {memory, func}}); |
| for (let i = 0; i < max/growMemoryAmount; ++i) { |
| instance.exports.foo(); |
| } |
| } |