diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /js/src/jit-test/tests/wasm/gc/tables.js | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'js/src/jit-test/tests/wasm/gc/tables.js')
-rw-r--r-- | js/src/jit-test/tests/wasm/gc/tables.js | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/gc/tables.js b/js/src/jit-test/tests/wasm/gc/tables.js new file mode 100644 index 0000000000..e9c4e8f82e --- /dev/null +++ b/js/src/jit-test/tests/wasm/gc/tables.js @@ -0,0 +1,167 @@ +// |jit-test| skip-if: !wasmGcEnabled() + +// implicit null funcref value +{ + const { t, get } = wasmEvalText(`(module + (table (export "t") 3 funcref) + (func (export "get") (param i32) (result funcref) + (table.get (local.get 0)) + ) + )`).exports; + + assertEq(t.get(0), null); + assertEq(t.get(1), null); + assertEq(t.get(2), null); + assertEq(get(0), null); + assertEq(get(1), null); + assertEq(get(2), null); +} + +// explicit null funcref value +{ + const { t, get } = wasmEvalText(`(module + (table (export "t") 3 funcref (ref.null func)) + (func (export "get") (param i32) (result funcref) + (table.get (local.get 0)) + ) + )`).exports; + + assertEq(t.get(0), null); + assertEq(t.get(1), null); + assertEq(t.get(2), null); + assertEq(get(0), null); + assertEq(get(1), null); + assertEq(get(2), null); +} + +// actual funcref value +{ + const { t, get, foo } = wasmEvalText(`(module + (func $foo (export "foo")) + + (table (export "t") 3 funcref (ref.func $foo)) + (func (export "get") (param i32) (result funcref) + (table.get (local.get 0)) + ) + )`).exports; + + assertEq(t.get(0), foo); + assertEq(t.get(1), foo); + assertEq(t.get(2), foo); + assertEq(get(0), foo); + assertEq(get(1), foo); + assertEq(get(2), foo); +} + +// implicit null anyref value +{ + const { t, get } = wasmEvalText(`(module + (table (export "t") 3 anyref) + (func (export "get") (param i32) (result anyref) + (table.get (local.get 0)) + ) + )`).exports; + + assertEq(t.get(0), null); + assertEq(t.get(1), null); + assertEq(t.get(2), null); + assertEq(get(0), null); + assertEq(get(1), null); + assertEq(get(2), null); +} + +// explicit null anyref value +{ + const { t, get } = wasmEvalText(`(module + (table (export "t") 3 anyref (ref.null any)) + (func (export "get") (param i32) (result anyref) + (table.get (local.get 0)) + ) + )`).exports; + + assertEq(t.get(0), null); + assertEq(t.get(1), null); + assertEq(t.get(2), null); + assertEq(get(0), null); + assertEq(get(1), null); + assertEq(get(2), null); +} + +// actual anyref value +{ + const { t, get } = wasmEvalText(`(module + (type $s (struct)) + + (table (export "t") 3 anyref (struct.new $s)) + (func (export "get") (param i32) (result anyref) + (table.get (local.get 0)) + ) + )`).exports; + + assertEq(!!t.get(0), true); + assertEq(!!t.get(1), true); + assertEq(!!t.get(2), true); + assertEq(!!get(0), true); + assertEq(!!get(1), true); + assertEq(!!get(2), true); +} + +// implicit null externref value +{ + const { t, get } = wasmEvalText(`(module + (table (export "t") 3 externref) + (func (export "get") (param i32) (result externref) + (table.get (local.get 0)) + ) + )`).exports; + + assertEq(t.get(0), null); + assertEq(t.get(1), null); + assertEq(t.get(2), null); + assertEq(get(0), null); + assertEq(get(1), null); + assertEq(get(2), null); +} + +// explicit null externref value +{ + const { t, get } = wasmEvalText(`(module + (table (export "t") 3 externref (ref.null extern)) + (func (export "get") (param i32) (result externref) + (table.get (local.get 0)) + ) + )`).exports; + + assertEq(t.get(0), null); + assertEq(t.get(1), null); + assertEq(t.get(2), null); + assertEq(get(0), null); + assertEq(get(1), null); + assertEq(get(2), null); +} + +// actual externref value (from an imported global, which is visible to tables) +{ + const foo = "wowzers"; + const { t, get } = wasmEvalText(`(module + (global (import "" "foo") externref) + + (table (export "t") 3 externref (global.get 0)) + (func (export "get") (param i32) (result externref) + (table.get (local.get 0)) + ) + )`, { "": { "foo": foo } }).exports; + + assertEq(t.get(0), foo); + assertEq(t.get(1), foo); + assertEq(t.get(2), foo); + assertEq(get(0), foo); + assertEq(get(1), foo); + assertEq(get(2), foo); +} + +// non-imported globals come after tables and are therefore not visible +assertErrorMessage(() => wasmEvalText(`(module + (global anyref (ref.null any)) + (table 3 anyref (global.get 0)) +)`), WebAssembly.CompileError, /global.get index out of range/); |