diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-06-12 05:43:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-06-12 05:43:14 +0000 |
commit | 8dd16259287f58f9273002717ec4d27e97127719 (patch) | |
tree | 3863e62a53829a84037444beab3abd4ed9dfc7d0 /js/src/jit-test/tests/wasm/exnref | |
parent | Releasing progress-linux version 126.0.1-1~progress7.99u1. (diff) | |
download | firefox-8dd16259287f58f9273002717ec4d27e97127719.tar.xz firefox-8dd16259287f58f9273002717ec4d27e97127719.zip |
Merging upstream version 127.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'js/src/jit-test/tests/wasm/exnref')
-rw-r--r-- | js/src/jit-test/tests/wasm/exnref/casting.js | 261 | ||||
-rw-r--r-- | js/src/jit-test/tests/wasm/exnref/try-table.js | 53 |
2 files changed, 228 insertions, 86 deletions
diff --git a/js/src/jit-test/tests/wasm/exnref/casting.js b/js/src/jit-test/tests/wasm/exnref/casting.js index fa433fc152..20fbd145fe 100644 --- a/js/src/jit-test/tests/wasm/exnref/casting.js +++ b/js/src/jit-test/tests/wasm/exnref/casting.js @@ -1,110 +1,199 @@ // |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)) +// Test exnref +{ + 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 - ) + 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)) + (func (export "refCast") (param $null i32) (call $make (local.get $null)) - br_on_cast 0 exnref (ref exn) + ref.cast (ref exn) drop - (return (i32.const 0)) ) - drop - (return (i32.const 1)) - ) - (func (export "branchFail") (param $null i32) (result i32) - (block (result exnref) + (func (export "refTest") (param $null i32) (result i32) (call $make (local.get $null)) - br_on_cast_fail 0 exnref (ref exn) + 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)) ) - drop - (return (i32.const 0)) - ) + (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) + (func (export "refCastNullable") (param $null i32) (call $make (local.get $null)) - br_on_cast 0 exnref exnref + ref.cast exnref drop - (return (i32.const 0)) ) - drop - (return (i32.const 1)) - ) - (func (export "branchFailNullable") (param $null i32) (result i32) - (block (result exnref) + (func (export "refTestNullable") (param $null i32) (result i32) (call $make (local.get $null)) - br_on_cast_fail 0 exnref exnref + 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)) ) - drop - (return (i32.const 0)) - ) -)`).exports; + (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 -> (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 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); +} + + +// Test nullexnref +{ + const { + refCastNull, + refCastNonNull, + refTestNull, + refTestNonNull, + branchNull, + branchNonNull, + branchFailNull, + branchFailNonNull, + } = wasmEvalText(`(module + (func (export "refCastNull") + ref.null noexn + ref.cast nullexnref + drop + ) + (func (export "refCastNonNull") + ref.null noexn + ref.cast (ref noexn) + drop + ) + (func (export "refTestNull") (result i32) + ref.null noexn + ref.test nullexnref + ) + (func (export "refTestNonNull") (result i32) + ref.null noexn + ref.test (ref noexn) + ) + (func (export "branchNull") (result i32) + (block (result nullexnref) + ref.null noexn + br_on_cast 0 exnref nullexnref + drop + (return (i32.const 0)) + ) + drop + (return (i32.const 1)) + ) + (func (export "branchNonNull") (result i32) + (block (result (ref noexn)) + ref.null noexn + br_on_cast 0 exnref (ref noexn) + drop + (return (i32.const 0)) + ) + drop + (return (i32.const 1)) + ) + (func (export "branchFailNull") (result i32) + (block (result exnref) + ref.null noexn + br_on_cast_fail 0 exnref (ref noexn) + drop + (return (i32.const 1)) + ) + drop + (return (i32.const 0)) + ) + (func (export "branchFailNonNull") (result i32) + (block (result (ref exn)) + ref.null noexn + br_on_cast_fail 0 exnref (ref null noexn) + drop + (return (i32.const 1)) + ) + drop + (return (i32.const 0)) + ) + )`).exports; -// cast null exnref -> (ref exn) -assertErrorMessage(() => refCast(1), WebAssembly.RuntimeError, /bad cast/); -assertEq(refTest(1), 0); -assertEq(branch(1), 0); -assertEq(branchFail(1), 0); + // null exceptions can be casted to nullexnref + refCastNull(); + assertEq(refTestNull(), 1); + assertEq(branchNull(), 1); + assertEq(branchFailNull(), 0); -// cast null exnref -> exnref -refCastNullable(1); -assertEq(refTestNullable(1), 1); -assertEq(branchNullable(1), 1); -assertEq(branchFailNullable(1), 1); + // null exceptions cannot be casted to (ref noexn) + assertErrorMessage(() => refCastNonNull(), WebAssembly.RuntimeError, /bad cast/); + assertEq(refTestNonNull(), 0); + assertEq(branchNonNull(), 0); + assertEq(branchFailNonNull(), 1); +} diff --git a/js/src/jit-test/tests/wasm/exnref/try-table.js b/js/src/jit-test/tests/wasm/exnref/try-table.js index c89330917c..407d6db133 100644 --- a/js/src/jit-test/tests/wasm/exnref/try-table.js +++ b/js/src/jit-test/tests/wasm/exnref/try-table.js @@ -382,3 +382,56 @@ } } } + +// WebAssembly.JSTag property is read-only and enumerable +WebAssembly.JSTag = null; +assertEq(WebAssembly.JSTag !== null, true); +assertEq(WebAssembly.propertyIsEnumerable('JSTag'), true); + +// Test try_table catching JS exceptions and unpacking them using JSTag +{ + let tag = WebAssembly.JSTag; + let values = [...WasmExternrefValues]; + function throwJS(value) { + throw value; + } + let {test} = wasmEvalText(`(module + (import "" "tag" (tag $tag (param externref))) + (import "" "throwJS" (func $throwJS (param externref))) + (func (export "test") (param externref) (result externref) + try_table (catch $tag 0) + local.get 0 + call $throwJS + end + unreachable + ) + )`, {"": {tag, throwJS}}).exports; + + for (let value of values) { + assertEq(value, test(value)); + } +} + +// Test try_table catching JS exceptions using JSTag and unpacking them using JSTag +{ + let tag = WebAssembly.JSTag; + let values = [...WasmExternrefValues]; + function throwJS(value) { + throw new WebAssembly.Exception(tag, [value]); + } + let {test} = wasmEvalText(`(module + (import "" "tag" (tag $tag (param externref))) + (import "" "throwJS" (func $throwJS (param externref))) + (func (export "test") (param externref) (result externref) + try_table (catch $tag 0) + local.get 0 + call $throwJS + end + unreachable + ) + )`, {"": {tag, throwJS}}).exports; + + for (let value of values) { + assertEq(value, test(value)); + } +} |