tor-browser

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

init-expr.js (10536B)


      1 // Test wasm::InitExpr GC specific constant expressions
      2 
      3 // struct.new and struct.new_default
      4 
      5 const { structNew, structNewDefault, structLarge } = wasmEvalText(`(module
      6    (type $r (struct (field i32) (field f32)))
      7    (type $xxl (struct
      8        (field i64) (field f64) (field i64) (field f64)
      9        (field i64) (field f64) (field i64) (field f64)
     10        (field i64) (field f64) (field i64) (field f64)
     11        (field i64) (field f64) (field i64) (field f64)
     12        (field i64) (field f64) (field i64) (field f64)))
     13 
     14    (global $g1 (ref null $r) (struct.new_default $r))
     15 
     16    (global $g2 (ref null $r) (struct.new $r
     17      (i32.const 2)
     18      (f32.const 3.14)))
     19 
     20    (global $gx (ref null $xxl) (struct.new $xxl
     21      (i64.const 1) (f64.const 2.) (i64.const 3) (f64.const 4.)
     22      (i64.const 5) (f64.const 2.) (i64.const 3) (f64.const 4.)
     23      (i64.const 1) (f64.const 8.) (i64.const 9) (f64.const 4.)
     24      (i64.const 1) (f64.const 2.) (i64.const 12) (f64.const 3.14)
     25      (i64.const 16) (f64.const 17.) (i64.const 18) (f64.const 19.)))
     26    
     27    (func (export "structNewDefault") (result eqref) global.get $g1)
     28    (func (export "structNew") (result eqref) global.get $g2)
     29    (func (export "structLarge") (result eqref) global.get $gx)
     30  )`).exports;
     31 
     32 let result;
     33 result = structNew();
     34 assertEq(wasmGcReadField(result, 0), 2);
     35 assertEq(wasmGcReadField(result, 1), new Float32Array([3.140000104904175])[0]);
     36 result = structNewDefault();
     37 assertEq(wasmGcReadField(result, 0), 0);
     38 assertEq(wasmGcReadField(result, 1), 0);
     39 result = structLarge();
     40 assertEq(wasmGcReadField(result, 2), 3n);
     41 assertEq(wasmGcReadField(result, 19), 19);
     42 
     43 // array.new, array.new_default, array.new_fixed, and array.new_elem
     44 
     45 const { arrayNew, arrayNewDefault, arrayNewFixed, arrayNewElem } = wasmEvalText(`(module
     46    (type $r (struct (field i32) (field f32)))
     47    (type $a1 (array f64))
     48    (type $a2 (array i32))
     49    (type $a3 (array (ref null $r)))
     50 
     51    (global $g1 (ref null $a1) (array.new $a1 (f64.const 3.14) (i32.const 3)))
     52    (global $g2 (ref null $a2) (array.new_default $a2 (i32.const 2)))
     53    (global $g3 (ref null $a3) (array.new_fixed $a3 2
     54        (struct.new $r (i32.const 10) (f32.const 16.0))
     55        (ref.null $r)))
     56 
     57    (elem $a3e (ref null $r)
     58      (item (struct.new $r (i32.const 1) (f32.const 2.0)))
     59      (item (struct.new $r (i32.const 3) (f32.const 4.0)))
     60      (item (struct.new $r (i32.const 5) (f32.const 6.0)))
     61    )
     62 
     63    (func (export "arrayNew") (result eqref) global.get $g1)
     64    (func (export "arrayNewDefault") (result eqref) global.get $g2)
     65    (func (export "arrayNewFixed") (result eqref) global.get $g3)
     66    (func (export "arrayNewElem") (result eqref)
     67      (array.new_elem $a3 $a3e (i32.const 0) (i32.const 3))
     68    )
     69  )`).exports;
     70 
     71 result = arrayNew();
     72 assertEq(wasmGcArrayLength(result), 3);
     73 assertEq(wasmGcReadField(result, 0), 3.14);
     74 assertEq(wasmGcReadField(result, 2), 3.14);
     75 
     76 result = arrayNewDefault();
     77 assertEq(wasmGcArrayLength(result), 2);
     78 assertEq(wasmGcReadField(result, 1), 0);
     79 
     80 result = arrayNewFixed();
     81 assertEq(wasmGcArrayLength(result), 2);
     82 assertEq(wasmGcReadField(wasmGcReadField(result, 0), 0), 10);
     83 assertEq(wasmGcReadField(wasmGcReadField(result, 0), 1), 16);
     84 assertEq(wasmGcReadField(result, 1), null);
     85 
     86 result = arrayNewElem();
     87 assertEq(wasmGcArrayLength(result), 3);
     88 assertEq(wasmGcReadField(wasmGcReadField(result, 0), 0), 1);
     89 assertEq(wasmGcReadField(wasmGcReadField(result, 0), 1), 2);
     90 assertEq(wasmGcReadField(wasmGcReadField(result, 1), 0), 3);
     91 assertEq(wasmGcReadField(wasmGcReadField(result, 1), 1), 4);
     92 assertEq(wasmGcReadField(wasmGcReadField(result, 2), 0), 5);
     93 assertEq(wasmGcReadField(wasmGcReadField(result, 2), 1), 6);
     94 
     95 // any.convert_extern and extern.convert_any
     96 
     97 let {testString, testArray} = wasmEvalText(`(module
     98        (type $array (array i32))
     99        (import "env" "s" (global $s (ref extern)))
    100        (global $s' (ref extern) (extern.convert_any (any.convert_extern (global.get $s))))
    101        (func (export "testString") (result (ref extern))
    102           (global.get $s'))
    103        (global $a (ref $array) (array.new_fixed $array 1 (i32.const 0)))
    104        (global $a' (ref any) (any.convert_extern (extern.convert_any (global.get $a))))
    105        (func (export "testArray") (result i32)
    106           (ref.eq (global.get $a) (ref.cast (ref eq) (global.get $a'))))
    107 )`, {env:{s:"abc"}}).exports;
    108 
    109 assertEq(testString(), 'abc');
    110 assertEq(testArray(), 1);
    111 
    112 wasmFailValidateText(`(module
    113 (global $g (ref extern) (extern.convert_any (any.convert_extern (ref.null extern))))
    114 )`, /expected/);
    115 wasmFailValidateText(`(module
    116 (global $g (ref extern) (any.convert_extern (extern.convert_any (ref.null any))))
    117 )`, /expected/);
    118 
    119 // Simple table initialization
    120 {
    121  const { t1, t2, t1init } = wasmEvalText(`(module
    122    (type $s (struct (field i32)))
    123    (type $a1 (array f64))
    124    (type $a2 (array (ref null $s)))
    125 
    126    ;; passive segment
    127    (elem $e1 anyref
    128      (item (struct.new $s (i32.const 123)))
    129      (item (array.new $a1 (f64.const 234) (i32.const 3)))
    130      (item (array.new_default $a2 (i32.const 3)))
    131      (item (ref.i31 (i32.const 345)))
    132    )
    133    (table $t1 (export "t1") 4 4 anyref)
    134 
    135    ;; active segment
    136    (table $t2 (export "t2") anyref (elem
    137      (item (struct.new $s (i32.const 321)))
    138      (item (array.new $a1 (f64.const 432) (i32.const 3)))
    139      (item (array.new_default $a2 (i32.const 3)))
    140      (item (ref.i31 (i32.const 543)))
    141    ))
    142 
    143    (func (export "t1init") (table.init $t1 $e1 (i32.const 0) (i32.const 0) (i32.const 4)))
    144  )`).exports;
    145 
    146  assertEq(t1.get(0), null);
    147  assertEq(t1.get(1), null);
    148  assertEq(t1.get(2), null);
    149  assertEq(t1.get(3), null);
    150 
    151  assertEq(wasmGcReadField(t2.get(0), 0), 321);
    152  assertEq(wasmGcReadField(t2.get(1), 0), 432);
    153  assertEq(wasmGcReadField(t2.get(1), 1), 432);
    154  assertEq(wasmGcReadField(t2.get(1), 2), 432);
    155  assertEq(wasmGcReadField(t2.get(2), 0), null);
    156  assertEq(wasmGcReadField(t2.get(2), 1), null);
    157  assertEq(wasmGcReadField(t2.get(2), 2), null);
    158  assertEq(t2.get(3), 543);
    159 
    160  t1init();
    161  assertEq(wasmGcReadField(t1.get(0), 0), 123);
    162  assertEq(wasmGcReadField(t1.get(1), 0), 234);
    163  assertEq(wasmGcReadField(t1.get(1), 1), 234);
    164  assertEq(wasmGcReadField(t1.get(1), 2), 234);
    165  assertEq(wasmGcReadField(t1.get(2), 0), null);
    166  assertEq(wasmGcReadField(t1.get(2), 1), null);
    167  assertEq(wasmGcReadField(t1.get(2), 2), null);
    168  assertEq(t1.get(3), 345);
    169 }
    170 
    171 // The contents of passive segments are unique per instance and evaluated at
    172 // instantiation time.
    173 {
    174  const mod = new WebAssembly.Module(wasmTextToBinary(`(module
    175    (type $s (struct (field (mut i32))))
    176    (type $a (array (mut f64)))
    177 
    178    (elem $e anyref
    179      (item (struct.new $s (i32.const 123)))
    180      (item (array.new $a (f64.const 234) (i32.const 1)))
    181    )
    182 
    183    (table $t1 (export "t1") 2 2 anyref)
    184    (table $t2 (export "t2") 2 2 anyref)
    185 
    186    (start $init1)
    187 
    188    (func $init1
    189      (table.init $t1 $e (i32.const 0) (i32.const 0) (i32.const 2))
    190    )
    191    (func (export "init2")
    192      (table.init $t2 $e (i32.const 0) (i32.const 0) (i32.const 2))
    193    )
    194    (func (export "update1")
    195      (ref.cast (ref $s) (table.get $t1 (i32.const 0)))
    196      (struct.set $s 0 (i32.const 321))
    197      (ref.cast (ref $a) (table.get $t1 (i32.const 1)))
    198      (array.set $a (i32.const 0) (f64.const 432))
    199    )
    200    (func (export "update2")
    201      (ref.cast (ref $s) (table.get $t1 (i32.const 0)))
    202      (struct.set $s 0 (i32.const -321))
    203      (ref.cast (ref $a) (table.get $t1 (i32.const 1)))
    204      (array.set $a (i32.const 0) (f64.const -432))
    205    )
    206  )`));
    207 
    208  const { t1: t1_1, t2: t2_1, init2: init2_1, update1: update1_1, update2: update2_1 } = new WebAssembly.Instance(mod, {}).exports;
    209  const { t1: t1_2, t2: t2_2, init2: init2_2, update1: update1_2, update2: update2_2 } = new WebAssembly.Instance(mod, {}).exports;
    210 
    211  assertEq(wasmGcReadField(t1_1.get(0), 0), 123);
    212  assertEq(wasmGcReadField(t1_1.get(1), 0), 234);
    213  assertEq(t2_1.get(0), null);
    214  assertEq(t2_1.get(1), null);
    215  assertEq(wasmGcReadField(t1_2.get(0), 0), 123);
    216  assertEq(wasmGcReadField(t1_2.get(1), 0), 234);
    217  assertEq(t2_2.get(0), null);
    218  assertEq(t2_2.get(1), null);
    219 
    220  update1_1();
    221  assertEq(wasmGcReadField(t1_1.get(0), 0), 321);
    222  assertEq(wasmGcReadField(t1_1.get(1), 0), 432);
    223  assertEq(t2_1.get(0), null);
    224  assertEq(t2_1.get(1), null);
    225  assertEq(wasmGcReadField(t1_2.get(0), 0), 123);
    226  assertEq(wasmGcReadField(t1_2.get(1), 0), 234);
    227  assertEq(t2_2.get(0), null);
    228  assertEq(t2_2.get(1), null);
    229 
    230  init2_1();
    231  assertEq(wasmGcReadField(t1_1.get(0), 0), 321);
    232  assertEq(wasmGcReadField(t1_1.get(1), 0), 432);
    233  assertEq(wasmGcReadField(t2_1.get(0), 0), 321);
    234  assertEq(wasmGcReadField(t2_1.get(1), 0), 432);
    235  assertEq(wasmGcReadField(t1_2.get(0), 0), 123);
    236  assertEq(wasmGcReadField(t1_2.get(1), 0), 234);
    237  assertEq(t2_2.get(0), null);
    238  assertEq(t2_2.get(1), null);
    239 
    240  init2_2();
    241  assertEq(wasmGcReadField(t1_1.get(0), 0), 321);
    242  assertEq(wasmGcReadField(t1_1.get(1), 0), 432);
    243  assertEq(wasmGcReadField(t2_1.get(0), 0), 321);
    244  assertEq(wasmGcReadField(t2_1.get(1), 0), 432);
    245  assertEq(wasmGcReadField(t1_2.get(0), 0), 123);
    246  assertEq(wasmGcReadField(t1_2.get(1), 0), 234);
    247  assertEq(wasmGcReadField(t2_2.get(0), 0), 123);
    248  assertEq(wasmGcReadField(t2_2.get(1), 0), 234);
    249 
    250  update2_1();
    251  assertEq(wasmGcReadField(t1_1.get(0), 0), -321);
    252  assertEq(wasmGcReadField(t1_1.get(1), 0), -432);
    253  assertEq(wasmGcReadField(t2_1.get(0), 0), -321);
    254  assertEq(wasmGcReadField(t2_1.get(1), 0), -432);
    255  assertEq(wasmGcReadField(t1_2.get(0), 0), 123);
    256  assertEq(wasmGcReadField(t1_2.get(1), 0), 234);
    257  assertEq(wasmGcReadField(t2_2.get(0), 0), 123);
    258  assertEq(wasmGcReadField(t2_2.get(1), 0), 234);
    259 
    260  update1_2();
    261  assertEq(wasmGcReadField(t1_1.get(0), 0), -321);
    262  assertEq(wasmGcReadField(t1_1.get(1), 0), -432);
    263  assertEq(wasmGcReadField(t2_1.get(0), 0), -321);
    264  assertEq(wasmGcReadField(t2_1.get(1), 0), -432);
    265  assertEq(wasmGcReadField(t1_2.get(0), 0), 321);
    266  assertEq(wasmGcReadField(t1_2.get(1), 0), 432);
    267  assertEq(wasmGcReadField(t2_2.get(0), 0), 321);
    268  assertEq(wasmGcReadField(t2_2.get(1), 0), 432);
    269 
    270  update2_2();
    271  assertEq(wasmGcReadField(t1_1.get(0), 0), -321);
    272  assertEq(wasmGcReadField(t1_1.get(1), 0), -432);
    273  assertEq(wasmGcReadField(t2_1.get(0), 0), -321);
    274  assertEq(wasmGcReadField(t2_1.get(1), 0), -432);
    275  assertEq(wasmGcReadField(t1_2.get(0), 0), -321);
    276  assertEq(wasmGcReadField(t1_2.get(1), 0), -432);
    277  assertEq(wasmGcReadField(t2_2.get(0), 0), -321);
    278  assertEq(wasmGcReadField(t2_2.get(1), 0), -432);
    279 }