| Index: src/parsing/parser-base.h
|
| diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h
|
| index 27b9764434c5364ff18c9cf561acde122b80090d..cf1cc543a01bdbc9e782f34c0977457bdf134b58 100644
|
| --- a/src/parsing/parser-base.h
|
| +++ b/src/parsing/parser-base.h
|
| @@ -464,9 +464,9 @@ class ParserBase : public Traits {
|
|
|
| bool peek_any_identifier() {
|
| Token::Value next = peek();
|
| - return next == Token::IDENTIFIER || next == Token::FUTURE_RESERVED_WORD ||
|
| - next == Token::FUTURE_STRICT_RESERVED_WORD || next == Token::LET ||
|
| - next == Token::STATIC || next == Token::YIELD;
|
| + return next == Token::IDENTIFIER || next == Token::AWAIT ||
|
| + next == Token::ENUM || next == Token::FUTURE_STRICT_RESERVED_WORD ||
|
| + next == Token::LET || next == Token::STATIC || next == Token::YIELD;
|
| }
|
|
|
| bool CheckContextualKeyword(Vector<const char> keyword) {
|
| @@ -910,6 +910,7 @@ class ParserBase : public Traits {
|
| AstValueFactory* ast_value_factory_; // Not owned.
|
| ParserRecorder* log_;
|
| Mode mode_;
|
| + bool parsing_module_;
|
| uintptr_t stack_limit_;
|
|
|
| private:
|
| @@ -983,7 +984,8 @@ void ParserBase<Traits>::GetUnexpectedTokenMessage(
|
| case Token::IDENTIFIER:
|
| *message = MessageTemplate::kUnexpectedTokenIdentifier;
|
| break;
|
| - case Token::FUTURE_RESERVED_WORD:
|
| + case Token::AWAIT:
|
| + case Token::ENUM:
|
| *message = MessageTemplate::kUnexpectedReserved;
|
| break;
|
| case Token::LET:
|
| @@ -1058,7 +1060,7 @@ typename ParserBase<Traits>::IdentifierT
|
| ParserBase<Traits>::ParseAndClassifyIdentifier(ExpressionClassifier* classifier,
|
| bool* ok) {
|
| Token::Value next = Next();
|
| - if (next == Token::IDENTIFIER) {
|
| + if (next == Token::IDENTIFIER || (next == Token::AWAIT && !parsing_module_)) {
|
| IdentifierT name = this->GetSymbol(scanner());
|
| // When this function is used to read a formal parameter, we don't always
|
| // know whether the function is going to be strict or sloppy. Indeed for
|
| @@ -1122,7 +1124,7 @@ typename ParserBase<Traits>::IdentifierT
|
| ParserBase<Traits>::ParseIdentifierOrStrictReservedWord(
|
| bool is_generator, bool* is_strict_reserved, bool* ok) {
|
| Token::Value next = Next();
|
| - if (next == Token::IDENTIFIER) {
|
| + if (next == Token::IDENTIFIER || (next == Token::AWAIT && !parsing_module_)) {
|
| *is_strict_reserved = false;
|
| } else if (next == Token::FUTURE_STRICT_RESERVED_WORD || next == Token::LET ||
|
| next == Token::STATIC || (next == Token::YIELD && !is_generator)) {
|
| @@ -1138,14 +1140,13 @@ ParserBase<Traits>::ParseIdentifierOrStrictReservedWord(
|
| return name;
|
| }
|
|
|
| -
|
| template <class Traits>
|
| typename ParserBase<Traits>::IdentifierT
|
| ParserBase<Traits>::ParseIdentifierName(bool* ok) {
|
| Token::Value next = Next();
|
| - if (next != Token::IDENTIFIER && next != Token::FUTURE_RESERVED_WORD &&
|
| - next != Token::LET && next != Token::STATIC && next != Token::YIELD &&
|
| - next != Token::FUTURE_STRICT_RESERVED_WORD &&
|
| + if (next != Token::IDENTIFIER && next != Token::ENUM &&
|
| + next != Token::AWAIT && next != Token::LET && next != Token::STATIC &&
|
| + next != Token::YIELD && next != Token::FUTURE_STRICT_RESERVED_WORD &&
|
| next != Token::ESCAPED_KEYWORD &&
|
| next != Token::ESCAPED_STRICT_RESERVED_WORD && !Token::IsKeyword(next)) {
|
| this->ReportUnexpectedToken(next);
|
| @@ -1242,6 +1243,7 @@ ParserBase<Traits>::ParsePrimaryExpression(ExpressionClassifier* classifier,
|
| case Token::LET:
|
| case Token::STATIC:
|
| case Token::YIELD:
|
| + case Token::AWAIT:
|
| case Token::ESCAPED_STRICT_RESERVED_WORD:
|
| case Token::FUTURE_STRICT_RESERVED_WORD: {
|
| // Using eval or arguments in this context is OK even in strict mode.
|
| @@ -1609,8 +1611,8 @@ ParserBase<Traits>::ParsePropertyDefinition(
|
| *is_computed_name);
|
| }
|
|
|
| - if (Token::IsIdentifier(name_token, language_mode(),
|
| - this->is_generator()) &&
|
| + if (Token::IsIdentifier(name_token, language_mode(), this->is_generator(),
|
| + parsing_module_) &&
|
| (peek() == Token::COMMA || peek() == Token::RBRACE ||
|
| peek() == Token::ASSIGN)) {
|
| // PropertyDefinition
|
| @@ -2790,6 +2792,7 @@ bool ParserBase<Traits>::IsNextLetKeyword() {
|
| case Token::STATIC:
|
| case Token::LET: // Yes, you can do let let = ... in sloppy mode
|
| case Token::YIELD:
|
| + case Token::AWAIT:
|
| return true;
|
| default:
|
| return false;
|
|
|