tor-browser

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

yield.js (3585B)


      1 var BUGNUMBER = 1185106;
      2 var summary = "yield handling in async function";
      3 
      4 print(BUGNUMBER + ": " + summary);
      5 
      6 function testPassArgsBody(argsbody) {
      7    Reflect.parse(`async function a${argsbody}`);
      8    Reflect.parse(`(async function a${argsbody})`);
      9    Reflect.parse(`(async function ${argsbody})`);
     10    Reflect.parse(`({ async m${argsbody} })`);
     11 }
     12 
     13 function testErrorArgsBody(argsbody, prefix="") {
     14    assertThrowsInstanceOf(() => Reflect.parse(`${prefix} async function a${argsbody}`), SyntaxError);
     15    assertThrowsInstanceOf(() => Reflect.parse(`${prefix} (async function a${argsbody})`), SyntaxError);
     16    assertThrowsInstanceOf(() => Reflect.parse(`${prefix} (async function ${argsbody})`), SyntaxError);
     17    assertThrowsInstanceOf(() => Reflect.parse(`${prefix} ({ async m${argsbody} })`), SyntaxError);
     18 }
     19 
     20 function testErrorArgsBodyStrict(argsbody) {
     21    testErrorArgsBody(argsbody);
     22    testErrorArgsBody(argsbody, "'use strict'; ");
     23    assertThrowsInstanceOf(() => Reflect.parse(`class X { async m${argsbody} }`), SyntaxError);
     24    assertThrowsInstanceOf(() => Reflect.parse(`class X { static async m${argsbody} }`), SyntaxError);
     25    assertThrowsInstanceOf(() => Reflect.parse(`export default async function ${argsbody}`, { target: "module" }), SyntaxError);
     26 }
     27 
     28 if (typeof Reflect !== "undefined" && Reflect.parse) {
     29    // `yield` handling is inherited in async function declaration name.
     30    Reflect.parse("async function yield() {}");
     31    Reflect.parse("function f() { async function yield() {} }");
     32    assertThrowsInstanceOf(() => Reflect.parse("function* g() { async function yield() {} }"), SyntaxError);
     33    assertThrowsInstanceOf(() => Reflect.parse("'use strict'; async function yield() {}"), SyntaxError);
     34 
     35    // `yield` is treated as an identifier in an async function expression name.
     36    // `yield` is not allowed as an identifier in strict code.
     37    Reflect.parse("(async function yield() {});");
     38    Reflect.parse("function f() { (async function yield() {}); }");
     39    Reflect.parse("function* g() { (async function yield() {}); }");
     40    assertThrowsInstanceOf(() => Reflect.parse("'use strict'; (async function yield() {});"), SyntaxError);
     41 
     42    // `yield` handling is inherited in async method name.
     43    Reflect.parse("({ async yield() {} });");
     44    Reflect.parse("function f() { ({ async yield() {} }); }");
     45    Reflect.parse("function* g() { ({ async yield() {} }); }");
     46    Reflect.parse("'use strict'; ({ async yield() {} });");
     47    Reflect.parse("class X { async yield() {} }");
     48 
     49    Reflect.parse("({ async [yield]() {} });");
     50    Reflect.parse("function f() { ({ async [yield]() {} }); }");
     51    Reflect.parse("function* g() { ({ async [yield]() {} }); }");
     52    assertThrowsInstanceOf(() => Reflect.parse("'use strict'; ({ async [yield]() {} });"), SyntaxError);
     53    assertThrowsInstanceOf(() => Reflect.parse("class X { async [yield]() {} }"), SyntaxError);
     54 
     55    // `yield` is treated as an identifier in an async function parameter
     56    // `yield` is not allowed as an identifier in strict code.
     57    testPassArgsBody("(yield) {}");
     58    testPassArgsBody("(yield = 1) {}");
     59    testPassArgsBody("(a = yield) {}");
     60    testErrorArgsBodyStrict("(yield 3) {}");
     61    testErrorArgsBodyStrict("(a = yield 3) {}");
     62 
     63    // `yield` is treated as an identifier in an async function body
     64    // `yield` is not allowed as an identifier in strict code.
     65    testPassArgsBody("() { yield; }");
     66    testPassArgsBody("() { yield = 1; }");
     67    testErrorArgsBodyStrict("() { yield 3; }");
     68 }
     69 
     70 if (typeof reportCompare === "function")
     71    reportCompare(true, true);