Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_PARSING_PARSER_BASE_H | 5 #ifndef V8_PARSING_PARSER_BASE_H |
| 6 #define V8_PARSING_PARSER_BASE_H | 6 #define V8_PARSING_PARSER_BASE_H |
| 7 | 7 |
| 8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
| 9 #include "src/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
| 10 #include "src/hashmap.h" | 10 #include "src/hashmap.h" |
| (...skipping 766 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 777 } | 777 } |
| 778 | 778 |
| 779 void ArrowFormalParametersUnexpectedToken(ExpressionClassifier* classifier) { | 779 void ArrowFormalParametersUnexpectedToken(ExpressionClassifier* classifier) { |
| 780 MessageTemplate::Template message = MessageTemplate::kUnexpectedToken; | 780 MessageTemplate::Template message = MessageTemplate::kUnexpectedToken; |
| 781 const char* arg; | 781 const char* arg; |
| 782 Scanner::Location location = scanner()->peek_location(); | 782 Scanner::Location location = scanner()->peek_location(); |
| 783 GetUnexpectedTokenMessage(peek(), &message, &location, &arg); | 783 GetUnexpectedTokenMessage(peek(), &message, &location, &arg); |
| 784 classifier->RecordArrowFormalParametersError(location, message, arg); | 784 classifier->RecordArrowFormalParametersError(location, message, arg); |
| 785 } | 785 } |
| 786 | 786 |
| 787 void FormalParameterInitializerUnexpectedToken( | |
| 788 ExpressionClassifier* classifier) { | |
| 789 MessageTemplate::Template message = MessageTemplate::kUnexpectedToken; | |
| 790 const char* arg; | |
| 791 Scanner::Location location = scanner()->peek_location(); | |
| 792 GetUnexpectedTokenMessage(peek(), &message, &location, &arg); | |
| 793 classifier->RecordFormalParameterInitializerError(location, message, arg); | |
| 794 } | |
| 795 | |
| 796 // Recursive descent functions: | 787 // Recursive descent functions: |
| 797 | 788 |
| 798 // Parses an identifier that is valid for the current scope, in particular it | 789 // Parses an identifier that is valid for the current scope, in particular it |
| 799 // fails on strict mode future reserved keywords in a strict scope. If | 790 // fails on strict mode future reserved keywords in a strict scope. If |
| 800 // allow_eval_or_arguments is kAllowEvalOrArguments, we allow "eval" or | 791 // allow_eval_or_arguments is kAllowEvalOrArguments, we allow "eval" or |
| 801 // "arguments" as identifier even in strict mode (this is needed in cases like | 792 // "arguments" as identifier even in strict mode (this is needed in cases like |
| 802 // "var foo = eval;"). | 793 // "var foo = eval;"). |
| 803 IdentifierT ParseIdentifier(AllowRestrictedIdentifiers, bool* ok); | 794 IdentifierT ParseIdentifier(AllowRestrictedIdentifiers, bool* ok); |
| 804 IdentifierT ParseAndClassifyIdentifier(ExpressionClassifier* classifier, | 795 IdentifierT ParseAndClassifyIdentifier(ExpressionClassifier* classifier, |
| 805 bool* ok); | 796 bool* ok); |
| (...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1408 Consume(Token::CLASS); | 1399 Consume(Token::CLASS); |
| 1409 int class_token_position = position(); | 1400 int class_token_position = position(); |
| 1410 IdentifierT name = this->EmptyIdentifier(); | 1401 IdentifierT name = this->EmptyIdentifier(); |
| 1411 bool is_strict_reserved_name = false; | 1402 bool is_strict_reserved_name = false; |
| 1412 Scanner::Location class_name_location = Scanner::Location::invalid(); | 1403 Scanner::Location class_name_location = Scanner::Location::invalid(); |
| 1413 if (peek_any_identifier()) { | 1404 if (peek_any_identifier()) { |
| 1414 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved_name, | 1405 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved_name, |
| 1415 CHECK_OK); | 1406 CHECK_OK); |
| 1416 class_name_location = scanner()->location(); | 1407 class_name_location = scanner()->location(); |
| 1417 } | 1408 } |
| 1418 return this->ParseClassLiteral(name, class_name_location, | 1409 return this->ParseClassLiteral(classifier, name, class_name_location, |
| 1419 is_strict_reserved_name, | 1410 is_strict_reserved_name, |
| 1420 class_token_position, ok); | 1411 class_token_position, ok); |
| 1421 } | 1412 } |
| 1422 | 1413 |
| 1423 case Token::TEMPLATE_SPAN: | 1414 case Token::TEMPLATE_SPAN: |
| 1424 case Token::TEMPLATE_TAIL: | 1415 case Token::TEMPLATE_TAIL: |
| 1425 BindingPatternUnexpectedToken(classifier); | 1416 BindingPatternUnexpectedToken(classifier); |
| 1426 return this->ParseTemplateLiteral(Traits::NoTemplateTag(), beg_pos, | 1417 return this->ParseTemplateLiteral(Traits::NoTemplateTag(), beg_pos, |
| 1427 classifier, ok); | 1418 classifier, ok); |
| 1428 | 1419 |
| (...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1983 ArrowFormalParametersUnexpectedToken(&arrow_formals_classifier); | 1974 ArrowFormalParametersUnexpectedToken(&arrow_formals_classifier); |
| 1984 } | 1975 } |
| 1985 ExpressionT expression = this->ParseConditionalExpression( | 1976 ExpressionT expression = this->ParseConditionalExpression( |
| 1986 accept_IN, &arrow_formals_classifier, CHECK_OK); | 1977 accept_IN, &arrow_formals_classifier, CHECK_OK); |
| 1987 if (peek() == Token::ARROW) { | 1978 if (peek() == Token::ARROW) { |
| 1988 classifier->RecordPatternError(scanner()->peek_location(), | 1979 classifier->RecordPatternError(scanner()->peek_location(), |
| 1989 MessageTemplate::kUnexpectedToken, | 1980 MessageTemplate::kUnexpectedToken, |
| 1990 Token::String(Token::ARROW)); | 1981 Token::String(Token::ARROW)); |
| 1991 ValidateArrowFormalParameters(&arrow_formals_classifier, expression, | 1982 ValidateArrowFormalParameters(&arrow_formals_classifier, expression, |
| 1992 parenthesized_formals, CHECK_OK); | 1983 parenthesized_formals, CHECK_OK); |
| 1984 // This reads strangely, but is correct: it checks whether any | |
| 1985 // sub-expression of the parameter list failed to be a valid formal | |
| 1986 // parameter initializer. Since YieldExpressions are banned anywhere | |
| 1987 // in an arrow parameter list, this is correct. | |
| 1988 // TODO(adamk): Rename "FormalParameterInitializerError" to refer to | |
| 1989 // "YieldExpression", which is its only use. | |
|
Dan Ehrenberg
2016/05/02 23:11:43
You probably want to remove this TODO
adamk
2016/05/02 23:14:18
I actually also want to rename the methods on Expr
| |
| 1990 ValidateFormalParameterInitializer(&arrow_formals_classifier, ok); | |
| 1993 Scanner::Location loc(lhs_beg_pos, scanner()->location().end_pos); | 1991 Scanner::Location loc(lhs_beg_pos, scanner()->location().end_pos); |
| 1994 Scope* scope = | 1992 Scope* scope = |
| 1995 this->NewScope(scope_, FUNCTION_SCOPE, FunctionKind::kArrowFunction); | 1993 this->NewScope(scope_, FUNCTION_SCOPE, FunctionKind::kArrowFunction); |
| 1996 // Because the arrow's parameters were parsed in the outer scope, any | 1994 // Because the arrow's parameters were parsed in the outer scope, any |
| 1997 // usage flags that might have been triggered there need to be copied | 1995 // usage flags that might have been triggered there need to be copied |
| 1998 // to the arrow scope. | 1996 // to the arrow scope. |
| 1999 scope_->PropagateUsageFlagsToScope(scope); | 1997 scope_->PropagateUsageFlagsToScope(scope); |
| 2000 FormalParametersT parameters(scope); | 1998 FormalParametersT parameters(scope); |
| 2001 if (!arrow_formals_classifier.is_simple_parameter_list()) { | 1999 if (!arrow_formals_classifier.is_simple_parameter_list()) { |
| 2002 scope->SetHasNonSimpleParameters(); | 2000 scope->SetHasNonSimpleParameters(); |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2119 template <class Traits> | 2117 template <class Traits> |
| 2120 typename ParserBase<Traits>::ExpressionT | 2118 typename ParserBase<Traits>::ExpressionT |
| 2121 ParserBase<Traits>::ParseYieldExpression(bool accept_IN, | 2119 ParserBase<Traits>::ParseYieldExpression(bool accept_IN, |
| 2122 ExpressionClassifier* classifier, | 2120 ExpressionClassifier* classifier, |
| 2123 bool* ok) { | 2121 bool* ok) { |
| 2124 // YieldExpression :: | 2122 // YieldExpression :: |
| 2125 // 'yield' ([no line terminator] '*'? AssignmentExpression)? | 2123 // 'yield' ([no line terminator] '*'? AssignmentExpression)? |
| 2126 int pos = peek_position(); | 2124 int pos = peek_position(); |
| 2127 classifier->RecordPatternError(scanner()->peek_location(), | 2125 classifier->RecordPatternError(scanner()->peek_location(), |
| 2128 MessageTemplate::kInvalidDestructuringTarget); | 2126 MessageTemplate::kInvalidDestructuringTarget); |
| 2129 FormalParameterInitializerUnexpectedToken(classifier); | 2127 classifier->RecordFormalParameterInitializerError( |
| 2128 scanner()->peek_location(), MessageTemplate::kYieldInParameter); | |
| 2130 Expect(Token::YIELD, CHECK_OK); | 2129 Expect(Token::YIELD, CHECK_OK); |
| 2131 ExpressionT generator_object = | 2130 ExpressionT generator_object = |
| 2132 factory()->NewVariableProxy(function_state_->generator_object_variable()); | 2131 factory()->NewVariableProxy(function_state_->generator_object_variable()); |
| 2133 ExpressionT expression = Traits::EmptyExpression(); | 2132 ExpressionT expression = Traits::EmptyExpression(); |
| 2134 bool delegating = false; // yield* | 2133 bool delegating = false; // yield* |
| 2135 if (!scanner()->HasAnyLineTerminatorBeforeNext()) { | 2134 if (!scanner()->HasAnyLineTerminatorBeforeNext()) { |
| 2136 if (Check(Token::MUL)) delegating = true; | 2135 if (Check(Token::MUL)) delegating = true; |
| 2137 switch (peek()) { | 2136 switch (peek()) { |
| 2138 case Token::EOS: | 2137 case Token::EOS: |
| 2139 case Token::SEMICOLON: | 2138 case Token::SEMICOLON: |
| (...skipping 1071 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3211 has_seen_constructor_ = true; | 3210 has_seen_constructor_ = true; |
| 3212 return; | 3211 return; |
| 3213 } | 3212 } |
| 3214 } | 3213 } |
| 3215 | 3214 |
| 3216 | 3215 |
| 3217 } // namespace internal | 3216 } // namespace internal |
| 3218 } // namespace v8 | 3217 } // namespace v8 |
| 3219 | 3218 |
| 3220 #endif // V8_PARSING_PARSER_BASE_H | 3219 #endif // V8_PARSING_PARSER_BASE_H |
| OLD | NEW |