tor-browser

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

limits.js (1985B)


      1 // |jit-test| skip-if: getBuildConfiguration("wasi")
      2 //
      3 // Tests aimed at AbstractGeneratorObject::FixedSlotLimit.
      4 
      5 "use strict";
      6 
      7 function test(n) {
      8  const iterate = (start, f) => {
      9    let value = start;
     10    for (let i = n; i-- > 0; ) {
     11      value = f(value, i);
     12    }
     13    return value;
     14  };
     15 
     16  const generate = (start, f) => {
     17    let s = iterate(start, f);
     18    let gen = eval('(function* () {\n' + s + '})');
     19    return gen();
     20  };
     21 
     22  // Test 1: many vars in the function scope
     23  {
     24    let it = generate(
     25      "yield 0;",
     26      (s, i) => `
     27        var v${i} = ${i};
     28        ${s}
     29        assertEq(v${i}, ${i});
     30      `
     31    );
     32    assertEq(it.next().done, false);
     33    assertEq(it.next().done, true);
     34  }
     35 
     36  // Test 2: many let-bindings in nested lexical scopes
     37  {
     38    let it = generate(
     39      "yield a => v174;",
     40      (s, i) => {
     41        let block = `
     42          let v${i} = ${i};
     43          ${s}
     44          assertEq(v${i}, ${i});
     45        `;
     46        if (i % 17 == 0) {
     47          block = '{\n' + block + '}\n';
     48        }
     49        return block;
     50      }
     51    );
     52    assertEq(it.next().done, false);
     53    assertEq(it.next().done, true);
     54  }
     55 
     56  // Test 3: TDZ is preserved across yield
     57  {
     58    let it = generate(
     59      'yield 0;\n' +
     60        'try { v1; } catch (exc) { yield [1, exc]; }\n' +
     61        `try { v${n - 1}; } catch (exc) { yield [2, exc]; }\n`,
     62      (s, i) => {
     63        let block = `
     64          ${s}
     65          let v${i};
     66        `;
     67        if (i % 256 == 0) {
     68          block = '{\n' + block + '}\n';
     69        }
     70        return block;
     71      }
     72    );
     73    let {value, done} = it.next();
     74    assertEq(value, 0);
     75    ({value, done} = it.next());
     76    assertEq(value[0], 1);
     77    assertEq(value[1].name, "ReferenceError");
     78    ({value, done} = it.next());
     79    assertEq(value[0], 2);
     80    assertEq(value[1].name, "ReferenceError");
     81    ({value, done} = it.next());
     82    assertEq(done, true);
     83  }
     84 }
     85 
     86 for (let exp = 8; exp < 12; exp++) {
     87  const n = 2 ** exp;
     88  test(n - 2);
     89  test(n + 1);
     90 }