Title: [223548] releases/WebKitGTK/webkit-2.18
Revision
223548
Author
[email protected]
Date
2017-10-17 07:39:54 -0700 (Tue, 17 Oct 2017)

Log Message

Merge r223043 - Safari 10 /11 problem with if (!await get(something)).
https://bugs.webkit.org/show_bug.cgi?id=176685

Reviewed by Saam Barati.

JSTests:

* stress/async-await-basic.js:
(awaitEpression.async):
* stress/async-await-syntax.js:
(testTopLevelAsyncAwaitSyntaxSloppyMode.testSyntax):
(prototype.testTopLevelAsyncAwaitSyntaxStrictMode):

Source/_javascript_Core:

Using unary operator before `await` lead to count it as identifier.
According to spec https://tc39.github.io/ecma262/#sec-async-function-definitions
and Note 1 `await` is as AwaitExpression and it is allowed to use unary operator

* parser/Parser.cpp:
(JSC::Parser<LexerType>::parsePrimaryExpression):

Modified Paths

Diff

Modified: releases/WebKitGTK/webkit-2.18/JSTests/ChangeLog (223547 => 223548)


--- releases/WebKitGTK/webkit-2.18/JSTests/ChangeLog	2017-10-17 14:36:57 UTC (rev 223547)
+++ releases/WebKitGTK/webkit-2.18/JSTests/ChangeLog	2017-10-17 14:39:54 UTC (rev 223548)
@@ -1,3 +1,16 @@
+2017-10-09  Oleksandr Skachkov  <[email protected]>
+
+        Safari 10 /11 problem with if (!await get(something)).
+        https://bugs.webkit.org/show_bug.cgi?id=176685
+
+        Reviewed by Saam Barati.
+
+        * stress/async-await-basic.js:
+        (awaitEpression.async):
+        * stress/async-await-syntax.js:
+        (testTopLevelAsyncAwaitSyntaxSloppyMode.testSyntax):
+        (prototype.testTopLevelAsyncAwaitSyntaxStrictMode):
+
 2017-09-27  Michael Saboff  <[email protected]>
 
         REGRESSION(210837): RegExp containing failed non-zero minimum greedy groups incorrectly match

Modified: releases/WebKitGTK/webkit-2.18/JSTests/stress/async-await-basic.js (223547 => 223548)


--- releases/WebKitGTK/webkit-2.18/JSTests/stress/async-await-basic.js	2017-10-17 14:36:57 UTC (rev 223547)
+++ releases/WebKitGTK/webkit-2.18/JSTests/stress/async-await-basic.js	2017-10-17 14:39:54 UTC (rev 223548)
@@ -254,6 +254,45 @@
 shouldBeAsync(5, () => resumeAfterThrowEval(4));
 shouldBe("start:4 resume:throw1 resume:throw2", log.join(" "));
 
+var awaitEpression = async (value) => {
+    log.push("start:" + value);
+    if (!await false)
+        log.push('step 1');
+    var t = ~await true;
+    log.push('step 2 ' + t);
+
+    var t1 = +await Promise.resolve(12345);
+    log.push('step 3 ' + t1);
+
+    var t2 = -await 54321;
+    log.push('step 4 ' + t2);
+
+    var t3 = !!!!!await Promise.resolve(true);
+    log.push('step 5 ' + t3);
+
+    try {
+        var t4 = ++await 1;
+    } catch(e) {
+        if (e instanceof ReferenceError) {
+            log.push('step 6 ');
+        } 
+    }
+
+    try {
+        var t5 = --await 1;
+    } catch(e) {
+        if (e instanceof ReferenceError) {
+            log.push('step 7');
+        } 
+    }
+
+    return void await 'test';
+};
+log = [];
+
+shouldBeAsync(undefined, () => awaitEpression(5));
+shouldBe("start:5 step 1 step 2 -2 step 3 12345 step 4 -54321 step 5 false step 6  step 7", log.join(" "));
+
 // MethoodDefinition SyntaxErrors
 shouldThrowSyntaxError("var obj = { async foo : true };", "Unexpected token ':'. Expected a parenthesis for argument list.");
 shouldThrowSyntaxError("var obj = { async foo = true };", "Unexpected token '='. Expected a parenthesis for argument list.");

