tor-browser

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

symbol-for-index-throws-agent.js (2534B)


      1 // |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration('arm64-simulator'))) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
      2 // Copyright (C) 2018 Amal Hussein. All rights reserved.
      3 // This code is governed by the BSD license found in the LICENSE file.
      4 
      5 /*---
      6 esid: sec-atomics.wait
      7 description: >
      8  Throws a TypeError if index arg can not be converted to an Integer
      9 info: |
     10  Atomics.wait( typedArray, index, value, timeout )
     11 
     12  2. Let i be ? ValidateAtomicAccess(typedArray, index).
     13 
     14  ValidateAtomicAccess( typedArray, requestIndex )
     15 
     16  2. Let accessIndex be ? ToIndex(requestIndex).
     17 
     18  ToIndex ( value )
     19 
     20  2. Else,
     21    a. Let integerIndex be ? ToInteger(value).
     22 
     23  ToInteger(value)
     24 
     25  1. Let number be ? ToNumber(argument).
     26 
     27    Symbol --> Throw a TypeError exception.
     28 
     29 includes: [atomicsHelper.js]
     30 features: [Atomics, SharedArrayBuffer, Symbol, Symbol.toPrimitive, TypedArray]
     31 ---*/
     32 
     33 const RUNNING = 1;
     34 
     35 $262.agent.start(`
     36  const poisonedValueOf = {
     37    valueOf: function() {
     38      throw new Test262Error('should not evaluate this code');
     39    }
     40  };
     41 
     42  const poisonedToPrimitive = {
     43    [Symbol.toPrimitive]: function() {
     44      throw new Test262Error("passing a poisoned object using @@ToPrimitive");
     45    }
     46  };
     47 
     48  $262.agent.receiveBroadcast(function(sab) {
     49    const i32a = new Int32Array(sab);
     50    Atomics.add(i32a, ${RUNNING}, 1);
     51 
     52    let status1 = "";
     53    let status2 = "";
     54 
     55    try {
     56      Atomics.wait(i32a, Symbol("1"), poisonedValueOf, poisonedValueOf);
     57    } catch (error) {
     58      status1 = 'Symbol("1")';
     59    }
     60    try {
     61      Atomics.wait(i32a, Symbol("2"), poisonedToPrimitive, poisonedToPrimitive);
     62    } catch (error) {
     63      status2 = 'Symbol("2")';
     64    }
     65 
     66    $262.agent.report(status1);
     67    $262.agent.report(status2);
     68    $262.agent.leaving();
     69  });
     70 `);
     71 
     72 const i32a = new Int32Array(
     73  new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 4)
     74 );
     75 
     76 $262.agent.safeBroadcast(i32a);
     77 $262.agent.waitUntil(i32a, RUNNING, 1);
     78 
     79 // Try to yield control to ensure the agent actually started to wait.
     80 $262.agent.tryYield();
     81 
     82 assert.sameValue(
     83  $262.agent.getReport(),
     84  'Symbol("1")',
     85  '$262.agent.getReport() returns "Symbol("1")"'
     86 );
     87 assert.sameValue(
     88  $262.agent.getReport(),
     89  'Symbol("2")',
     90  '$262.agent.getReport() returns "Symbol("2")"'
     91 );
     92 
     93 assert.sameValue(Atomics.notify(i32a, 0), 0, 'Atomics.notify(i32a, 0) returns 0');
     94 
     95 reportCompare(0, 0);