Chromium Code Reviews| Index: src/parsing/parser-base.h |
| diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h |
| index 0a2bf4e45a045c2146c90f6ebcf90cdfa58070f8..a0ce8ff42a2441d447b00bc7cb8645c23a59c9a9 100644 |
| --- a/src/parsing/parser-base.h |
| +++ b/src/parsing/parser-base.h |
| @@ -1055,17 +1055,16 @@ class ParserBase : public Traits { |
| IdentifierT ParseAndClassifyIdentifier(ExpressionClassifier* classifier, |
| bool* ok); |
| // Parses an identifier or a strict mode future reserved word, and indicate |
| - // whether it is strict mode future reserved. Allows passing in is_generator |
| + // whether it is strict mode future reserved. Allows passing in function_kind |
| // for the case of parsing the identifier in a function expression, where the |
| - // relevant "is_generator" bit is of the function being parsed, not the |
| - // containing |
| - // function. |
| - IdentifierT ParseIdentifierOrStrictReservedWord(bool is_generator, |
| + // relevant "function_kind" bit is of the function being parsed, not the |
| + // containing function. |
| + IdentifierT ParseIdentifierOrStrictReservedWord(FunctionKind function_kind, |
| bool* is_strict_reserved, |
| bool* ok); |
| IdentifierT ParseIdentifierOrStrictReservedWord(bool* is_strict_reserved, |
| bool* ok) { |
| - return ParseIdentifierOrStrictReservedWord(this->is_generator(), |
| + return ParseIdentifierOrStrictReservedWord(function_state_->kind(), |
| is_strict_reserved, ok); |
| } |
| @@ -1085,7 +1084,7 @@ class ParserBase : public Traits { |
| bool* ok); |
| ExpressionT ParseArrayLiteral(ExpressionClassifier* classifier, bool* ok); |
| ExpressionT ParsePropertyName(IdentifierT* name, bool* is_get, bool* is_set, |
| - bool* is_await, bool* is_computed_name, |
| + bool* is_computed_name, |
| ExpressionClassifier* classifier, bool* ok); |
| ExpressionT ParseObjectLiteral(ExpressionClassifier* classifier, bool* ok); |
| ObjectLiteralPropertyT ParsePropertyDefinition( |
| @@ -1415,7 +1414,7 @@ ParserBase<Traits>::ParseAndClassifyIdentifier(ExpressionClassifier* classifier, |
| bool* ok) { |
| Token::Value next = Next(); |
| if (next == Token::IDENTIFIER || next == Token::ASYNC || |
| - (next == Token::AWAIT && !parsing_module_)) { |
| + (next == Token::AWAIT && !parsing_module_ && !is_async_function())) { |
| 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 |
| @@ -1423,27 +1422,14 @@ ParserBase<Traits>::ParseAndClassifyIdentifier(ExpressionClassifier* classifier, |
| // is actually a formal parameter. Therefore besides the errors that we |
| // must detect because we know we're in strict mode, we also record any |
| // error that we might make in the future once we know the language mode. |
| - if (this->IsEval(name)) { |
| + if (this->IsEvalOrArguments(name)) { |
| classifier->RecordStrictModeFormalParameterError( |
| scanner()->location(), MessageTemplate::kStrictEvalArguments); |
| if (is_strict(language_mode())) { |
| classifier->RecordBindingPatternError( |
| scanner()->location(), MessageTemplate::kStrictEvalArguments); |
| } |
| - } |
| - if (this->IsArguments(name)) { |
| - classifier->RecordStrictModeFormalParameterError( |
| - scanner()->location(), MessageTemplate::kStrictEvalArguments); |
| - if (is_strict(language_mode())) { |
| - classifier->RecordBindingPatternError( |
| - scanner()->location(), MessageTemplate::kStrictEvalArguments); |
| - } |
| - } |
| - if (this->IsAwait(name)) { |
| - if (is_async_function()) { |
| - classifier->RecordPatternError( |
| - scanner()->location(), MessageTemplate::kAwaitBindingIdentifier); |
| - } |
| + } else if (next == Token::AWAIT) { |
| classifier->RecordAsyncArrowFormalParametersError( |
| scanner()->location(), MessageTemplate::kAwaitBindingIdentifier); |
| } |
| @@ -1480,17 +1466,18 @@ ParserBase<Traits>::ParseAndClassifyIdentifier(ExpressionClassifier* classifier, |
| } |
| } |
| - |
| template <class Traits> |
| typename ParserBase<Traits>::IdentifierT |
| ParserBase<Traits>::ParseIdentifierOrStrictReservedWord( |
| - bool is_generator, bool* is_strict_reserved, bool* ok) { |
| + FunctionKind function_kind, bool* is_strict_reserved, bool* ok) { |
| Token::Value next = Next(); |
| - if (next == Token::IDENTIFIER || (next == Token::AWAIT && !parsing_module_) || |
| + if (next == Token::IDENTIFIER || (next == Token::AWAIT && !parsing_module_ && |
| + !IsAsyncFunction(function_kind)) || |
| next == Token::ASYNC) { |
| *is_strict_reserved = false; |
| } else if (next == Token::FUTURE_STRICT_RESERVED_WORD || next == Token::LET || |
| - next == Token::STATIC || (next == Token::YIELD && !is_generator)) { |
| + next == Token::STATIC || |
| + (next == Token::YIELD && !IsGeneratorFunction(function_kind))) { |
| *is_strict_reserved = true; |
| } else { |
| ReportUnexpectedToken(next); |
| @@ -1880,8 +1867,8 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseArrayLiteral( |
| template <class Traits> |
| typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParsePropertyName( |
| - IdentifierT* name, bool* is_get, bool* is_set, bool* is_await, |
| - bool* is_computed_name, ExpressionClassifier* classifier, bool* ok) { |
| + IdentifierT* name, bool* is_get, bool* is_set, bool* is_computed_name, |
| + ExpressionClassifier* classifier, bool* ok) { |
| Token::Value token = peek(); |
| int pos = peek_position(); |
| @@ -1926,9 +1913,6 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParsePropertyName( |
| default: |
| *name = ParseIdentifierName(CHECK_OK); |
| scanner()->IsGetOrSet(is_get, is_set); |
| - if (this->IsAwait(*name)) { |
| - *is_await = true; |
| - } |
| break; |
| } |
| @@ -1948,7 +1932,6 @@ ParserBase<Traits>::ParsePropertyDefinition( |
| has_seen_constructor != nullptr); |
| bool is_get = false; |
| bool is_set = false; |
| - bool is_await = false; |
| bool is_generator = Check(Token::MUL); |
| bool is_async = false; |
| const bool is_static = IsStaticMethod(method_kind); |
| @@ -1965,9 +1948,9 @@ ParserBase<Traits>::ParsePropertyDefinition( |
| int next_beg_pos = scanner()->peek_location().beg_pos; |
| int next_end_pos = scanner()->peek_location().end_pos; |
| - ExpressionT name_expression = ParsePropertyName( |
| - name, &is_get, &is_set, &is_await, is_computed_name, classifier, |
| - CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
| + ExpressionT name_expression = |
| + ParsePropertyName(name, &is_get, &is_set, is_computed_name, classifier, |
| + CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
| if (fni_ != nullptr && !*is_computed_name) { |
| this->PushLiteralName(fni_, *name); |
| @@ -1994,7 +1977,7 @@ ParserBase<Traits>::ParsePropertyDefinition( |
| } |
| if (Token::IsIdentifier(name_token, language_mode(), this->is_generator(), |
| - parsing_module_) && |
| + parsing_module_ || is_async_function()) && |
|
adamk
2016/08/20 01:00:54
To be clear, this is the bugfix, everything else i
|
| (peek() == Token::COMMA || peek() == Token::RBRACE || |
| peek() == Token::ASSIGN)) { |
| // PropertyDefinition |
| @@ -2017,16 +2000,11 @@ ParserBase<Traits>::ParsePropertyDefinition( |
| classifier->RecordLetPatternError( |
| scanner()->location(), MessageTemplate::kLetInLexicalBinding); |
| } |
| - if (is_await) { |
| - if (is_async_function()) { |
| - classifier->RecordPatternError( |
| - Scanner::Location(next_beg_pos, next_end_pos), |
| - MessageTemplate::kAwaitBindingIdentifier); |
| - } else { |
| - classifier->RecordAsyncArrowFormalParametersError( |
| - Scanner::Location(next_beg_pos, next_end_pos), |
| - MessageTemplate::kAwaitBindingIdentifier); |
| - } |
| + if (name_token == Token::AWAIT) { |
| + DCHECK(!is_async_function()); |
| + classifier->RecordAsyncArrowFormalParametersError( |
| + Scanner::Location(next_beg_pos, next_end_pos), |
| + MessageTemplate::kAwaitBindingIdentifier); |
| } |
| ExpressionT lhs = |
| this->ExpressionFromIdentifier(*name, next_beg_pos, next_end_pos); |
| @@ -2069,7 +2047,7 @@ ParserBase<Traits>::ParsePropertyDefinition( |
| DCHECK(!is_set); |
| bool dont_care; |
| name_expression = ParsePropertyName( |
| - name, &dont_care, &dont_care, &dont_care, is_computed_name, classifier, |
| + name, &dont_care, &dont_care, is_computed_name, classifier, |
| CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
| method_kind |= MethodKind::kAsync; |
| } |
| @@ -2125,7 +2103,7 @@ ParserBase<Traits>::ParsePropertyDefinition( |
| name_token = peek(); |
| name_expression = ParsePropertyName( |
| - name, &dont_care, &dont_care, &dont_care, is_computed_name, classifier, |
| + name, &dont_care, &dont_care, is_computed_name, classifier, |
| CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
| if (!*is_computed_name) { |
| @@ -3101,7 +3079,9 @@ ParserBase<Traits>::ParseMemberExpression(ExpressionClassifier* classifier, |
| return this->FunctionSentExpression(factory(), pos); |
| } |
| - bool is_generator = Check(Token::MUL); |
| + FunctionKind function_kind = Check(Token::MUL) |
| + ? FunctionKind::kGeneratorFunction |
| + : FunctionKind::kNormalFunction; |
| IdentifierT name = this->EmptyIdentifier(); |
| bool is_strict_reserved_name = false; |
| Scanner::Location function_name_location = Scanner::Location::invalid(); |
| @@ -3109,7 +3089,7 @@ ParserBase<Traits>::ParseMemberExpression(ExpressionClassifier* classifier, |
| FunctionLiteral::kAnonymousExpression; |
| if (peek_any_identifier()) { |
| name = ParseIdentifierOrStrictReservedWord( |
| - is_generator, &is_strict_reserved_name, CHECK_OK); |
| + function_kind, &is_strict_reserved_name, CHECK_OK); |
| function_name_location = scanner()->location(); |
| function_type = FunctionLiteral::kNamedExpression; |
| } |
| @@ -3117,9 +3097,8 @@ ParserBase<Traits>::ParseMemberExpression(ExpressionClassifier* classifier, |
| name, function_name_location, |
| is_strict_reserved_name ? kFunctionNameIsStrictReserved |
| : kFunctionNameValidityUnknown, |
| - is_generator ? FunctionKind::kGeneratorFunction |
| - : FunctionKind::kNormalFunction, |
| - function_token_position, function_type, language_mode(), CHECK_OK); |
| + function_kind, function_token_position, function_type, language_mode(), |
| + CHECK_OK); |
| } else if (peek() == Token::SUPER) { |
| const bool is_new = false; |
| result = ParseSuperExpression(is_new, CHECK_OK); |