blob: 8e3ba4a378fa0def34d6e750031668d7ed39ea5c [file] [edit]
//@ skip if $addressBits <= 32
import { instantiate } from "../wabt-wrapper.js";
import * as assert from "../assert.js";
let wat = `
(module
(memory i64 1)
(table $tbl i64 100 externref)
(table $tbl2 i64 100 externref)
(table $tblFunc i64 100 funcref)
(table $tblGrow i64 1 funcref)
(func $f (result i32) i32.const 42)
(elem $element funcref (ref.func $f))
(func $tableGet (export "tableGet") (param $index i64) (result externref)
(local.get $index)
(table.get $tbl)
)
(func $tableSet (export "tableSet") (param $index i64) (param $value externref)
(local.get $index)
(local.get $value)
(table.set $tbl)
)
(func $tableFill (export "tableFill") (param $offset i64) (param $count i64)
(local.get $offset)
(ref.null extern)
(local.get $count)
(table.fill $tbl)
)
(func $tableCopy (export "tableCopy") (param $dst i64) (param $src i64) (param $len i64)
(local.get $dst)
(local.get $src)
(local.get $len)
(table.copy $tbl2 $tbl)
)
(func $tableInit (export "tableInit") (param $dst i64) (param $src i32) (param $len i32)
(local.get $dst)
(local.get $src)
(local.get $len)
(table.init $tblFunc $element)
)
(func $tableGrow (export "tableGrow") (param $delta i64) (result i64)
(ref.null func)
(local.get $delta)
(table.grow $tblGrow)
)
(func $tableGrowSize (export "tableGrowSize") (result i64)
(table.size $tblGrow)
)
)`;
const oob = "Out of bounds table access";
const twoPow32 = 0x1_0000_0000n;
function test(exports) {
const { tableGet, tableSet, tableFill, tableCopy, tableInit, tableGrow, tableGrowSize } = exports;
assert.throws(() => tableGet(twoPow32 + 5n), WebAssembly.RuntimeError, oob);
assert.throws(() => tableGet(twoPow32 + 100n), WebAssembly.RuntimeError, oob);
assert.throws(() => tableSet(twoPow32 + 5n, "x"), WebAssembly.RuntimeError, oob);
assert.eq(tableGet(5n), null);
assert.throws(() => tableFill(twoPow32, 1n), WebAssembly.RuntimeError, oob);
assert.throws(() => tableFill(0n, twoPow32 + 1n), WebAssembly.RuntimeError, oob);
assert.eq(tableGet(0n), null);
assert.throws(() => tableCopy(twoPow32, 0n, 1n), WebAssembly.RuntimeError, oob);
assert.throws(() => tableCopy(0n, twoPow32, 1n), WebAssembly.RuntimeError, oob);
assert.throws(() => tableCopy(0n, 0n, twoPow32 + 1n), WebAssembly.RuntimeError, oob);
assert.throws(() => tableInit(twoPow32, 0, 1), WebAssembly.RuntimeError, oob);
const badGrow = tableGrow(twoPow32 + 5n);
assert.eq(badGrow, -1n);
assert.eq(tableGrowSize(), 1n);
}
const instance = await instantiate(wat, {}, {memory64: true});
for (let i = 0; i < wasmTestLoopCount; i++)
test(instance.exports);