blob: a8a5bd2ba4466d8dc91a5bff5d914a2dac8a2868 [file] [log] [blame]
import * as assert from '../assert.js';
import Builder from '../Builder.js';
{
function makeImport() {
const tbl = new WebAssembly.Table({initial:2, element:"externref"});
const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder())
.Type().End()
.Import()
.Table("imp", "tbl", {initial: 2, element: "externref"})
.End()
.Function().End()
.Export()
.Function("set_tbl")
.Function("get_tbl")
.Function("tbl_is_null")
.Function("set_tbl_null")
.Table("tbl", 0)
.End()
.Code()
.Function("set_tbl", { params: ["externref"], ret: "void" })
.I32Const(0)
.GetLocal(0)
.TableSet(0)
.End()
.Function("get_tbl", { params: [], ret: "externref" })
.I32Const(0)
.TableGet(0)
.End()
.Function("tbl_is_null", { params: [], ret: "i32" })
.Call(1)
.RefIsNull()
.End()
.Function("set_tbl_null", { params: [], ret: "void" })
.RefNull("externref")
.Call(0)
.End()
.End().WebAssembly().get()), { imp: { tbl }});
fullGC()
return $1
}
const $1 = makeImport()
fullGC()
assert.eq($1.exports.get_tbl(), undefined)
assert.eq($1.exports.tbl_is_null(), 0)
$1.exports.set_tbl("hi")
fullGC()
assert.eq($1.exports.get_tbl(), "hi")
assert.eq($1.exports.tbl_is_null(), 0)
assert.eq($1.exports.tbl.get(0), "hi")
assert.eq($1.exports.tbl.get(1), undefined)
$1.exports.tbl.set(0, { test: "test" });
fullGC()
assert.eq($1.exports.get_tbl().test, "test")
assert.eq($1.exports.tbl.grow(10), 2)
assert.eq($1.exports.tbl.grow(0), 12)
assert.eq($1.exports.get_tbl().test, "test")
fullGC()
assert.eq($1.exports.get_tbl().test, "test")
}
{
function makeImport() {
const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder())
.Type().End()
.Import()
.Table("imp", "tbl", {initial: 2, element: "externref"})
.End()
.Function().End()
.Export()
.Function("set_tbl")
.Function("get_tbl")
.Function("tbl_is_null")
.Function("set_tbl_null")
.Table("tbl", 0)
.End()
.Code()
.Function("set_tbl", { params: ["externref"], ret: "void" })
.I32Const(0)
.GetLocal(0)
.TableSet(0)
.End()
.Function("get_tbl", { params: [], ret: "externref" })
.I32Const(0)
.TableGet(0)
.End()
.Function("tbl_is_null", { params: [], ret: "i32" })
.Call(1)
.RefIsNull()
.End()
.Function("set_tbl_null", { params: [], ret: "void" })
.RefNull("externref")
.Call(0)
.End()
.End().WebAssembly().get()), { imp: { tbl: new WebAssembly.Table({initial:2, element:"externref"}) }});
fullGC()
$1.exports.tbl.set(0, { test: "test" });
const $2 = new WebAssembly.Instance(new WebAssembly.Module((new Builder())
.Type().End()
.Import()
.Table("imp", "tbl", {initial: 2, element: "externref"})
.End()
.Function().End()
.Export()
.Function("set_tbl")
.Function("get_tbl")
.Function("tbl_is_null")
.Function("set_tbl_null")
.Table("tbl", 0)
.End()
.Code()
.Function("set_tbl", { params: ["externref"], ret: "void" })
.I32Const(0)
.GetLocal(0)
.TableSet(0)
.End()
.Function("get_tbl", { params: [], ret: "externref" })
.I32Const(0)
.TableGet(0)
.End()
.Function("tbl_is_null", { params: [], ret: "i32" })
.Call(1)
.RefIsNull()
.End()
.Function("set_tbl_null", { params: [], ret: "void" })
.RefNull("externref")
.Call(0)
.End()
.End().WebAssembly().get()), { imp: { tbl: $1.exports.tbl }});
fullGC()
return $2
}
const $1 = makeImport()
fullGC()
assert.eq($1.exports.get_tbl().test, "test")
assert.eq($1.exports.tbl_is_null(), 0)
$1.exports.set_tbl("hi")
fullGC()
assert.eq($1.exports.get_tbl(), "hi")
assert.eq($1.exports.tbl_is_null(), 0)
assert.eq($1.exports.tbl.get(0), "hi")
assert.eq($1.exports.tbl.get(1), undefined)
$1.exports.tbl.set(0, { test: "test" });
fullGC()
assert.eq($1.exports.get_tbl().test, "test")
assert.eq($1.exports.tbl.grow(10), 2)
assert.eq($1.exports.tbl.grow(0), 12)
assert.eq($1.exports.get_tbl().test, "test")
fullGC()
assert.eq($1.exports.get_tbl().test, "test")
}
{
let tbl = new WebAssembly.Table({initial:1, element:"externref"});
function doSet(i, v) {
tbl.set(i, { test: v });
}
function makeGarbage(depth) {
let garbage = { val: "hi", val2: 5, arr: [] }
for (let i=0; i<100; ++i) garbage.arr += ({ field: i })
if (depth < 5)
return 1 + makeGarbage(depth + 1);
return 0;
}
for (let iter=0; iter<5; ++iter) {
for (let k=0; k<100; ++k)
tbl = new WebAssembly.Table({initial:100, element:"externref"})
for (let i=1; i<20; ++i) {
const len = tbl.length;
for (let j=0; j<len; ++j)
doSet(j, j);
makeGarbage(0);
tbl.grow(Math.pow(2,i));
for (let j=0; j<len; ++j)
assert.eq(tbl.get(j).test, j);
for (let j=0; j<tbl.length; ++j)
doSet(j, -j);
}
}
}
{
const tbl = new WebAssembly.Table({initial:2, element:"funcref"});
const mod = new WebAssembly.Module((new Builder())
.Type().End()
.Import()
.Table("imp", "tbl", {initial: 2, element: "externref"})
.End()
.Function().End()
.Export()
.End()
.Code()
.End().WebAssembly().get())
assert.throws(() => new WebAssembly.Instance(mod, { imp: { tbl }}), Error, "Table import imp:tbl provided a 'type' that is wrong (evaluating 'new WebAssembly.Instance(mod, { imp: { tbl }})')");
}
{
const tbl = new WebAssembly.Table({initial:2, element:"funcref"});
const mod = new WebAssembly.Module((new Builder())
.Type().End()
.Import()
.Table("imp", "tbl", {initial: 2, element: "externref"})
.End()
.Function().End()
.Export()
.End()
.Code()
.End().WebAssembly().get())
assert.throws(() => new WebAssembly.Instance(mod, { imp: { tbl }}), Error, "Table import imp:tbl provided a 'type' that is wrong (evaluating 'new WebAssembly.Instance(mod, { imp: { tbl }})')");
}