Ignore:
Timestamp:
Dec 6, 2020, 12:41:11 AM (4 years ago)
Author:
[email protected]
Message:

[JSC] Accept escaped keywords for class and object property names
https://bugs.webkit.org/show_bug.cgi?id=219575

Reviewed by Alexey Shvayka.

JSTests:

  • stress/syntax-error-if-escaped-keyword-used-as-target-object-pattern.js: Added.

(testSyntaxError):

  • test262/expectations.yaml:

Source/JavaScriptCore:

In this patch, we accept escaped keywords for class, object, and object pattern property names.

var object = {

bre\u0061k: 42

};

When escaped keyword appears, we produce ESCAPED_KEYWORD with CanBeErrorTokenFlag. Now CanBeErrorTokenFlag
represents "when this token appears in an error condition, possibly this is error token and special message will appear",
instead of saying this token is definitely an error. So we can just use ESCAPED_KEYWORD token to handle this case.

  • parser/Lexer.cpp:

(JSC::Lexer<CharacterType>::parseIdentifierSlowCase):
(JSC::Lexer<T>::lexWithoutClearingLineTerminator):

  • parser/Parser.cpp:

(JSC::Parser<LexerType>::parseDestructuringPattern):
(JSC::Parser<LexerType>::parseClass):
(JSC::Parser<LexerType>::parseProperty):
(JSC::Parser<LexerType>::printUnexpectedTokenText):

  • parser/Parser.h:

