Changeset 223043 in webkit


Ignore:
Timestamp:
Oct 9, 2017 2:59:26 AM (7 years ago)
Author:
gskachkov@gmail.com
Message:

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/JavaScriptCore:

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

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/JSTests/ChangeLog

    r223037 r223043  
     12017-10-09  Oleksandr Skachkov  <gskachkov@gmail.com>
     2
     3        Safari 10 /11 problem with if (!await get(something)).
     4        https://bugs.webkit.org/show_bug.cgi?id=176685
     5
     6        Reviewed by Saam Barati.
     7
     8        * stress/async-await-basic.js:
     9        (awaitEpression.async):
     10        * stress/async-await-syntax.js:
     11        (testTopLevelAsyncAwaitSyntaxSloppyMode.testSyntax):
     12        (prototype.testTopLevelAsyncAwaitSyntaxStrictMode):
     13
    1142017-10-08  Saam Barati  <sbarati@apple.com>
    215
  • trunk/JSTests/stress/async-await-basic.js

    r209113 r223043  
    255255shouldBe("start:4 resume:throw1 resume:throw2", log.join(" "));
    256256
     257var awaitEpression = async (value) => {
     258    log.push("start:" + value);
     259    if (!await false)
     260        log.push('step 1');
     261    var t = ~await true;
     262    log.push('step 2 ' + t);
     263
     264    var t1 = +await Promise.resolve(12345);
     265    log.push('step 3 ' + t1);
     266
     267    var t2 = -await 54321;
     268    log.push('step 4 ' + t2);
     269
     270    var t3 = !!!!!await Promise.resolve(true);
     271    log.push('step 5 ' + t3);
     272
     273    try {
     274        var t4 = ++await 1;
     275    } catch(e) {
     276        if (e instanceof ReferenceError) {
     277            log.push('step 6 ');
     278        }
     279    }
     280
     281    try {
     282        var t5 = --await 1;
     283    } catch(e) {
     284        if (e instanceof ReferenceError) {
     285            log.push('step 7');
     286        }
     287    }
     288
     289    return void await 'test';
     290};
     291log = [];
     292
     293shouldBeAsync(undefined, () => awaitEpression(5));
     294shouldBe("start:5 step 1 step 2 -2 step 3 12345 step 4 -54321 step 5 false step 6  step 7", log.join(" "));
     295
    257296// MethoodDefinition SyntaxErrors
    258297shouldThrowSyntaxError("var obj = { async foo : true };", "Unexpected token ':'. Expected a parenthesis for argument list.");
  • trunk/JSTests/stress/async-await-syntax.js

    r220449 r223043  
    3535    testSyntax(`({async: 1})`);
    3636    testSyntax(`var asyncFn = async function() { await 1; };`);
     37
     38    testSyntax(`var asyncFn = async function() { var t = !await 1; };`);
     39    testSyntax(`var asyncFn = async function() { var t = ~await 1; };`);
     40    testSyntax(`var asyncFn = async function() { var t = typeof await 1; };`);
     41    testSyntax(`var asyncFn = async function() { var t = void await 1; };`);
     42    testSyntax(`var asyncFn = async function() { var t = !(await 1); };`);
     43    testSyntax(`var asyncFn = async function() { var t = ~(await 1); };`);
     44    testSyntax(`var asyncFn = async function() { var t = typeof (await 1); };`);
     45    testSyntax(`var asyncFn = async function() { var t = void (await 1); };`);
     46
     47
     48    testSyntax(`var asyncFn = async function() { var t = !!await 1; };`);
     49    testSyntax(`var asyncFn = async function() { var t = ~~await 1; };`);
     50    testSyntax(`var asyncFn = async function() { var t = typeof typeof await 1; };`);
     51    testSyntax(`var asyncFn = async function() { var t = void void await 1; };`);
     52
    3753    testSyntax(`var asyncFn = async function withName() { await 1; };`);
    3854    testSyntax(`var asyncFn = async () => await 'test';`);
     55
     56    testSyntax(`var asyncFn = async () => !await 'test';`);
     57    testSyntax(`var asyncFn = async () => ~await 'test';`);
     58    testSyntax(`var asyncFn = async () => typeof await 'test';`);
     59    testSyntax(`var asyncFn = async () => void await 'test';`);
     60    testSyntax(`var asyncFn = async () => - await 'test';`);
     61    testSyntax(`var asyncFn = async () => + await 'test';`);
     62    testSyntax(`var asyncFn = async () => delete await 'test';`);
     63
     64    testSyntax(`var asyncFn = async () => !!await 'test';`);
     65    testSyntax(`var asyncFn = async () => ~~await 'test';`);
     66    testSyntax(`var asyncFn = async () => typeof typeof await 'test';`);
     67    testSyntax(`var asyncFn = async () => void void await 'test';`);
     68
    3969    testSyntax(`var asyncFn = async x => await x + 'test';`);
    4070    testSyntax(`function foo(fn) { fn({ async: true }); }`);
     
    70100    testSyntax(`"use strict"; ({async: 1})`);
    71101    testSyntax(`"use strict"; var asyncFn = async function() { await 1; };`);
     102
     103    testSyntax(`"use strict"; var asyncFn = async function() { var t = !await 1; };`);
     104    testSyntax(`"use strict"; var asyncFn = async function() { var t = ~await 1; };`);
     105    testSyntax(`"use strict"; var asyncFn = async function() { var t = +await 1; };`);
     106    testSyntax(`"use strict"; var asyncFn = async function() { var t = -await 1; };`);
     107    testSyntax(`"use strict"; var asyncFn = async function() { var t = typeof await 1; };`);
     108    testSyntax(`"use strict"; var asyncFn = async function() { var t = void await 1; };`);
     109    testSyntax(`"use strict"; var asyncFn = async function() { var t = !(await 1); };`);
     110    testSyntax(`"use strict"; var asyncFn = async function() { var t = ~(await 1); };`);
     111    testSyntax(`"use strict"; var asyncFn = async function() { var t = -(await 1); };`);
     112    testSyntax(`"use strict"; var asyncFn = async function() { var t = +(await 1); };`);
     113    testSyntax(`"use strict"; var asyncFn = async function() { var t = typeof (await 1); };`);
     114    testSyntax(`"use strict"; var asyncFn = async function() { var t = void (await 1); };`);
     115
     116    testSyntax(`"use strict"; var asyncFn = async function() { var t = !!await 1; };`);
     117    testSyntax(`"use strict"; var asyncFn = async function() { var t = ~~await 1; };`);
     118    testSyntax(`"use strict"; var asyncFn = async function() { var t = typeof typeof await 1; };`);
     119    testSyntax(`"use strict"; var asyncFn = async function() { var t = void void await 1; };`);
     120
     121    testSyntax(`"use strict"; var asyncFn = async function() { var t = !!await 1; };`);
     122    testSyntax(`"use strict"; var asyncFn = async function() { var t = !~await 1; };`);
     123    testSyntax(`"use strict"; var asyncFn = async function() { var t = !typeof typeof await 1; };`);
     124    testSyntax(`"use strict"; var asyncFn = async function() { var t = !void void await 1; };`);
     125
     126
    72127    testSyntax(`"use strict"; var asyncFn = async function withName() { await 1; };`);
    73128    testSyntax(`"use strict"; var asyncFn = async () => await 'test';`);
  • trunk/Source/JavaScriptCore/ChangeLog

    r223027 r223043  
     12017-10-09  Oleksandr Skachkov  <gskachkov@gmail.com>
     2
     3        Safari 10 /11 problem with if (!await get(something)).
     4        https://bugs.webkit.org/show_bug.cgi?id=176685
     5
     6        Reviewed by Saam Barati.
     7
     8        Using unary operator before `await` lead to count it as identifier.
     9        According to spec https://tc39.github.io/ecma262/#sec-async-function-definitions
     10        and Note 1 `await` is as AwaitExpression and it is allowed to use unary operator
     11
     12        * parser/Parser.cpp:
     13        (JSC::Parser<LexerType>::parsePrimaryExpression):
     14
    1152017-10-07  Filip Pizlo  <fpizlo@apple.com>
    216
  • trunk/Source/JavaScriptCore/parser/Parser.cpp

    r223022 r223043  
    44494449        if (m_parserState.functionParsePhase == FunctionParsePhase::Parameters)
    44504450            failIfFalse(m_parserState.allowAwait, "Cannot use await expression within parameters");
     4451        else if (currentFunctionScope()->isAsyncFunctionBoundary())
     4452            return parseAwaitExpression(context);
     4453
    44514454        goto identifierExpression;
    44524455    case IDENT: {
Note: See TracChangeset for help on using the changeset viewer.