Source code

Revision control

Copy as Markdown

Other Tools

// Test changes to the WebAssembly.Table API by reference-types
function assertTableFilled(table, length, element) {
assertEq(table.length, length);
for (let i = 0; i < length; i++) {
assertEq(table.get(i), element);
}
}
const tableLength = 10;
// Test table constructor can accept a default value to fill elements to
for (let value of WasmExternrefValues) {
let table = new WebAssembly.Table({'element': 'externref', initial: tableLength}, value);
assertTableFilled(table, tableLength, value);
}
for (let value of WasmFuncrefValues) {
let table = new WebAssembly.Table({'element': 'anyfunc', initial: tableLength}, value);
assertTableFilled(table, tableLength, value);
}
// Test not specifying default value in constructor yields 'undefined' for externref
{
let table = new WebAssembly.Table({'element': 'externref', initial: tableLength});
assertTableFilled(table, tableLength, undefined);
}
// Test not specifying default value in constructor yields 'null' for funcref
{
let table = new WebAssembly.Table({'element': 'anyfunc', initial: tableLength});
assertTableFilled(table, tableLength, null);
}
// Test omitting the value in table set defaults to undefined for externref and
// null for funcref.
{
let t = new WebAssembly.Table({element:"externref", initial: 1});
// Clear out initial value
t.set(0, '');
// Set with an omitted value
t.set(0);
// Assert the omitted value is undefined
assertEq(t.get(0), undefined);
}
{
let t = new WebAssembly.Table({element:"anyfunc", initial: 1});
// Clear out initial value
t.set(0, WasmFuncrefValues[0]);
// Set with an omitted value
t.set(0);
// Assert the omitted value is null
assertEq(t.get(0), null);
}
// Test table grow. There is an optional fill argument that defaults to
// undefined with externref, and null with funcref.
{
let t = new WebAssembly.Table({element:"externref", initial:0});
t.grow(1);
assertEq(t.get(t.length-1), undefined);
let prev = undefined;
for (let v of WasmExternrefValues) {
t.grow(2, v);
assertEq(t.get(t.length-3), prev);
assertEq(t.get(t.length-2), v);
assertEq(t.get(t.length-1), v);
prev = v;
}
}
{
let t = new WebAssembly.Table({element:"anyfunc", initial:0});
t.grow(1);
assertEq(t.get(t.length-1), null);
let prev = null;
for (let v of WasmFuncrefValues) {
t.grow(2, v);
assertEq(t.get(t.length-3), prev);
assertEq(t.get(t.length-2), v);
assertEq(t.get(t.length-1), v);
prev = v;
}
}
// If growing by zero elements there are no spurious writes
{
let t = new WebAssembly.Table({element:"externref", initial:1});
t.set(0, 1337);
t.grow(0, 1789);
assertEq(t.get(0), 1337);
}