(JSC::Parser<LexerType>::parse):

  • parser/ParserTokens.h:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/parser/ParserTokens.h

    r262613 r270481  
    4949    BinaryOpTokenAllowsInPrecedenceAdditionalShift = 4,
    5050    BinaryOpTokenPrecedenceMask = 15 << BinaryOpTokenPrecedenceShift,
    51     ErrorTokenFlag = 1 << (BinaryOpTokenAllowsInPrecedenceAdditionalShift + BinaryOpTokenPrecedenceShift + 6),
    52     UnterminatedErrorTokenFlag = ErrorTokenFlag << 1,
    53     RightAssociativeBinaryOpTokenFlag = UnterminatedErrorTokenFlag << 1
     51    CanBeErrorTokenFlag = 1 << (BinaryOpTokenAllowsInPrecedenceAdditionalShift + BinaryOpTokenPrecedenceShift + 6),
     52    UnterminatedCanBeErrorTokenFlag = CanBeErrorTokenFlag << 1,
     53    RightAssociativeBinaryOpTokenFlag = UnterminatedCanBeErrorTokenFlag << 1
    5454};
    5555
     
    179179    MOD = 2 | BINARY_OP_PRECEDENCE(11),
    180180    POW = 0 | BINARY_OP_PRECEDENCE(12) | RightAssociativeBinaryOpTokenFlag, // Make sure that POW has the highest operator precedence.
    181     ERRORTOK = 0 | ErrorTokenFlag,
    182     UNTERMINATED_IDENTIFIER_ESCAPE_ERRORTOK = 0 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
    183     INVALID_IDENTIFIER_ESCAPE_ERRORTOK = 1 | ErrorTokenFlag,
    184     UNTERMINATED_IDENTIFIER_UNICODE_ESCAPE_ERRORTOK = 2 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
    185     INVALID_IDENTIFIER_UNICODE_ESCAPE_ERRORTOK = 3 | ErrorTokenFlag,
    186     UNTERMINATED_MULTILINE_COMMENT_ERRORTOK = 4 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
    187     UNTERMINATED_NUMERIC_LITERAL_ERRORTOK = 5 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
    188     UNTERMINATED_OCTAL_NUMBER_ERRORTOK = 6 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
    189     INVALID_NUMERIC_LITERAL_ERRORTOK = 7 | ErrorTokenFlag,
    190     UNTERMINATED_STRING_LITERAL_ERRORTOK = 8 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
    191     INVALID_STRING_LITERAL_ERRORTOK = 9 | ErrorTokenFlag,
    192     INVALID_PRIVATE_NAME_ERRORTOK = 10 | ErrorTokenFlag,
    193     UNTERMINATED_HEX_NUMBER_ERRORTOK = 11 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
    194     UNTERMINATED_BINARY_NUMBER_ERRORTOK = 12 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
    195     UNTERMINATED_TEMPLATE_LITERAL_ERRORTOK = 13 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
    196     UNTERMINATED_REGEXP_LITERAL_ERRORTOK = 14 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
    197     INVALID_TEMPLATE_LITERAL_ERRORTOK = 15 | ErrorTokenFlag,
    198     UNEXPECTED_ESCAPE_ERRORTOK = 16 | ErrorTokenFlag,
    199     INVALID_UNICODE_ENCODING_ERRORTOK = 17 | ErrorTokenFlag,
    200     INVALID_IDENTIFIER_UNICODE_ERRORTOK = 18 | ErrorTokenFlag,
     181    ERRORTOK = 0 | CanBeErrorTokenFlag,
     182    UNTERMINATED_IDENTIFIER_ESCAPE_ERRORTOK = 0 | CanBeErrorTokenFlag | UnterminatedCanBeErrorTokenFlag,
     183    INVALID_IDENTIFIER_ESCAPE_ERRORTOK = 1 | CanBeErrorTokenFlag,
     184    UNTERMINATED_IDENTIFIER_UNICODE_ESCAPE_ERRORTOK = 2 | CanBeErrorTokenFlag | UnterminatedCanBeErrorTokenFlag,
     185    INVALID_IDENTIFIER_UNICODE_ESCAPE_ERRORTOK = 3 | CanBeErrorTokenFlag,
     186    UNTERMINATED_MULTILINE_COMMENT_ERRORTOK = 4 | CanBeErrorTokenFlag | UnterminatedCanBeErrorTokenFlag,
     187    UNTERMINATED_NUMERIC_LITERAL_ERRORTOK = 5 | CanBeErrorTokenFlag | UnterminatedCanBeErrorTokenFlag,
     188    UNTERMINATED_OCTAL_NUMBER_ERRORTOK = 6 | CanBeErrorTokenFlag | UnterminatedCanBeErrorTokenFlag,
     189    INVALID_NUMERIC_LITERAL_ERRORTOK = 7 | CanBeErrorTokenFlag,
     190    UNTERMINATED_STRING_LITERAL_ERRORTOK = 8 | CanBeErrorTokenFlag | UnterminatedCanBeErrorTokenFlag,
     191    INVALID_STRING_LITERAL_ERRORTOK = 9 | CanBeErrorTokenFlag,
     192    INVALID_PRIVATE_NAME_ERRORTOK = 10 | CanBeErrorTokenFlag,
     193    UNTERMINATED_HEX_NUMBER_ERRORTOK = 11 | CanBeErrorTokenFlag | UnterminatedCanBeErrorTokenFlag,
     194    UNTERMINATED_BINARY_NUMBER_ERRORTOK = 12 | CanBeErrorTokenFlag | UnterminatedCanBeErrorTokenFlag,
     195    UNTERMINATED_TEMPLATE_LITERAL_ERRORTOK = 13 | CanBeErrorTokenFlag | UnterminatedCanBeErrorTokenFlag,
     196    UNTERMINATED_REGEXP_LITERAL_ERRORTOK = 14 | CanBeErrorTokenFlag | UnterminatedCanBeErrorTokenFlag,
     197    INVALID_TEMPLATE_LITERAL_ERRORTOK = 15 | CanBeErrorTokenFlag,
     198    ESCAPED_KEYWORD = 16 | CanBeErrorTokenFlag,
     199    INVALID_UNICODE_ENCODING_ERRORTOK = 17 | CanBeErrorTokenFlag,
     200    INVALID_IDENTIFIER_UNICODE_ERRORTOK = 18 | CanBeErrorTokenFlag,
    201201};
    202202static_assert(static_cast<unsigned>(POW) <= 0x00ffffffU, "JSTokenType must be 24bits.");
Note: See TracChangeset for help on using the changeset viewer.