summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/exnref/casting.js
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /js/src/jit-test/tests/wasm/exnref/casting.js
parentInitial commit. (diff)
downloadfirefox-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/exnref/casting.js')
-rw-r--r--js/src/jit-test/tests/wasm/exnref/casting.js110
1 files changed, 110 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/exnref/casting.js b/js/src/jit-test/tests/wasm/exnref/casting.js
new file mode 100644
index 0000000000..fa433fc152
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/exnref/casting.js
@@ -0,0 +1,110 @@
+// |jit-test| skip-if: !wasmGcEnabled()
+
+const {
+ refCast,
+ refTest,
+ branch,
+ branchFail,
+ refCastNullable,
+ refTestNullable,
+ branchNullable,
+ branchFailNullable,
+} = wasmEvalText(`(module
+ (tag $a)
+ (func $make (param $null i32) (result exnref)
+ (if (local.get $null)
+ (then
+ (return (ref.null exn))
+ )
+ )
+
+ try_table (catch_all_ref 0)
+ throw $a
+ end
+ unreachable
+ )
+
+ (func (export "refCast") (param $null i32)
+ (call $make (local.get $null))
+ ref.cast (ref exn)
+ drop
+ )
+ (func (export "refTest") (param $null i32) (result i32)
+ (call $make (local.get $null))
+ ref.test (ref exn)
+ )
+ (func (export "branch") (param $null i32) (result i32)
+ (block (result (ref exn))
+ (call $make (local.get $null))
+ br_on_cast 0 exnref (ref exn)
+ drop
+ (return (i32.const 0))
+ )
+ drop
+ (return (i32.const 1))
+ )
+ (func (export "branchFail") (param $null i32) (result i32)
+ (block (result exnref)
+ (call $make (local.get $null))
+ br_on_cast_fail 0 exnref (ref exn)
+ drop
+ (return (i32.const 1))
+ )
+ drop
+ (return (i32.const 0))
+ )
+
+ (func (export "refCastNullable") (param $null i32)
+ (call $make (local.get $null))
+ ref.cast exnref
+ drop
+ )
+ (func (export "refTestNullable") (param $null i32) (result i32)
+ (call $make (local.get $null))
+ ref.test exnref
+ )
+ (func (export "branchNullable") (param $null i32) (result i32)
+ (block (result exnref)
+ (call $make (local.get $null))
+ br_on_cast 0 exnref exnref
+ drop
+ (return (i32.const 0))
+ )
+ drop
+ (return (i32.const 1))
+ )
+ (func (export "branchFailNullable") (param $null i32) (result i32)
+ (block (result exnref)
+ (call $make (local.get $null))
+ br_on_cast_fail 0 exnref exnref
+ drop
+ (return (i32.const 1))
+ )
+ drop
+ (return (i32.const 0))
+ )
+)`).exports;
+
+// cast non-null exnref -> (ref exn)
+refCast(0);
+assertEq(refTest(0), 1);
+assertEq(branch(0), 1);
+assertEq(branchFail(0), 1);
+
+// cast non-null exnref -> exnref
+refCastNullable(0);
+assertEq(refTestNullable(0), 1);
+assertEq(branchNullable(0), 1);
+assertEq(branchFailNullable(0), 1);
+
+// cast null exnref -> (ref exn)
+assertErrorMessage(() => refCast(1), WebAssembly.RuntimeError, /bad cast/);
+assertEq(refTest(1), 0);
+assertEq(branch(1), 0);
+assertEq(branchFail(1), 0);
+
+// cast null exnref -> exnref
+refCastNullable(1);
+assertEq(refTestNullable(1), 1);
+assertEq(branchNullable(1), 1);
+assertEq(branchFailNullable(1), 1);