summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/spec/gc/array.wast.js
diff options
context:
space:
mode:
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.js385
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`);