summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/exnref
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-12 05:43:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-12 05:43:14 +0000
commit8dd16259287f58f9273002717ec4d27e97127719 (patch)
tree3863e62a53829a84037444beab3abd4ed9dfc7d0 /js/src/jit-test/tests/wasm/exnref
parentReleasing progress-linux version 126.0.1-1~progress7.99u1. (diff)
downloadfirefox-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.js261
-rw-r--r--js/src/jit-test/tests/wasm/exnref/try-table.js53
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));
+ }
+}