summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/gc/ref-global.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/wasm/gc/ref-global.js')
-rw-r--r--js/src/jit-test/tests/wasm/gc/ref-global.js96
1 files changed, 96 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/gc/ref-global.js b/js/src/jit-test/tests/wasm/gc/ref-global.js
new file mode 100644
index 0000000000..1e2a87edc6
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/gc/ref-global.js
@@ -0,0 +1,96 @@
+// |jit-test| skip-if: !wasmGcEnabled()
+
+// Basic private-to-module functionality. At the moment all we have is null
+// pointers, not very exciting.
+
+{
+ let bin = wasmTextToBinary(
+ `(module
+ (type $point (struct
+ (field $x f64)
+ (field $y f64)))
+
+ (global $g1 (mut (ref null $point)) (ref.null $point))
+ (global $g2 (mut (ref null $point)) (ref.null $point))
+ (global $g3 (ref null $point) (ref.null $point))
+
+ ;; Restriction: cannot expose Refs outside the module, not even
+ ;; as a return value. See ref-restrict.js.
+
+ (func (export "get") (result eqref)
+ (global.get $g1))
+
+ (func (export "copy")
+ (global.set $g2 (global.get $g1)))
+
+ (func (export "clear")
+ (global.set $g1 (global.get $g3))
+ (global.set $g2 (ref.null $point))))`);
+
+ let mod = new WebAssembly.Module(bin);
+ let ins = new WebAssembly.Instance(mod).exports;
+
+ assertEq(ins.get(), null);
+ ins.copy(); // Should not crash
+ ins.clear(); // Should not crash
+}
+
+// Global with struct type
+
+{
+ let bin = wasmTextToBinary(
+ `(module
+ (type $point (struct
+ (field $x f64)
+ (field $y f64)))
+
+ (global $glob (mut (ref null $point)) (ref.null $point))
+
+ (func (export "init")
+ (global.set $glob (struct.new $point (f64.const 0.5) (f64.const 2.75))))
+
+ (func (export "change")
+ (global.set $glob (struct.new $point (f64.const 3.5) (f64.const 37.25))))
+
+ (func (export "clear")
+ (global.set $glob (ref.null $point)))
+
+ (func (export "x") (result f64)
+ (struct.get $point 0 (global.get $glob)))
+
+ (func (export "y") (result f64)
+ (struct.get $point 1 (global.get $glob))))`);
+
+ let mod = new WebAssembly.Module(bin);
+ let ins = new WebAssembly.Instance(mod).exports;
+
+ assertErrorMessage(() => ins.x(), WebAssembly.RuntimeError, /dereferencing null pointer/);
+
+ ins.init();
+ assertEq(ins.x(), 0.5);
+ assertEq(ins.y(), 2.75);
+
+ ins.change();
+ assertEq(ins.x(), 3.5);
+ assertEq(ins.y(), 37.25);
+
+ ins.clear();
+ assertErrorMessage(() => ins.x(), WebAssembly.RuntimeError, /dereferencing null pointer/);
+}
+
+// Global value of type externref for initializer from a WebAssembly.Global,
+// just check that it works.
+{
+ let bin = wasmTextToBinary(
+ `(module
+ (import "" "g" (global $g externref))
+ (global $glob externref (global.get $g))
+ (func (export "get") (result externref)
+ (global.get $glob)))`);
+
+ let mod = new WebAssembly.Module(bin);
+ let obj = {zappa:37};
+ let g = new WebAssembly.Global({value: "externref"}, obj);
+ let ins = new WebAssembly.Instance(mod, {"":{g}}).exports;
+ assertEq(ins.get(), obj);
+}