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

Side by Side Diff: src/preparser.h

Issue 1292393002: [parser] make kInvalidLhsInFor a SyntaxError (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: 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 696 matching lines...) Expand 10 before | Expand all | Expand 10 after
707 void CheckArityRestrictions( 707 void CheckArityRestrictions(
708 int param_count, FunctionLiteral::ArityRestriction arity_restriction, 708 int param_count, FunctionLiteral::ArityRestriction arity_restriction,
709 bool has_rest, int formals_start_pos, int formals_end_pos, bool* ok); 709 bool has_rest, int formals_start_pos, int formals_end_pos, bool* ok);
710 710
711 // Checks if the expression is a valid reference expression (e.g., on the 711 // Checks if the expression is a valid reference expression (e.g., on the
712 // left-hand side of assignments). Although ruled out by ECMA as early errors, 712 // left-hand side of assignments). Although ruled out by ECMA as early errors,
713 // we allow calls for web compatibility and rewrite them to a runtime throw. 713 // we allow calls for web compatibility and rewrite them to a runtime throw.
714 ExpressionT CheckAndRewriteReferenceExpression( 714 ExpressionT CheckAndRewriteReferenceExpression(
715 ExpressionT expression, int beg_pos, int end_pos, 715 ExpressionT expression, int beg_pos, int end_pos,
716 MessageTemplate::Template message, bool* ok); 716 MessageTemplate::Template message, bool* ok);
717 ExpressionT CheckAndRewriteReferenceExpression(
718 ExpressionT expression, int beg_pos, int end_pos,
719 MessageTemplate::Template message, ParseErrorType type, bool* ok);
717 720
718 // Used to validate property names in object literals and class literals 721 // Used to validate property names in object literals and class literals
719 enum PropertyKind { 722 enum PropertyKind {
720 kAccessorProperty, 723 kAccessorProperty,
721 kValueProperty, 724 kValueProperty,
722 kMethodProperty 725 kMethodProperty
723 }; 726 };
724 727
725 class ObjectLiteralCheckerBase { 728 class ObjectLiteralCheckerBase {
726 public: 729 public:
(...skipping 739 matching lines...) Expand 10 before | Expand all | Expand 10 after
1466 } 1469 }
1467 1470
1468 PreParserExpression NewThrowReferenceError(MessageTemplate::Template message, 1471 PreParserExpression NewThrowReferenceError(MessageTemplate::Template message,
1469 int pos) { 1472 int pos) {
1470 return PreParserExpression::Default(); 1473 return PreParserExpression::Default();
1471 } 1474 }
1472 PreParserExpression NewThrowSyntaxError(MessageTemplate::Template message, 1475 PreParserExpression NewThrowSyntaxError(MessageTemplate::Template message,
1473 Handle<Object> arg, int pos) { 1476 Handle<Object> arg, int pos) {
1474 return PreParserExpression::Default(); 1477 return PreParserExpression::Default();
1475 } 1478 }
1479 PreParserExpression NewThrowSyntaxError(MessageTemplate::Template message,
1480 int pos) {
1481 return PreParserExpression::Default();
1482 }
1476 PreParserExpression NewThrowTypeError(MessageTemplate::Template message, 1483 PreParserExpression NewThrowTypeError(MessageTemplate::Template message,
1477 Handle<Object> arg, int pos) { 1484 Handle<Object> arg, int pos) {
1478 return PreParserExpression::Default(); 1485 return PreParserExpression::Default();
1479 } 1486 }
1480 1487
1481 // Reporting errors. 1488 // Reporting errors.
1482 void ReportMessageAt(Scanner::Location location, 1489 void ReportMessageAt(Scanner::Location location,
1483 MessageTemplate::Template message, 1490 MessageTemplate::Template message,
1484 const char* arg = NULL, 1491 const char* arg = NULL,
1485 ParseErrorType error_type = kSyntaxError); 1492 ParseErrorType error_type = kSyntaxError);
(...skipping 2444 matching lines...) Expand 10 before | Expand all | Expand 10 after
3930 // Once we've reached a TEMPLATE_TAIL, we can close the TemplateLiteral. 3937 // Once we've reached a TEMPLATE_TAIL, we can close the TemplateLiteral.
3931 return Traits::CloseTemplateLiteral(&ts, start, tag); 3938 return Traits::CloseTemplateLiteral(&ts, start, tag);
3932 } 3939 }
3933 3940
3934 3941
3935 template <typename Traits> 3942 template <typename Traits>
3936 typename ParserBase<Traits>::ExpressionT 3943 typename ParserBase<Traits>::ExpressionT
3937 ParserBase<Traits>::CheckAndRewriteReferenceExpression( 3944 ParserBase<Traits>::CheckAndRewriteReferenceExpression(
3938 ExpressionT expression, int beg_pos, int end_pos, 3945 ExpressionT expression, int beg_pos, int end_pos,
3939 MessageTemplate::Template message, bool* ok) { 3946 MessageTemplate::Template message, bool* ok) {
3947 return this->CheckAndRewriteReferenceExpression(expression, beg_pos, end_pos,
3948 message, kReferenceError, ok);
3949 }
3950
3951
3952 template <typename Traits>
3953 typename ParserBase<Traits>::ExpressionT
3954 ParserBase<Traits>::CheckAndRewriteReferenceExpression(
3955 ExpressionT expression, int beg_pos, int end_pos,
3956 MessageTemplate::Template message, ParseErrorType type, bool* ok) {
3940 Scanner::Location location(beg_pos, end_pos); 3957 Scanner::Location location(beg_pos, end_pos);
3941 if (this->IsIdentifier(expression)) { 3958 if (this->IsIdentifier(expression)) {
3942 if (is_strict(language_mode()) && 3959 if (is_strict(language_mode()) &&
3943 this->IsEvalOrArguments(this->AsIdentifier(expression))) { 3960 this->IsEvalOrArguments(this->AsIdentifier(expression))) {
3944 this->ReportMessageAt(location, MessageTemplate::kStrictEvalArguments, 3961 this->ReportMessageAt(location, MessageTemplate::kStrictEvalArguments,
3945 kSyntaxError); 3962 kSyntaxError);
3946 *ok = false; 3963 *ok = false;
3947 return this->EmptyExpression(); 3964 return this->EmptyExpression();
3948 } 3965 }
3949 if (is_strong(language_mode()) && 3966 if (is_strong(language_mode()) &&
3950 this->IsUndefined(this->AsIdentifier(expression))) { 3967 this->IsUndefined(this->AsIdentifier(expression))) {
3951 this->ReportMessageAt(location, MessageTemplate::kStrongUndefined, 3968 this->ReportMessageAt(location, MessageTemplate::kStrongUndefined,
3952 kSyntaxError); 3969 kSyntaxError);
3953 *ok = false; 3970 *ok = false;
3954 return this->EmptyExpression(); 3971 return this->EmptyExpression();
3955 } 3972 }
3956 } 3973 }
3957 if (expression->IsValidReferenceExpression()) { 3974 if (expression->IsValidReferenceExpression()) {
3958 return expression; 3975 return expression;
3959 } else if (expression->IsCall()) { 3976 } else if (expression->IsCall()) {
3960 // If it is a call, make it a runtime error for legacy web compatibility. 3977 // If it is a call, make it a runtime error for legacy web compatibility.
3961 // Rewrite `expr' to `expr[throw ReferenceError]'. 3978 // Rewrite `expr' to `expr[throw ReferenceError]'.
3962 int pos = location.beg_pos; 3979 int pos = location.beg_pos;
3963 ExpressionT error = this->NewThrowReferenceError(message, pos); 3980 ExpressionT error = type == kReferenceError
3981 ? this->NewThrowReferenceError(message, pos)
3982 : this->NewThrowSyntaxError(message, pos);
caitp (gmail) 2015/08/14 17:06:17 I'm not sure if this distinction is necessary or g
adamk 2015/08/15 01:06:15 Seems fine to me, and also makes sense tonot throw
3964 return factory()->NewProperty(expression, error, pos); 3983 return factory()->NewProperty(expression, error, pos);
3965 } else { 3984 } else {
3966 this->ReportMessageAt(location, message, kReferenceError); 3985 this->ReportMessageAt(location, message, type);
3967 *ok = false; 3986 *ok = false;
3968 return this->EmptyExpression(); 3987 return this->EmptyExpression();
3969 } 3988 }
3970 } 3989 }
3971 3990
3972 3991
3973 #undef CHECK_OK 3992 #undef CHECK_OK
3974 #undef CHECK_OK_CUSTOM 3993 #undef CHECK_OK_CUSTOM
3975 3994
3976 3995
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
4023 *ok = false; 4042 *ok = false;
4024 return; 4043 return;
4025 } 4044 }
4026 has_seen_constructor_ = true; 4045 has_seen_constructor_ = true;
4027 return; 4046 return;
4028 } 4047 }
4029 } 4048 }
4030 } } // v8::internal 4049 } } // v8::internal
4031 4050
4032 #endif // V8_PREPARSER_H 4051 #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