Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(280)

Side by Side Diff: src/preparser.h

Issue 1534533002: Version 4.8.271.10 (cherry-pick) (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@4.8
Patch Set: Bump patch level Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/parser.cc ('k') | test/mjsunit/mjsunit.status » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 2769 matching lines...) Expand 10 before | Expand all | Expand 10 after
2780 typename Traits::Type::PropertyList properties = 2780 typename Traits::Type::PropertyList properties =
2781 this->NewPropertyList(4, zone_); 2781 this->NewPropertyList(4, zone_);
2782 int number_of_boilerplate_properties = 0; 2782 int number_of_boilerplate_properties = 0;
2783 bool has_function = false; 2783 bool has_function = false;
2784 bool has_computed_names = false; 2784 bool has_computed_names = false;
2785 ObjectLiteralChecker checker(this); 2785 ObjectLiteralChecker checker(this);
2786 2786
2787 Expect(Token::LBRACE, CHECK_OK); 2787 Expect(Token::LBRACE, CHECK_OK);
2788 2788
2789 while (peek() != Token::RBRACE) { 2789 while (peek() != Token::RBRACE) {
2790 if (fni_ != nullptr) fni_->Enter(); 2790 FuncNameInferrer::State fni_state(fni_);
2791 2791
2792 const bool in_class = false; 2792 const bool in_class = false;
2793 const bool is_static = false; 2793 const bool is_static = false;
2794 const bool has_extends = false; 2794 const bool has_extends = false;
2795 bool is_computed_name = false; 2795 bool is_computed_name = false;
2796 ObjectLiteralPropertyT property = this->ParsePropertyDefinition( 2796 ObjectLiteralPropertyT property = this->ParsePropertyDefinition(
2797 &checker, in_class, has_extends, is_static, &is_computed_name, NULL, 2797 &checker, in_class, has_extends, is_static, &is_computed_name, NULL,
2798 classifier, CHECK_OK); 2798 classifier, CHECK_OK);
2799 2799
2800 if (is_computed_name) { 2800 if (is_computed_name) {
(...skipping 10 matching lines...) Expand all
2811 if (!has_computed_names && this->IsBoilerplateProperty(property)) { 2811 if (!has_computed_names && this->IsBoilerplateProperty(property)) {
2812 number_of_boilerplate_properties++; 2812 number_of_boilerplate_properties++;
2813 } 2813 }
2814 properties->Add(property, zone()); 2814 properties->Add(property, zone());
2815 2815
2816 if (peek() != Token::RBRACE) { 2816 if (peek() != Token::RBRACE) {
2817 // Need {} because of the CHECK_OK macro. 2817 // Need {} because of the CHECK_OK macro.
2818 Expect(Token::COMMA, CHECK_OK); 2818 Expect(Token::COMMA, CHECK_OK);
2819 } 2819 }
2820 2820
2821 if (fni_ != nullptr) { 2821 if (fni_ != nullptr) fni_->Infer();
2822 fni_->Infer();
2823 fni_->Leave();
2824 }
2825 } 2822 }
2826 Expect(Token::RBRACE, CHECK_OK); 2823 Expect(Token::RBRACE, CHECK_OK);
2827 2824
2828 // Computation of literal_index must happen before pre parse bailout. 2825 // Computation of literal_index must happen before pre parse bailout.
2829 int literal_index = function_state_->NextMaterializedLiteralIndex(); 2826 int literal_index = function_state_->NextMaterializedLiteralIndex();
2830 2827
2831 return factory()->NewObjectLiteral(properties, 2828 return factory()->NewObjectLiteral(properties,
2832 literal_index, 2829 literal_index,
2833 number_of_boilerplate_properties, 2830 number_of_boilerplate_properties,
2834 has_function, 2831 has_function,
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
2914 // ArrowFunction 2911 // ArrowFunction
2915 // YieldExpression 2912 // YieldExpression
2916 // LeftHandSideExpression AssignmentOperator AssignmentExpression 2913 // LeftHandSideExpression AssignmentOperator AssignmentExpression
2917 2914
2918 int lhs_beg_pos = peek_position(); 2915 int lhs_beg_pos = peek_position();
2919 2916
2920 if (peek() == Token::YIELD && is_generator()) { 2917 if (peek() == Token::YIELD && is_generator()) {
2921 return this->ParseYieldExpression(classifier, ok); 2918 return this->ParseYieldExpression(classifier, ok);
2922 } 2919 }
2923 2920
2924 if (fni_ != NULL) fni_->Enter(); 2921 FuncNameInferrer::State fni_state(fni_);
2925 ParserBase<Traits>::Checkpoint checkpoint(this); 2922 ParserBase<Traits>::Checkpoint checkpoint(this);
2926 ExpressionClassifier arrow_formals_classifier(classifier->duplicate_finder()); 2923 ExpressionClassifier arrow_formals_classifier(classifier->duplicate_finder());
2927 bool parenthesized_formals = peek() == Token::LPAREN; 2924 bool parenthesized_formals = peek() == Token::LPAREN;
2928 if (!parenthesized_formals) { 2925 if (!parenthesized_formals) {
2929 ArrowFormalParametersUnexpectedToken(&arrow_formals_classifier); 2926 ArrowFormalParametersUnexpectedToken(&arrow_formals_classifier);
2930 } 2927 }
2931 ExpressionT expression = this->ParseConditionalExpression( 2928 ExpressionT expression = this->ParseConditionalExpression(
2932 accept_IN, &arrow_formals_classifier, CHECK_OK); 2929 accept_IN, &arrow_formals_classifier, CHECK_OK);
2933 if (peek() == Token::ARROW) { 2930 if (peek() == Token::ARROW) {
2934 BindingPatternUnexpectedToken(classifier); 2931 BindingPatternUnexpectedToken(classifier);
(...skipping 18 matching lines...) Expand all
2953 2950
2954 checkpoint.Restore(&parameters.materialized_literals_count); 2951 checkpoint.Restore(&parameters.materialized_literals_count);
2955 2952
2956 scope->set_start_position(lhs_beg_pos); 2953 scope->set_start_position(lhs_beg_pos);
2957 if (duplicate_loc.IsValid()) { 2954 if (duplicate_loc.IsValid()) {
2958 arrow_formals_classifier.RecordDuplicateFormalParameterError( 2955 arrow_formals_classifier.RecordDuplicateFormalParameterError(
2959 duplicate_loc); 2956 duplicate_loc);
2960 } 2957 }
2961 expression = this->ParseArrowFunctionLiteral( 2958 expression = this->ParseArrowFunctionLiteral(
2962 accept_IN, parameters, arrow_formals_classifier, CHECK_OK); 2959 accept_IN, parameters, arrow_formals_classifier, CHECK_OK);
2960
2961 if (fni_ != nullptr) fni_->Infer();
2962
2963 return expression; 2963 return expression;
2964 } 2964 }
2965 2965
2966 // "expression" was not itself an arrow function parameter list, but it might 2966 // "expression" was not itself an arrow function parameter list, but it might
2967 // form part of one. Propagate speculative formal parameter error locations. 2967 // form part of one. Propagate speculative formal parameter error locations.
2968 classifier->Accumulate(arrow_formals_classifier, 2968 classifier->Accumulate(arrow_formals_classifier,
2969 ExpressionClassifier::StandardProductions | 2969 ExpressionClassifier::StandardProductions |
2970 ExpressionClassifier::FormalParametersProductions); 2970 ExpressionClassifier::FormalParametersProductions);
2971 2971
2972 if (!Token::IsAssignmentOp(peek())) { 2972 if (!Token::IsAssignmentOp(peek())) {
2973 if (fni_ != NULL) fni_->Leave();
2974 // Parsed conditional expression only (no assignment). 2973 // Parsed conditional expression only (no assignment).
2975 return expression; 2974 return expression;
2976 } 2975 }
2977 2976
2978 if (!(allow_harmony_destructuring() || allow_harmony_default_parameters())) { 2977 if (!(allow_harmony_destructuring() || allow_harmony_default_parameters())) {
2979 BindingPatternUnexpectedToken(classifier); 2978 BindingPatternUnexpectedToken(classifier);
2980 } 2979 }
2981 2980
2982 expression = this->CheckAndRewriteReferenceExpression( 2981 expression = this->CheckAndRewriteReferenceExpression(
2983 expression, lhs_beg_pos, scanner()->location().end_pos, 2982 expression, lhs_beg_pos, scanner()->location().end_pos,
(...skipping 30 matching lines...) Expand all
3014 // name if we're dealing with "a = function(){...}();"-like 3013 // name if we're dealing with "a = function(){...}();"-like
3015 // expression. 3014 // expression.
3016 if ((op == Token::INIT_VAR 3015 if ((op == Token::INIT_VAR
3017 || op == Token::INIT_CONST_LEGACY 3016 || op == Token::INIT_CONST_LEGACY
3018 || op == Token::ASSIGN) 3017 || op == Token::ASSIGN)
3019 && (!right->IsCall() && !right->IsCallNew())) { 3018 && (!right->IsCall() && !right->IsCallNew())) {
3020 fni_->Infer(); 3019 fni_->Infer();
3021 } else { 3020 } else {
3022 fni_->RemoveLastFunction(); 3021 fni_->RemoveLastFunction();
3023 } 3022 }
3024 fni_->Leave();
3025 } 3023 }
3026 3024
3027 return factory()->NewAssignment(op, expression, right, pos); 3025 return factory()->NewAssignment(op, expression, right, pos);
3028 } 3026 }
3029 3027
3030 template <class Traits> 3028 template <class Traits>
3031 typename ParserBase<Traits>::ExpressionT 3029 typename ParserBase<Traits>::ExpressionT
3032 ParserBase<Traits>::ParseYieldExpression(ExpressionClassifier* classifier, 3030 ParserBase<Traits>::ParseYieldExpression(ExpressionClassifier* classifier,
3033 bool* ok) { 3031 bool* ok) {
3034 // YieldExpression :: 3032 // YieldExpression ::
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after
3481 3479
3482 3480
3483 template <class Traits> 3481 template <class Traits>
3484 typename ParserBase<Traits>::ExpressionT 3482 typename ParserBase<Traits>::ExpressionT
3485 ParserBase<Traits>::ParseStrongInitializationExpression( 3483 ParserBase<Traits>::ParseStrongInitializationExpression(
3486 ExpressionClassifier* classifier, bool* ok) { 3484 ExpressionClassifier* classifier, bool* ok) {
3487 // InitializationExpression :: (strong mode) 3485 // InitializationExpression :: (strong mode)
3488 // 'this' '.' IdentifierName '=' AssignmentExpression 3486 // 'this' '.' IdentifierName '=' AssignmentExpression
3489 // 'this' '[' Expression ']' '=' AssignmentExpression 3487 // 'this' '[' Expression ']' '=' AssignmentExpression
3490 3488
3491 if (fni_ != NULL) fni_->Enter(); 3489 FuncNameInferrer::State fni_state(fni_);
3492 3490
3493 Consume(Token::THIS); 3491 Consume(Token::THIS);
3494 int pos = position(); 3492 int pos = position();
3495 function_state_->set_this_location(scanner()->location()); 3493 function_state_->set_this_location(scanner()->location());
3496 ExpressionT this_expr = this->ThisExpression(scope_, factory(), pos); 3494 ExpressionT this_expr = this->ThisExpression(scope_, factory(), pos);
3497 3495
3498 ExpressionT left = this->EmptyExpression(); 3496 ExpressionT left = this->EmptyExpression();
3499 switch (peek()) { 3497 switch (peek()) {
3500 case Token::LBRACK: { 3498 case Token::LBRACK: {
3501 Consume(Token::LBRACK); 3499 Consume(Token::LBRACK);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
3540 function_state_->AddProperty(); 3538 function_state_->AddProperty();
3541 if (fni_ != NULL) { 3539 if (fni_ != NULL) {
3542 // Check if the right hand side is a call to avoid inferring a 3540 // Check if the right hand side is a call to avoid inferring a
3543 // name if we're dealing with "this.a = function(){...}();"-like 3541 // name if we're dealing with "this.a = function(){...}();"-like
3544 // expression. 3542 // expression.
3545 if (!right->IsCall() && !right->IsCallNew()) { 3543 if (!right->IsCall() && !right->IsCallNew()) {
3546 fni_->Infer(); 3544 fni_->Infer();
3547 } else { 3545 } else {
3548 fni_->RemoveLastFunction(); 3546 fni_->RemoveLastFunction();
3549 } 3547 }
3550 fni_->Leave();
3551 } 3548 }
3552 3549
3553 if (function_state_->return_location().IsValid()) { 3550 if (function_state_->return_location().IsValid()) {
3554 ReportMessageAt(function_state_->return_location(), 3551 ReportMessageAt(function_state_->return_location(),
3555 MessageTemplate::kStrongConstructorReturnMisplaced); 3552 MessageTemplate::kStrongConstructorReturnMisplaced);
3556 *ok = false; 3553 *ok = false;
3557 return this->EmptyExpression(); 3554 return this->EmptyExpression();
3558 } 3555 }
3559 3556
3560 return factory()->NewAssignment(Token::ASSIGN, left, right, pos); 3557 return factory()->NewAssignment(Token::ASSIGN, left, right, pos);
(...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after
4199 return; 4196 return;
4200 } 4197 }
4201 has_seen_constructor_ = true; 4198 has_seen_constructor_ = true;
4202 return; 4199 return;
4203 } 4200 }
4204 } 4201 }
4205 } // namespace internal 4202 } // namespace internal
4206 } // namespace v8 4203 } // namespace v8
4207 4204
4208 #endif // V8_PREPARSER_H 4205 #endif // V8_PREPARSER_H
OLDNEW
« no previous file with comments | « src/parser.cc ('k') | test/mjsunit/mjsunit.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698