diff options
Diffstat (limited to 'js/src/jit-test/tests/wasm/exnref/casting.js')
-rw-r--r-- | js/src/jit-test/tests/wasm/exnref/casting.js | 110 |
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); |