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

Side by Side Diff: src/preparser.h

Issue 1290013002: [es6] Make assignment to new.target an early ReferenceError (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Add a few more tests Created 5 years, 4 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/parser.cc ('k') | src/preparser.cc » ('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 695 matching lines...) Expand 10 before | Expand all | Expand 10 after
706 void ParseFormalParameterList(FormalParametersT* parameters, 706 void ParseFormalParameterList(FormalParametersT* parameters,
707 ExpressionClassifier* classifier, bool* ok); 707 ExpressionClassifier* classifier, bool* ok);
708 void CheckArityRestrictions( 708 void CheckArityRestrictions(
709 int param_count, FunctionLiteral::ArityRestriction arity_restriction, 709 int param_count, FunctionLiteral::ArityRestriction arity_restriction,
710 bool has_rest, int formals_start_pos, int formals_end_pos, bool* ok); 710 bool has_rest, int formals_start_pos, int formals_end_pos, bool* ok);
711 711
712 // Checks if the expression is a valid reference expression (e.g., on the 712 // Checks if the expression is a valid reference expression (e.g., on the
713 // left-hand side of assignments). Although ruled out by ECMA as early errors, 713 // left-hand side of assignments). Although ruled out by ECMA as early errors,
714 // we allow calls for web compatibility and rewrite them to a runtime throw. 714 // we allow calls for web compatibility and rewrite them to a runtime throw.
715 ExpressionT CheckAndRewriteReferenceExpression( 715 ExpressionT CheckAndRewriteReferenceExpression(
716 ExpressionT expression, Scanner::Location location, 716 ExpressionT expression, int beg_pos, int end_pos,
717 MessageTemplate::Template message, bool* ok); 717 MessageTemplate::Template message, bool* ok);
718 718
719 // Used to validate property names in object literals and class literals 719 // Used to validate property names in object literals and class literals
720 enum PropertyKind { 720 enum PropertyKind {
721 kAccessorProperty, 721 kAccessorProperty,
722 kValueProperty, 722 kValueProperty,
723 kMethodProperty 723 kMethodProperty
724 }; 724 };
725 725
726 class ObjectLiteralCheckerBase { 726 class ObjectLiteralCheckerBase {
(...skipping 2087 matching lines...) Expand 10 before | Expand all | Expand 10 after
2814 typename ParserBase<Traits>::ExpressionT 2814 typename ParserBase<Traits>::ExpressionT
2815 ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, 2815 ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN,
2816 ExpressionClassifier* classifier, 2816 ExpressionClassifier* classifier,
2817 bool* ok) { 2817 bool* ok) {
2818 // AssignmentExpression :: 2818 // AssignmentExpression ::
2819 // ConditionalExpression 2819 // ConditionalExpression
2820 // ArrowFunction 2820 // ArrowFunction
2821 // YieldExpression 2821 // YieldExpression
2822 // LeftHandSideExpression AssignmentOperator AssignmentExpression 2822 // LeftHandSideExpression AssignmentOperator AssignmentExpression
2823 2823
2824 Scanner::Location lhs_location = scanner()->peek_location(); 2824 int lhs_beg_pos = peek_position();
2825 2825
2826 if (peek() == Token::YIELD && is_generator()) { 2826 if (peek() == Token::YIELD && is_generator()) {
2827 return this->ParseYieldExpression(classifier, ok); 2827 return this->ParseYieldExpression(classifier, ok);
2828 } 2828 }
2829 2829
2830 if (fni_ != NULL) fni_->Enter(); 2830 if (fni_ != NULL) fni_->Enter();
2831 ParserBase<Traits>::Checkpoint checkpoint(this); 2831 ParserBase<Traits>::Checkpoint checkpoint(this);
2832 ExpressionClassifier arrow_formals_classifier(classifier->duplicate_finder()); 2832 ExpressionClassifier arrow_formals_classifier(classifier->duplicate_finder());
2833 bool parenthesized_formals = peek() == Token::LPAREN; 2833 bool parenthesized_formals = peek() == Token::LPAREN;
2834 if (!parenthesized_formals) { 2834 if (!parenthesized_formals) {
2835 ArrowFormalParametersUnexpectedToken(&arrow_formals_classifier); 2835 ArrowFormalParametersUnexpectedToken(&arrow_formals_classifier);
2836 } 2836 }
2837 ExpressionT expression = this->ParseConditionalExpression( 2837 ExpressionT expression = this->ParseConditionalExpression(
2838 accept_IN, &arrow_formals_classifier, CHECK_OK); 2838 accept_IN, &arrow_formals_classifier, CHECK_OK);
2839 2839
2840 if (allow_harmony_arrow_functions() && peek() == Token::ARROW) { 2840 if (allow_harmony_arrow_functions() && peek() == Token::ARROW) {
2841 BindingPatternUnexpectedToken(classifier); 2841 BindingPatternUnexpectedToken(classifier);
2842 ValidateArrowFormalParameters(&arrow_formals_classifier, expression, 2842 ValidateArrowFormalParameters(&arrow_formals_classifier, expression,
2843 parenthesized_formals, CHECK_OK); 2843 parenthesized_formals, CHECK_OK);
2844 Scanner::Location loc(lhs_location.beg_pos, scanner()->location().end_pos); 2844 Scanner::Location loc(lhs_beg_pos, scanner()->location().end_pos);
2845 Scope* scope = 2845 Scope* scope =
2846 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction); 2846 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction);
2847 FormalParametersT parameters(scope); 2847 FormalParametersT parameters(scope);
2848 checkpoint.Restore(&parameters.materialized_literals_count); 2848 checkpoint.Restore(&parameters.materialized_literals_count);
2849 2849
2850 scope->set_start_position(lhs_location.beg_pos); 2850 scope->set_start_position(lhs_beg_pos);
2851 Scanner::Location duplicate_loc = Scanner::Location::invalid(); 2851 Scanner::Location duplicate_loc = Scanner::Location::invalid();
2852 this->ParseArrowFunctionFormalParameterList(&parameters, expression, loc, 2852 this->ParseArrowFunctionFormalParameterList(&parameters, expression, loc,
2853 &duplicate_loc, CHECK_OK); 2853 &duplicate_loc, CHECK_OK);
2854 if (duplicate_loc.IsValid()) { 2854 if (duplicate_loc.IsValid()) {
2855 arrow_formals_classifier.RecordDuplicateFormalParameterError( 2855 arrow_formals_classifier.RecordDuplicateFormalParameterError(
2856 duplicate_loc); 2856 duplicate_loc);
2857 } 2857 }
2858 expression = this->ParseArrowFunctionLiteral( 2858 expression = this->ParseArrowFunctionLiteral(
2859 parameters, arrow_formals_classifier, CHECK_OK); 2859 parameters, arrow_formals_classifier, CHECK_OK);
2860 return expression; 2860 return expression;
2861 } 2861 }
2862 2862
2863 // "expression" was not itself an arrow function parameter list, but it might 2863 // "expression" was not itself an arrow function parameter list, but it might
2864 // form part of one. Propagate speculative formal parameter error locations. 2864 // form part of one. Propagate speculative formal parameter error locations.
2865 classifier->Accumulate(arrow_formals_classifier, 2865 classifier->Accumulate(arrow_formals_classifier,
2866 ExpressionClassifier::StandardProductions | 2866 ExpressionClassifier::StandardProductions |
2867 ExpressionClassifier::FormalParametersProductions); 2867 ExpressionClassifier::FormalParametersProductions);
2868 2868
2869 if (!Token::IsAssignmentOp(peek())) { 2869 if (!Token::IsAssignmentOp(peek())) {
2870 if (fni_ != NULL) fni_->Leave(); 2870 if (fni_ != NULL) fni_->Leave();
2871 // Parsed conditional expression only (no assignment). 2871 // Parsed conditional expression only (no assignment).
2872 return expression; 2872 return expression;
2873 } 2873 }
2874 2874
2875 if (!allow_harmony_destructuring()) { 2875 if (!allow_harmony_destructuring()) {
2876 BindingPatternUnexpectedToken(classifier); 2876 BindingPatternUnexpectedToken(classifier);
2877 } 2877 }
2878 2878
2879 expression = this->CheckAndRewriteReferenceExpression( 2879 expression = this->CheckAndRewriteReferenceExpression(
2880 expression, lhs_location, MessageTemplate::kInvalidLhsInAssignment, 2880 expression, lhs_beg_pos, scanner()->location().end_pos,
2881 CHECK_OK); 2881 MessageTemplate::kInvalidLhsInAssignment, CHECK_OK);
2882 expression = this->MarkExpressionAsAssigned(expression); 2882 expression = this->MarkExpressionAsAssigned(expression);
2883 2883
2884 Token::Value op = Next(); // Get assignment operator. 2884 Token::Value op = Next(); // Get assignment operator.
2885 if (op != Token::ASSIGN) { 2885 if (op != Token::ASSIGN) {
2886 classifier->RecordBindingPatternError(scanner()->location(), 2886 classifier->RecordBindingPatternError(scanner()->location(),
2887 MessageTemplate::kUnexpectedToken, 2887 MessageTemplate::kUnexpectedToken,
2888 Token::String(op)); 2888 Token::String(op));
2889 } 2889 }
2890 int pos = position(); 2890 int pos = position();
2891 2891
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
3087 *ok = false; 3087 *ok = false;
3088 return this->EmptyExpression(); 3088 return this->EmptyExpression();
3089 } 3089 }
3090 } 3090 }
3091 3091
3092 // Allow Traits do rewrite the expression. 3092 // Allow Traits do rewrite the expression.
3093 return this->BuildUnaryExpression(expression, op, pos, factory()); 3093 return this->BuildUnaryExpression(expression, op, pos, factory());
3094 } else if (Token::IsCountOp(op)) { 3094 } else if (Token::IsCountOp(op)) {
3095 BindingPatternUnexpectedToken(classifier); 3095 BindingPatternUnexpectedToken(classifier);
3096 op = Next(); 3096 op = Next();
3097 Scanner::Location lhs_location = scanner()->peek_location(); 3097 int beg_pos = peek_position();
3098 ExpressionT expression = this->ParseUnaryExpression(classifier, CHECK_OK); 3098 ExpressionT expression = this->ParseUnaryExpression(classifier, CHECK_OK);
3099 expression = this->CheckAndRewriteReferenceExpression( 3099 expression = this->CheckAndRewriteReferenceExpression(
3100 expression, lhs_location, MessageTemplate::kInvalidLhsInPrefixOp, 3100 expression, beg_pos, scanner()->location().end_pos,
3101 CHECK_OK); 3101 MessageTemplate::kInvalidLhsInPrefixOp, CHECK_OK);
3102 this->MarkExpressionAsAssigned(expression); 3102 this->MarkExpressionAsAssigned(expression);
3103 3103
3104 return factory()->NewCountOperation(op, 3104 return factory()->NewCountOperation(op,
3105 true /* prefix */, 3105 true /* prefix */,
3106 expression, 3106 expression,
3107 position()); 3107 position());
3108 3108
3109 } else { 3109 } else {
3110 return this->ParsePostfixExpression(classifier, ok); 3110 return this->ParsePostfixExpression(classifier, ok);
3111 } 3111 }
3112 } 3112 }
3113 3113
3114 3114
3115 template <class Traits> 3115 template <class Traits>
3116 typename ParserBase<Traits>::ExpressionT 3116 typename ParserBase<Traits>::ExpressionT
3117 ParserBase<Traits>::ParsePostfixExpression(ExpressionClassifier* classifier, 3117 ParserBase<Traits>::ParsePostfixExpression(ExpressionClassifier* classifier,
3118 bool* ok) { 3118 bool* ok) {
3119 // PostfixExpression :: 3119 // PostfixExpression ::
3120 // LeftHandSideExpression ('++' | '--')? 3120 // LeftHandSideExpression ('++' | '--')?
3121 3121
3122 Scanner::Location lhs_location = scanner()->peek_location(); 3122 int lhs_beg_pos = peek_position();
3123 ExpressionT expression = 3123 ExpressionT expression =
3124 this->ParseLeftHandSideExpression(classifier, CHECK_OK); 3124 this->ParseLeftHandSideExpression(classifier, CHECK_OK);
3125 if (!scanner()->HasAnyLineTerminatorBeforeNext() && 3125 if (!scanner()->HasAnyLineTerminatorBeforeNext() &&
3126 Token::IsCountOp(peek())) { 3126 Token::IsCountOp(peek())) {
3127 BindingPatternUnexpectedToken(classifier); 3127 BindingPatternUnexpectedToken(classifier);
3128 3128
3129 expression = this->CheckAndRewriteReferenceExpression( 3129 expression = this->CheckAndRewriteReferenceExpression(
3130 expression, lhs_location, MessageTemplate::kInvalidLhsInPostfixOp, 3130 expression, lhs_beg_pos, scanner()->location().end_pos,
3131 CHECK_OK); 3131 MessageTemplate::kInvalidLhsInPostfixOp, CHECK_OK);
3132 expression = this->MarkExpressionAsAssigned(expression); 3132 expression = this->MarkExpressionAsAssigned(expression);
3133 3133
3134 Token::Value next = Next(); 3134 Token::Value next = Next();
3135 expression = 3135 expression =
3136 factory()->NewCountOperation(next, 3136 factory()->NewCountOperation(next,
3137 false /* postfix */, 3137 false /* postfix */,
3138 expression, 3138 expression,
3139 position()); 3139 position());
3140 } 3140 }
3141 return expression; 3141 return expression;
(...skipping 787 matching lines...) Expand 10 before | Expand all | Expand 10 after
3929 DCHECK_EQ(next, Token::TEMPLATE_TAIL); 3929 DCHECK_EQ(next, Token::TEMPLATE_TAIL);
3930 CheckTemplateOctalLiteral(pos, peek_position(), CHECK_OK); 3930 CheckTemplateOctalLiteral(pos, peek_position(), CHECK_OK);
3931 // Once we've reached a TEMPLATE_TAIL, we can close the TemplateLiteral. 3931 // Once we've reached a TEMPLATE_TAIL, we can close the TemplateLiteral.
3932 return Traits::CloseTemplateLiteral(&ts, start, tag); 3932 return Traits::CloseTemplateLiteral(&ts, start, tag);
3933 } 3933 }
3934 3934
3935 3935
3936 template <typename Traits> 3936 template <typename Traits>
3937 typename ParserBase<Traits>::ExpressionT 3937 typename ParserBase<Traits>::ExpressionT
3938 ParserBase<Traits>::CheckAndRewriteReferenceExpression( 3938 ParserBase<Traits>::CheckAndRewriteReferenceExpression(
3939 ExpressionT expression, Scanner::Location location, 3939 ExpressionT expression, int beg_pos, int end_pos,
3940 MessageTemplate::Template message, bool* ok) { 3940 MessageTemplate::Template message, bool* ok) {
3941 Scanner::Location location(beg_pos, end_pos);
3941 if (this->IsIdentifier(expression)) { 3942 if (this->IsIdentifier(expression)) {
3942 if (is_strict(language_mode()) && 3943 if (is_strict(language_mode()) &&
3943 this->IsEvalOrArguments(this->AsIdentifier(expression))) { 3944 this->IsEvalOrArguments(this->AsIdentifier(expression))) {
3944 this->ReportMessageAt(location, MessageTemplate::kStrictEvalArguments, 3945 this->ReportMessageAt(location, MessageTemplate::kStrictEvalArguments,
3945 kSyntaxError); 3946 kSyntaxError);
3946 *ok = false; 3947 *ok = false;
3947 return this->EmptyExpression(); 3948 return this->EmptyExpression();
3948 } 3949 }
3949 if (is_strong(language_mode()) && 3950 if (is_strong(language_mode()) &&
3950 this->IsUndefined(this->AsIdentifier(expression))) { 3951 this->IsUndefined(this->AsIdentifier(expression))) {
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
4023 *ok = false; 4024 *ok = false;
4024 return; 4025 return;
4025 } 4026 }
4026 has_seen_constructor_ = true; 4027 has_seen_constructor_ = true;
4027 return; 4028 return;
4028 } 4029 }
4029 } 4030 }
4030 } } // v8::internal 4031 } } // v8::internal
4031 4032
4032 #endif // V8_PREPARSER_H 4033 #endif // V8_PREPARSER_H
OLDNEW
« no previous file with comments | « src/parser.cc ('k') | src/preparser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698