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

Side by Side Diff: src/parsing/parser-base.h

Issue 1712833002: Don't reflect ES2015 Function name inference in Function.prototype.toString (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Move bits around to make STATIC_ASSERT happy Created 4 years, 10 months 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/parsing/parser.cc ('k') | src/parsing/preparser.h » ('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_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/hashmap.h" 10 #include "src/hashmap.h"
(...skipping 784 matching lines...) Expand 10 before | Expand all | Expand 10 after
795 ExpressionT ParseNewTargetExpression(bool* ok); 795 ExpressionT ParseNewTargetExpression(bool* ok);
796 ExpressionT ParseStrongInitializationExpression( 796 ExpressionT ParseStrongInitializationExpression(
797 ExpressionClassifier* classifier, bool* ok); 797 ExpressionClassifier* classifier, bool* ok);
798 ExpressionT ParseStrongSuperCallExpression(ExpressionClassifier* classifier, 798 ExpressionT ParseStrongSuperCallExpression(ExpressionClassifier* classifier,
799 bool* ok); 799 bool* ok);
800 800
801 void ParseFormalParameter(FormalParametersT* parameters, 801 void ParseFormalParameter(FormalParametersT* parameters,
802 ExpressionClassifier* classifier, bool* ok); 802 ExpressionClassifier* classifier, bool* ok);
803 void ParseFormalParameterList(FormalParametersT* parameters, 803 void ParseFormalParameterList(FormalParametersT* parameters,
804 ExpressionClassifier* classifier, bool* ok); 804 ExpressionClassifier* classifier, bool* ok);
805 void CheckArityRestrictions( 805 void CheckArityRestrictions(int param_count, FunctionKind function_type,
806 int param_count, FunctionLiteral::ArityRestriction arity_restriction, 806 bool has_rest, int formals_start_pos,
807 bool has_rest, int formals_start_pos, int formals_end_pos, bool* ok); 807 int formals_end_pos, bool* ok);
808 808
809 bool IsNextLetKeyword(); 809 bool IsNextLetKeyword();
810 810
811 // Checks if the expression is a valid reference expression (e.g., on the 811 // Checks if the expression is a valid reference expression (e.g., on the
812 // left-hand side of assignments). Although ruled out by ECMA as early errors, 812 // left-hand side of assignments). Although ruled out by ECMA as early errors,
813 // we allow calls for web compatibility and rewrite them to a runtime throw. 813 // we allow calls for web compatibility and rewrite them to a runtime throw.
814 ExpressionT CheckAndRewriteReferenceExpression( 814 ExpressionT CheckAndRewriteReferenceExpression(
815 ExpressionT expression, int beg_pos, int end_pos, 815 ExpressionT expression, int beg_pos, int end_pos,
816 MessageTemplate::Template message, bool* ok); 816 MessageTemplate::Template message, bool* ok);
817 ExpressionT ClassifyAndRewriteReferenceExpression( 817 ExpressionT ClassifyAndRewriteReferenceExpression(
(...skipping 912 matching lines...) Expand 10 before | Expand all | Expand 10 after
1730 : FunctionKind::kConciseMethod; 1730 : FunctionKind::kConciseMethod;
1731 1731
1732 if (in_class && !is_static && this->IsConstructor(*name)) { 1732 if (in_class && !is_static && this->IsConstructor(*name)) {
1733 *has_seen_constructor = true; 1733 *has_seen_constructor = true;
1734 kind = has_extends ? FunctionKind::kSubclassConstructor 1734 kind = has_extends ? FunctionKind::kSubclassConstructor
1735 : FunctionKind::kBaseConstructor; 1735 : FunctionKind::kBaseConstructor;
1736 } 1736 }
1737 1737
1738 value = this->ParseFunctionLiteral( 1738 value = this->ParseFunctionLiteral(
1739 *name, scanner()->location(), kSkipFunctionNameCheck, kind, 1739 *name, scanner()->location(), kSkipFunctionNameCheck, kind,
1740 RelocInfo::kNoPosition, FunctionLiteral::kAnonymousExpression, 1740 RelocInfo::kNoPosition, FunctionLiteral::kAccessorOrMethod,
1741 FunctionLiteral::kNormalArity, language_mode(), 1741 language_mode(), CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
1742 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
1743 1742
1744 return factory()->NewObjectLiteralProperty(name_expression, value, 1743 return factory()->NewObjectLiteralProperty(name_expression, value,
1745 ObjectLiteralProperty::COMPUTED, 1744 ObjectLiteralProperty::COMPUTED,
1746 is_static, *is_computed_name); 1745 is_static, *is_computed_name);
1747 } 1746 }
1748 1747
1749 if (in_class && name_token == Token::STATIC && !is_static) { 1748 if (in_class && name_token == Token::STATIC && !is_static) {
1750 // ClassElement (static) 1749 // ClassElement (static)
1751 // 'static' MethodDefinition 1750 // 'static' MethodDefinition
1752 *name = this->EmptyIdentifier(); 1751 *name = this->EmptyIdentifier();
(...skipping 18 matching lines...) Expand all
1771 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); 1770 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
1772 1771
1773 if (!*is_computed_name) { 1772 if (!*is_computed_name) {
1774 checker->CheckProperty(name_token, kAccessorProperty, is_static, 1773 checker->CheckProperty(name_token, kAccessorProperty, is_static,
1775 is_generator, 1774 is_generator,
1776 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); 1775 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
1777 } 1776 }
1778 1777
1779 typename Traits::Type::FunctionLiteral value = this->ParseFunctionLiteral( 1778 typename Traits::Type::FunctionLiteral value = this->ParseFunctionLiteral(
1780 *name, scanner()->location(), kSkipFunctionNameCheck, 1779 *name, scanner()->location(), kSkipFunctionNameCheck,
1781 FunctionKind::kAccessorFunction, RelocInfo::kNoPosition, 1780 is_get ? FunctionKind::kGetterFunction : FunctionKind::kSetterFunction,
1782 FunctionLiteral::kAnonymousExpression, 1781 RelocInfo::kNoPosition, FunctionLiteral::kAccessorOrMethod,
1783 is_get ? FunctionLiteral::kGetterArity : FunctionLiteral::kSetterArity,
1784 language_mode(), CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); 1782 language_mode(), CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
1785 1783
1786 // Make sure the name expression is a string since we need a Name for 1784 // Make sure the name expression is a string since we need a Name for
1787 // Runtime_DefineAccessorPropertyUnchecked and since we can determine this 1785 // Runtime_DefineAccessorPropertyUnchecked and since we can determine this
1788 // statically we can skip the extra runtime check. 1786 // statically we can skip the extra runtime check.
1789 if (!*is_computed_name) { 1787 if (!*is_computed_name) {
1790 name_expression = 1788 name_expression =
1791 factory()->NewStringLiteral(*name, name_expression->position()); 1789 factory()->NewStringLiteral(*name, name_expression->position());
1792 } 1790 }
1793 1791
(...skipping 776 matching lines...) Expand 10 before | Expand all | Expand 10 after
2570 is_generator, &is_strict_reserved_name, CHECK_OK); 2568 is_generator, &is_strict_reserved_name, CHECK_OK);
2571 function_name_location = scanner()->location(); 2569 function_name_location = scanner()->location();
2572 function_type = FunctionLiteral::kNamedExpression; 2570 function_type = FunctionLiteral::kNamedExpression;
2573 } 2571 }
2574 result = this->ParseFunctionLiteral( 2572 result = this->ParseFunctionLiteral(
2575 name, function_name_location, 2573 name, function_name_location,
2576 is_strict_reserved_name ? kFunctionNameIsStrictReserved 2574 is_strict_reserved_name ? kFunctionNameIsStrictReserved
2577 : kFunctionNameValidityUnknown, 2575 : kFunctionNameValidityUnknown,
2578 is_generator ? FunctionKind::kGeneratorFunction 2576 is_generator ? FunctionKind::kGeneratorFunction
2579 : FunctionKind::kNormalFunction, 2577 : FunctionKind::kNormalFunction,
2580 function_token_position, function_type, FunctionLiteral::kNormalArity, 2578 function_token_position, function_type, language_mode(), CHECK_OK);
2581 language_mode(), CHECK_OK);
2582 } else if (peek() == Token::SUPER) { 2579 } else if (peek() == Token::SUPER) {
2583 const bool is_new = false; 2580 const bool is_new = false;
2584 result = ParseSuperExpression(is_new, classifier, CHECK_OK); 2581 result = ParseSuperExpression(is_new, classifier, CHECK_OK);
2585 } else { 2582 } else {
2586 result = ParsePrimaryExpression(classifier, CHECK_OK); 2583 result = ParsePrimaryExpression(classifier, CHECK_OK);
2587 } 2584 }
2588 2585
2589 result = ParseMemberExpressionContinuation(result, classifier, CHECK_OK); 2586 result = ParseMemberExpressionContinuation(result, classifier, CHECK_OK);
2590 return result; 2587 return result;
2591 } 2588 }
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after
2963 } 2960 }
2964 } 2961 }
2965 } 2962 }
2966 2963
2967 for (int i = 0; i < parameters->Arity(); ++i) { 2964 for (int i = 0; i < parameters->Arity(); ++i) {
2968 auto parameter = parameters->at(i); 2965 auto parameter = parameters->at(i);
2969 Traits::DeclareFormalParameter(parameters->scope, parameter, classifier); 2966 Traits::DeclareFormalParameter(parameters->scope, parameter, classifier);
2970 } 2967 }
2971 } 2968 }
2972 2969
2973
2974 template <class Traits> 2970 template <class Traits>
2975 void ParserBase<Traits>::CheckArityRestrictions( 2971 void ParserBase<Traits>::CheckArityRestrictions(int param_count,
2976 int param_count, FunctionLiteral::ArityRestriction arity_restriction, 2972 FunctionKind function_kind,
2977 bool has_rest, int formals_start_pos, int formals_end_pos, bool* ok) { 2973 bool has_rest,
2978 switch (arity_restriction) { 2974 int formals_start_pos,
2979 case FunctionLiteral::kGetterArity: 2975 int formals_end_pos, bool* ok) {
2980 if (param_count != 0) { 2976 if (IsGetterFunction(function_kind)) {
2981 ReportMessageAt(Scanner::Location(formals_start_pos, formals_end_pos), 2977 if (param_count != 0) {
2982 MessageTemplate::kBadGetterArity); 2978 ReportMessageAt(Scanner::Location(formals_start_pos, formals_end_pos),
2983 *ok = false; 2979 MessageTemplate::kBadGetterArity);
2984 } 2980 *ok = false;
2985 break; 2981 }
2986 case FunctionLiteral::kSetterArity: 2982 } else if (IsSetterFunction(function_kind)) {
2987 if (param_count != 1) { 2983 if (param_count != 1) {
2988 ReportMessageAt(Scanner::Location(formals_start_pos, formals_end_pos), 2984 ReportMessageAt(Scanner::Location(formals_start_pos, formals_end_pos),
2989 MessageTemplate::kBadSetterArity); 2985 MessageTemplate::kBadSetterArity);
2990 *ok = false; 2986 *ok = false;
2991 } 2987 }
2992 if (has_rest) { 2988 if (has_rest) {
2993 ReportMessageAt(Scanner::Location(formals_start_pos, formals_end_pos), 2989 ReportMessageAt(Scanner::Location(formals_start_pos, formals_end_pos),
2994 MessageTemplate::kBadSetterRestParameter); 2990 MessageTemplate::kBadSetterRestParameter);
2995 *ok = false; 2991 *ok = false;
2996 } 2992 }
2997 break;
2998 default:
2999 break;
3000 } 2993 }
3001 } 2994 }
3002 2995
3003 2996
3004 template <class Traits> 2997 template <class Traits>
3005 bool ParserBase<Traits>::IsNextLetKeyword() { 2998 bool ParserBase<Traits>::IsNextLetKeyword() {
3006 DCHECK(peek() == Token::LET); 2999 DCHECK(peek() == Token::LET);
3007 if (!allow_let()) { 3000 if (!allow_let()) {
3008 return false; 3001 return false;
3009 } 3002 }
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after
3360 return; 3353 return;
3361 } 3354 }
3362 has_seen_constructor_ = true; 3355 has_seen_constructor_ = true;
3363 return; 3356 return;
3364 } 3357 }
3365 } 3358 }
3366 } // namespace internal 3359 } // namespace internal
3367 } // namespace v8 3360 } // namespace v8
3368 3361
3369 #endif // V8_PARSING_PARSER_BASE_H 3362 #endif // V8_PARSING_PARSER_BASE_H
OLDNEW
« no previous file with comments | « src/parsing/parser.cc ('k') | src/parsing/preparser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698