tor-browser

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

regress-outline-repr.js (3319B)


      1 // White-box test for bug 1617908.  The significance of this test is that the
      2 // type $S is too large to fit in an inline WasmGcObject, and the write barrier
      3 // logic must take this into account when storing the (ref $S2) into the last
      4 // field of the object.
      5 
      6 const wat = `
      7 (module
      8  (type $S2 (sub (struct)))
      9  (type $S (sub $S2
     10    (struct
     11      (field (mut i64))
     12      (field (mut i64))
     13      (field (mut i64))
     14      (field (mut i64))
     15      (field (mut i64))
     16      (field (mut i64))
     17      (field (mut i64))
     18      (field (mut i64))
     19      (field (mut i64))
     20      (field (mut i64))
     21      (field (mut i64))
     22      (field (mut i64))
     23      (field (mut i64))
     24      (field (mut i64))
     25      (field (mut i64))
     26      (field (mut i64))
     27      (field (mut i64))
     28      (field (mut i64))
     29      (field (mut eqref)))))
     30 
     31  (func $main
     32    (struct.set $S 18
     33      (struct.new $S
     34        (i64.const 0)
     35        (i64.const 0)
     36        (i64.const 0)
     37        (i64.const 0)
     38        (i64.const 0)
     39        (i64.const 0)
     40        (i64.const 0)
     41        (i64.const 0)
     42        (i64.const 0)
     43        (i64.const 0)
     44        (i64.const 0)
     45        (i64.const 0)
     46        (i64.const 0)
     47        (i64.const 0)
     48        (i64.const 0)
     49        (i64.const 0)
     50        (i64.const 0)
     51        (i64.const 0)
     52        (ref.null eq))
     53      (struct.new $S2)))
     54  (start $main))
     55 `
     56 wasmEvalText(wat);
     57 
     58 // Test subtyping across outline/inline representations works
     59 
     60 wasmEvalText(`
     61 (module
     62  (type $inline
     63    (sub (struct
     64      (field (mut i64))
     65      (field (mut i64))
     66      (field (mut i64))
     67      (field (mut i64))
     68      (field (mut i64))
     69    )))
     70  (type $outline (sub $inline
     71    (struct
     72      (field (mut i64))
     73      (field (mut i64))
     74      (field (mut i64))
     75      (field (mut i64))
     76      (field (mut i64))
     77      (field (mut i64))
     78      (field (mut i64))
     79      (field (mut i64))
     80      (field (mut i64))
     81      (field (mut i64))
     82      (field (mut i64))
     83      (field (mut i64))
     84      (field (mut i64))
     85      (field (mut i64))
     86      (field (mut i64))
     87      (field (mut i64))
     88      (field (mut i64))
     89      (field (mut i64))
     90      (field (mut i64)))))
     91  
     92  (func $main
     93    (local $outline (ref null $outline))
     94    (local $inline (ref null $inline))
     95 
     96    (; create an outline object and acquire multiple views to it ;)
     97    (struct.new $outline
     98          (i64.const 0xFF)
     99          (i64.const 0)
    100          (i64.const 0)
    101          (i64.const 0)
    102          (i64.const 0)
    103          (i64.const 0)
    104          (i64.const 0)
    105          (i64.const 0)
    106          (i64.const 0)
    107          (i64.const 0)
    108          (i64.const 0)
    109          (i64.const 0)
    110          (i64.const 0)
    111          (i64.const 0)
    112          (i64.const 0)
    113          (i64.const 0)
    114          (i64.const 0)
    115          (i64.const 0)
    116          (i64.const 0))
    117    local.tee $outline
    118    local.set $inline
    119 
    120    (; clobber the object header ;)
    121    (struct.set $inline 0
    122      local.get $inline
    123      i64.const 0
    124    )
    125    (struct.set $inline 1
    126      local.get $inline
    127      i64.const 0
    128    )
    129    (struct.set $inline 2
    130      local.get $inline
    131      i64.const 0
    132    )
    133    (struct.set $inline 3
    134      local.get $inline
    135      i64.const 0
    136    )
    137    (struct.set $inline 4
    138      local.get $inline
    139      i64.const 0
    140    )
    141 
    142    (; try to read a field ;)
    143    (struct.get $outline 0
    144      local.get $outline
    145    )
    146    drop
    147  )
    148  (start $main))
    149 `);