diff options
Diffstat (limited to 'js/src/jit-test/tests/wasm/spec/gc/array.wast.js')
-rw-r--r-- | js/src/jit-test/tests/wasm/spec/gc/array.wast.js | 385 |
1 files changed, 385 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/spec/gc/array.wast.js b/js/src/jit-test/tests/wasm/spec/gc/array.wast.js new file mode 100644 index 0000000000..4161a6b5f9 --- /dev/null +++ b/js/src/jit-test/tests/wasm/spec/gc/array.wast.js @@ -0,0 +1,385 @@ +/* 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/array.wast + +// ./test/core/gc/array.wast:3 +let $0 = instantiate(`(module + (type (array i8)) + (type (array i16)) + (type (array i32)) + (type (array i64)) + (type (array f32)) + (type (array f64)) + (type (array anyref)) + (type (array (ref struct))) + (type (array (ref 0))) + (type (array (ref null 1))) + (type (array (mut i8))) + (type (array (mut i16))) + (type (array (mut i32))) + (type (array (mut i64))) + (type (array (mut i32))) + (type (array (mut i64))) + (type (array (mut anyref))) + (type (array (mut (ref struct)))) + (type (array (mut (ref 0)))) + (type (array (mut (ref null i31)))) +)`); + +// ./test/core/gc/array.wast:27 +assert_invalid( + () => instantiate(`(module + (type (array (mut (ref null 10)))) + )`), + `unknown type`, +); + +// ./test/core/gc/array.wast:37 +let $1 = instantiate(`(module + (rec + (type $$s0 (array (ref $$s1))) + (type $$s1 (array (ref $$s0))) + ) + + (func (param (ref $$forward))) + + (type $$forward (array i32)) +)`); + +// ./test/core/gc/array.wast:48 +assert_invalid(() => instantiate(`(module (type (array (ref 1))))`), `unknown type`); + +// ./test/core/gc/array.wast:52 +assert_invalid(() => instantiate(`(module (type (array (mut (ref 1)))))`), `unknown type`); + +// ./test/core/gc/array.wast:60 +let $2 = instantiate(`(module + (type $$vec (array f32)) + (type $$mvec (array (mut f32))) + + (global (ref $$vec) (array.new $$vec (f32.const 1) (i32.const 3))) + (global (ref $$vec) (array.new_default $$vec (i32.const 3))) + + (func $$new (export "new") (result (ref $$vec)) + (array.new_default $$vec (i32.const 3)) + ) + + (func $$get (param $$i i32) (param $$v (ref $$vec)) (result f32) + (array.get $$vec (local.get $$v) (local.get $$i)) + ) + (func (export "get") (param $$i i32) (result f32) + (call $$get (local.get $$i) (call $$new)) + ) + + (func $$set_get (param $$i i32) (param $$v (ref $$mvec)) (param $$y f32) (result f32) + (array.set $$mvec (local.get $$v) (local.get $$i) (local.get $$y)) + (array.get $$mvec (local.get $$v) (local.get $$i)) + ) + (func (export "set_get") (param $$i i32) (param $$y f32) (result f32) + (call $$set_get (local.get $$i) + (array.new_default $$mvec (i32.const 3)) + (local.get $$y) + ) + ) + + (func $$len (param $$v (ref array)) (result i32) + (array.len (local.get $$v)) + ) + (func (export "len") (result i32) + (call $$len (call $$new)) + ) +)`); + +// ./test/core/gc/array.wast:97 +assert_return(() => invoke($2, `new`, []), [new RefWithType('arrayref')]); + +// ./test/core/gc/array.wast:98 +assert_return(() => invoke($2, `new`, []), [new RefWithType('eqref')]); + +// ./test/core/gc/array.wast:99 +assert_return(() => invoke($2, `get`, [0]), [value("f32", 0)]); + +// ./test/core/gc/array.wast:100 +assert_return(() => invoke($2, `set_get`, [1, value("f32", 7)]), [value("f32", 7)]); + +// ./test/core/gc/array.wast:101 +assert_return(() => invoke($2, `len`, []), [value("i32", 3)]); + +// ./test/core/gc/array.wast:103 +assert_trap(() => invoke($2, `get`, [10]), `out of bounds array access`); + +// ./test/core/gc/array.wast:104 +assert_trap(() => invoke($2, `set_get`, [10, value("f32", 7)]), `out of bounds array access`); + +// ./test/core/gc/array.wast:106 +let $3 = instantiate(`(module + (type $$vec (array f32)) + (type $$mvec (array (mut f32))) + + (global (ref $$vec) (array.new_fixed $$vec 2 (f32.const 1) (f32.const 2))) + + (func $$new (export "new") (result (ref $$vec)) + (array.new_fixed $$vec 2 (f32.const 1) (f32.const 2)) + ) + + (func $$get (param $$i i32) (param $$v (ref $$vec)) (result f32) + (array.get $$vec (local.get $$v) (local.get $$i)) + ) + (func (export "get") (param $$i i32) (result f32) + (call $$get (local.get $$i) (call $$new)) + ) + + (func $$set_get (param $$i i32) (param $$v (ref $$mvec)) (param $$y f32) (result f32) + (array.set $$mvec (local.get $$v) (local.get $$i) (local.get $$y)) + (array.get $$mvec (local.get $$v) (local.get $$i)) + ) + (func (export "set_get") (param $$i i32) (param $$y f32) (result f32) + (call $$set_get (local.get $$i) + (array.new_fixed $$mvec 3 (f32.const 1) (f32.const 2) (f32.const 3)) + (local.get $$y) + ) + ) + + (func $$len (param $$v (ref array)) (result i32) + (array.len (local.get $$v)) + ) + (func (export "len") (result i32) + (call $$len (call $$new)) + ) +)`); + +// ./test/core/gc/array.wast:142 +assert_return(() => invoke($3, `new`, []), [new RefWithType('arrayref')]); + +// ./test/core/gc/array.wast:143 +assert_return(() => invoke($3, `new`, []), [new RefWithType('eqref')]); + +// ./test/core/gc/array.wast:144 +assert_return(() => invoke($3, `get`, [0]), [value("f32", 1)]); + +// ./test/core/gc/array.wast:145 +assert_return(() => invoke($3, `set_get`, [1, value("f32", 7)]), [value("f32", 7)]); + +// ./test/core/gc/array.wast:146 +assert_return(() => invoke($3, `len`, []), [value("i32", 2)]); + +// ./test/core/gc/array.wast:148 +assert_trap(() => invoke($3, `get`, [10]), `out of bounds array access`); + +// ./test/core/gc/array.wast:149 +assert_trap(() => invoke($3, `set_get`, [10, value("f32", 7)]), `out of bounds array access`); + +// ./test/core/gc/array.wast:151 +let $4 = instantiate(`(module + (type $$vec (array i8)) + (type $$mvec (array (mut i8))) + + (data $$d "\\00\\01\\02\\ff\\04") + + (func $$new (export "new") (result (ref $$vec)) + (array.new_data $$vec $$d (i32.const 1) (i32.const 3)) + ) + + (func $$get_u (param $$i i32) (param $$v (ref $$vec)) (result i32) + (array.get_u $$vec (local.get $$v) (local.get $$i)) + ) + (func (export "get_u") (param $$i i32) (result i32) + (call $$get_u (local.get $$i) (call $$new)) + ) + + (func $$get_s (param $$i i32) (param $$v (ref $$vec)) (result i32) + (array.get_s $$vec (local.get $$v) (local.get $$i)) + ) + (func (export "get_s") (param $$i i32) (result i32) + (call $$get_s (local.get $$i) (call $$new)) + ) + + (func $$set_get (param $$i i32) (param $$v (ref $$mvec)) (param $$y i32) (result i32) + (array.set $$mvec (local.get $$v) (local.get $$i) (local.get $$y)) + (array.get_u $$mvec (local.get $$v) (local.get $$i)) + ) + (func (export "set_get") (param $$i i32) (param $$y i32) (result i32) + (call $$set_get (local.get $$i) + (array.new_data $$mvec $$d (i32.const 1) (i32.const 3)) + (local.get $$y) + ) + ) + + (func $$len (param $$v (ref array)) (result i32) + (array.len (local.get $$v)) + ) + (func (export "len") (result i32) + (call $$len (call $$new)) + ) +)`); + +// ./test/core/gc/array.wast:194 +assert_return(() => invoke($4, `new`, []), [new RefWithType('arrayref')]); + +// ./test/core/gc/array.wast:195 +assert_return(() => invoke($4, `new`, []), [new RefWithType('eqref')]); + +// ./test/core/gc/array.wast:196 +assert_return(() => invoke($4, `get_u`, [2]), [value("i32", 255)]); + +// ./test/core/gc/array.wast:197 +assert_return(() => invoke($4, `get_s`, [2]), [value("i32", -1)]); + +// ./test/core/gc/array.wast:198 +assert_return(() => invoke($4, `set_get`, [1, 7]), [value("i32", 7)]); + +// ./test/core/gc/array.wast:199 +assert_return(() => invoke($4, `len`, []), [value("i32", 3)]); + +// ./test/core/gc/array.wast:201 +assert_trap(() => invoke($4, `get_u`, [10]), `out of bounds array access`); + +// ./test/core/gc/array.wast:202 +assert_trap(() => invoke($4, `get_s`, [10]), `out of bounds array access`); + +// ./test/core/gc/array.wast:203 +assert_trap(() => invoke($4, `set_get`, [10, 7]), `out of bounds array access`); + +// ./test/core/gc/array.wast:205 +let $5 = instantiate(`(module + (type $$bvec (array i8)) + (type $$vec (array (ref $$bvec))) + (type $$mvec (array (mut (ref $$bvec)))) + (type $$nvec (array (ref null $$bvec))) + (type $$avec (array (mut anyref))) + + (elem $$e (ref $$bvec) + (array.new $$bvec (i32.const 7) (i32.const 3)) + (array.new_fixed $$bvec 2 (i32.const 1) (i32.const 2)) + ) + + (func $$new (export "new") (result (ref $$vec)) + (array.new_elem $$vec $$e (i32.const 0) (i32.const 2)) + ) + + (func $$sub1 (result (ref $$nvec)) + (array.new_elem $$nvec $$e (i32.const 0) (i32.const 2)) + ) + (func $$sub2 (result (ref $$avec)) + (array.new_elem $$avec $$e (i32.const 0) (i32.const 2)) + ) + + (func $$get (param $$i i32) (param $$j i32) (param $$v (ref $$vec)) (result i32) + (array.get_u $$bvec (array.get $$vec (local.get $$v) (local.get $$i)) (local.get $$j)) + ) + (func (export "get") (param $$i i32) (param $$j i32) (result i32) + (call $$get (local.get $$i) (local.get $$j) (call $$new)) + ) + + (func $$set_get (param $$i i32) (param $$j i32) (param $$v (ref $$mvec)) (param $$y i32) (result i32) + (array.set $$mvec (local.get $$v) (local.get $$i) (array.get $$mvec (local.get $$v) (local.get $$y))) + (array.get_u $$bvec (array.get $$mvec (local.get $$v) (local.get $$i)) (local.get $$j)) + ) + (func (export "set_get") (param $$i i32) (param $$j i32) (param $$y i32) (result i32) + (call $$set_get (local.get $$i) (local.get $$j) + (array.new_elem $$mvec $$e (i32.const 0) (i32.const 2)) + (local.get $$y) + ) + ) + + (func $$len (param $$v (ref array)) (result i32) + (array.len (local.get $$v)) + ) + (func (export "len") (result i32) + (call $$len (call $$new)) + ) +)`); + +// ./test/core/gc/array.wast:254 +assert_return(() => invoke($5, `new`, []), [new RefWithType('arrayref')]); + +// ./test/core/gc/array.wast:255 +assert_return(() => invoke($5, `new`, []), [new RefWithType('eqref')]); + +// ./test/core/gc/array.wast:256 +assert_return(() => invoke($5, `get`, [0, 0]), [value("i32", 7)]); + +// ./test/core/gc/array.wast:257 +assert_return(() => invoke($5, `get`, [1, 0]), [value("i32", 1)]); + +// ./test/core/gc/array.wast:258 +assert_return(() => invoke($5, `set_get`, [0, 1, 1]), [value("i32", 2)]); + +// ./test/core/gc/array.wast:259 +assert_return(() => invoke($5, `len`, []), [value("i32", 2)]); + +// ./test/core/gc/array.wast:261 +assert_trap(() => invoke($5, `get`, [10, 0]), `out of bounds array access`); + +// ./test/core/gc/array.wast:262 +assert_trap(() => invoke($5, `set_get`, [10, 0, 0]), `out of bounds array access`); + +// ./test/core/gc/array.wast:264 +assert_invalid( + () => instantiate(`(module + (type $$a (array i64)) + (func (export "array.set-immutable") (param $$a (ref $$a)) + (array.set $$a (local.get $$a) (i32.const 0) (i64.const 1)) + ) + )`), + `array is immutable`, +); + +// ./test/core/gc/array.wast:274 +assert_invalid( + () => instantiate(`(module + (type $$bvec (array i8)) + + (data $$d "\\00\\01\\02\\03\\04") + + (global (ref $$bvec) + (array.new_data $$bvec $$d (i32.const 1) (i32.const 3)) + ) + )`), + `constant expression required`, +); + +// ./test/core/gc/array.wast:287 +assert_invalid( + () => instantiate(`(module + (type $$bvec (array i8)) + (type $$vvec (array (ref $$bvec))) + + (elem $$e (ref $$bvec) (ref.null $$bvec)) + + (global (ref $$vvec) + (array.new_elem $$vvec $$e (i32.const 0) (i32.const 1)) + ) + )`), + `constant expression required`, +); + +// ./test/core/gc/array.wast:304 +let $6 = instantiate(`(module + (type $$t (array (mut i32))) + (func (export "array.get-null") + (local (ref null $$t)) (drop (array.get $$t (local.get 0) (i32.const 0))) + ) + (func (export "array.set-null") + (local (ref null $$t)) (array.set $$t (local.get 0) (i32.const 0) (i32.const 0)) + ) +)`); + +// ./test/core/gc/array.wast:314 +assert_trap(() => invoke($6, `array.get-null`, []), `null array reference`); + +// ./test/core/gc/array.wast:315 +assert_trap(() => invoke($6, `array.set-null`, []), `null array reference`); |