tor-browser

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

async-disposal-during-throw-async-generator.js (1869B)


      1 // |jit-test| skip-if: !getBuildConfiguration("explicit-resource-management"); --enable-explicit-resource-management
      2 
      3 load(libdir + "asserts.js");
      4 
      5 class CustomError extends Error {}
      6 
      7 {
      8  const values = [];
      9  async function* gen() {
     10    yield 1;
     11    await using a = {
     12      [Symbol.asyncDispose]() {
     13        values.push("a");
     14      }
     15    }
     16    yield 2;
     17    await using b = {
     18      [Symbol.asyncDispose]() {
     19        values.push("b");
     20      }
     21    }
     22    throw new CustomError();
     23    yield 3;
     24  }
     25  let caught = false;
     26  async function testDisposalDuringThrowInGenerator() {
     27    let x = gen();
     28    values.push((await x.next()).value);
     29    values.push((await x.next()).value);
     30    try {
     31      await x.next();
     32    } catch (e) {
     33      assertEq(e instanceof CustomError, true);
     34      caught = true;
     35    }
     36  }
     37  testDisposalDuringThrowInGenerator();
     38  drainJobQueue();
     39  assertEq(caught, true);
     40  assertArrayEq(values, [1, 2, "b", "a"]);
     41 }
     42 
     43 {
     44  const values = [];
     45  async function* gen() {
     46    yield 1;
     47    await using a = {
     48      [Symbol.asyncDispose]() {
     49        values.push("a");
     50      }
     51    }
     52    yield 2;
     53    await using b = {
     54      [Symbol.asyncDispose]() {
     55        values.push("b");
     56      }
     57    }
     58    yield 3;
     59  }
     60  let caught = false;
     61  async function testDisposalDuringForcedThrowInGenerator() {
     62    let x = gen();
     63    values.push((await x.next()).value);
     64    values.push((await x.next()).value);
     65    try {
     66      // the generator was resumed right at the point where
     67      // we have yield 2, and the throw statement is inserted right over
     68      // there preventing the evaluation of `await using b`.
     69      await x.throw(new CustomError());
     70    } catch (e) {
     71      assertEq(e instanceof CustomError, true);
     72      caught = true;
     73    }
     74  }
     75  testDisposalDuringForcedThrowInGenerator();
     76  drainJobQueue();
     77  assertEq(caught, true);
     78  assertArrayEq(values, [1, 2, "a"]);
     79 }