summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/spec/gc/type-equivalence.wast.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/wasm/spec/gc/type-equivalence.wast.js')
-rw-r--r--js/src/jit-test/tests/wasm/spec/gc/type-equivalence.wast.js345
1 files changed, 345 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/spec/gc/type-equivalence.wast.js b/js/src/jit-test/tests/wasm/spec/gc/type-equivalence.wast.js
new file mode 100644
index 0000000000..447729927e
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/spec/gc/type-equivalence.wast.js
@@ -0,0 +1,345 @@
+/* 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/type-equivalence.wast
+
+// ./test/core/type-equivalence.wast:5
+let $0 = instantiate(`(module
+ (type $$t1 (func (param f32 f32) (result f32)))
+ (type $$t2 (func (param $$x f32) (param $$y f32) (result f32)))
+
+ (func $$f1 (param $$r (ref $$t1)) (call $$f2 (local.get $$r)))
+ (func $$f2 (param $$r (ref $$t2)) (call $$f1 (local.get $$r)))
+)`);
+
+// ./test/core/type-equivalence.wast:16
+let $1 = instantiate(`(module
+ (type $$s0 (func (param i32) (result f32)))
+ (type $$s1 (func (param i32 (ref $$s0)) (result (ref $$s0))))
+ (type $$s2 (func (param i32 (ref $$s0)) (result (ref $$s0))))
+ (type $$t1 (func (param (ref $$s1)) (result (ref $$s2))))
+ (type $$t2 (func (param (ref $$s2)) (result (ref $$s1))))
+
+ (func $$f1 (param $$r (ref $$t1)) (call $$f2 (local.get $$r)))
+ (func $$f2 (param $$r (ref $$t2)) (call $$f1 (local.get $$r)))
+)`);
+
+// ./test/core/type-equivalence.wast:30
+let $2 = instantiate(`(module
+ (rec (type $$t1 (func (param i32 (ref $$t1)))))
+ (rec (type $$t2 (func (param i32 (ref $$t2)))))
+
+ (func $$f1 (param $$r (ref $$t1)) (call $$f2 (local.get $$r)))
+ (func $$f2 (param $$r (ref $$t2)) (call $$f1 (local.get $$r)))
+)`);
+
+// ./test/core/type-equivalence.wast:38
+let $3 = instantiate(`(module
+ (type $$t1 (func (param i32 (ref $$t1))))
+ (type $$t2 (func (param i32 (ref $$t2))))
+
+ (func $$f1 (param $$r (ref $$t1)) (call $$f2 (local.get $$r)))
+ (func $$f2 (param $$r (ref $$t2)) (call $$f1 (local.get $$r)))
+)`);
+
+// ./test/core/type-equivalence.wast:49
+let $4 = instantiate(`(module
+ (rec
+ (type $$t0 (func (param i32 (ref $$t1))))
+ (type $$t1 (func (param i32 (ref $$t0))))
+ )
+ (rec
+ (type $$t2 (func (param i32 (ref $$t3))))
+ (type $$t3 (func (param i32 (ref $$t2))))
+ )
+
+ (func $$f0 (param $$r (ref $$t0))
+ (call $$f2 (local.get $$r))
+ )
+ (func $$f1 (param $$r (ref $$t1))
+ (call $$f3 (local.get $$r))
+ )
+ (func $$f2 (param $$r (ref $$t2))
+ (call $$f0 (local.get $$r))
+ )
+ (func $$f3 (param $$r (ref $$t3))
+ (call $$f1 (local.get $$r))
+ )
+)`);
+
+// ./test/core/type-equivalence.wast:76
+assert_invalid(
+ () => instantiate(`(module
+ (type $$t1 (func (param (ref $$t2))))
+ (type $$t2 (func (param (ref $$t1))))
+ )`),
+ `unknown type`,
+);
+
+// ./test/core/type-equivalence.wast:89
+let $5 = instantiate(`(module
+ (type $$t1 (func (param f32 f32)))
+ (type $$t2 (func (param $$x f32) (param $$y f32)))
+
+ (func $$f1 (type $$t1))
+ (func $$f2 (type $$t2))
+ (table funcref (elem $$f1 $$f2))
+
+ (func (export "run")
+ (call_indirect (type $$t1) (f32.const 1) (f32.const 2) (i32.const 1))
+ (call_indirect (type $$t2) (f32.const 1) (f32.const 2) (i32.const 0))
+ )
+)`);
+
+// ./test/core/type-equivalence.wast:102
+assert_return(() => invoke($5, `run`, []), []);
+
+// ./test/core/type-equivalence.wast:107
+let $6 = instantiate(`(module
+ (type $$s0 (func (param i32)))
+ (type $$s1 (func (param i32 (ref $$s0))))
+ (type $$s2 (func (param i32 (ref $$s0))))
+ (type $$t1 (func (param (ref $$s1))))
+ (type $$t2 (func (param (ref $$s2))))
+
+ (func $$s1 (type $$s1))
+ (func $$s2 (type $$s2))
+ (func $$f1 (type $$t1))
+ (func $$f2 (type $$t2))
+ (table funcref (elem $$f1 $$f2 $$s1 $$s2))
+
+ (func (export "run")
+ (call_indirect (type $$t1) (ref.func $$s1) (i32.const 0))
+ (call_indirect (type $$t1) (ref.func $$s1) (i32.const 1))
+ (call_indirect (type $$t1) (ref.func $$s2) (i32.const 0))
+ (call_indirect (type $$t1) (ref.func $$s2) (i32.const 1))
+ (call_indirect (type $$t2) (ref.func $$s1) (i32.const 0))
+ (call_indirect (type $$t2) (ref.func $$s1) (i32.const 1))
+ (call_indirect (type $$t2) (ref.func $$s2) (i32.const 0))
+ (call_indirect (type $$t2) (ref.func $$s2) (i32.const 1))
+ )
+)`);
+
+// ./test/core/type-equivalence.wast:131
+assert_return(() => invoke($6, `run`, []), []);
+
+// ./test/core/type-equivalence.wast:136
+let $7 = instantiate(`(module
+ (rec (type $$t1 (func (result (ref null $$t1)))))
+ (rec (type $$t2 (func (result (ref null $$t2)))))
+
+ (func $$f1 (type $$t1) (ref.null $$t1))
+ (func $$f2 (type $$t2) (ref.null $$t2))
+ (table funcref (elem $$f1 $$f2))
+
+ (func (export "run")
+ (block (result (ref null $$t1)) (call_indirect (type $$t1) (i32.const 0)))
+ (block (result (ref null $$t1)) (call_indirect (type $$t2) (i32.const 0)))
+ (block (result (ref null $$t2)) (call_indirect (type $$t1) (i32.const 0)))
+ (block (result (ref null $$t2)) (call_indirect (type $$t2) (i32.const 0)))
+ (block (result (ref null $$t1)) (call_indirect (type $$t1) (i32.const 1)))
+ (block (result (ref null $$t1)) (call_indirect (type $$t2) (i32.const 1)))
+ (block (result (ref null $$t2)) (call_indirect (type $$t1) (i32.const 1)))
+ (block (result (ref null $$t2)) (call_indirect (type $$t2) (i32.const 1)))
+ (br 0)
+ )
+)`);
+
+// ./test/core/type-equivalence.wast:156
+assert_return(() => invoke($7, `run`, []), []);
+
+// ./test/core/type-equivalence.wast:161
+let $8 = instantiate(`(module
+ (rec
+ (type $$t1 (func (param i32 (ref $$t1))))
+ (type $$t2 (func (param i32 (ref $$t3))))
+ (type $$t3 (func (param i32 (ref $$t2))))
+ )
+
+ (rec
+ (type $$u1 (func (param i32 (ref $$u1))))
+ (type $$u2 (func (param i32 (ref $$u3))))
+ (type $$u3 (func (param i32 (ref $$u2))))
+ )
+
+ (func $$f1 (type $$t1))
+ (func $$f2 (type $$t2))
+ (func $$f3 (type $$t3))
+ (table funcref (elem $$f1 $$f2 $$f3))
+
+ (func (export "run")
+ (call_indirect (type $$t1) (i32.const 1) (ref.func $$f1) (i32.const 0))
+ (call_indirect (type $$t2) (i32.const 1) (ref.func $$f3) (i32.const 1))
+ (call_indirect (type $$t3) (i32.const 1) (ref.func $$f2) (i32.const 2))
+ (call_indirect (type $$u1) (i32.const 1) (ref.func $$f1) (i32.const 0))
+ (call_indirect (type $$u2) (i32.const 1) (ref.func $$f3) (i32.const 1))
+ (call_indirect (type $$u3) (i32.const 1) (ref.func $$f2) (i32.const 2))
+ )
+)`);
+
+// ./test/core/type-equivalence.wast:188
+assert_return(() => invoke($8, `run`, []), []);
+
+// ./test/core/type-equivalence.wast:195
+let $9 = instantiate(`(module
+ (type $$t1 (func (param f32 f32) (result f32)))
+ (func (export "f") (param (ref $$t1)))
+)`);
+
+// ./test/core/type-equivalence.wast:199
+register($9, `M`);
+
+// ./test/core/type-equivalence.wast:200
+let $10 = instantiate(`(module
+ (type $$t2 (func (param $$x f32) (param $$y f32) (result f32)))
+ (func (import "M" "f") (param (ref $$t2)))
+)`);
+
+// ./test/core/type-equivalence.wast:208
+let $11 = instantiate(`(module
+ (type $$s0 (func (param i32) (result f32)))
+ (type $$s1 (func (param i32 (ref $$s0)) (result (ref $$s0))))
+ (type $$s2 (func (param i32 (ref $$s0)) (result (ref $$s0))))
+ (type $$t1 (func (param (ref $$s1)) (result (ref $$s2))))
+ (type $$t2 (func (param (ref $$s2)) (result (ref $$s1))))
+ (func (export "f1") (param (ref $$t1)))
+ (func (export "f2") (param (ref $$t1)))
+)`);
+
+// ./test/core/type-equivalence.wast:217
+register($11, `N`);
+
+// ./test/core/type-equivalence.wast:218
+let $12 = instantiate(`(module
+ (type $$s0 (func (param i32) (result f32)))
+ (type $$s1 (func (param i32 (ref $$s0)) (result (ref $$s0))))
+ (type $$s2 (func (param i32 (ref $$s0)) (result (ref $$s0))))
+ (type $$t1 (func (param (ref $$s1)) (result (ref $$s2))))
+ (type $$t2 (func (param (ref $$s2)) (result (ref $$s1))))
+ (func (import "N" "f1") (param (ref $$t1)))
+ (func (import "N" "f1") (param (ref $$t2)))
+ (func (import "N" "f2") (param (ref $$t1)))
+ (func (import "N" "f2") (param (ref $$t1)))
+)`);
+
+// ./test/core/type-equivalence.wast:233
+let $13 = instantiate(`(module
+ (rec (type $$t1 (func (param i32 (ref $$t1)))))
+ (func (export "f") (param (ref $$t1)))
+)`);
+
+// ./test/core/type-equivalence.wast:237
+register($13, `Mr1`);
+
+// ./test/core/type-equivalence.wast:238
+let $14 = instantiate(`(module
+ (rec (type $$t2 (func (param i32 (ref $$t2)))))
+ (func (import "Mr1" "f") (param (ref $$t2)))
+)`);
+
+// ./test/core/type-equivalence.wast:246
+let $15 = instantiate(`(module
+ (rec
+ (type $$t1 (func (param i32 (ref $$t1))))
+ (type $$t2 (func (param i32 (ref $$t3))))
+ (type $$t3 (func (param i32 (ref $$t2))))
+ )
+ (func (export "f1") (param (ref $$t1)))
+ (func (export "f2") (param (ref $$t2)))
+ (func (export "f3") (param (ref $$t3)))
+)`);
+
+// ./test/core/type-equivalence.wast:256
+register($15, `Mr2`);
+
+// ./test/core/type-equivalence.wast:257
+let $16 = instantiate(`(module
+ (rec
+ (type $$t1 (func (param i32 (ref $$t1))))
+ (type $$t2 (func (param i32 (ref $$t3))))
+ (type $$t3 (func (param i32 (ref $$t2))))
+ )
+ (func (import "Mr2" "f1") (param (ref $$t1)))
+ (func (import "Mr2" "f2") (param (ref $$t2)))
+ (func (import "Mr2" "f3") (param (ref $$t3)))
+)`);
+
+// ./test/core/type-equivalence.wast:268
+let $17 = instantiate(`(module
+ (rec
+ (type $$t1 (func (param i32 (ref $$t3))))
+ (type $$t2 (func (param i32 (ref $$t1))))
+ (type $$t3 (func (param i32 (ref $$t2))))
+ )
+ (func (export "f1") (param (ref $$t1)))
+ (func (export "f2") (param (ref $$t2)))
+ (func (export "f3") (param (ref $$t3)))
+)`);
+
+// ./test/core/type-equivalence.wast:278
+register($17, `Mr3`);
+
+// ./test/core/type-equivalence.wast:279
+let $18 = instantiate(`(module
+ (rec
+ (type $$t1 (func (param i32 (ref $$t3))))
+ (type $$t2 (func (param i32 (ref $$t1))))
+ (type $$t3 (func (param i32 (ref $$t2))))
+ )
+ (func (import "Mr3" "f1") (param (ref $$t1)))
+ (func (import "Mr3" "f2") (param (ref $$t2)))
+ (func (import "Mr3" "f3") (param (ref $$t3)))
+)`);
+
+// ./test/core/type-equivalence.wast:290
+let $19 = instantiate(`(module
+ (rec
+ (type $$t1 (func (param i32 (ref $$u1))))
+ (type $$u1 (func (param f32 (ref $$t1))))
+ )
+
+ (rec
+ (type $$t2 (func (param i32 (ref $$u3))))
+ (type $$u2 (func (param f32 (ref $$t3))))
+ (type $$t3 (func (param i32 (ref $$u2))))
+ (type $$u3 (func (param f32 (ref $$t2))))
+ )
+
+ (func (export "f1") (param (ref $$t1)))
+ (func (export "f2") (param (ref $$t2)))
+ (func (export "f3") (param (ref $$t3)))
+)`);
+
+// ./test/core/type-equivalence.wast:307
+register($19, `Mr4`);
+
+// ./test/core/type-equivalence.wast:308
+let $20 = instantiate(`(module
+ (rec
+ (type $$t1 (func (param i32 (ref $$u1))))
+ (type $$u1 (func (param f32 (ref $$t1))))
+ )
+
+ (rec
+ (type $$t2 (func (param i32 (ref $$u3))))
+ (type $$u2 (func (param f32 (ref $$t3))))
+ (type $$t3 (func (param i32 (ref $$u2))))
+ (type $$u3 (func (param f32 (ref $$t2))))
+ )
+
+ (func (import "Mr4" "f1") (param (ref $$t1)))
+ (func (import "Mr4" "f2") (param (ref $$t2)))
+ (func (import "Mr4" "f3") (param (ref $$t3)))
+)`);