import Builder from '../Builder.js' import * as assert from '../assert.js' { const count = 1000; const signature = []; for (let i = 0; i < count; ++i) signature.push("i32"); let builder = new Builder() .Type() .End() .Import() .Function("imp", "f1", {params:signature, ret:"void"}) .Function("imp", "f2", {params:signature, ret:"void"}) .End() .Function().End() .Export() .Function("foo") .End() .Code() .Function("foo", {params: signature, ret: "void" }); for (let i = 0; i < count; ++i) builder = builder.GetLocal(i); builder = builder.Call(0); for (let i = count; i--; ) builder = builder.GetLocal(i); builder = builder.Call(1).Return().End().End(); let calledF1 = false; let calledF2 = false; function f1(...args) { calledF1 = true; let realArgs = [...args, ...args]; return end(...realArgs); } noInline(f1); function end() {} noInline(end); function f2(...args) { calledF2 = true; let called = false; assert.eq(args.length, count); for (let i = 0; i < args.length; ++i) { assert.eq(args[i], args.length - i - 1); } } noInline(f2); let instance = new WebAssembly.Instance(new WebAssembly.Module(builder.WebAssembly().get()), {imp: {f1, f2}}); const args = []; for (let i = 0; i < count; ++i) args.push(i); for (let i = 0; i < 50; ++i) { instance.exports.foo(...args); assert.eq(calledF1, true); assert.eq(calledF2, true); calledF1 = false; calledF2 = false; } }