| 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 907 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 918 Scanner::Location location, Token::Value token, | 918 Scanner::Location location, Token::Value token, |
| 919 MessageTemplate::Template message = MessageTemplate::kUnexpectedToken); | 919 MessageTemplate::Template message = MessageTemplate::kUnexpectedToken); |
| 920 | 920 |
| 921 void ReportClassifierError( | 921 void ReportClassifierError( |
| 922 const typename ExpressionClassifier::Error& error) { | 922 const typename ExpressionClassifier::Error& error) { |
| 923 impl()->ReportMessageAt(error.location, error.message, error.arg, | 923 impl()->ReportMessageAt(error.location, error.message, error.arg, |
| 924 error.type); | 924 error.type); |
| 925 } | 925 } |
| 926 | 926 |
| 927 void ValidateExpression(const ExpressionClassifier* classifier, bool* ok) { | 927 void ValidateExpression(const ExpressionClassifier* classifier, bool* ok) { |
| 928 if (!classifier->is_valid_expression() || | 928 if (!classifier->is_valid_expression()) { |
| 929 classifier->has_object_literal_error()) { | 929 ReportClassifierError(classifier->expression_error()); |
| 930 const Scanner::Location& a = classifier->expression_error().location; | |
| 931 const Scanner::Location& b = | |
| 932 classifier->object_literal_error().location; | |
| 933 if (a.beg_pos < 0 || (b.beg_pos >= 0 && a.beg_pos > b.beg_pos)) { | |
| 934 ReportClassifierError(classifier->object_literal_error()); | |
| 935 } else { | |
| 936 ReportClassifierError(classifier->expression_error()); | |
| 937 } | |
| 938 *ok = false; | 930 *ok = false; |
| 939 } | 931 } |
| 940 } | 932 } |
| 941 | 933 |
| 942 void ValidateFormalParameterInitializer( | 934 void ValidateFormalParameterInitializer( |
| 943 const ExpressionClassifier* classifier, bool* ok) { | 935 const ExpressionClassifier* classifier, bool* ok) { |
| 944 if (!classifier->is_valid_formal_parameter_initializer()) { | 936 if (!classifier->is_valid_formal_parameter_initializer()) { |
| 945 ReportClassifierError(classifier->formal_parameter_initializer_error()); | 937 ReportClassifierError(classifier->formal_parameter_initializer_error()); |
| 946 *ok = false; | 938 *ok = false; |
| 947 } | 939 } |
| (...skipping 1080 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2028 if (peek() == Token::ASSIGN) { | 2020 if (peek() == Token::ASSIGN) { |
| 2029 Consume(Token::ASSIGN); | 2021 Consume(Token::ASSIGN); |
| 2030 ExpressionClassifier rhs_classifier(this); | 2022 ExpressionClassifier rhs_classifier(this); |
| 2031 ExpressionT rhs = ParseAssignmentExpression( | 2023 ExpressionT rhs = ParseAssignmentExpression( |
| 2032 true, &rhs_classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); | 2024 true, &rhs_classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
| 2033 impl()->RewriteNonPattern(&rhs_classifier, | 2025 impl()->RewriteNonPattern(&rhs_classifier, |
| 2034 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); | 2026 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
| 2035 classifier->AccumulateFormalParameterContainmentErrors(&rhs_classifier); | 2027 classifier->AccumulateFormalParameterContainmentErrors(&rhs_classifier); |
| 2036 value = factory()->NewAssignment(Token::ASSIGN, lhs, rhs, | 2028 value = factory()->NewAssignment(Token::ASSIGN, lhs, rhs, |
| 2037 kNoSourcePosition); | 2029 kNoSourcePosition); |
| 2038 classifier->RecordObjectLiteralError( | 2030 classifier->RecordExpressionError( |
| 2039 Scanner::Location(next_beg_pos, scanner()->location().end_pos), | 2031 Scanner::Location(next_beg_pos, scanner()->location().end_pos), |
| 2040 MessageTemplate::kInvalidCoverInitializedName); | 2032 MessageTemplate::kInvalidCoverInitializedName); |
| 2041 | 2033 |
| 2042 impl()->SetFunctionNameFromIdentifierRef(rhs, lhs); | 2034 impl()->SetFunctionNameFromIdentifierRef(rhs, lhs); |
| 2043 } else { | 2035 } else { |
| 2044 value = lhs; | 2036 value = lhs; |
| 2045 } | 2037 } |
| 2046 | 2038 |
| 2047 return factory()->NewObjectLiteralProperty( | 2039 return factory()->NewObjectLiteralProperty( |
| 2048 name_expression, value, ObjectLiteralProperty::COMPUTED, is_static, | 2040 name_expression, value, ObjectLiteralProperty::COMPUTED, is_static, |
| (...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2409 if (IsValidReferenceExpression(expression)) { | 2401 if (IsValidReferenceExpression(expression)) { |
| 2410 productions &= ~ExpressionClassifier::AssignmentPatternProduction; | 2402 productions &= ~ExpressionClassifier::AssignmentPatternProduction; |
| 2411 } | 2403 } |
| 2412 | 2404 |
| 2413 const bool is_destructuring_assignment = | 2405 const bool is_destructuring_assignment = |
| 2414 IsValidPattern(expression) && peek() == Token::ASSIGN; | 2406 IsValidPattern(expression) && peek() == Token::ASSIGN; |
| 2415 if (is_destructuring_assignment) { | 2407 if (is_destructuring_assignment) { |
| 2416 // This is definitely not an expression so don't accumulate | 2408 // This is definitely not an expression so don't accumulate |
| 2417 // expression-related errors. | 2409 // expression-related errors. |
| 2418 productions &= ~(ExpressionClassifier::ExpressionProduction | | 2410 productions &= ~(ExpressionClassifier::ExpressionProduction | |
| 2419 ExpressionClassifier::ObjectLiteralProduction | | |
| 2420 ExpressionClassifier::TailCallExpressionProduction); | 2411 ExpressionClassifier::TailCallExpressionProduction); |
| 2421 } | 2412 } |
| 2422 | 2413 |
| 2423 classifier->Accumulate(&arrow_formals_classifier, productions, false); | 2414 classifier->Accumulate(&arrow_formals_classifier, productions, false); |
| 2424 | 2415 |
| 2425 if (!Token::IsAssignmentOp(peek())) { | 2416 if (!Token::IsAssignmentOp(peek())) { |
| 2426 // Parsed conditional expression only (no assignment). | 2417 // Parsed conditional expression only (no assignment). |
| 2427 // Now pending non-pattern expressions must be merged. | 2418 // Now pending non-pattern expressions must be merged. |
| 2428 classifier->MergeNonPatterns(&arrow_formals_classifier); | 2419 classifier->MergeNonPatterns(&arrow_formals_classifier); |
| 2429 return expression; | 2420 return expression; |
| (...skipping 1231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3661 void ParserBase<Impl>::ObjectLiteralChecker::CheckProperty( | 3652 void ParserBase<Impl>::ObjectLiteralChecker::CheckProperty( |
| 3662 Token::Value property, PropertyKind type, MethodKind method_type, | 3653 Token::Value property, PropertyKind type, MethodKind method_type, |
| 3663 ExpressionClassifier* classifier, bool* ok) { | 3654 ExpressionClassifier* classifier, bool* ok) { |
| 3664 DCHECK(!IsStaticMethod(method_type)); | 3655 DCHECK(!IsStaticMethod(method_type)); |
| 3665 DCHECK(!IsSpecialMethod(method_type) || type == kMethodProperty); | 3656 DCHECK(!IsSpecialMethod(method_type) || type == kMethodProperty); |
| 3666 | 3657 |
| 3667 if (property == Token::SMI || property == Token::NUMBER) return; | 3658 if (property == Token::SMI || property == Token::NUMBER) return; |
| 3668 | 3659 |
| 3669 if (type == kValueProperty && IsProto()) { | 3660 if (type == kValueProperty && IsProto()) { |
| 3670 if (has_seen_proto_) { | 3661 if (has_seen_proto_) { |
| 3671 classifier->RecordObjectLiteralError( | 3662 classifier->RecordExpressionError(this->scanner()->location(), |
| 3672 this->scanner()->location(), MessageTemplate::kDuplicateProto); | 3663 MessageTemplate::kDuplicateProto); |
| 3673 return; | 3664 return; |
| 3674 } | 3665 } |
| 3675 has_seen_proto_ = true; | 3666 has_seen_proto_ = true; |
| 3676 } | 3667 } |
| 3677 } | 3668 } |
| 3678 | 3669 |
| 3679 template <typename Impl> | 3670 template <typename Impl> |
| 3680 void ParserBase<Impl>::ClassLiteralChecker::CheckProperty( | 3671 void ParserBase<Impl>::ClassLiteralChecker::CheckProperty( |
| 3681 Token::Value property, PropertyKind type, MethodKind method_type, | 3672 Token::Value property, PropertyKind type, MethodKind method_type, |
| 3682 ExpressionClassifier* classifier, bool* ok) { | 3673 ExpressionClassifier* classifier, bool* ok) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 3710 has_seen_constructor_ = true; | 3701 has_seen_constructor_ = true; |
| 3711 return; | 3702 return; |
| 3712 } | 3703 } |
| 3713 } | 3704 } |
| 3714 | 3705 |
| 3715 | 3706 |
| 3716 } // namespace internal | 3707 } // namespace internal |
| 3717 } // namespace v8 | 3708 } // namespace v8 |
| 3718 | 3709 |
| 3719 #endif // V8_PARSING_PARSER_BASE_H | 3710 #endif // V8_PARSING_PARSER_BASE_H |
| OLD | NEW |