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