tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

ref-global.js (2915B)


      1 // Basic private-to-module functionality.  At the moment all we have is null
      2 // pointers, not very exciting.
      3 
      4 {
      5    let bin = wasmTextToBinary(
      6        `(module
      7          (type $point (struct
      8                        (field $x f64)
      9                        (field $y f64)))
     10 
     11          (global $g1 (mut (ref null $point)) (ref.null $point))
     12          (global $g2 (mut (ref null $point)) (ref.null $point))
     13          (global $g3 (ref null $point) (ref.null $point))
     14 
     15          ;; Restriction: cannot expose Refs outside the module, not even
     16          ;; as a return value.  See ref-restrict.js.
     17 
     18          (func (export "get") (result eqref)
     19           (global.get $g1))
     20 
     21          (func (export "copy")
     22           (global.set $g2 (global.get $g1)))
     23 
     24          (func (export "clear")
     25           (global.set $g1 (global.get $g3))
     26           (global.set $g2 (ref.null $point))))`);
     27 
     28    let mod = new WebAssembly.Module(bin);
     29    let ins = new WebAssembly.Instance(mod).exports;
     30 
     31    assertEq(ins.get(), null);
     32    ins.copy();                 // Should not crash
     33    ins.clear();                // Should not crash
     34 }
     35 
     36 // Global with struct type
     37 
     38 {
     39    let bin = wasmTextToBinary(
     40        `(module
     41          (type $point (struct
     42                        (field $x f64)
     43                        (field $y f64)))
     44 
     45          (global $glob (mut (ref null $point)) (ref.null $point))
     46 
     47          (func (export "init")
     48           (global.set $glob (struct.new $point (f64.const 0.5) (f64.const 2.75))))
     49 
     50          (func (export "change")
     51           (global.set $glob (struct.new $point (f64.const 3.5) (f64.const 37.25))))
     52 
     53          (func (export "clear")
     54           (global.set $glob (ref.null $point)))
     55 
     56          (func (export "x") (result f64)
     57           (struct.get $point 0 (global.get $glob)))
     58 
     59          (func (export "y") (result f64)
     60           (struct.get $point 1 (global.get $glob))))`);
     61 
     62    let mod = new WebAssembly.Module(bin);
     63    let ins = new WebAssembly.Instance(mod).exports;
     64 
     65    assertErrorMessage(() => ins.x(), WebAssembly.RuntimeError, /dereferencing null pointer/);
     66 
     67    ins.init();
     68    assertEq(ins.x(), 0.5);
     69    assertEq(ins.y(), 2.75);
     70 
     71    ins.change();
     72    assertEq(ins.x(), 3.5);
     73    assertEq(ins.y(), 37.25);
     74 
     75    ins.clear();
     76    assertErrorMessage(() => ins.x(), WebAssembly.RuntimeError, /dereferencing null pointer/);
     77 }
     78 
     79 // Global value of type externref for initializer from a WebAssembly.Global,
     80 // just check that it works.
     81 {
     82    let bin = wasmTextToBinary(
     83        `(module
     84          (import "" "g" (global $g externref))
     85          (global $glob externref (global.get $g))
     86          (func (export "get") (result externref)
     87           (global.get $glob)))`);
     88 
     89    let mod = new WebAssembly.Module(bin);
     90    let obj = {zappa:37};
     91    let g = new WebAssembly.Global({value: "externref"}, obj);
     92    let ins = new WebAssembly.Instance(mod, {"":{g}}).exports;
     93    assertEq(ins.get(), obj);
     94 }