 Chromium Code Reviews
 Chromium Code Reviews Issue 1723313002:
  [parser] Enforce module-specific identifier restriction  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master
    
  
    Issue 1723313002:
  [parser] Enforce module-specific identifier restriction  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master| 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; |