import Builder from '../Builder.js';
import * as assert from '../assert.js';


const tableDescription = {initial: 1, element: "funcref"};
const builder = new Builder()
    .Type().End()
    .Import()
        .Table("imp", "table", tableDescription)
    .End()
    .Function().End()
    .Element()
        .Element({tableIndex: 0, offset: 0, functionIndices: [0]})
    .End()
    .Code()
        .Function("foo", {params: ["i32"], ret: "i32"})
            .GetLocal(0)
            .I32Const(42)
            .I32Add()
            .Return()
        .End()
    .End();

const bin = builder.WebAssembly().get();
const module = new WebAssembly.Module(bin);
const table = new WebAssembly.Table(tableDescription);
new WebAssembly.Instance(module, {imp: {table}});
const foo = table.get(0);
const objs = [];
for (let i = 0; i < 10000; i++) {
    objs.push(new String("foo"));
    if (foo(20) !== 20 + 42)
        throw new Error("bad!!!");
}
