tor-browser

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

shell.js (22228B)


      1 // GENERATED, DO NOT EDIT
      2 // file: assert.js
      3 // Copyright (C) 2017 Ecma International.  All rights reserved.
      4 // This code is governed by the BSD license found in the LICENSE file.
      5 /*---
      6 description: |
      7    Collection of assertion functions used throughout test262
      8 defines: [assert]
      9 ---*/
     10 
     11 
     12 function assert(mustBeTrue, message) {
     13  if (mustBeTrue === true) {
     14    return;
     15  }
     16 
     17  if (message === undefined) {
     18    message = 'Expected true but got ' + assert._toString(mustBeTrue);
     19  }
     20  throw new Test262Error(message);
     21 }
     22 
     23 assert._isSameValue = function (a, b) {
     24  if (a === b) {
     25    // Handle +/-0 vs. -/+0
     26    return a !== 0 || 1 / a === 1 / b;
     27  }
     28 
     29  // Handle NaN vs. NaN
     30  return a !== a && b !== b;
     31 };
     32 
     33 assert.sameValue = function (actual, expected, message) {
     34  try {
     35    if (assert._isSameValue(actual, expected)) {
     36      return;
     37    }
     38  } catch (error) {
     39    throw new Test262Error(message + ' (_isSameValue operation threw) ' + error);
     40    return;
     41  }
     42 
     43  if (message === undefined) {
     44    message = '';
     45  } else {
     46    message += ' ';
     47  }
     48 
     49  message += 'Expected SameValue(«' + assert._toString(actual) + '», «' + assert._toString(expected) + '») to be true';
     50 
     51  throw new Test262Error(message);
     52 };
     53 
     54 assert.notSameValue = function (actual, unexpected, message) {
     55  if (!assert._isSameValue(actual, unexpected)) {
     56    return;
     57  }
     58 
     59  if (message === undefined) {
     60    message = '';
     61  } else {
     62    message += ' ';
     63  }
     64 
     65  message += 'Expected SameValue(«' + assert._toString(actual) + '», «' + assert._toString(unexpected) + '») to be false';
     66 
     67  throw new Test262Error(message);
     68 };
     69 
     70 assert.throws = function (expectedErrorConstructor, func, message) {
     71  var expectedName, actualName;
     72  if (typeof func !== "function") {
     73    throw new Test262Error('assert.throws requires two arguments: the error constructor ' +
     74      'and a function to run');
     75    return;
     76  }
     77  if (message === undefined) {
     78    message = '';
     79  } else {
     80    message += ' ';
     81  }
     82 
     83  try {
     84    func();
     85  } catch (thrown) {
     86    if (typeof thrown !== 'object' || thrown === null) {
     87      message += 'Thrown value was not an object!';
     88      throw new Test262Error(message);
     89    } else if (thrown.constructor !== expectedErrorConstructor) {
     90      expectedName = expectedErrorConstructor.name;
     91      actualName = thrown.constructor.name;
     92      if (expectedName === actualName) {
     93        message += 'Expected a ' + expectedName + ' but got a different error constructor with the same name';
     94      } else {
     95        message += 'Expected a ' + expectedName + ' but got a ' + actualName;
     96      }
     97      throw new Test262Error(message);
     98    }
     99    return;
    100  }
    101 
    102  message += 'Expected a ' + expectedErrorConstructor.name + ' to be thrown but no exception was thrown at all';
    103  throw new Test262Error(message);
    104 };
    105 
    106 assert._toString = function (value) {
    107  try {
    108    if (value === 0 && 1 / value === -Infinity) {
    109      return '-0';
    110    }
    111 
    112    return String(value);
    113  } catch (err) {
    114    if (err.name === 'TypeError') {
    115      return Object.prototype.toString.call(value);
    116    }
    117 
    118    throw err;
    119  }
    120 };
    121 
    122 // file: compareArray.js
    123 // Copyright (C) 2017 Ecma International.  All rights reserved.
    124 // This code is governed by the BSD license found in the LICENSE file.
    125 /*---
    126 description: |
    127    Compare the contents of two arrays
    128 defines: [compareArray]
    129 ---*/
    130 
    131 function compareArray(a, b) {
    132  if (b.length !== a.length) {
    133    return false;
    134  }
    135 
    136  for (var i = 0; i < a.length; i++) {
    137    if (!compareArray.isSameValue(b[i], a[i])) {
    138      return false;
    139    }
    140  }
    141  return true;
    142 }
    143 
    144 compareArray.isSameValue = function(a, b) {
    145  if (a === 0 && b === 0) return 1 / a === 1 / b;
    146  if (a !== a && b !== b) return true;
    147 
    148  return a === b;
    149 };
    150 
    151 compareArray.format = function(arrayLike) {
    152  return `[${[].map.call(arrayLike, String).join(', ')}]`;
    153 };
    154 
    155 assert.compareArray = function(actual, expected, message) {
    156  message  = message === undefined ? '' : message;
    157 
    158  if (typeof message === 'symbol') {
    159    message = message.toString();
    160  }
    161 
    162  assert(actual != null, `First argument shouldn't be nullish. ${message}`);
    163  assert(expected != null, `Second argument shouldn't be nullish. ${message}`);
    164  var format = compareArray.format;
    165  var result = compareArray(actual, expected);
    166 
    167  // The following prevents actual and expected from being iterated and evaluated
    168  // more than once unless absolutely necessary.
    169  if (!result) {
    170    assert(false, `Expected ${format(actual)} and ${format(expected)} to have the same contents. ${message}`);
    171  }
    172 };
    173 
    174 // file: propertyHelper.js
    175 // Copyright (C) 2017 Ecma International.  All rights reserved.
    176 // This code is governed by the BSD license found in the LICENSE file.
    177 /*---
    178 description: |
    179    Collection of functions used to safely verify the correctness of
    180    property descriptors.
    181 defines:
    182  - verifyProperty
    183  - verifyEqualTo # deprecated
    184  - verifyWritable # deprecated
    185  - verifyNotWritable # deprecated
    186  - verifyEnumerable # deprecated
    187  - verifyNotEnumerable # deprecated
    188  - verifyConfigurable # deprecated
    189  - verifyNotConfigurable # deprecated
    190 ---*/
    191 
    192 // @ts-check
    193 
    194 /**
    195 * @param {object} obj
    196 * @param {string|symbol} name
    197 * @param {PropertyDescriptor|undefined} desc
    198 * @param {object} [options]
    199 * @param {boolean} [options.restore]
    200 */
    201 function verifyProperty(obj, name, desc, options) {
    202  assert(
    203    arguments.length > 2,
    204    'verifyProperty should receive at least 3 arguments: obj, name, and descriptor'
    205  );
    206 
    207  var originalDesc = Object.getOwnPropertyDescriptor(obj, name);
    208  var nameStr = String(name);
    209 
    210  // Allows checking for undefined descriptor if it's explicitly given.
    211  if (desc === undefined) {
    212    assert.sameValue(
    213      originalDesc,
    214      undefined,
    215      "obj['" + nameStr + "'] descriptor should be undefined"
    216    );
    217 
    218    // desc and originalDesc are both undefined, problem solved;
    219    return true;
    220  }
    221 
    222  assert(
    223    Object.prototype.hasOwnProperty.call(obj, name),
    224    "obj should have an own property " + nameStr
    225  );
    226 
    227  assert.notSameValue(
    228    desc,
    229    null,
    230    "The desc argument should be an object or undefined, null"
    231  );
    232 
    233  assert.sameValue(
    234    typeof desc,
    235    "object",
    236    "The desc argument should be an object or undefined, " + String(desc)
    237  );
    238 
    239  var names = Object.getOwnPropertyNames(desc);
    240  for (var i = 0; i < names.length; i++) {
    241    assert(
    242      names[i] === "value" ||
    243        names[i] === "writable" ||
    244        names[i] === "enumerable" ||
    245        names[i] === "configurable" ||
    246        names[i] === "get" ||
    247        names[i] === "set",
    248      "Invalid descriptor field: " + names[i],
    249    );
    250  }
    251 
    252  var failures = [];
    253 
    254  if (Object.prototype.hasOwnProperty.call(desc, 'value')) {
    255    if (!isSameValue(desc.value, originalDesc.value)) {
    256      failures.push("descriptor value should be " + desc.value);
    257    }
    258    if (!isSameValue(desc.value, obj[name])) {
    259      failures.push("object value should be " + desc.value);
    260    }
    261  }
    262 
    263  if (Object.prototype.hasOwnProperty.call(desc, 'enumerable')) {
    264    if (desc.enumerable !== originalDesc.enumerable ||
    265        desc.enumerable !== isEnumerable(obj, name)) {
    266      failures.push('descriptor should ' + (desc.enumerable ? '' : 'not ') + 'be enumerable');
    267    }
    268  }
    269 
    270  if (Object.prototype.hasOwnProperty.call(desc, 'writable')) {
    271    if (desc.writable !== originalDesc.writable ||
    272        desc.writable !== isWritable(obj, name)) {
    273      failures.push('descriptor should ' + (desc.writable ? '' : 'not ') + 'be writable');
    274    }
    275  }
    276 
    277  if (Object.prototype.hasOwnProperty.call(desc, 'configurable')) {
    278    if (desc.configurable !== originalDesc.configurable ||
    279        desc.configurable !== isConfigurable(obj, name)) {
    280      failures.push('descriptor should ' + (desc.configurable ? '' : 'not ') + 'be configurable');
    281    }
    282  }
    283 
    284  assert(!failures.length, failures.join('; '));
    285 
    286  if (options && options.restore) {
    287    Object.defineProperty(obj, name, originalDesc);
    288  }
    289 
    290  return true;
    291 }
    292 
    293 function isConfigurable(obj, name) {
    294  var hasOwnProperty = Object.prototype.hasOwnProperty;
    295  try {
    296    delete obj[name];
    297  } catch (e) {
    298    if (!(e instanceof TypeError)) {
    299      throw new Test262Error("Expected TypeError, got " + e);
    300    }
    301  }
    302  return !hasOwnProperty.call(obj, name);
    303 }
    304 
    305 function isEnumerable(obj, name) {
    306  var stringCheck = false;
    307 
    308  if (typeof name === "string") {
    309    for (var x in obj) {
    310      if (x === name) {
    311        stringCheck = true;
    312        break;
    313      }
    314    }
    315  } else {
    316    // skip it if name is not string, works for Symbol names.
    317    stringCheck = true;
    318  }
    319 
    320  return stringCheck &&
    321    Object.prototype.hasOwnProperty.call(obj, name) &&
    322    Object.prototype.propertyIsEnumerable.call(obj, name);
    323 }
    324 
    325 function isSameValue(a, b) {
    326  if (a === 0 && b === 0) return 1 / a === 1 / b;
    327  if (a !== a && b !== b) return true;
    328 
    329  return a === b;
    330 }
    331 
    332 var __isArray = Array.isArray;
    333 function isWritable(obj, name, verifyProp, value) {
    334  var unlikelyValue = __isArray(obj) && name === "length" ?
    335    Math.pow(2, 32) - 1 :
    336    "unlikelyValue";
    337  var newValue = value || unlikelyValue;
    338  var hadValue = Object.prototype.hasOwnProperty.call(obj, name);
    339  var oldValue = obj[name];
    340  var writeSucceeded;
    341 
    342  try {
    343    obj[name] = newValue;
    344  } catch (e) {
    345    if (!(e instanceof TypeError)) {
    346      throw new Test262Error("Expected TypeError, got " + e);
    347    }
    348  }
    349 
    350  writeSucceeded = isSameValue(obj[verifyProp || name], newValue);
    351 
    352  // Revert the change only if it was successful (in other cases, reverting
    353  // is unnecessary and may trigger exceptions for certain property
    354  // configurations)
    355  if (writeSucceeded) {
    356    if (hadValue) {
    357      obj[name] = oldValue;
    358    } else {
    359      delete obj[name];
    360    }
    361  }
    362 
    363  return writeSucceeded;
    364 }
    365 
    366 /**
    367 * Deprecated; please use `verifyProperty` in new tests.
    368 */
    369 function verifyEqualTo(obj, name, value) {
    370  if (!isSameValue(obj[name], value)) {
    371    throw new Test262Error("Expected obj[" + String(name) + "] to equal " + value +
    372           ", actually " + obj[name]);
    373  }
    374 }
    375 
    376 /**
    377 * Deprecated; please use `verifyProperty` in new tests.
    378 */
    379 function verifyWritable(obj, name, verifyProp, value) {
    380  if (!verifyProp) {
    381    assert(Object.getOwnPropertyDescriptor(obj, name).writable,
    382         "Expected obj[" + String(name) + "] to have writable:true.");
    383  }
    384  if (!isWritable(obj, name, verifyProp, value)) {
    385    throw new Test262Error("Expected obj[" + String(name) + "] to be writable, but was not.");
    386  }
    387 }
    388 
    389 /**
    390 * Deprecated; please use `verifyProperty` in new tests.
    391 */
    392 function verifyNotWritable(obj, name, verifyProp, value) {
    393  if (!verifyProp) {
    394    assert(!Object.getOwnPropertyDescriptor(obj, name).writable,
    395         "Expected obj[" + String(name) + "] to have writable:false.");
    396  }
    397  if (isWritable(obj, name, verifyProp)) {
    398    throw new Test262Error("Expected obj[" + String(name) + "] NOT to be writable, but was.");
    399  }
    400 }
    401 
    402 /**
    403 * Deprecated; please use `verifyProperty` in new tests.
    404 */
    405 function verifyEnumerable(obj, name) {
    406  assert(Object.getOwnPropertyDescriptor(obj, name).enumerable,
    407       "Expected obj[" + String(name) + "] to have enumerable:true.");
    408  if (!isEnumerable(obj, name)) {
    409    throw new Test262Error("Expected obj[" + String(name) + "] to be enumerable, but was not.");
    410  }
    411 }
    412 
    413 /**
    414 * Deprecated; please use `verifyProperty` in new tests.
    415 */
    416 function verifyNotEnumerable(obj, name) {
    417  assert(!Object.getOwnPropertyDescriptor(obj, name).enumerable,
    418       "Expected obj[" + String(name) + "] to have enumerable:false.");
    419  if (isEnumerable(obj, name)) {
    420    throw new Test262Error("Expected obj[" + String(name) + "] NOT to be enumerable, but was.");
    421  }
    422 }
    423 
    424 /**
    425 * Deprecated; please use `verifyProperty` in new tests.
    426 */
    427 function verifyConfigurable(obj, name) {
    428  assert(Object.getOwnPropertyDescriptor(obj, name).configurable,
    429       "Expected obj[" + String(name) + "] to have configurable:true.");
    430  if (!isConfigurable(obj, name)) {
    431    throw new Test262Error("Expected obj[" + String(name) + "] to be configurable, but was not.");
    432  }
    433 }
    434 
    435 /**
    436 * Deprecated; please use `verifyProperty` in new tests.
    437 */
    438 function verifyNotConfigurable(obj, name) {
    439  assert(!Object.getOwnPropertyDescriptor(obj, name).configurable,
    440       "Expected obj[" + String(name) + "] to have configurable:false.");
    441  if (isConfigurable(obj, name)) {
    442    throw new Test262Error("Expected obj[" + String(name) + "] NOT to be configurable, but was.");
    443  }
    444 }
    445 
    446 // file: sta.js
    447 // Copyright (c) 2012 Ecma International.  All rights reserved.
    448 // This code is governed by the BSD license found in the LICENSE file.
    449 /*---
    450 description: |
    451    Provides both:
    452 
    453    - An error class to avoid false positives when testing for thrown exceptions
    454    - A function to explicitly throw an exception using the Test262Error class
    455 defines: [Test262Error, $DONOTEVALUATE]
    456 ---*/
    457 
    458 
    459 function Test262Error(message) {
    460  this.message = message || "";
    461 }
    462 
    463 Test262Error.prototype.toString = function () {
    464  return "Test262Error: " + this.message;
    465 };
    466 
    467 Test262Error.thrower = function (message) {
    468  throw new Test262Error(message);
    469 };
    470 
    471 function $DONOTEVALUATE() {
    472  throw "Test262: This statement should not be evaluated.";
    473 }
    474 
    475 // file: test262-host.js
    476 // This Source Code Form is subject to the terms of the Mozilla Public
    477 // License, v. 2.0. If a copy of the MPL was not distributed with this
    478 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
    479 
    480 // https://github.com/tc39/test262/blob/main/INTERPRETING.md#host-defined-functions
    481 ;(function createHostObject(global) {
    482    "use strict";
    483 
    484    // Save built-in functions and constructors.
    485    var FunctionToString = global.Function.prototype.toString;
    486    var ReflectApply = global.Reflect.apply;
    487    var Atomics = global.Atomics;
    488    var Error = global.Error;
    489    var SharedArrayBuffer = global.SharedArrayBuffer;
    490    var Int32Array = global.Int32Array;
    491 
    492    // Save built-in shell functions.
    493    var NewGlobal = global.newGlobal;
    494    var setSharedArrayBuffer = global.setSharedArrayBuffer;
    495    var getSharedArrayBuffer = global.getSharedArrayBuffer;
    496    var evalInWorker = global.evalInWorker;
    497    var monotonicNow = global.monotonicNow;
    498    var gc = global.gc;
    499    var clearKeptObjects = global.clearKeptObjects;
    500 
    501    var hasCreateIsHTMLDDA = "createIsHTMLDDA" in global;
    502    var hasThreads = ("helperThreadCount" in global ? global.helperThreadCount() > 0 : true);
    503    var hasMailbox = typeof setSharedArrayBuffer === "function" && typeof getSharedArrayBuffer === "function";
    504    var hasEvalInWorker = typeof evalInWorker === "function";
    505 
    506    if (!hasCreateIsHTMLDDA && !("document" in global && "all" in global.document))
    507        throw new Error("no [[IsHTMLDDA]] object available for testing");
    508 
    509    var IsHTMLDDA = hasCreateIsHTMLDDA
    510                    ? global.createIsHTMLDDA()
    511                    : global.document.all;
    512 
    513    // The $262.agent framework is not appropriate for browsers yet, and some
    514    // test cases can't work in browsers (they block the main thread).
    515 
    516    var shellCode = hasMailbox && hasEvalInWorker;
    517    var sabTestable = Atomics && SharedArrayBuffer && hasThreads && shellCode;
    518 
    519    global.$262 = {
    520        __proto__: null,
    521        createRealm() {
    522            var newGlobalObject = NewGlobal();
    523            var createHostObjectFn = ReflectApply(FunctionToString, createHostObject, []);
    524            newGlobalObject.Function(`${createHostObjectFn} createHostObject(this);`)();
    525            return newGlobalObject.$262;
    526        },
    527        detachArrayBuffer: global.detachArrayBuffer,
    528        evalScript: global.evaluateScript || global.evaluate,
    529        global,
    530        IsHTMLDDA,
    531        gc() {
    532            gc();
    533        },
    534        clearKeptObjects() {
    535            clearKeptObjects();
    536        },
    537        agent: (function () {
    538 
    539            // SpiderMonkey complication: With run-time argument --no-threads
    540            // our test runner will not properly filter test cases that can't be
    541            // run because agents can't be started, and so we do a little
    542            // filtering here: We will quietly succeed and exit if an agent test
    543            // should not have been run because threads cannot be started.
    544            //
    545            // Firefox complication: The test cases that use $262.agent can't
    546            // currently work in the browser, so for now we rely on them not
    547            // being run at all.
    548 
    549            if (!sabTestable) {
    550                let {reportCompare, quit} = global;
    551 
    552                function notAvailable() {
    553                    // See comment above.
    554                    if (!hasThreads && shellCode) {
    555                        reportCompare(0, 0);
    556                        quit(0);
    557                    }
    558                    throw new Error("Agents not available");
    559                }
    560 
    561                return {
    562                    start(script) { notAvailable() },
    563                    broadcast(sab, id) { notAvailable() },
    564                    getReport() { notAvailable() },
    565                    sleep(s) { notAvailable() },
    566                    monotonicNow,
    567                }
    568            }
    569 
    570            // The SpiderMonkey implementation uses a designated shared buffer _ia
    571            // for coordination, and spinlocks for everything except sleeping.
    572 
    573            var _MSG_LOC = 0;           // Low bit set: broadcast available; High bits: seq #
    574            var _ID_LOC = 1;            // ID sent with broadcast
    575            var _ACK_LOC = 2;           // Worker increments this to ack that broadcast was received
    576            var _RDY_LOC = 3;           // Worker increments this to ack that worker is up and running
    577            var _LOCKTXT_LOC = 4;       // Writer lock for the text buffer: 0=open, 1=closed
    578            var _NUMTXT_LOC = 5;        // Count of messages in text buffer
    579            var _NEXT_LOC = 6;          // First free location in the buffer
    580            var _SLEEP_LOC = 7;         // Used for sleeping
    581 
    582            var _FIRST = 10;            // First location of first message
    583 
    584            var _ia = new Int32Array(new SharedArrayBuffer(65536));
    585            _ia[_NEXT_LOC] = _FIRST;
    586 
    587            var _worker_prefix =
    588 // BEGIN WORKER PREFIX
    589 `if (typeof $262 === 'undefined')
    590    $262 = {};
    591 $262.agent = (function (global) {
    592    var ReflectApply = global.Reflect.apply;
    593    var StringCharCodeAt = global.String.prototype.charCodeAt;
    594    var {
    595        add: Atomics_add,
    596        compareExchange: Atomics_compareExchange,
    597        load: Atomics_load,
    598        store: Atomics_store,
    599        wait: Atomics_wait,
    600    } = global.Atomics;
    601 
    602    var {getSharedArrayBuffer} = global;
    603 
    604    var _ia = new Int32Array(getSharedArrayBuffer());
    605    var agent = {
    606        receiveBroadcast(receiver) {
    607            var k;
    608            while (((k = Atomics_load(_ia, ${_MSG_LOC})) & 1) === 0)
    609                ;
    610            var received_sab = getSharedArrayBuffer();
    611            var received_id = Atomics_load(_ia, ${_ID_LOC});
    612            Atomics_add(_ia, ${_ACK_LOC}, 1);
    613            while (Atomics_load(_ia, ${_MSG_LOC}) === k)
    614                ;
    615            receiver(received_sab, received_id);
    616        },
    617 
    618        report(msg) {
    619            while (Atomics_compareExchange(_ia, ${_LOCKTXT_LOC}, 0, 1) === 1)
    620                ;
    621            msg = "" + msg;
    622            var i = _ia[${_NEXT_LOC}];
    623            _ia[i++] = msg.length;
    624            for ( let j=0 ; j < msg.length ; j++ )
    625                _ia[i++] = ReflectApply(StringCharCodeAt, msg, [j]);
    626            _ia[${_NEXT_LOC}] = i;
    627            Atomics_add(_ia, ${_NUMTXT_LOC}, 1);
    628            Atomics_store(_ia, ${_LOCKTXT_LOC}, 0);
    629        },
    630 
    631        sleep(s) {
    632            Atomics_wait(_ia, ${_SLEEP_LOC}, 0, s);
    633        },
    634 
    635        leaving() {},
    636 
    637        monotonicNow: global.monotonicNow,
    638    };
    639    Atomics_add(_ia, ${_RDY_LOC}, 1);
    640    return agent;
    641 })(this);`;
    642 // END WORKER PREFIX
    643 
    644            var _numWorkers = 0;
    645            var _numReports = 0;
    646            var _reportPtr = _FIRST;
    647            var {
    648                add: Atomics_add,
    649                load: Atomics_load,
    650                store: Atomics_store,
    651                wait: Atomics_wait,
    652            } = Atomics;
    653            var StringFromCharCode = global.String.fromCharCode;
    654 
    655            return {
    656                start(script) {
    657                    setSharedArrayBuffer(_ia.buffer);
    658                    var oldrdy = Atomics_load(_ia, _RDY_LOC);
    659                    evalInWorker(_worker_prefix + script);
    660                    while (Atomics_load(_ia, _RDY_LOC) === oldrdy)
    661                        ;
    662                    _numWorkers++;
    663                },
    664 
    665                broadcast(sab, id) {
    666                    setSharedArrayBuffer(sab);
    667                    Atomics_store(_ia, _ID_LOC, id);
    668                    Atomics_store(_ia, _ACK_LOC, 0);
    669                    Atomics_add(_ia, _MSG_LOC, 1);
    670                    while (Atomics_load(_ia, _ACK_LOC) < _numWorkers)
    671                        ;
    672                    Atomics_add(_ia, _MSG_LOC, 1);
    673                },
    674 
    675                getReport() {
    676                    if (_numReports === Atomics_load(_ia, _NUMTXT_LOC))
    677                        return null;
    678                    var s = "";
    679                    var i = _reportPtr;
    680                    var len = _ia[i++];
    681                    for ( let j=0 ; j < len ; j++ )
    682                        s += StringFromCharCode(_ia[i++]);
    683                    _reportPtr = i;
    684                    _numReports++;
    685                    return s;
    686                },
    687 
    688                sleep(s) {
    689                    Atomics_wait(_ia, _SLEEP_LOC, 0, s);
    690                },
    691 
    692                monotonicNow,
    693            };
    694        })()
    695    };
    696 })(this);
    697 
    698 var $mozAsyncTestDone = false;
    699 function $DONE(failure) {
    700    // This function is generally called from within a Promise handler, so any
    701    // exception thrown by this method will be swallowed and most likely
    702    // ignored by the Promise machinery.
    703    if ($mozAsyncTestDone) {
    704        reportFailure("$DONE() already called");
    705        return;
    706    }
    707    $mozAsyncTestDone = true;
    708 
    709    if (failure)
    710        reportFailure(failure);
    711    else
    712        reportCompare(0, 0);
    713 
    714    if (typeof jsTestDriverEnd === "function") {
    715        gDelayTestDriverEnd = false;
    716        jsTestDriverEnd();
    717    }
    718 }
    719 
    720 // Some tests in test262 leave promise rejections unhandled.
    721 if ("ignoreUnhandledRejections" in this) {
    722  ignoreUnhandledRejections();
    723 }