Chromium Code Reviews| Index: src/parsing/parser-base.h |
| diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h |
| index 6be19b397c2d603ffce011f6811c924b0c676c27..1f6af798233f95c468dea14ab14b9e42e0c94f66 100644 |
| --- a/src/parsing/parser-base.h |
| +++ b/src/parsing/parser-base.h |
| @@ -449,9 +449,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) { |
| @@ -935,6 +935,7 @@ class ParserBase : public Traits { |
| AstValueFactory* ast_value_factory_; // Not owned. |
| ParserRecorder* log_; |
| Mode mode_; |
| + bool parsing_module_; |
|
adamk
2016/02/24 19:13:25
Please initialize this to false in the constructor
|
| uintptr_t stack_limit_; |
| private: |
| @@ -1010,7 +1011,8 @@ void ParserBase<Traits>::GetUnexpectedTokenMessage( |
| *message = MessageTemplate::kUnexpectedTokenIdentifier; |
| *arg = nullptr; |
| break; |
| - case Token::FUTURE_RESERVED_WORD: |
| + case Token::AWAIT: |
| + case Token::ENUM: |
| *message = MessageTemplate::kUnexpectedReserved; |
| *arg = nullptr; |
| break; |
| @@ -1081,7 +1083,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 |
| @@ -1158,7 +1160,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)) { |
| @@ -1174,14 +1176,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); |
| @@ -1288,6 +1289,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. |
| @@ -1672,8 +1674,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 |
| @@ -3025,6 +3027,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; |