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/base/hashmap.h" | 10 #include "src/base/hashmap.h" |
(...skipping 997 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1008 bool* is_strict_reserved, | 1008 bool* is_strict_reserved, |
1009 bool* ok); | 1009 bool* ok); |
1010 IdentifierT ParseIdentifierOrStrictReservedWord(bool* is_strict_reserved, | 1010 IdentifierT ParseIdentifierOrStrictReservedWord(bool* is_strict_reserved, |
1011 bool* ok) { | 1011 bool* ok) { |
1012 return ParseIdentifierOrStrictReservedWord(this->is_generator(), | 1012 return ParseIdentifierOrStrictReservedWord(this->is_generator(), |
1013 is_strict_reserved, ok); | 1013 is_strict_reserved, ok); |
1014 } | 1014 } |
1015 | 1015 |
1016 IdentifierT ParseIdentifierName(bool* ok); | 1016 IdentifierT ParseIdentifierName(bool* ok); |
1017 | 1017 |
1018 ExpressionT ParseRegExpLiteral(bool seen_equal, | 1018 ExpressionT ParseRegExpLiteral(bool seen_equal, bool* ok); |
1019 ExpressionClassifier* classifier, bool* ok); | |
1020 | 1019 |
1021 ExpressionT ParsePrimaryExpression(ExpressionClassifier* classifier, | 1020 ExpressionT ParsePrimaryExpression(ExpressionClassifier* classifier, |
1022 bool* is_async, bool* ok); | 1021 bool* is_async, bool* ok); |
1023 ExpressionT ParsePrimaryExpression(ExpressionClassifier* classifier, | 1022 ExpressionT ParsePrimaryExpression(ExpressionClassifier* classifier, |
1024 bool* ok) { | 1023 bool* ok) { |
1025 bool is_async; | 1024 bool is_async; |
1026 return ParsePrimaryExpression(classifier, &is_async, ok); | 1025 return ParsePrimaryExpression(classifier, &is_async, ok); |
1027 } | 1026 } |
1028 ExpressionT ParseExpression(bool accept_IN, bool* ok); | 1027 ExpressionT ParseExpression(bool accept_IN, bool* ok); |
1029 ExpressionT ParseExpression(bool accept_IN, ExpressionClassifier* classifier, | 1028 ExpressionT ParseExpression(bool accept_IN, ExpressionClassifier* classifier, |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1071 ExpressionT expression, bool* is_async, ExpressionClassifier* classifier, | 1070 ExpressionT expression, bool* is_async, ExpressionClassifier* classifier, |
1072 bool* ok); | 1071 bool* ok); |
1073 ExpressionT ParseArrowFunctionLiteral(bool accept_IN, | 1072 ExpressionT ParseArrowFunctionLiteral(bool accept_IN, |
1074 const FormalParametersT& parameters, | 1073 const FormalParametersT& parameters, |
1075 bool is_async, | 1074 bool is_async, |
1076 const ExpressionClassifier& classifier, | 1075 const ExpressionClassifier& classifier, |
1077 bool* ok); | 1076 bool* ok); |
1078 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, | 1077 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, |
1079 ExpressionClassifier* classifier, bool* ok); | 1078 ExpressionClassifier* classifier, bool* ok); |
1080 void AddTemplateExpression(ExpressionT); | 1079 void AddTemplateExpression(ExpressionT); |
1081 ExpressionT ParseSuperExpression(bool is_new, | 1080 ExpressionT ParseSuperExpression(bool is_new, bool* ok); |
1082 ExpressionClassifier* classifier, bool* ok); | |
1083 ExpressionT ParseNewTargetExpression(bool* ok); | 1081 ExpressionT ParseNewTargetExpression(bool* ok); |
1084 | 1082 |
1085 void ParseFormalParameter(FormalParametersT* parameters, | 1083 void ParseFormalParameter(FormalParametersT* parameters, |
1086 ExpressionClassifier* classifier, bool* ok); | 1084 ExpressionClassifier* classifier, bool* ok); |
1087 void ParseFormalParameterList(FormalParametersT* parameters, | 1085 void ParseFormalParameterList(FormalParametersT* parameters, |
1088 ExpressionClassifier* classifier, bool* ok); | 1086 ExpressionClassifier* classifier, bool* ok); |
1089 void CheckArityRestrictions(int param_count, FunctionKind function_type, | 1087 void CheckArityRestrictions(int param_count, FunctionKind function_type, |
1090 bool has_rest, int formals_start_pos, | 1088 bool has_rest, int formals_start_pos, |
1091 int formals_end_pos, bool* ok); | 1089 int formals_end_pos, bool* ok); |
1092 | 1090 |
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1452 this->ReportUnexpectedToken(next); | 1450 this->ReportUnexpectedToken(next); |
1453 *ok = false; | 1451 *ok = false; |
1454 return Traits::EmptyIdentifier(); | 1452 return Traits::EmptyIdentifier(); |
1455 } | 1453 } |
1456 | 1454 |
1457 IdentifierT name = this->GetSymbol(scanner()); | 1455 IdentifierT name = this->GetSymbol(scanner()); |
1458 if (this->IsArguments(name)) scope()->RecordArgumentsUsage(); | 1456 if (this->IsArguments(name)) scope()->RecordArgumentsUsage(); |
1459 return name; | 1457 return name; |
1460 } | 1458 } |
1461 | 1459 |
1462 | |
1463 template <class Traits> | 1460 template <class Traits> |
1464 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseRegExpLiteral( | 1461 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseRegExpLiteral( |
1465 bool seen_equal, ExpressionClassifier* classifier, bool* ok) { | 1462 bool seen_equal, bool* ok) { |
1466 int pos = peek_position(); | 1463 int pos = peek_position(); |
1467 if (!scanner()->ScanRegExpPattern(seen_equal)) { | 1464 if (!scanner()->ScanRegExpPattern(seen_equal)) { |
1468 Next(); | 1465 Next(); |
1469 ReportMessage(MessageTemplate::kUnterminatedRegExp); | 1466 ReportMessage(MessageTemplate::kUnterminatedRegExp); |
1470 *ok = false; | 1467 *ok = false; |
1471 return Traits::EmptyExpression(); | 1468 return Traits::EmptyExpression(); |
1472 } | 1469 } |
1473 | 1470 |
1474 int literal_index = function_state_->NextMaterializedLiteralIndex(); | 1471 int literal_index = function_state_->NextMaterializedLiteralIndex(); |
1475 | 1472 |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1551 | 1548 |
1552 case Token::STRING: { | 1549 case Token::STRING: { |
1553 BindingPatternUnexpectedToken(classifier); | 1550 BindingPatternUnexpectedToken(classifier); |
1554 Consume(Token::STRING); | 1551 Consume(Token::STRING); |
1555 return this->ExpressionFromString(beg_pos, scanner(), factory()); | 1552 return this->ExpressionFromString(beg_pos, scanner(), factory()); |
1556 } | 1553 } |
1557 | 1554 |
1558 case Token::ASSIGN_DIV: | 1555 case Token::ASSIGN_DIV: |
1559 classifier->RecordBindingPatternError( | 1556 classifier->RecordBindingPatternError( |
1560 scanner()->peek_location(), MessageTemplate::kUnexpectedTokenRegExp); | 1557 scanner()->peek_location(), MessageTemplate::kUnexpectedTokenRegExp); |
1561 return this->ParseRegExpLiteral(true, classifier, ok); | 1558 return this->ParseRegExpLiteral(true, ok); |
1562 | 1559 |
1563 case Token::DIV: | 1560 case Token::DIV: |
1564 classifier->RecordBindingPatternError( | 1561 classifier->RecordBindingPatternError( |
1565 scanner()->peek_location(), MessageTemplate::kUnexpectedTokenRegExp); | 1562 scanner()->peek_location(), MessageTemplate::kUnexpectedTokenRegExp); |
1566 return this->ParseRegExpLiteral(false, classifier, ok); | 1563 return this->ParseRegExpLiteral(false, ok); |
1567 | 1564 |
1568 case Token::LBRACK: | 1565 case Token::LBRACK: |
1569 return this->ParseArrayLiteral(classifier, ok); | 1566 return this->ParseArrayLiteral(classifier, ok); |
1570 | 1567 |
1571 case Token::LBRACE: | 1568 case Token::LBRACE: |
1572 return this->ParseObjectLiteral(classifier, ok); | 1569 return this->ParseObjectLiteral(classifier, ok); |
1573 | 1570 |
1574 case Token::LPAREN: { | 1571 case Token::LPAREN: { |
1575 // Arrow function formal parameters are either a single identifier or a | 1572 // Arrow function formal parameters are either a single identifier or a |
1576 // list of BindingPattern productions enclosed in parentheses. | 1573 // list of BindingPattern productions enclosed in parentheses. |
(...skipping 1369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2946 // new new foo().bar().baz means (new (new foo()).bar()).baz | 2943 // new new foo().bar().baz means (new (new foo()).bar()).baz |
2947 | 2944 |
2948 if (peek() == Token::NEW) { | 2945 if (peek() == Token::NEW) { |
2949 BindingPatternUnexpectedToken(classifier); | 2946 BindingPatternUnexpectedToken(classifier); |
2950 ArrowFormalParametersUnexpectedToken(classifier); | 2947 ArrowFormalParametersUnexpectedToken(classifier); |
2951 Consume(Token::NEW); | 2948 Consume(Token::NEW); |
2952 int new_pos = position(); | 2949 int new_pos = position(); |
2953 ExpressionT result; | 2950 ExpressionT result; |
2954 if (peek() == Token::SUPER) { | 2951 if (peek() == Token::SUPER) { |
2955 const bool is_new = true; | 2952 const bool is_new = true; |
2956 result = ParseSuperExpression(is_new, classifier, CHECK_OK); | 2953 result = ParseSuperExpression(is_new, CHECK_OK); |
2957 } else if (peek() == Token::PERIOD) { | 2954 } else if (peek() == Token::PERIOD) { |
2958 return ParseNewTargetExpression(CHECK_OK); | 2955 return ParseNewTargetExpression(CHECK_OK); |
2959 } else { | 2956 } else { |
2960 result = this->ParseMemberWithNewPrefixesExpression(classifier, is_async, | 2957 result = this->ParseMemberWithNewPrefixesExpression(classifier, is_async, |
2961 CHECK_OK); | 2958 CHECK_OK); |
2962 } | 2959 } |
2963 Traits::RewriteNonPattern(classifier, CHECK_OK); | 2960 Traits::RewriteNonPattern(classifier, CHECK_OK); |
2964 if (peek() == Token::LPAREN) { | 2961 if (peek() == Token::LPAREN) { |
2965 // NewExpression with arguments. | 2962 // NewExpression with arguments. |
2966 Scanner::Location spread_pos; | 2963 Scanner::Location spread_pos; |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3037 } | 3034 } |
3038 result = this->ParseFunctionLiteral( | 3035 result = this->ParseFunctionLiteral( |
3039 name, function_name_location, | 3036 name, function_name_location, |
3040 is_strict_reserved_name ? kFunctionNameIsStrictReserved | 3037 is_strict_reserved_name ? kFunctionNameIsStrictReserved |
3041 : kFunctionNameValidityUnknown, | 3038 : kFunctionNameValidityUnknown, |
3042 is_generator ? FunctionKind::kGeneratorFunction | 3039 is_generator ? FunctionKind::kGeneratorFunction |
3043 : FunctionKind::kNormalFunction, | 3040 : FunctionKind::kNormalFunction, |
3044 function_token_position, function_type, language_mode(), CHECK_OK); | 3041 function_token_position, function_type, language_mode(), CHECK_OK); |
3045 } else if (peek() == Token::SUPER) { | 3042 } else if (peek() == Token::SUPER) { |
3046 const bool is_new = false; | 3043 const bool is_new = false; |
3047 result = ParseSuperExpression(is_new, classifier, CHECK_OK); | 3044 result = ParseSuperExpression(is_new, CHECK_OK); |
3048 } else { | 3045 } else { |
3049 result = ParsePrimaryExpression(classifier, is_async, CHECK_OK); | 3046 result = ParsePrimaryExpression(classifier, is_async, CHECK_OK); |
3050 } | 3047 } |
3051 | 3048 |
3052 result = | 3049 result = |
3053 ParseMemberExpressionContinuation(result, is_async, classifier, CHECK_OK); | 3050 ParseMemberExpressionContinuation(result, is_async, classifier, CHECK_OK); |
3054 return result; | 3051 return result; |
3055 } | 3052 } |
3056 | 3053 |
3057 | |
3058 template <class Traits> | 3054 template <class Traits> |
3059 typename ParserBase<Traits>::ExpressionT | 3055 typename ParserBase<Traits>::ExpressionT |
3060 ParserBase<Traits>::ParseSuperExpression(bool is_new, | 3056 ParserBase<Traits>::ParseSuperExpression(bool is_new, bool* ok) { |
3061 ExpressionClassifier* classifier, | |
3062 bool* ok) { | |
3063 Expect(Token::SUPER, CHECK_OK); | 3057 Expect(Token::SUPER, CHECK_OK); |
3064 int pos = position(); | 3058 int pos = position(); |
3065 | 3059 |
3066 Scope* scope = this->scope()->ReceiverScope(); | 3060 Scope* scope = this->scope()->ReceiverScope(); |
3067 FunctionKind kind = scope->function_kind(); | 3061 FunctionKind kind = scope->function_kind(); |
3068 if (IsConciseMethod(kind) || IsAccessorFunction(kind) || | 3062 if (IsConciseMethod(kind) || IsAccessorFunction(kind) || |
3069 IsClassConstructor(kind)) { | 3063 IsClassConstructor(kind)) { |
3070 if (peek() == Token::PERIOD || peek() == Token::LBRACK) { | 3064 if (peek() == Token::PERIOD || peek() == Token::LBRACK) { |
3071 scope->RecordSuperPropertyUsage(); | 3065 scope->RecordSuperPropertyUsage(); |
3072 return this->NewSuperPropertyReference(this->scope(), factory(), pos); | 3066 return this->NewSuperPropertyReference(this->scope(), factory(), pos); |
(...skipping 587 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3660 has_seen_constructor_ = true; | 3654 has_seen_constructor_ = true; |
3661 return; | 3655 return; |
3662 } | 3656 } |
3663 } | 3657 } |
3664 | 3658 |
3665 | 3659 |
3666 } // namespace internal | 3660 } // namespace internal |
3667 } // namespace v8 | 3661 } // namespace v8 |
3668 | 3662 |
3669 #endif // V8_PARSING_PARSER_BASE_H | 3663 #endif // V8_PARSING_PARSER_BASE_H |
OLD | NEW |