| import * as assert from '../assert.js'; |
| import Builder from '../Builder.js'; |
| |
| async function test() { |
| const loopDepth = 100; |
| const numCompilations = 1; |
| const numVars = 30; |
| const params = []; |
| params.length = numVars; |
| params.fill("i32"); |
| |
| let builder = (new Builder()) |
| .Type().End() |
| .Import() |
| .Memory("imp", "memory", { initial: 0 }) |
| .End() |
| .Function().End() |
| .Export() |
| .Function("foo") |
| .End() |
| .Code() |
| .Function("foo", { params, ret: "i32" }); |
| |
| const makeLoop = (builder, depth) => { |
| if (depth === 0) |
| return builder; |
| |
| builder = builder |
| .Loop("i32", (b) => { |
| b.GetLocal(0) |
| .I32Const(1) |
| .I32Sub() |
| .TeeLocal(0) |
| .GetLocal(0) |
| .I32Eqz() |
| .BrIf(1); |
| |
| return makeLoop(b, depth - 1).Br(0); |
| }); |
| return builder; |
| } |
| |
| builder = makeLoop(builder, loopDepth); |
| builder = builder.End().End(); |
| |
| const bin = builder.WebAssembly().get(); |
| const memory = new WebAssembly.Memory({ initial: 0 }); |
| const importObject = { "imp": { "memory": memory } }; |
| |
| // Compile a bunch of instances in parallel. |
| let compilations = []; |
| for (let i = 0; i < numCompilations; ++i) { |
| compilations.push(WebAssembly.instantiate(bin, importObject)); |
| } |
| |
| let [inst] = await Promise.all(compilations); |
| let module = inst.module; |
| |
| // Compile a bunch of instances from modules in parallel. |
| compilations = []; |
| for (let i = 0; i < numCompilations; ++i) { |
| compilations.push(WebAssembly.instantiate(module, importObject)); |
| } |
| |
| await Promise.all(compilations); |
| |
| // Compile an instance from a module in parallel, have sync compilation steal it. |
| compilations = []; |
| compilations.push(WebAssembly.instantiate(module, importObject)); |
| inst = new WebAssembly.Instance(module, importObject); |
| |
| await Promise.all(compilations); |
| } |
| |
| assert.asyncTest(test()); |