summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/spec/gc/ref_cast.wast.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/wasm/spec/gc/ref_cast.wast.js')
-rw-r--r--js/src/jit-test/tests/wasm/spec/gc/ref_cast.wast.js279
1 files changed, 279 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/spec/gc/ref_cast.wast.js b/js/src/jit-test/tests/wasm/spec/gc/ref_cast.wast.js
new file mode 100644
index 0000000000..e5dcd20a95
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/spec/gc/ref_cast.wast.js
@@ -0,0 +1,279 @@
+/* Copyright 2021 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// ./test/core/gc/ref_cast.wast
+
+// ./test/core/gc/ref_cast.wast:3
+let $0 = instantiate(`(module
+ (type $$ft (func))
+ (type $$st (struct))
+ (type $$at (array i8))
+
+ (table 10 anyref)
+
+ (elem declare func $$f)
+ (func $$f)
+
+ (func (export "init") (param $$x externref)
+ (table.set (i32.const 0) (ref.null any))
+ (table.set (i32.const 1) (ref.i31 (i32.const 7)))
+ (table.set (i32.const 2) (struct.new_default $$st))
+ (table.set (i32.const 3) (array.new_default $$at (i32.const 0)))
+ (table.set (i32.const 4) (any.convert_extern (local.get $$x)))
+ (table.set (i32.const 5) (ref.null i31))
+ (table.set (i32.const 6) (ref.null struct))
+ (table.set (i32.const 7) (ref.null none))
+ )
+
+ (func (export "ref_cast_non_null") (param $$i i32)
+ (drop (ref.as_non_null (table.get (local.get $$i))))
+ (drop (ref.cast (ref null any) (table.get (local.get $$i))))
+ )
+ (func (export "ref_cast_null") (param $$i i32)
+ (drop (ref.cast anyref (table.get (local.get $$i))))
+ (drop (ref.cast structref (table.get (local.get $$i))))
+ (drop (ref.cast arrayref (table.get (local.get $$i))))
+ (drop (ref.cast i31ref (table.get (local.get $$i))))
+ (drop (ref.cast nullref (table.get (local.get $$i))))
+ )
+ (func (export "ref_cast_i31") (param $$i i32)
+ (drop (ref.cast (ref i31) (table.get (local.get $$i))))
+ (drop (ref.cast i31ref (table.get (local.get $$i))))
+ )
+ (func (export "ref_cast_struct") (param $$i i32)
+ (drop (ref.cast (ref struct) (table.get (local.get $$i))))
+ (drop (ref.cast structref (table.get (local.get $$i))))
+ )
+ (func (export "ref_cast_array") (param $$i i32)
+ (drop (ref.cast (ref array) (table.get (local.get $$i))))
+ (drop (ref.cast arrayref (table.get (local.get $$i))))
+ )
+)`);
+
+// ./test/core/gc/ref_cast.wast:49
+invoke($0, `init`, [externref(0)]);
+
+// ./test/core/gc/ref_cast.wast:51
+assert_trap(() => invoke($0, `ref_cast_non_null`, [0]), `null reference`);
+
+// ./test/core/gc/ref_cast.wast:52
+assert_return(() => invoke($0, `ref_cast_non_null`, [1]), []);
+
+// ./test/core/gc/ref_cast.wast:53
+assert_return(() => invoke($0, `ref_cast_non_null`, [2]), []);
+
+// ./test/core/gc/ref_cast.wast:54
+assert_return(() => invoke($0, `ref_cast_non_null`, [3]), []);
+
+// ./test/core/gc/ref_cast.wast:55
+assert_return(() => invoke($0, `ref_cast_non_null`, [4]), []);
+
+// ./test/core/gc/ref_cast.wast:56
+assert_trap(() => invoke($0, `ref_cast_non_null`, [5]), `null reference`);
+
+// ./test/core/gc/ref_cast.wast:57
+assert_trap(() => invoke($0, `ref_cast_non_null`, [6]), `null reference`);
+
+// ./test/core/gc/ref_cast.wast:58
+assert_trap(() => invoke($0, `ref_cast_non_null`, [7]), `null reference`);
+
+// ./test/core/gc/ref_cast.wast:60
+assert_return(() => invoke($0, `ref_cast_null`, [0]), []);
+
+// ./test/core/gc/ref_cast.wast:61
+assert_trap(() => invoke($0, `ref_cast_null`, [1]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:62
+assert_trap(() => invoke($0, `ref_cast_null`, [2]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:63
+assert_trap(() => invoke($0, `ref_cast_null`, [3]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:64
+assert_trap(() => invoke($0, `ref_cast_null`, [4]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:65
+assert_return(() => invoke($0, `ref_cast_null`, [5]), []);
+
+// ./test/core/gc/ref_cast.wast:66
+assert_return(() => invoke($0, `ref_cast_null`, [6]), []);
+
+// ./test/core/gc/ref_cast.wast:67
+assert_return(() => invoke($0, `ref_cast_null`, [7]), []);
+
+// ./test/core/gc/ref_cast.wast:69
+assert_trap(() => invoke($0, `ref_cast_i31`, [0]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:70
+assert_return(() => invoke($0, `ref_cast_i31`, [1]), []);
+
+// ./test/core/gc/ref_cast.wast:71
+assert_trap(() => invoke($0, `ref_cast_i31`, [2]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:72
+assert_trap(() => invoke($0, `ref_cast_i31`, [3]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:73
+assert_trap(() => invoke($0, `ref_cast_i31`, [4]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:74
+assert_trap(() => invoke($0, `ref_cast_i31`, [5]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:75
+assert_trap(() => invoke($0, `ref_cast_i31`, [6]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:76
+assert_trap(() => invoke($0, `ref_cast_i31`, [7]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:78
+assert_trap(() => invoke($0, `ref_cast_struct`, [0]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:79
+assert_trap(() => invoke($0, `ref_cast_struct`, [1]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:80
+assert_return(() => invoke($0, `ref_cast_struct`, [2]), []);
+
+// ./test/core/gc/ref_cast.wast:81
+assert_trap(() => invoke($0, `ref_cast_struct`, [3]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:82
+assert_trap(() => invoke($0, `ref_cast_struct`, [4]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:83
+assert_trap(() => invoke($0, `ref_cast_struct`, [5]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:84
+assert_trap(() => invoke($0, `ref_cast_struct`, [6]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:85
+assert_trap(() => invoke($0, `ref_cast_struct`, [7]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:87
+assert_trap(() => invoke($0, `ref_cast_array`, [0]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:88
+assert_trap(() => invoke($0, `ref_cast_array`, [1]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:89
+assert_trap(() => invoke($0, `ref_cast_array`, [2]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:90
+assert_return(() => invoke($0, `ref_cast_array`, [3]), []);
+
+// ./test/core/gc/ref_cast.wast:91
+assert_trap(() => invoke($0, `ref_cast_array`, [4]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:92
+assert_trap(() => invoke($0, `ref_cast_array`, [5]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:93
+assert_trap(() => invoke($0, `ref_cast_array`, [6]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:94
+assert_trap(() => invoke($0, `ref_cast_array`, [7]), `cast failure`);
+
+// ./test/core/gc/ref_cast.wast:99
+let $1 = instantiate(`(module
+ (type $$t0 (sub (struct)))
+ (type $$t1 (sub $$t0 (struct (field i32))))
+ (type $$t1' (sub $$t0 (struct (field i32))))
+ (type $$t2 (sub $$t1 (struct (field i32 i32))))
+ (type $$t2' (sub $$t1' (struct (field i32 i32))))
+ (type $$t3 (sub $$t0 (struct (field i32 i32))))
+ (type $$t0' (sub $$t0 (struct)))
+ (type $$t4 (sub $$t0' (struct (field i32 i32))))
+
+ (table 20 (ref null struct))
+
+ (func $$init
+ (table.set (i32.const 0) (struct.new_default $$t0))
+ (table.set (i32.const 10) (struct.new_default $$t0))
+ (table.set (i32.const 1) (struct.new_default $$t1))
+ (table.set (i32.const 11) (struct.new_default $$t1'))
+ (table.set (i32.const 2) (struct.new_default $$t2))
+ (table.set (i32.const 12) (struct.new_default $$t2'))
+ (table.set (i32.const 3) (struct.new_default $$t3))
+ (table.set (i32.const 4) (struct.new_default $$t4))
+ )
+
+ (func (export "test-sub")
+ (call $$init)
+
+ (drop (ref.cast (ref null $$t0) (ref.null struct)))
+ (drop (ref.cast (ref null $$t0) (table.get (i32.const 0))))
+ (drop (ref.cast (ref null $$t0) (table.get (i32.const 1))))
+ (drop (ref.cast (ref null $$t0) (table.get (i32.const 2))))
+ (drop (ref.cast (ref null $$t0) (table.get (i32.const 3))))
+ (drop (ref.cast (ref null $$t0) (table.get (i32.const 4))))
+
+ (drop (ref.cast (ref null $$t0) (ref.null struct)))
+ (drop (ref.cast (ref null $$t1) (table.get (i32.const 1))))
+ (drop (ref.cast (ref null $$t1) (table.get (i32.const 2))))
+
+ (drop (ref.cast (ref null $$t0) (ref.null struct)))
+ (drop (ref.cast (ref null $$t2) (table.get (i32.const 2))))
+
+ (drop (ref.cast (ref null $$t0) (ref.null struct)))
+ (drop (ref.cast (ref null $$t3) (table.get (i32.const 3))))
+
+ (drop (ref.cast (ref null $$t4) (table.get (i32.const 4))))
+
+ (drop (ref.cast (ref $$t0) (table.get (i32.const 0))))
+ (drop (ref.cast (ref $$t0) (table.get (i32.const 1))))
+ (drop (ref.cast (ref $$t0) (table.get (i32.const 2))))
+ (drop (ref.cast (ref $$t0) (table.get (i32.const 3))))
+ (drop (ref.cast (ref $$t0) (table.get (i32.const 4))))
+
+ (drop (ref.cast (ref $$t1) (table.get (i32.const 1))))
+ (drop (ref.cast (ref $$t1) (table.get (i32.const 2))))
+
+ (drop (ref.cast (ref $$t2) (table.get (i32.const 2))))
+
+ (drop (ref.cast (ref $$t3) (table.get (i32.const 3))))
+
+ (drop (ref.cast (ref $$t4) (table.get (i32.const 4))))
+ )
+
+ (func (export "test-canon")
+ (call $$init)
+
+ (drop (ref.cast (ref $$t0) (table.get (i32.const 0))))
+ (drop (ref.cast (ref $$t0) (table.get (i32.const 1))))
+ (drop (ref.cast (ref $$t0) (table.get (i32.const 2))))
+ (drop (ref.cast (ref $$t0) (table.get (i32.const 3))))
+ (drop (ref.cast (ref $$t0) (table.get (i32.const 4))))
+
+ (drop (ref.cast (ref $$t0) (table.get (i32.const 10))))
+ (drop (ref.cast (ref $$t0) (table.get (i32.const 11))))
+ (drop (ref.cast (ref $$t0) (table.get (i32.const 12))))
+
+ (drop (ref.cast (ref $$t1') (table.get (i32.const 1))))
+ (drop (ref.cast (ref $$t1') (table.get (i32.const 2))))
+
+ (drop (ref.cast (ref $$t1) (table.get (i32.const 11))))
+ (drop (ref.cast (ref $$t1) (table.get (i32.const 12))))
+
+ (drop (ref.cast (ref $$t2') (table.get (i32.const 2))))
+
+ (drop (ref.cast (ref $$t2) (table.get (i32.const 12))))
+ )
+)`);
+
+// ./test/core/gc/ref_cast.wast:185
+invoke($1, `test-sub`, []);
+
+// ./test/core/gc/ref_cast.wast:186
+invoke($1, `test-canon`, []);