summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/gc/tables.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/wasm/gc/tables.js')
-rw-r--r--js/src/jit-test/tests/wasm/gc/tables.js167
1 files changed, 167 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/gc/tables.js b/js/src/jit-test/tests/wasm/gc/tables.js
new file mode 100644
index 0000000000..e9c4e8f82e
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/gc/tables.js
@@ -0,0 +1,167 @@
+// |jit-test| skip-if: !wasmGcEnabled()
+
+// implicit null funcref value
+{
+ const { t, get } = wasmEvalText(`(module
+ (table (export "t") 3 funcref)
+ (func (export "get") (param i32) (result funcref)
+ (table.get (local.get 0))
+ )
+ )`).exports;
+
+ assertEq(t.get(0), null);
+ assertEq(t.get(1), null);
+ assertEq(t.get(2), null);
+ assertEq(get(0), null);
+ assertEq(get(1), null);
+ assertEq(get(2), null);
+}
+
+// explicit null funcref value
+{
+ const { t, get } = wasmEvalText(`(module
+ (table (export "t") 3 funcref (ref.null func))
+ (func (export "get") (param i32) (result funcref)
+ (table.get (local.get 0))
+ )
+ )`).exports;
+
+ assertEq(t.get(0), null);
+ assertEq(t.get(1), null);
+ assertEq(t.get(2), null);
+ assertEq(get(0), null);
+ assertEq(get(1), null);
+ assertEq(get(2), null);
+}
+
+// actual funcref value
+{
+ const { t, get, foo } = wasmEvalText(`(module
+ (func $foo (export "foo"))
+
+ (table (export "t") 3 funcref (ref.func $foo))
+ (func (export "get") (param i32) (result funcref)
+ (table.get (local.get 0))
+ )
+ )`).exports;
+
+ assertEq(t.get(0), foo);
+ assertEq(t.get(1), foo);
+ assertEq(t.get(2), foo);
+ assertEq(get(0), foo);
+ assertEq(get(1), foo);
+ assertEq(get(2), foo);
+}
+
+// implicit null anyref value
+{
+ const { t, get } = wasmEvalText(`(module
+ (table (export "t") 3 anyref)
+ (func (export "get") (param i32) (result anyref)
+ (table.get (local.get 0))
+ )
+ )`).exports;
+
+ assertEq(t.get(0), null);
+ assertEq(t.get(1), null);
+ assertEq(t.get(2), null);
+ assertEq(get(0), null);
+ assertEq(get(1), null);
+ assertEq(get(2), null);
+}
+
+// explicit null anyref value
+{
+ const { t, get } = wasmEvalText(`(module
+ (table (export "t") 3 anyref (ref.null any))
+ (func (export "get") (param i32) (result anyref)
+ (table.get (local.get 0))
+ )
+ )`).exports;
+
+ assertEq(t.get(0), null);
+ assertEq(t.get(1), null);
+ assertEq(t.get(2), null);
+ assertEq(get(0), null);
+ assertEq(get(1), null);
+ assertEq(get(2), null);
+}
+
+// actual anyref value
+{
+ const { t, get } = wasmEvalText(`(module
+ (type $s (struct))
+
+ (table (export "t") 3 anyref (struct.new $s))
+ (func (export "get") (param i32) (result anyref)
+ (table.get (local.get 0))
+ )
+ )`).exports;
+
+ assertEq(!!t.get(0), true);
+ assertEq(!!t.get(1), true);
+ assertEq(!!t.get(2), true);
+ assertEq(!!get(0), true);
+ assertEq(!!get(1), true);
+ assertEq(!!get(2), true);
+}
+
+// implicit null externref value
+{
+ const { t, get } = wasmEvalText(`(module
+ (table (export "t") 3 externref)
+ (func (export "get") (param i32) (result externref)
+ (table.get (local.get 0))
+ )
+ )`).exports;
+
+ assertEq(t.get(0), null);
+ assertEq(t.get(1), null);
+ assertEq(t.get(2), null);
+ assertEq(get(0), null);
+ assertEq(get(1), null);
+ assertEq(get(2), null);
+}
+
+// explicit null externref value
+{
+ const { t, get } = wasmEvalText(`(module
+ (table (export "t") 3 externref (ref.null extern))
+ (func (export "get") (param i32) (result externref)
+ (table.get (local.get 0))
+ )
+ )`).exports;
+
+ assertEq(t.get(0), null);
+ assertEq(t.get(1), null);
+ assertEq(t.get(2), null);
+ assertEq(get(0), null);
+ assertEq(get(1), null);
+ assertEq(get(2), null);
+}
+
+// actual externref value (from an imported global, which is visible to tables)
+{
+ const foo = "wowzers";
+ const { t, get } = wasmEvalText(`(module
+ (global (import "" "foo") externref)
+
+ (table (export "t") 3 externref (global.get 0))
+ (func (export "get") (param i32) (result externref)
+ (table.get (local.get 0))
+ )
+ )`, { "": { "foo": foo } }).exports;
+
+ assertEq(t.get(0), foo);
+ assertEq(t.get(1), foo);
+ assertEq(t.get(2), foo);
+ assertEq(get(0), foo);
+ assertEq(get(1), foo);
+ assertEq(get(2), foo);
+}
+
+// non-imported globals come after tables and are therefore not visible
+assertErrorMessage(() => wasmEvalText(`(module
+ (global anyref (ref.null any))
+ (table 3 anyref (global.get 0))
+)`), WebAssembly.CompileError, /global.get index out of range/);