diff options
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.js | 96 |
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); +} |