tor-browser

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

nursery-non-shared-moved-gc.js (1708B)


      1 // Small (non-shared) TypedArrays can use inline storage and can also be nursery
      2 // allocated. Ensure Atomics functions use correct rooting and don't store the
      3 // TypedArray's data pointer on the stack across a GC.
      4 const INLINE_MEMORY_LENGTH = 1;
      5 
      6 function gcValue(value) {
      7  return {
      8    valueOf() {
      9      minorgc();
     10      return value;
     11    }
     12  };
     13 };
     14 
     15 // Atomics.store
     16 {
     17  let ta = new Int32Array(INLINE_MEMORY_LENGTH);
     18 
     19  Atomics.store(ta, 0, gcValue(1));
     20 
     21  assertEq(ta[0], 1);
     22 }
     23 
     24 // Atomics.compareExchange
     25 {
     26  let ta = new Int32Array(INLINE_MEMORY_LENGTH);
     27  ta[0] = 1;
     28 
     29  let val = Atomics.compareExchange(ta, 0, 1, gcValue(2));
     30 
     31  assertEq(val, 1);
     32  assertEq(ta[0], 2);
     33 }
     34 
     35 // Atomics.exchange
     36 {
     37  let ta = new Int32Array(INLINE_MEMORY_LENGTH);
     38  ta[0] = 1;
     39 
     40  let val = Atomics.exchange(ta, 0, gcValue(2));
     41 
     42  assertEq(val, 1);
     43  assertEq(ta[0], 2);
     44 }
     45 
     46 // Atomics.add
     47 {
     48  let ta = new Int32Array(INLINE_MEMORY_LENGTH);
     49  ta[0] = 1;
     50 
     51  let val = Atomics.add(ta, 0, gcValue(2));
     52 
     53  assertEq(val, 1);
     54  assertEq(ta[0], 3);
     55 }
     56 
     57 // Atomics.sub
     58 {
     59  let ta = new Int32Array(INLINE_MEMORY_LENGTH);
     60  ta[0] = 3;
     61 
     62  let val = Atomics.sub(ta, 0, gcValue(2));
     63 
     64  assertEq(val, 3);
     65  assertEq(ta[0], 1);
     66 }
     67 
     68 // Atomics.and
     69 {
     70  let ta = new Int32Array(INLINE_MEMORY_LENGTH);
     71  ta[0] = 3;
     72 
     73  let val = Atomics.and(ta, 0, gcValue(1));
     74 
     75  assertEq(val, 3);
     76  assertEq(ta[0], 1);
     77 }
     78 
     79 // Atomics.or
     80 {
     81  let ta = new Int32Array(INLINE_MEMORY_LENGTH);
     82  ta[0] = 2;
     83 
     84  let val = Atomics.or(ta, 0, gcValue(1));
     85 
     86  assertEq(val, 2);
     87  assertEq(ta[0], 3);
     88 }
     89 
     90 // Atomics.xor
     91 {
     92  let ta = new Int32Array(INLINE_MEMORY_LENGTH);
     93  ta[0] = 3;
     94 
     95  let val = Atomics.xor(ta, 0, gcValue(1));
     96 
     97  assertEq(val, 3);
     98  assertEq(ta[0], 2);
     99 }