diff options
Diffstat (limited to 'js/src/jit-test/tests/wasm/spec/gc/ref_test.wast.js')
-rw-r--r-- | js/src/jit-test/tests/wasm/spec/gc/ref_test.wast.js | 470 |
1 files changed, 470 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/spec/gc/ref_test.wast.js b/js/src/jit-test/tests/wasm/spec/gc/ref_test.wast.js new file mode 100644 index 0000000000..fc0f2c0a4c --- /dev/null +++ b/js/src/jit-test/tests/wasm/spec/gc/ref_test.wast.js @@ -0,0 +1,470 @@ +/* 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_test.wast + +// ./test/core/gc/ref_test.wast:3 +let $0 = instantiate(`(module + (type $$ft (func)) + (type $$st (struct)) + (type $$at (array i8)) + + (table $$ta 10 anyref) + (table $$tf 10 funcref) + (table $$te 10 externref) + + (elem declare func $$f) + (func $$f) + + (func (export "init") (param $$x externref) + (table.set $$ta (i32.const 0) (ref.null any)) + (table.set $$ta (i32.const 1) (ref.null struct)) + (table.set $$ta (i32.const 2) (ref.null none)) + (table.set $$ta (i32.const 3) (ref.i31 (i32.const 7))) + (table.set $$ta (i32.const 4) (struct.new_default $$st)) + (table.set $$ta (i32.const 5) (array.new_default $$at (i32.const 0))) + (table.set $$ta (i32.const 6) (any.convert_extern (local.get $$x))) + (table.set $$ta (i32.const 7) (any.convert_extern (ref.null extern))) + + (table.set $$tf (i32.const 0) (ref.null nofunc)) + (table.set $$tf (i32.const 1) (ref.null func)) + (table.set $$tf (i32.const 2) (ref.func $$f)) + + (table.set $$te (i32.const 0) (ref.null noextern)) + (table.set $$te (i32.const 1) (ref.null extern)) + (table.set $$te (i32.const 2) (local.get $$x)) + (table.set $$te (i32.const 3) (extern.convert_any (ref.i31 (i32.const 8)))) + (table.set $$te (i32.const 4) (extern.convert_any (struct.new_default $$st))) + (table.set $$te (i32.const 5) (extern.convert_any (ref.null any))) + ) + + (func (export "ref_test_null_data") (param $$i i32) (result i32) + (i32.add + (ref.is_null (table.get $$ta (local.get $$i))) + (ref.test nullref (table.get $$ta (local.get $$i))) + ) + ) + (func (export "ref_test_any") (param $$i i32) (result i32) + (i32.add + (ref.test (ref any) (table.get $$ta (local.get $$i))) + (ref.test anyref (table.get $$ta (local.get $$i))) + ) + ) + (func (export "ref_test_eq") (param $$i i32) (result i32) + (i32.add + (ref.test (ref eq) (table.get $$ta (local.get $$i))) + (ref.test eqref (table.get $$ta (local.get $$i))) + ) + ) + (func (export "ref_test_i31") (param $$i i32) (result i32) + (i32.add + (ref.test (ref i31) (table.get $$ta (local.get $$i))) + (ref.test i31ref (table.get $$ta (local.get $$i))) + ) + ) + (func (export "ref_test_struct") (param $$i i32) (result i32) + (i32.add + (ref.test (ref struct) (table.get $$ta (local.get $$i))) + (ref.test structref (table.get $$ta (local.get $$i))) + ) + ) + (func (export "ref_test_array") (param $$i i32) (result i32) + (i32.add + (ref.test (ref array) (table.get $$ta (local.get $$i))) + (ref.test arrayref (table.get $$ta (local.get $$i))) + ) + ) + + (func (export "ref_test_null_func") (param $$i i32) (result i32) + (i32.add + (ref.is_null (table.get $$tf (local.get $$i))) + (ref.test (ref null nofunc) (table.get $$tf (local.get $$i))) + ) + ) + (func (export "ref_test_func") (param $$i i32) (result i32) + (i32.add + (ref.test (ref func) (table.get $$tf (local.get $$i))) + (ref.test funcref (table.get $$tf (local.get $$i))) + ) + ) + + (func (export "ref_test_null_extern") (param $$i i32) (result i32) + (i32.add + (ref.is_null (table.get $$te (local.get $$i))) + (ref.test (ref null noextern) (table.get $$te (local.get $$i))) + ) + ) + (func (export "ref_test_extern") (param $$i i32) (result i32) + (i32.add + (ref.test (ref extern) (table.get $$te (local.get $$i))) + (ref.test externref (table.get $$te (local.get $$i))) + ) + ) +)`); + +// ./test/core/gc/ref_test.wast:101 +invoke($0, `init`, [externref(0)]); + +// ./test/core/gc/ref_test.wast:103 +assert_return(() => invoke($0, `ref_test_null_data`, [0]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:104 +assert_return(() => invoke($0, `ref_test_null_data`, [1]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:105 +assert_return(() => invoke($0, `ref_test_null_data`, [2]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:106 +assert_return(() => invoke($0, `ref_test_null_data`, [3]), [value("i32", 0)]); + +// ./test/core/gc/ref_test.wast:107 +assert_return(() => invoke($0, `ref_test_null_data`, [4]), [value("i32", 0)]); + +// ./test/core/gc/ref_test.wast:108 +assert_return(() => invoke($0, `ref_test_null_data`, [5]), [value("i32", 0)]); + +// ./test/core/gc/ref_test.wast:109 +assert_return(() => invoke($0, `ref_test_null_data`, [6]), [value("i32", 0)]); + +// ./test/core/gc/ref_test.wast:110 +assert_return(() => invoke($0, `ref_test_null_data`, [7]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:112 +assert_return(() => invoke($0, `ref_test_any`, [0]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:113 +assert_return(() => invoke($0, `ref_test_any`, [1]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:114 +assert_return(() => invoke($0, `ref_test_any`, [2]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:115 +assert_return(() => invoke($0, `ref_test_any`, [3]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:116 +assert_return(() => invoke($0, `ref_test_any`, [4]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:117 +assert_return(() => invoke($0, `ref_test_any`, [5]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:118 +assert_return(() => invoke($0, `ref_test_any`, [6]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:119 +assert_return(() => invoke($0, `ref_test_any`, [7]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:121 +assert_return(() => invoke($0, `ref_test_eq`, [0]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:122 +assert_return(() => invoke($0, `ref_test_eq`, [1]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:123 +assert_return(() => invoke($0, `ref_test_eq`, [2]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:124 +assert_return(() => invoke($0, `ref_test_eq`, [3]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:125 +assert_return(() => invoke($0, `ref_test_eq`, [4]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:126 +assert_return(() => invoke($0, `ref_test_eq`, [5]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:127 +assert_return(() => invoke($0, `ref_test_eq`, [6]), [value("i32", 0)]); + +// ./test/core/gc/ref_test.wast:128 +assert_return(() => invoke($0, `ref_test_eq`, [7]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:130 +assert_return(() => invoke($0, `ref_test_i31`, [0]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:131 +assert_return(() => invoke($0, `ref_test_i31`, [1]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:132 +assert_return(() => invoke($0, `ref_test_i31`, [2]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:133 +assert_return(() => invoke($0, `ref_test_i31`, [3]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:134 +assert_return(() => invoke($0, `ref_test_i31`, [4]), [value("i32", 0)]); + +// ./test/core/gc/ref_test.wast:135 +assert_return(() => invoke($0, `ref_test_i31`, [5]), [value("i32", 0)]); + +// ./test/core/gc/ref_test.wast:136 +assert_return(() => invoke($0, `ref_test_i31`, [6]), [value("i32", 0)]); + +// ./test/core/gc/ref_test.wast:137 +assert_return(() => invoke($0, `ref_test_i31`, [7]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:139 +assert_return(() => invoke($0, `ref_test_struct`, [0]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:140 +assert_return(() => invoke($0, `ref_test_struct`, [1]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:141 +assert_return(() => invoke($0, `ref_test_struct`, [2]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:142 +assert_return(() => invoke($0, `ref_test_struct`, [3]), [value("i32", 0)]); + +// ./test/core/gc/ref_test.wast:143 +assert_return(() => invoke($0, `ref_test_struct`, [4]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:144 +assert_return(() => invoke($0, `ref_test_struct`, [5]), [value("i32", 0)]); + +// ./test/core/gc/ref_test.wast:145 +assert_return(() => invoke($0, `ref_test_struct`, [6]), [value("i32", 0)]); + +// ./test/core/gc/ref_test.wast:146 +assert_return(() => invoke($0, `ref_test_struct`, [7]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:148 +assert_return(() => invoke($0, `ref_test_array`, [0]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:149 +assert_return(() => invoke($0, `ref_test_array`, [1]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:150 +assert_return(() => invoke($0, `ref_test_array`, [2]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:151 +assert_return(() => invoke($0, `ref_test_array`, [3]), [value("i32", 0)]); + +// ./test/core/gc/ref_test.wast:152 +assert_return(() => invoke($0, `ref_test_array`, [4]), [value("i32", 0)]); + +// ./test/core/gc/ref_test.wast:153 +assert_return(() => invoke($0, `ref_test_array`, [5]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:154 +assert_return(() => invoke($0, `ref_test_array`, [6]), [value("i32", 0)]); + +// ./test/core/gc/ref_test.wast:155 +assert_return(() => invoke($0, `ref_test_array`, [7]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:157 +assert_return(() => invoke($0, `ref_test_null_func`, [0]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:158 +assert_return(() => invoke($0, `ref_test_null_func`, [1]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:159 +assert_return(() => invoke($0, `ref_test_null_func`, [2]), [value("i32", 0)]); + +// ./test/core/gc/ref_test.wast:161 +assert_return(() => invoke($0, `ref_test_func`, [0]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:162 +assert_return(() => invoke($0, `ref_test_func`, [1]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:163 +assert_return(() => invoke($0, `ref_test_func`, [2]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:165 +assert_return(() => invoke($0, `ref_test_null_extern`, [0]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:166 +assert_return(() => invoke($0, `ref_test_null_extern`, [1]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:167 +assert_return(() => invoke($0, `ref_test_null_extern`, [2]), [value("i32", 0)]); + +// ./test/core/gc/ref_test.wast:168 +assert_return(() => invoke($0, `ref_test_null_extern`, [3]), [value("i32", 0)]); + +// ./test/core/gc/ref_test.wast:169 +assert_return(() => invoke($0, `ref_test_null_extern`, [4]), [value("i32", 0)]); + +// ./test/core/gc/ref_test.wast:170 +assert_return(() => invoke($0, `ref_test_null_extern`, [5]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:172 +assert_return(() => invoke($0, `ref_test_extern`, [0]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:173 +assert_return(() => invoke($0, `ref_test_extern`, [1]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:174 +assert_return(() => invoke($0, `ref_test_extern`, [2]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:175 +assert_return(() => invoke($0, `ref_test_extern`, [3]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:176 +assert_return(() => invoke($0, `ref_test_extern`, [4]), [value("i32", 2)]); + +// ./test/core/gc/ref_test.wast:177 +assert_return(() => invoke($0, `ref_test_extern`, [5]), [value("i32", 1)]); + +// ./test/core/gc/ref_test.wast:182 +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) + (block $$l + ;; must hold + (br_if $$l (i32.eqz (ref.test (ref null $$t0) (ref.null struct)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t0) (ref.null $$t0)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t0) (ref.null $$t1)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t0) (ref.null $$t2)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t0) (ref.null $$t3)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t0) (ref.null $$t4)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t0) (table.get (i32.const 0))))) + (br_if $$l (i32.eqz (ref.test (ref null $$t0) (table.get (i32.const 1))))) + (br_if $$l (i32.eqz (ref.test (ref null $$t0) (table.get (i32.const 2))))) + (br_if $$l (i32.eqz (ref.test (ref null $$t0) (table.get (i32.const 3))))) + (br_if $$l (i32.eqz (ref.test (ref null $$t0) (table.get (i32.const 4))))) + + (br_if $$l (i32.eqz (ref.test (ref null $$t1) (ref.null struct)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t1) (ref.null $$t0)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t1) (ref.null $$t1)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t1) (ref.null $$t2)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t1) (ref.null $$t3)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t1) (ref.null $$t4)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t1) (table.get (i32.const 1))))) + (br_if $$l (i32.eqz (ref.test (ref null $$t1) (table.get (i32.const 2))))) + + (br_if $$l (i32.eqz (ref.test (ref null $$t2) (ref.null struct)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t2) (ref.null $$t0)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t2) (ref.null $$t1)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t2) (ref.null $$t2)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t2) (ref.null $$t3)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t2) (ref.null $$t4)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t2) (table.get (i32.const 2))))) + + (br_if $$l (i32.eqz (ref.test (ref null $$t3) (ref.null struct)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t3) (ref.null $$t0)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t3) (ref.null $$t1)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t3) (ref.null $$t2)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t3) (ref.null $$t3)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t3) (ref.null $$t4)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t3) (table.get (i32.const 3))))) + + (br_if $$l (i32.eqz (ref.test (ref null $$t4) (ref.null struct)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t4) (ref.null $$t0)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t4) (ref.null $$t1)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t4) (ref.null $$t2)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t4) (ref.null $$t3)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t4) (ref.null $$t4)))) + (br_if $$l (i32.eqz (ref.test (ref null $$t4) (table.get (i32.const 4))))) + + (br_if $$l (i32.eqz (ref.test (ref $$t0) (table.get (i32.const 0))))) + (br_if $$l (i32.eqz (ref.test (ref $$t0) (table.get (i32.const 1))))) + (br_if $$l (i32.eqz (ref.test (ref $$t0) (table.get (i32.const 2))))) + (br_if $$l (i32.eqz (ref.test (ref $$t0) (table.get (i32.const 3))))) + (br_if $$l (i32.eqz (ref.test (ref $$t0) (table.get (i32.const 4))))) + + (br_if $$l (i32.eqz (ref.test (ref $$t1) (table.get (i32.const 1))))) + (br_if $$l (i32.eqz (ref.test (ref $$t1) (table.get (i32.const 2))))) + + (br_if $$l (i32.eqz (ref.test (ref $$t2) (table.get (i32.const 2))))) + + (br_if $$l (i32.eqz (ref.test (ref $$t3) (table.get (i32.const 3))))) + + (br_if $$l (i32.eqz (ref.test (ref $$t4) (table.get (i32.const 4))))) + + ;; must not hold + (br_if $$l (ref.test (ref $$t0) (ref.null struct))) + (br_if $$l (ref.test (ref $$t1) (ref.null struct))) + (br_if $$l (ref.test (ref $$t2) (ref.null struct))) + (br_if $$l (ref.test (ref $$t3) (ref.null struct))) + (br_if $$l (ref.test (ref $$t4) (ref.null struct))) + + (br_if $$l (ref.test (ref $$t1) (table.get (i32.const 0)))) + (br_if $$l (ref.test (ref $$t1) (table.get (i32.const 3)))) + (br_if $$l (ref.test (ref $$t1) (table.get (i32.const 4)))) + + (br_if $$l (ref.test (ref $$t2) (table.get (i32.const 0)))) + (br_if $$l (ref.test (ref $$t2) (table.get (i32.const 1)))) + (br_if $$l (ref.test (ref $$t2) (table.get (i32.const 3)))) + (br_if $$l (ref.test (ref $$t2) (table.get (i32.const 4)))) + + (br_if $$l (ref.test (ref $$t3) (table.get (i32.const 0)))) + (br_if $$l (ref.test (ref $$t3) (table.get (i32.const 1)))) + (br_if $$l (ref.test (ref $$t3) (table.get (i32.const 2)))) + (br_if $$l (ref.test (ref $$t3) (table.get (i32.const 4)))) + + (br_if $$l (ref.test (ref $$t4) (table.get (i32.const 0)))) + (br_if $$l (ref.test (ref $$t4) (table.get (i32.const 1)))) + (br_if $$l (ref.test (ref $$t4) (table.get (i32.const 2)))) + (br_if $$l (ref.test (ref $$t4) (table.get (i32.const 3)))) + + (return) + ) + (unreachable) + ) + + (func (export "test-canon") + (call $$init) + (block $$l + (br_if $$l (i32.eqz (ref.test (ref $$t0) (table.get (i32.const 0))))) + (br_if $$l (i32.eqz (ref.test (ref $$t0) (table.get (i32.const 1))))) + (br_if $$l (i32.eqz (ref.test (ref $$t0) (table.get (i32.const 2))))) + (br_if $$l (i32.eqz (ref.test (ref $$t0) (table.get (i32.const 3))))) + (br_if $$l (i32.eqz (ref.test (ref $$t0) (table.get (i32.const 4))))) + + (br_if $$l (i32.eqz (ref.test (ref $$t0) (table.get (i32.const 10))))) + (br_if $$l (i32.eqz (ref.test (ref $$t0) (table.get (i32.const 11))))) + (br_if $$l (i32.eqz (ref.test (ref $$t0) (table.get (i32.const 12))))) + + (br_if $$l (i32.eqz (ref.test (ref $$t1') (table.get (i32.const 1))))) + (br_if $$l (i32.eqz (ref.test (ref $$t1') (table.get (i32.const 2))))) + + (br_if $$l (i32.eqz (ref.test (ref $$t1) (table.get (i32.const 11))))) + (br_if $$l (i32.eqz (ref.test (ref $$t1) (table.get (i32.const 12))))) + + (br_if $$l (i32.eqz (ref.test (ref $$t2') (table.get (i32.const 2))))) + + (br_if $$l (i32.eqz (ref.test (ref $$t2) (table.get (i32.const 12))))) + + (return) + ) + (unreachable) + ) +)`); + +// ./test/core/gc/ref_test.wast:329 +assert_return(() => invoke($1, `test-sub`, []), []); + +// ./test/core/gc/ref_test.wast:330 +assert_return(() => invoke($1, `test-canon`, []), []); |