| 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/bailout-reason.h" | 8 #include "src/bailout-reason.h" |
| 9 #include "src/expression-classifier.h" | 9 #include "src/expression-classifier.h" |
| 10 #include "src/func-name-inferrer.h" | 10 #include "src/func-name-inferrer.h" |
| (...skipping 2752 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2763 typename Traits::Type::PropertyList properties = | 2763 typename Traits::Type::PropertyList properties = |
| 2764 this->NewPropertyList(4, zone_); | 2764 this->NewPropertyList(4, zone_); |
| 2765 int number_of_boilerplate_properties = 0; | 2765 int number_of_boilerplate_properties = 0; |
| 2766 bool has_function = false; | 2766 bool has_function = false; |
| 2767 bool has_computed_names = false; | 2767 bool has_computed_names = false; |
| 2768 ObjectLiteralChecker checker(this); | 2768 ObjectLiteralChecker checker(this); |
| 2769 | 2769 |
| 2770 Expect(Token::LBRACE, CHECK_OK); | 2770 Expect(Token::LBRACE, CHECK_OK); |
| 2771 | 2771 |
| 2772 while (peek() != Token::RBRACE) { | 2772 while (peek() != Token::RBRACE) { |
| 2773 if (fni_ != nullptr) fni_->Enter(); | 2773 FuncNameInferrer::State fni_state(fni_); |
| 2774 | 2774 |
| 2775 const bool in_class = false; | 2775 const bool in_class = false; |
| 2776 const bool is_static = false; | 2776 const bool is_static = false; |
| 2777 const bool has_extends = false; | 2777 const bool has_extends = false; |
| 2778 bool is_computed_name = false; | 2778 bool is_computed_name = false; |
| 2779 ObjectLiteralPropertyT property = this->ParsePropertyDefinition( | 2779 ObjectLiteralPropertyT property = this->ParsePropertyDefinition( |
| 2780 &checker, in_class, has_extends, is_static, &is_computed_name, NULL, | 2780 &checker, in_class, has_extends, is_static, &is_computed_name, NULL, |
| 2781 classifier, CHECK_OK); | 2781 classifier, CHECK_OK); |
| 2782 | 2782 |
| 2783 if (is_computed_name) { | 2783 if (is_computed_name) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2794 if (!has_computed_names && this->IsBoilerplateProperty(property)) { | 2794 if (!has_computed_names && this->IsBoilerplateProperty(property)) { |
| 2795 number_of_boilerplate_properties++; | 2795 number_of_boilerplate_properties++; |
| 2796 } | 2796 } |
| 2797 properties->Add(property, zone()); | 2797 properties->Add(property, zone()); |
| 2798 | 2798 |
| 2799 if (peek() != Token::RBRACE) { | 2799 if (peek() != Token::RBRACE) { |
| 2800 // Need {} because of the CHECK_OK macro. | 2800 // Need {} because of the CHECK_OK macro. |
| 2801 Expect(Token::COMMA, CHECK_OK); | 2801 Expect(Token::COMMA, CHECK_OK); |
| 2802 } | 2802 } |
| 2803 | 2803 |
| 2804 if (fni_ != nullptr) { | 2804 if (fni_ != nullptr) fni_->Infer(); |
| 2805 fni_->Infer(); | |
| 2806 fni_->Leave(); | |
| 2807 } | |
| 2808 } | 2805 } |
| 2809 Expect(Token::RBRACE, CHECK_OK); | 2806 Expect(Token::RBRACE, CHECK_OK); |
| 2810 | 2807 |
| 2811 // Computation of literal_index must happen before pre parse bailout. | 2808 // Computation of literal_index must happen before pre parse bailout. |
| 2812 int literal_index = function_state_->NextMaterializedLiteralIndex(); | 2809 int literal_index = function_state_->NextMaterializedLiteralIndex(); |
| 2813 | 2810 |
| 2814 return factory()->NewObjectLiteral(properties, | 2811 return factory()->NewObjectLiteral(properties, |
| 2815 literal_index, | 2812 literal_index, |
| 2816 number_of_boilerplate_properties, | 2813 number_of_boilerplate_properties, |
| 2817 has_function, | 2814 has_function, |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2899 // ArrowFunction | 2896 // ArrowFunction |
| 2900 // YieldExpression | 2897 // YieldExpression |
| 2901 // LeftHandSideExpression AssignmentOperator AssignmentExpression | 2898 // LeftHandSideExpression AssignmentOperator AssignmentExpression |
| 2902 | 2899 |
| 2903 int lhs_beg_pos = peek_position(); | 2900 int lhs_beg_pos = peek_position(); |
| 2904 | 2901 |
| 2905 if (peek() == Token::YIELD && is_generator()) { | 2902 if (peek() == Token::YIELD && is_generator()) { |
| 2906 return this->ParseYieldExpression(classifier, ok); | 2903 return this->ParseYieldExpression(classifier, ok); |
| 2907 } | 2904 } |
| 2908 | 2905 |
| 2909 if (fni_ != NULL) fni_->Enter(); | 2906 FuncNameInferrer::State fni_state(fni_); |
| 2910 ParserBase<Traits>::Checkpoint checkpoint(this); | 2907 ParserBase<Traits>::Checkpoint checkpoint(this); |
| 2911 ExpressionClassifier arrow_formals_classifier(classifier->duplicate_finder()); | 2908 ExpressionClassifier arrow_formals_classifier(classifier->duplicate_finder()); |
| 2912 bool parenthesized_formals = peek() == Token::LPAREN; | 2909 bool parenthesized_formals = peek() == Token::LPAREN; |
| 2913 if (!parenthesized_formals) { | 2910 if (!parenthesized_formals) { |
| 2914 ArrowFormalParametersUnexpectedToken(&arrow_formals_classifier); | 2911 ArrowFormalParametersUnexpectedToken(&arrow_formals_classifier); |
| 2915 } | 2912 } |
| 2916 ExpressionT expression = this->ParseConditionalExpression( | 2913 ExpressionT expression = this->ParseConditionalExpression( |
| 2917 accept_IN, &arrow_formals_classifier, CHECK_OK); | 2914 accept_IN, &arrow_formals_classifier, CHECK_OK); |
| 2918 if (allow_harmony_arrow_functions() && peek() == Token::ARROW) { | 2915 if (allow_harmony_arrow_functions() && peek() == Token::ARROW) { |
| 2919 BindingPatternUnexpectedToken(classifier); | 2916 BindingPatternUnexpectedToken(classifier); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2934 | 2931 |
| 2935 checkpoint.Restore(¶meters.materialized_literals_count); | 2932 checkpoint.Restore(¶meters.materialized_literals_count); |
| 2936 | 2933 |
| 2937 scope->set_start_position(lhs_beg_pos); | 2934 scope->set_start_position(lhs_beg_pos); |
| 2938 if (duplicate_loc.IsValid()) { | 2935 if (duplicate_loc.IsValid()) { |
| 2939 arrow_formals_classifier.RecordDuplicateFormalParameterError( | 2936 arrow_formals_classifier.RecordDuplicateFormalParameterError( |
| 2940 duplicate_loc); | 2937 duplicate_loc); |
| 2941 } | 2938 } |
| 2942 expression = this->ParseArrowFunctionLiteral( | 2939 expression = this->ParseArrowFunctionLiteral( |
| 2943 parameters, arrow_formals_classifier, CHECK_OK); | 2940 parameters, arrow_formals_classifier, CHECK_OK); |
| 2941 |
| 2942 if (fni_ != nullptr) fni_->Infer(); |
| 2943 |
| 2944 return expression; | 2944 return expression; |
| 2945 } | 2945 } |
| 2946 | 2946 |
| 2947 // "expression" was not itself an arrow function parameter list, but it might | 2947 // "expression" was not itself an arrow function parameter list, but it might |
| 2948 // form part of one. Propagate speculative formal parameter error locations. | 2948 // form part of one. Propagate speculative formal parameter error locations. |
| 2949 classifier->Accumulate(arrow_formals_classifier, | 2949 classifier->Accumulate(arrow_formals_classifier, |
| 2950 ExpressionClassifier::StandardProductions | | 2950 ExpressionClassifier::StandardProductions | |
| 2951 ExpressionClassifier::FormalParametersProductions); | 2951 ExpressionClassifier::FormalParametersProductions); |
| 2952 | 2952 |
| 2953 if (!Token::IsAssignmentOp(peek())) { | 2953 if (!Token::IsAssignmentOp(peek())) { |
| 2954 if (fni_ != NULL) fni_->Leave(); | |
| 2955 // Parsed conditional expression only (no assignment). | 2954 // Parsed conditional expression only (no assignment). |
| 2956 return expression; | 2955 return expression; |
| 2957 } | 2956 } |
| 2958 | 2957 |
| 2959 if (!(allow_harmony_destructuring() || allow_harmony_default_parameters())) { | 2958 if (!(allow_harmony_destructuring() || allow_harmony_default_parameters())) { |
| 2960 BindingPatternUnexpectedToken(classifier); | 2959 BindingPatternUnexpectedToken(classifier); |
| 2961 } | 2960 } |
| 2962 | 2961 |
| 2963 expression = this->CheckAndRewriteReferenceExpression( | 2962 expression = this->CheckAndRewriteReferenceExpression( |
| 2964 expression, lhs_beg_pos, scanner()->location().end_pos, | 2963 expression, lhs_beg_pos, scanner()->location().end_pos, |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2995 // name if we're dealing with "a = function(){...}();"-like | 2994 // name if we're dealing with "a = function(){...}();"-like |
| 2996 // expression. | 2995 // expression. |
| 2997 if ((op == Token::INIT_VAR | 2996 if ((op == Token::INIT_VAR |
| 2998 || op == Token::INIT_CONST_LEGACY | 2997 || op == Token::INIT_CONST_LEGACY |
| 2999 || op == Token::ASSIGN) | 2998 || op == Token::ASSIGN) |
| 3000 && (!right->IsCall() && !right->IsCallNew())) { | 2999 && (!right->IsCall() && !right->IsCallNew())) { |
| 3001 fni_->Infer(); | 3000 fni_->Infer(); |
| 3002 } else { | 3001 } else { |
| 3003 fni_->RemoveLastFunction(); | 3002 fni_->RemoveLastFunction(); |
| 3004 } | 3003 } |
| 3005 fni_->Leave(); | |
| 3006 } | 3004 } |
| 3007 | 3005 |
| 3008 return factory()->NewAssignment(op, expression, right, pos); | 3006 return factory()->NewAssignment(op, expression, right, pos); |
| 3009 } | 3007 } |
| 3010 | 3008 |
| 3011 template <class Traits> | 3009 template <class Traits> |
| 3012 typename ParserBase<Traits>::ExpressionT | 3010 typename ParserBase<Traits>::ExpressionT |
| 3013 ParserBase<Traits>::ParseYieldExpression(ExpressionClassifier* classifier, | 3011 ParserBase<Traits>::ParseYieldExpression(ExpressionClassifier* classifier, |
| 3014 bool* ok) { | 3012 bool* ok) { |
| 3015 // YieldExpression :: | 3013 // YieldExpression :: |
| (...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3462 | 3460 |
| 3463 | 3461 |
| 3464 template <class Traits> | 3462 template <class Traits> |
| 3465 typename ParserBase<Traits>::ExpressionT | 3463 typename ParserBase<Traits>::ExpressionT |
| 3466 ParserBase<Traits>::ParseStrongInitializationExpression( | 3464 ParserBase<Traits>::ParseStrongInitializationExpression( |
| 3467 ExpressionClassifier* classifier, bool* ok) { | 3465 ExpressionClassifier* classifier, bool* ok) { |
| 3468 // InitializationExpression :: (strong mode) | 3466 // InitializationExpression :: (strong mode) |
| 3469 // 'this' '.' IdentifierName '=' AssignmentExpression | 3467 // 'this' '.' IdentifierName '=' AssignmentExpression |
| 3470 // 'this' '[' Expression ']' '=' AssignmentExpression | 3468 // 'this' '[' Expression ']' '=' AssignmentExpression |
| 3471 | 3469 |
| 3472 if (fni_ != NULL) fni_->Enter(); | 3470 FuncNameInferrer::State fni_state(fni_); |
| 3473 | 3471 |
| 3474 Consume(Token::THIS); | 3472 Consume(Token::THIS); |
| 3475 int pos = position(); | 3473 int pos = position(); |
| 3476 function_state_->set_this_location(scanner()->location()); | 3474 function_state_->set_this_location(scanner()->location()); |
| 3477 ExpressionT this_expr = this->ThisExpression(scope_, factory(), pos); | 3475 ExpressionT this_expr = this->ThisExpression(scope_, factory(), pos); |
| 3478 | 3476 |
| 3479 ExpressionT left = this->EmptyExpression(); | 3477 ExpressionT left = this->EmptyExpression(); |
| 3480 switch (peek()) { | 3478 switch (peek()) { |
| 3481 case Token::LBRACK: { | 3479 case Token::LBRACK: { |
| 3482 Consume(Token::LBRACK); | 3480 Consume(Token::LBRACK); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3521 function_state_->AddProperty(); | 3519 function_state_->AddProperty(); |
| 3522 if (fni_ != NULL) { | 3520 if (fni_ != NULL) { |
| 3523 // Check if the right hand side is a call to avoid inferring a | 3521 // Check if the right hand side is a call to avoid inferring a |
| 3524 // name if we're dealing with "this.a = function(){...}();"-like | 3522 // name if we're dealing with "this.a = function(){...}();"-like |
| 3525 // expression. | 3523 // expression. |
| 3526 if (!right->IsCall() && !right->IsCallNew()) { | 3524 if (!right->IsCall() && !right->IsCallNew()) { |
| 3527 fni_->Infer(); | 3525 fni_->Infer(); |
| 3528 } else { | 3526 } else { |
| 3529 fni_->RemoveLastFunction(); | 3527 fni_->RemoveLastFunction(); |
| 3530 } | 3528 } |
| 3531 fni_->Leave(); | |
| 3532 } | 3529 } |
| 3533 | 3530 |
| 3534 if (function_state_->return_location().IsValid()) { | 3531 if (function_state_->return_location().IsValid()) { |
| 3535 ReportMessageAt(function_state_->return_location(), | 3532 ReportMessageAt(function_state_->return_location(), |
| 3536 MessageTemplate::kStrongConstructorReturnMisplaced); | 3533 MessageTemplate::kStrongConstructorReturnMisplaced); |
| 3537 *ok = false; | 3534 *ok = false; |
| 3538 return this->EmptyExpression(); | 3535 return this->EmptyExpression(); |
| 3539 } | 3536 } |
| 3540 | 3537 |
| 3541 return factory()->NewAssignment(Token::ASSIGN, left, right, pos); | 3538 return factory()->NewAssignment(Token::ASSIGN, left, right, pos); |
| (...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4179 *ok = false; | 4176 *ok = false; |
| 4180 return; | 4177 return; |
| 4181 } | 4178 } |
| 4182 has_seen_constructor_ = true; | 4179 has_seen_constructor_ = true; |
| 4183 return; | 4180 return; |
| 4184 } | 4181 } |
| 4185 } | 4182 } |
| 4186 } } // v8::internal | 4183 } } // v8::internal |
| 4187 | 4184 |
| 4188 #endif // V8_PREPARSER_H | 4185 #endif // V8_PREPARSER_H |
| OLD | NEW |