tor-browser

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

tables.js (3997B)


      1 // implicit null funcref value
      2 {
      3  const { t, get } = wasmEvalText(`(module
      4    (table (export "t") 3 funcref)
      5    (func (export "get") (param i32) (result funcref)
      6      (table.get (local.get 0))
      7    )
      8  )`).exports;
      9 
     10  assertEq(t.get(0), null);
     11  assertEq(t.get(1), null);
     12  assertEq(t.get(2), null);
     13  assertEq(get(0), null);
     14  assertEq(get(1), null);
     15  assertEq(get(2), null);
     16 }
     17 
     18 // explicit null funcref value
     19 {
     20  const { t, get } = wasmEvalText(`(module
     21    (table (export "t") 3 funcref (ref.null func))
     22    (func (export "get") (param i32) (result funcref)
     23      (table.get (local.get 0))
     24    )
     25  )`).exports;
     26 
     27  assertEq(t.get(0), null);
     28  assertEq(t.get(1), null);
     29  assertEq(t.get(2), null);
     30  assertEq(get(0), null);
     31  assertEq(get(1), null);
     32  assertEq(get(2), null);
     33 }
     34 
     35 // actual funcref value
     36 {
     37  const { t, get, foo } = wasmEvalText(`(module
     38    (func $foo (export "foo"))
     39 
     40    (table (export "t") 3 funcref (ref.func $foo))
     41    (func (export "get") (param i32) (result funcref)
     42      (table.get (local.get 0))
     43    )
     44  )`).exports;
     45 
     46  assertEq(t.get(0), foo);
     47  assertEq(t.get(1), foo);
     48  assertEq(t.get(2), foo);
     49  assertEq(get(0), foo);
     50  assertEq(get(1), foo);
     51  assertEq(get(2), foo);
     52 }
     53 
     54 // implicit null anyref value
     55 {
     56  const { t, get } = wasmEvalText(`(module
     57    (table (export "t") 3 anyref)
     58    (func (export "get") (param i32) (result anyref)
     59      (table.get (local.get 0))
     60    )
     61  )`).exports;
     62 
     63  assertEq(t.get(0), null);
     64  assertEq(t.get(1), null);
     65  assertEq(t.get(2), null);
     66  assertEq(get(0), null);
     67  assertEq(get(1), null);
     68  assertEq(get(2), null);
     69 }
     70 
     71 // explicit null anyref value
     72 {
     73  const { t, get } = wasmEvalText(`(module
     74    (table (export "t") 3 anyref (ref.null any))
     75    (func (export "get") (param i32) (result anyref)
     76      (table.get (local.get 0))
     77    )
     78  )`).exports;
     79 
     80  assertEq(t.get(0), null);
     81  assertEq(t.get(1), null);
     82  assertEq(t.get(2), null);
     83  assertEq(get(0), null);
     84  assertEq(get(1), null);
     85  assertEq(get(2), null);
     86 }
     87 
     88 // actual anyref value
     89 {
     90  const { t, get } = wasmEvalText(`(module
     91    (type $s (struct))
     92 
     93    (table (export "t") 3 anyref (struct.new $s))
     94    (func (export "get") (param i32) (result anyref)
     95      (table.get (local.get 0))
     96    )
     97  )`).exports;
     98 
     99  assertEq(!!t.get(0), true);
    100  assertEq(!!t.get(1), true);
    101  assertEq(!!t.get(2), true);
    102  assertEq(!!get(0), true);
    103  assertEq(!!get(1), true);
    104  assertEq(!!get(2), true);
    105 }
    106 
    107 // implicit null externref value
    108 {
    109  const { t, get } = wasmEvalText(`(module
    110    (table (export "t") 3 externref)
    111    (func (export "get") (param i32) (result externref)
    112      (table.get (local.get 0))
    113    )
    114  )`).exports;
    115 
    116  assertEq(t.get(0), null);
    117  assertEq(t.get(1), null);
    118  assertEq(t.get(2), null);
    119  assertEq(get(0), null);
    120  assertEq(get(1), null);
    121  assertEq(get(2), null);
    122 }
    123 
    124 // explicit null externref value
    125 {
    126  const { t, get } = wasmEvalText(`(module
    127    (table (export "t") 3 externref (ref.null extern))
    128    (func (export "get") (param i32) (result externref)
    129      (table.get (local.get 0))
    130    )
    131  )`).exports;
    132 
    133  assertEq(t.get(0), null);
    134  assertEq(t.get(1), null);
    135  assertEq(t.get(2), null);
    136  assertEq(get(0), null);
    137  assertEq(get(1), null);
    138  assertEq(get(2), null);
    139 }
    140 
    141 // actual externref value (from an imported global, which is visible to tables)
    142 {
    143  const foo = "wowzers";
    144  const { t, get } = wasmEvalText(`(module
    145    (global (import "" "foo") externref)
    146 
    147    (table (export "t") 3 externref (global.get 0))
    148    (func (export "get") (param i32) (result externref)
    149      (table.get (local.get 0))
    150    )
    151  )`, { "": { "foo": foo } }).exports;
    152 
    153  assertEq(t.get(0), foo);
    154  assertEq(t.get(1), foo);
    155  assertEq(t.get(2), foo);
    156  assertEq(get(0), foo);
    157  assertEq(get(1), foo);
    158  assertEq(get(2), foo);
    159 }
    160 
    161 // non-imported globals come after tables and are therefore not visible
    162 assertErrorMessage(() => wasmEvalText(`(module
    163  (global anyref (ref.null any))
    164  (table 3 anyref (global.get 0))
    165 )`), WebAssembly.CompileError, /global.get index out of range/);