diff options
Diffstat (limited to 'js/src/jit-test/tests/wasm/spec/gc/struct.wast.js')
-rw-r--r-- | js/src/jit-test/tests/wasm/spec/gc/struct.wast.js | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/spec/gc/struct.wast.js b/js/src/jit-test/tests/wasm/spec/gc/struct.wast.js new file mode 100644 index 0000000000..24b57b8466 --- /dev/null +++ b/js/src/jit-test/tests/wasm/spec/gc/struct.wast.js @@ -0,0 +1,271 @@ +/* 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/struct.wast + +// ./test/core/gc/struct.wast:3 +let $0 = instantiate(`(module + (type (struct)) + (type (struct (field))) + (type (struct (field i8))) + (type (struct (field i8 i8 i8 i8))) + (type (struct (field $$x1 i32) (field $$y1 i32))) + (type (struct (field i8 i16 i32 i64 f32 f64 anyref funcref (ref 0) (ref null 1)))) + (type (struct (field i32 i64 i8) (field) (field) (field (ref null i31) anyref))) + (type (struct (field $$x2 i32) (field f32 f64) (field $$y2 i32))) +)`); + +// ./test/core/gc/struct.wast:15 +assert_malformed( + () => instantiate(`(type (struct (field $$x i32) (field $$x i32))) `), + `duplicate field`, +); + +// ./test/core/gc/struct.wast:25 +let $1 = instantiate(`(module + (rec + (type $$s0 (struct (field (ref 0) (ref 1) (ref $$s0) (ref $$s1)))) + (type $$s1 (struct (field (ref 0) (ref 1) (ref $$s0) (ref $$s1)))) + ) + + (func (param (ref $$forward))) + + (type $$forward (struct)) +)`); + +// ./test/core/gc/struct.wast:36 +assert_invalid( + () => instantiate(`(module (type (struct (field (ref 1)))))`), + `unknown type`, +); + +// ./test/core/gc/struct.wast:40 +assert_invalid( + () => instantiate(`(module (type (struct (field (mut (ref 1))))))`), + `unknown type`, +); + +// ./test/core/gc/struct.wast:48 +let $2 = instantiate(`(module + (type (struct (field $$x i32))) + (type $$t1 (struct (field i32) (field $$x f32))) + (type $$t2 (struct (field i32 i32) (field $$x i64))) + + (func (param (ref 0)) (result i32) (struct.get 0 $$x (local.get 0))) + (func (param (ref $$t1)) (result f32) (struct.get 1 $$x (local.get 0))) + (func (param (ref $$t2)) (result i64) (struct.get $$t2 $$x (local.get 0))) +)`); + +// ./test/core/gc/struct.wast:58 +assert_invalid( + () => instantiate(`(module + (type (struct (field $$x i64))) + (type $$t (struct (field $$x i32))) + (func (param (ref 0)) (result i32) (struct.get 0 $$x (local.get 0))) + )`), + `type mismatch`, +); + +// ./test/core/gc/struct.wast:70 +let $3 = instantiate(`(module + (type $$vec (struct (field f32) (field $$y (mut f32)) (field $$z f32))) + + (global (ref $$vec) (struct.new $$vec (f32.const 1) (f32.const 2) (f32.const 3))) + (global (ref $$vec) (struct.new_default $$vec)) + + (func (export "new") (result anyref) + (struct.new_default $$vec) + ) + + (func $$get_0_0 (param $$v (ref $$vec)) (result f32) + (struct.get 0 0 (local.get $$v)) + ) + (func (export "get_0_0") (result f32) + (call $$get_0_0 (struct.new_default $$vec)) + ) + (func $$get_vec_0 (param $$v (ref $$vec)) (result f32) + (struct.get $$vec 0 (local.get $$v)) + ) + (func (export "get_vec_0") (result f32) + (call $$get_vec_0 (struct.new_default $$vec)) + ) + (func $$get_0_y (param $$v (ref $$vec)) (result f32) + (struct.get 0 $$y (local.get $$v)) + ) + (func (export "get_0_y") (result f32) + (call $$get_0_y (struct.new_default $$vec)) + ) + (func $$get_vec_y (param $$v (ref $$vec)) (result f32) + (struct.get $$vec $$y (local.get $$v)) + ) + (func (export "get_vec_y") (result f32) + (call $$get_vec_y (struct.new_default $$vec)) + ) + + (func $$set_get_y (param $$v (ref $$vec)) (param $$y f32) (result f32) + (struct.set $$vec $$y (local.get $$v) (local.get $$y)) + (struct.get $$vec $$y (local.get $$v)) + ) + (func (export "set_get_y") (param $$y f32) (result f32) + (call $$set_get_y (struct.new_default $$vec) (local.get $$y)) + ) + + (func $$set_get_1 (param $$v (ref $$vec)) (param $$y f32) (result f32) + (struct.set $$vec 1 (local.get $$v) (local.get $$y)) + (struct.get $$vec $$y (local.get $$v)) + ) + (func (export "set_get_1") (param $$y f32) (result f32) + (call $$set_get_1 (struct.new_default $$vec) (local.get $$y)) + ) +)`); + +// ./test/core/gc/struct.wast:122 +assert_return(() => invoke($3, `new`, []), [new RefWithType('structref')]); + +// ./test/core/gc/struct.wast:124 +assert_return(() => invoke($3, `get_0_0`, []), [value("f32", 0)]); + +// ./test/core/gc/struct.wast:125 +assert_return(() => invoke($3, `get_vec_0`, []), [value("f32", 0)]); + +// ./test/core/gc/struct.wast:126 +assert_return(() => invoke($3, `get_0_y`, []), [value("f32", 0)]); + +// ./test/core/gc/struct.wast:127 +assert_return(() => invoke($3, `get_vec_y`, []), [value("f32", 0)]); + +// ./test/core/gc/struct.wast:129 +assert_return(() => invoke($3, `set_get_y`, [value("f32", 7)]), [value("f32", 7)]); + +// ./test/core/gc/struct.wast:130 +assert_return(() => invoke($3, `set_get_1`, [value("f32", 7)]), [value("f32", 7)]); + +// ./test/core/gc/struct.wast:132 +assert_invalid( + () => instantiate(`(module + (type $$s (struct (field i64))) + (func (export "struct.set-immutable") (param $$s (ref $$s)) + (struct.set $$s 0 (local.get $$s) (i64.const 1)) + ) + )`), + `field is immutable`, +); + +// ./test/core/gc/struct.wast:145 +let $4 = instantiate(`(module + (type $$t (struct (field i32 (mut i32)))) + (func (export "struct.get-null") + (local (ref null $$t)) (drop (struct.get $$t 1 (local.get 0))) + ) + (func (export "struct.set-null") + (local (ref null $$t)) (struct.set $$t 1 (local.get 0) (i32.const 0)) + ) +)`); + +// ./test/core/gc/struct.wast:155 +assert_trap(() => invoke($4, `struct.get-null`, []), `null structure reference`); + +// ./test/core/gc/struct.wast:156 +assert_trap(() => invoke($4, `struct.set-null`, []), `null structure reference`); + +// ./test/core/gc/struct.wast:160 +let $5 = instantiate(`(module + (type $$s (struct (field i8) (field (mut i8)) (field i16) (field (mut i16)))) + + (global (export "g0") (ref $$s) (struct.new $$s (i32.const 0) (i32.const 1) (i32.const 2) (i32.const 3))) + (global (export "g1") (ref $$s) (struct.new $$s (i32.const 254) (i32.const 255) (i32.const 65534) (i32.const 65535))) + + (func (export "get_packed_g0_0") (result i32 i32) + (struct.get_s 0 0 (global.get 0)) + (struct.get_u 0 0 (global.get 0)) + ) + + (func (export "get_packed_g1_0") (result i32 i32) + (struct.get_s 0 0 (global.get 1)) + (struct.get_u 0 0 (global.get 1)) + ) + + (func (export "get_packed_g0_1") (result i32 i32) + (struct.get_s 0 1 (global.get 0)) + (struct.get_u 0 1 (global.get 0)) + ) + + (func (export "get_packed_g1_1") (result i32 i32) + (struct.get_s 0 1 (global.get 1)) + (struct.get_u 0 1 (global.get 1)) + ) + + (func (export "get_packed_g0_2") (result i32 i32) + (struct.get_s 0 2 (global.get 0)) + (struct.get_u 0 2 (global.get 0)) + ) + + (func (export "get_packed_g1_2") (result i32 i32) + (struct.get_s 0 2 (global.get 1)) + (struct.get_u 0 2 (global.get 1)) + ) + + (func (export "get_packed_g0_3") (result i32 i32) + (struct.get_s 0 3 (global.get 0)) + (struct.get_u 0 3 (global.get 0)) + ) + + (func (export "get_packed_g1_3") (result i32 i32) + (struct.get_s 0 3 (global.get 1)) + (struct.get_u 0 3 (global.get 1)) + ) + + (func (export "set_get_packed_g0_1") (param i32) (result i32 i32) + (struct.set 0 1 (global.get 0) (local.get 0)) + (struct.get_s 0 1 (global.get 0)) + (struct.get_u 0 1 (global.get 0)) + ) + + (func (export "set_get_packed_g0_3") (param i32) (result i32 i32) + (struct.set 0 3 (global.get 0) (local.get 0)) + (struct.get_s 0 3 (global.get 0)) + (struct.get_u 0 3 (global.get 0)) + ) +)`); + +// ./test/core/gc/struct.wast:219 +assert_return(() => invoke($5, `get_packed_g0_0`, []), [value("i32", 0), value("i32", 0)]); + +// ./test/core/gc/struct.wast:220 +assert_return(() => invoke($5, `get_packed_g1_0`, []), [value("i32", -2), value("i32", 254)]); + +// ./test/core/gc/struct.wast:221 +assert_return(() => invoke($5, `get_packed_g0_1`, []), [value("i32", 1), value("i32", 1)]); + +// ./test/core/gc/struct.wast:222 +assert_return(() => invoke($5, `get_packed_g1_1`, []), [value("i32", -1), value("i32", 255)]); + +// ./test/core/gc/struct.wast:223 +assert_return(() => invoke($5, `get_packed_g0_2`, []), [value("i32", 2), value("i32", 2)]); + +// ./test/core/gc/struct.wast:224 +assert_return(() => invoke($5, `get_packed_g1_2`, []), [value("i32", -2), value("i32", 65534)]); + +// ./test/core/gc/struct.wast:225 +assert_return(() => invoke($5, `get_packed_g0_3`, []), [value("i32", 3), value("i32", 3)]); + +// ./test/core/gc/struct.wast:226 +assert_return(() => invoke($5, `get_packed_g1_3`, []), [value("i32", -1), value("i32", 65535)]); + +// ./test/core/gc/struct.wast:228 +assert_return(() => invoke($5, `set_get_packed_g0_1`, [257]), [value("i32", 1), value("i32", 1)]); + +// ./test/core/gc/struct.wast:229 +assert_return(() => invoke($5, `set_get_packed_g0_3`, [257]), [value("i32", 257), value("i32", 257)]); |