Modified: releases/WebKitGTK/webkit-2.18/JSTests/stress/async-await-syntax.js (223547 => 223548)


--- releases/WebKitGTK/webkit-2.18/JSTests/stress/async-await-syntax.js	2017-10-17 14:36:57 UTC (rev 223547)
+++ releases/WebKitGTK/webkit-2.18/JSTests/stress/async-await-syntax.js	2017-10-17 14:39:54 UTC (rev 223548)
@@ -34,8 +34,38 @@
 (function testTopLevelAsyncAwaitSyntaxSloppyMode() {
     testSyntax(`({async: 1})`);
     testSyntax(`var asyncFn = async function() { await 1; };`);
+
+    testSyntax(`var asyncFn = async function() { var t = !await 1; };`);
+    testSyntax(`var asyncFn = async function() { var t = ~await 1; };`);
+    testSyntax(`var asyncFn = async function() { var t = typeof await 1; };`);
+    testSyntax(`var asyncFn = async function() { var t = void await 1; };`);
+    testSyntax(`var asyncFn = async function() { var t = !(await 1); };`);
+    testSyntax(`var asyncFn = async function() { var t = ~(await 1); };`);
+    testSyntax(`var asyncFn = async function() { var t = typeof (await 1); };`);
+    testSyntax(`var asyncFn = async function() { var t = void (await 1); };`);
+
+
+    testSyntax(`var asyncFn = async function() { var t = !!await 1; };`);
+    testSyntax(`var asyncFn = async function() { var t = ~~await 1; };`);
+    testSyntax(`var asyncFn = async function() { var t = typeof typeof await 1; };`);
+    testSyntax(`var asyncFn = async function() { var t = void void await 1; };`);
+
     testSyntax(`var asyncFn = async function withName() { await 1; };`);
     testSyntax(`var asyncFn = async () => await 'test';`);
+
+    testSyntax(`var asyncFn = async () => !await 'test';`);
+    testSyntax(`var asyncFn = async () => ~await 'test';`);
+    testSyntax(`var asyncFn = async () => typeof await 'test';`);
+    testSyntax(`var asyncFn = async () => void await 'test';`);
+    testSyntax(`var asyncFn = async () => - await 'test';`);
+    testSyntax(`var asyncFn = async () => + await 'test';`);
+    testSyntax(`var asyncFn = async () => delete await 'test';`);
+
+    testSyntax(`var asyncFn = async () => !!await 'test';`);
+    testSyntax(`var asyncFn = async () => ~~await 'test';`);
+    testSyntax(`var asyncFn = async () => typeof typeof await 'test';`);
+    testSyntax(`var asyncFn = async () => void void await 'test';`);
+
     testSyntax(`var asyncFn = async x => await x + 'test';`);
     testSyntax(`function foo(fn) { fn({ async: true }); }`);
     testSyntax(`async function asyncFn() { await 1; }`);
@@ -69,6 +99,31 @@
 (function testTopLevelAsyncAwaitSyntaxStrictMode() {
     testSyntax(`"use strict"; ({async: 1})`);
     testSyntax(`"use strict"; var asyncFn = async function() { await 1; };`);
+
+    testSyntax(`"use strict"; var asyncFn = async function() { var t = !await 1; };`);
+    testSyntax(`"use strict"; var asyncFn = async function() { var t = ~await 1; };`);
+    testSyntax(`"use strict"; var asyncFn = async function() { var t = +await 1; };`);
+    testSyntax(`"use strict"; var asyncFn = async function() { var t = -await 1; };`);
+    testSyntax(`"use strict"; var asyncFn = async function() { var t = typeof await 1; };`);
+    testSyntax(`"use strict"; var asyncFn = async function() { var t = void await 1; };`);
+    testSyntax(`"use strict"; var asyncFn = async function() { var t = !(await 1); };`);
+    testSyntax(`"use strict"; var asyncFn = async function() { var t = ~(await 1); };`);
+    testSyntax(`"use strict"; var asyncFn = async function() { var t = -(await 1); };`);
+    testSyntax(`"use strict"; var asyncFn = async function() { var t = +(await 1); };`);
+    testSyntax(`"use strict"; var asyncFn = async function() { var t = typeof (await 1); };`);
+    testSyntax(`"use strict"; var asyncFn = async function() { var t = void (await 1); };`);
+
+    testSyntax(`"use strict"; var asyncFn = async function() { var t = !!await 1; };`);
+    testSyntax(`"use strict"; var asyncFn = async function() { var t = ~~await 1; };`);
+    testSyntax(`"use strict"; var asyncFn = async function() { var t = typeof typeof await 1; };`);
+    testSyntax(`"use strict"; var asyncFn = async function() { var t = void void await 1; };`);
+
+    testSyntax(`"use strict"; var asyncFn = async function() { var t = !!await 1; };`);
+    testSyntax(`"use strict"; var asyncFn = async function() { var t = !~await 1; };`);
+    testSyntax(`"use strict"; var asyncFn = async function() { var t = !typeof typeof await 1; };`);
+    testSyntax(`"use strict"; var asyncFn = async function() { var t = !void void await 1; };`);
+
+
     testSyntax(`"use strict"; var asyncFn = async function withName() { await 1; };`);
     testSyntax(`"use strict"; var asyncFn = async () => await 'test';`);
     testSyntax(`"use strict"; var asyncFn = async x => await x + 'test';`);

Modified: releases/WebKitGTK/webkit-2.18/Source/_javascript_Core/ChangeLog (223547 => 223548)


--- releases/WebKitGTK/webkit-2.18/Source/_javascript_Core/ChangeLog	2017-10-17 14:36:57 UTC (rev 223547)
+++ releases/WebKitGTK/webkit-2.18/Source/_javascript_Core/ChangeLog	2017-10-17 14:39:54 UTC (rev 223548)
@@ -1,3 +1,17 @@
+2017-10-09  Oleksandr Skachkov  <[email protected]>
+
+        Safari 10 /11 problem with if (!await get(something)).
+        https://bugs.webkit.org/show_bug.cgi?id=176685
+
+        Reviewed by Saam Barati.
+
+        Using unary operator before `await` lead to count it as identifier.
+        According to spec https://tc39.github.io/ecma262/#sec-async-function-definitions
+        and Note 1 `await` is as AwaitExpression and it is allowed to use unary operator
+
+        * parser/Parser.cpp:
+        (JSC::Parser<LexerType>::parsePrimaryExpression):
+
 2017-10-06  Robin Morisset  <[email protected]>
 
         Avoid integer overflow in DFGStrengthReduction.cpp

Modified: releases/WebKitGTK/webkit-2.18/Source/_javascript_Core/parser/Parser.cpp (223547 => 223548)


--- releases/WebKitGTK/webkit-2.18/Source/_javascript_Core/parser/Parser.cpp	2017-10-17 14:36:57 UTC (rev 223547)
+++ releases/WebKitGTK/webkit-2.18/Source/_javascript_Core/parser/Parser.cpp	2017-10-17 14:39:54 UTC (rev 223548)
@@ -4423,6 +4423,9 @@
     case AWAIT:
         if (m_parserState.functionParsePhase == FunctionParsePhase::Parameters)
             failIfFalse(m_parserState.allowAwait, "Cannot use await _expression_ within parameters");
+        else if (currentFunctionScope()->isAsyncFunctionBoundary())
+            return parseAwaitExpression(context);
+
         goto identifierExpression;
     case ASYNC: {
         JSTextPosition start = tokenStartPosition();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to