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);