summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/spec/gc/struct.wast.js
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /js/src/jit-test/tests/wasm/spec/gc/struct.wast.js
parentInitial commit. (diff)
downloadfirefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz
firefox-26a029d407be480d791972afb5975cf62c9360a6.zip
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
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.js271
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)]);