tor-browser

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

good-views.js (2376B)


      1 // |reftest| shell-option(--setpref=atomics_wait_async) skip-if(!this.hasOwnProperty('Atomics')||!xulRuntime.shell) async -- Atomics is not enabled unconditionally, requires shell-options
      2 // Copyright (C) 2020 Rick Waldron. All rights reserved.
      3 // This code is governed by the BSD license found in the LICENSE file.
      4 
      5 /*---
      6 esid: sec-atomics.waitasync
      7 description: >
      8  Test Atomics.waitAsync on arrays that allow atomic operations
      9 flags: [async]
     10 includes: [atomicsHelper.js, asyncHelpers.js]
     11 features: [Atomics.waitAsync, Atomics, BigInt]
     12 ---*/
     13 assert.sameValue(typeof Atomics.waitAsync, 'function', 'The value of `typeof Atomics.waitAsync` is "function"');
     14 
     15 $262.agent.start(`
     16  (async () => {
     17    var sab = new SharedArrayBuffer(2048);
     18    var good_indices = [ (view) => 0/-1, // -0
     19                         (view) => '-0',
     20                         (view) => view.length - 1,
     21                         (view) => ({ valueOf: () => 0 }),
     22                         (view) => ({ toString: () => '0', valueOf: false }) // non-callable valueOf triggers invocation of toString
     23                       ];
     24 
     25    var view = new BigInt64Array(sab, 32, 20);
     26 
     27    view[0] = 0n;
     28    $262.agent.report("A " + (await Atomics.waitAsync(view, 0, 0n, 0).value))
     29    $262.agent.report("B " + (await Atomics.waitAsync(view, 0, 37n, 0).value));
     30 
     31    const results = [];
     32    // In-bounds boundary cases for indexing
     33    for ( let IdxGen of good_indices ) {
     34        let Idx = IdxGen(view);
     35        view.fill(0n);
     36        // Atomics.store() computes an index from Idx in the same way as other
     37        // Atomics operations, not quite like view[Idx].
     38        Atomics.store(view, Idx, 37n);
     39        results.push(await Atomics.waitAsync(view, Idx, 0n).value);
     40    }
     41    $262.agent.report("C " + results.join(","));
     42 
     43    $262.agent.leaving();
     44  })();
     45 `);
     46 
     47 
     48 asyncTest(async () => {
     49  const outcomes = [];
     50 
     51  for (let i = 0; i < 3; i++) {
     52    outcomes.push(await $262.agent.getReportAsync());
     53  }
     54 
     55  assert.sameValue(
     56    outcomes[0],
     57    'A timed-out',
     58    'The value of outcomes[0] is "A timed-out"'
     59  );
     60 
     61  assert.sameValue(
     62    outcomes[1],
     63    'B not-equal',
     64    'The value of outcomes[1] is "B not-equal"'
     65  );
     66  assert.sameValue(
     67    outcomes[2],
     68    'C not-equal,not-equal,not-equal,not-equal,not-equal',
     69    'The value of outcomes[2] is "C not-equal,not-equal,not-equal,not-equal,not-equal"'
     70  );
     71 });