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_PREPARSER_H | 5 #ifndef V8_PREPARSER_H |
6 #define V8_PREPARSER_H | 6 #define V8_PREPARSER_H |
7 | 7 |
8 #include "src/v8.h" | 8 #include "src/v8.h" |
9 | 9 |
10 #include "src/bailout-reason.h" | 10 #include "src/bailout-reason.h" |
(...skipping 673 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
684 } | 684 } |
685 | 685 |
686 enum TargetProduction { | 686 enum TargetProduction { |
687 ExpressionProduction = 1 << 0, | 687 ExpressionProduction = 1 << 0, |
688 BindingPatternProduction = 1 << 1, | 688 BindingPatternProduction = 1 << 1, |
689 AssignmentPatternProduction = 1 << 2, | 689 AssignmentPatternProduction = 1 << 2, |
690 FormalParametersProduction = 1 << 3, | 690 FormalParametersProduction = 1 << 3, |
691 ArrowFormalParametersProduction = 1 << 4, | 691 ArrowFormalParametersProduction = 1 << 4, |
692 StandardProductions = (ExpressionProduction | BindingPatternProduction | | 692 StandardProductions = (ExpressionProduction | BindingPatternProduction | |
693 AssignmentPatternProduction), | 693 AssignmentPatternProduction), |
| 694 PatternProductions = |
| 695 BindingPatternProduction | AssignmentPatternProduction, |
694 AllProductions = (StandardProductions | FormalParametersProduction | | 696 AllProductions = (StandardProductions | FormalParametersProduction | |
695 ArrowFormalParametersProduction) | 697 ArrowFormalParametersProduction), |
696 }; | 698 }; |
697 | 699 |
698 void Accumulate(const ExpressionClassifier& inner, | 700 void Accumulate(const ExpressionClassifier& inner, |
699 unsigned productions = StandardProductions) { | 701 unsigned productions = StandardProductions) { |
700 if (productions & ExpressionProduction && is_valid_expression()) { | 702 if (productions & ExpressionProduction && is_valid_expression()) { |
701 expression_error_ = inner.expression_error_; | 703 expression_error_ = inner.expression_error_; |
702 } | 704 } |
703 if (productions & BindingPatternProduction && | 705 if (productions & BindingPatternProduction && |
704 is_valid_binding_pattern()) { | 706 is_valid_binding_pattern()) { |
705 binding_pattern_error_ = inner.binding_pattern_error_; | 707 binding_pattern_error_ = inner.binding_pattern_error_; |
(...skipping 17 matching lines...) Expand all Loading... |
723 } | 725 } |
724 } | 726 } |
725 if (productions & ArrowFormalParametersProduction && | 727 if (productions & ArrowFormalParametersProduction && |
726 is_valid_arrow_formal_parameters()) { | 728 is_valid_arrow_formal_parameters()) { |
727 // The result continues to be a valid arrow formal parameters if the | 729 // The result continues to be a valid arrow formal parameters if the |
728 // inner expression is a valid binding pattern. | 730 // inner expression is a valid binding pattern. |
729 arrow_formal_parameters_error_ = inner.binding_pattern_error_; | 731 arrow_formal_parameters_error_ = inner.binding_pattern_error_; |
730 } | 732 } |
731 } | 733 } |
732 | 734 |
| 735 void AccumulateReclassifyingAsPattern(const ExpressionClassifier& inner) { |
| 736 Accumulate(inner, AllProductions & ~PatternProductions); |
| 737 if (!inner.is_valid_expression()) { |
| 738 if (is_valid_binding_pattern()) { |
| 739 binding_pattern_error_ = inner.expression_error(); |
| 740 } |
| 741 if (is_valid_assignment_pattern()) { |
| 742 assignment_pattern_error_ = inner.expression_error(); |
| 743 } |
| 744 } |
| 745 } |
| 746 |
733 private: | 747 private: |
734 Error expression_error_; | 748 Error expression_error_; |
735 Error binding_pattern_error_; | 749 Error binding_pattern_error_; |
736 Error assignment_pattern_error_; | 750 Error assignment_pattern_error_; |
737 Error arrow_formal_parameters_error_; | 751 Error arrow_formal_parameters_error_; |
738 Error duplicate_formal_parameter_error_; | 752 Error duplicate_formal_parameter_error_; |
739 Error strict_mode_formal_parameter_error_; | 753 Error strict_mode_formal_parameter_error_; |
740 Error strong_mode_formal_parameter_error_; | 754 Error strong_mode_formal_parameter_error_; |
741 }; | 755 }; |
742 | 756 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
796 MessageTemplate::kUnexpectedToken, | 810 MessageTemplate::kUnexpectedToken, |
797 Token::String(scanner()->current_token())); | 811 Token::String(scanner()->current_token())); |
798 *ok = false; | 812 *ok = false; |
799 } | 813 } |
800 } else if (!classifier->is_valid_arrow_formal_parameters()) { | 814 } else if (!classifier->is_valid_arrow_formal_parameters()) { |
801 ReportClassifierError(classifier->arrow_formal_parameters_error()); | 815 ReportClassifierError(classifier->arrow_formal_parameters_error()); |
802 *ok = false; | 816 *ok = false; |
803 } | 817 } |
804 } | 818 } |
805 | 819 |
| 820 void ExpressionUnexpectedToken(ExpressionClassifier* classifier) { |
| 821 classifier->RecordExpressionError(scanner()->peek_location(), |
| 822 MessageTemplate::kUnexpectedToken, |
| 823 Token::String(peek())); |
| 824 } |
| 825 |
806 void BindingPatternUnexpectedToken(ExpressionClassifier* classifier) { | 826 void BindingPatternUnexpectedToken(ExpressionClassifier* classifier) { |
807 classifier->RecordBindingPatternError(scanner()->peek_location(), | 827 classifier->RecordBindingPatternError(scanner()->peek_location(), |
808 MessageTemplate::kUnexpectedToken, | 828 MessageTemplate::kUnexpectedToken, |
809 Token::String(peek())); | 829 Token::String(peek())); |
810 } | 830 } |
811 | 831 |
812 void ArrowFormalParametersUnexpectedToken(ExpressionClassifier* classifier) { | 832 void ArrowFormalParametersUnexpectedToken(ExpressionClassifier* classifier) { |
813 classifier->RecordArrowFormalParametersError( | 833 classifier->RecordArrowFormalParametersError( |
814 scanner()->peek_location(), MessageTemplate::kUnexpectedToken, | 834 scanner()->peek_location(), MessageTemplate::kUnexpectedToken, |
815 Token::String(peek())); | 835 Token::String(peek())); |
(...skipping 1854 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2670 return factory()->NewObjectLiteralProperty( | 2690 return factory()->NewObjectLiteralProperty( |
2671 name_expression, value, | 2691 name_expression, value, |
2672 is_get ? ObjectLiteralProperty::GETTER : ObjectLiteralProperty::SETTER, | 2692 is_get ? ObjectLiteralProperty::GETTER : ObjectLiteralProperty::SETTER, |
2673 is_static, *is_computed_name); | 2693 is_static, *is_computed_name); |
2674 | 2694 |
2675 } else if (!in_class && allow_harmony_object_literals_ && | 2695 } else if (!in_class && allow_harmony_object_literals_ && |
2676 Token::IsIdentifier(name_token, language_mode(), | 2696 Token::IsIdentifier(name_token, language_mode(), |
2677 this->is_generator())) { | 2697 this->is_generator())) { |
2678 DCHECK(!*is_computed_name); | 2698 DCHECK(!*is_computed_name); |
2679 DCHECK(!is_static); | 2699 DCHECK(!is_static); |
2680 value = this->ExpressionFromIdentifier(name, next_beg_pos, next_end_pos, | 2700 |
2681 scope_, factory()); | 2701 ExpressionT lhs = this->ExpressionFromIdentifier( |
| 2702 name, next_beg_pos, next_end_pos, scope_, factory()); |
| 2703 if (peek() == Token::ASSIGN) { |
| 2704 this->ExpressionUnexpectedToken(classifier); |
| 2705 Consume(Token::ASSIGN); |
| 2706 ExpressionClassifier rhs_classifier; |
| 2707 ExpressionT rhs = this->ParseAssignmentExpression( |
| 2708 true, &rhs_classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
| 2709 classifier->AccumulateReclassifyingAsPattern(rhs_classifier); |
| 2710 value = factory()->NewAssignment(Token::ASSIGN, lhs, rhs, |
| 2711 RelocInfo::kNoPosition); |
| 2712 } else { |
| 2713 value = lhs; |
| 2714 } |
2682 return factory()->NewObjectLiteralProperty( | 2715 return factory()->NewObjectLiteralProperty( |
2683 name_expression, value, ObjectLiteralProperty::COMPUTED, false, false); | 2716 name_expression, value, ObjectLiteralProperty::COMPUTED, false, false); |
2684 | 2717 |
2685 } else { | 2718 } else { |
2686 Token::Value next = Next(); | 2719 Token::Value next = Next(); |
2687 ReportUnexpectedToken(next); | 2720 ReportUnexpectedToken(next); |
2688 *ok = false; | 2721 *ok = false; |
2689 return this->EmptyObjectLiteralProperty(); | 2722 return this->EmptyObjectLiteralProperty(); |
2690 } | 2723 } |
2691 | 2724 |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2893 if (!allow_harmony_destructuring()) { | 2926 if (!allow_harmony_destructuring()) { |
2894 BindingPatternUnexpectedToken(classifier); | 2927 BindingPatternUnexpectedToken(classifier); |
2895 } | 2928 } |
2896 | 2929 |
2897 expression = this->CheckAndRewriteReferenceExpression( | 2930 expression = this->CheckAndRewriteReferenceExpression( |
2898 expression, lhs_location, MessageTemplate::kInvalidLhsInAssignment, | 2931 expression, lhs_location, MessageTemplate::kInvalidLhsInAssignment, |
2899 CHECK_OK); | 2932 CHECK_OK); |
2900 expression = this->MarkExpressionAsAssigned(expression); | 2933 expression = this->MarkExpressionAsAssigned(expression); |
2901 | 2934 |
2902 Token::Value op = Next(); // Get assignment operator. | 2935 Token::Value op = Next(); // Get assignment operator. |
| 2936 if (op != Token::ASSIGN) { |
| 2937 classifier->RecordBindingPatternError(scanner()->location(), |
| 2938 MessageTemplate::kUnexpectedToken, |
| 2939 Token::String(op)); |
| 2940 } |
2903 int pos = position(); | 2941 int pos = position(); |
| 2942 |
| 2943 ExpressionClassifier rhs_classifier; |
2904 ExpressionT right = | 2944 ExpressionT right = |
2905 this->ParseAssignmentExpression(accept_IN, classifier, CHECK_OK); | 2945 this->ParseAssignmentExpression(accept_IN, &rhs_classifier, CHECK_OK); |
| 2946 classifier->AccumulateReclassifyingAsPattern(rhs_classifier); |
2906 | 2947 |
2907 // TODO(1231235): We try to estimate the set of properties set by | 2948 // TODO(1231235): We try to estimate the set of properties set by |
2908 // constructors. We define a new property whenever there is an | 2949 // constructors. We define a new property whenever there is an |
2909 // assignment to a property of 'this'. We should probably only add | 2950 // assignment to a property of 'this'. We should probably only add |
2910 // properties if we haven't seen them before. Otherwise we'll | 2951 // properties if we haven't seen them before. Otherwise we'll |
2911 // probably overestimate the number of properties. | 2952 // probably overestimate the number of properties. |
2912 if (op == Token::ASSIGN && this->IsThisProperty(expression)) { | 2953 if (op == Token::ASSIGN && this->IsThisProperty(expression)) { |
2913 function_state_->AddProperty(); | 2954 function_state_->AddProperty(); |
2914 } | 2955 } |
2915 | 2956 |
(...skipping 1048 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3964 *ok = false; | 4005 *ok = false; |
3965 return; | 4006 return; |
3966 } | 4007 } |
3967 has_seen_constructor_ = true; | 4008 has_seen_constructor_ = true; |
3968 return; | 4009 return; |
3969 } | 4010 } |
3970 } | 4011 } |
3971 } } // v8::internal | 4012 } } // v8::internal |
3972 | 4013 |
3973 #endif // V8_PREPARSER_H | 4014 #endif // V8_PREPARSER_H |
OLD | NEW |