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

Unified Diff: src/preparser.h

Issue 1429983002: [es6] early error when Identifier is an escaped reserved word (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 1 month 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 side-by-side diff with in-line comments
Download patch
Index: src/preparser.h
diff --git a/src/preparser.h b/src/preparser.h
index 8bbd9e688ccb6adcf2b8e80a890e17fb5c4e71e8..6e70b225f053b2d04d530e1922ae4fc48db4fac0 100644
--- a/src/preparser.h
+++ b/src/preparser.h
@@ -654,6 +654,19 @@ class ParserBase : public Traits {
scanner()->peek_location(), message, arg);
}
+ bool IsNextEscapedReservedWord() {
+ return scanner()->IsNextEscapedReservedWord(
+ language_mode(), this->is_generator(), allow_harmony_sloppy_let());
caitp (gmail) 2015/11/03 17:19:12 It would be really helpful if there was an easier
+ }
+
+ void CheckNextEscapedKeyword(bool* ok) {
+ if (IsNextEscapedReservedWord()) {
caitp (gmail) 2015/11/03 17:19:13 Just used to shrink a bit of code in parser.cc / p
+ ReportMessageAt(scanner()->peek_location(),
+ MessageTemplate::kInvalidEscapedReservedWord);
+ *ok = false;
+ }
+ }
+
// Recursive descent functions:
// Parses an identifier that is valid for the current scope, in particular it
@@ -685,6 +698,7 @@ class ParserBase : public Traits {
ExpressionT ParseArrayLiteral(ExpressionClassifier* classifier, bool* ok);
ExpressionT ParsePropertyName(IdentifierT* name, bool* is_get, bool* is_set,
bool* is_static, bool* is_computed_name,
+ bool* is_identifier, bool* is_escaped_keyword,
caitp (gmail) 2015/11/03 17:19:12 I originally wrote a second method for testing thi
ExpressionClassifier* classifier, bool* ok);
ExpressionT ParseObjectLiteral(ExpressionClassifier* classifier, bool* ok);
ObjectLiteralPropertyT ParsePropertyDefinition(
@@ -2268,6 +2282,14 @@ ParserBase<Traits>::ParsePrimaryExpression(ExpressionClassifier* classifier,
break;
case Token::IDENTIFIER:
+ if (IsNextEscapedReservedWord()) {
caitp (gmail) 2015/11/03 17:19:12 IdentifierReference --- Escaped reserved words are
+ classifier->RecordExpressionError(
+ scanner()->peek_location(),
+ MessageTemplate::kInvalidEscapedReservedWord);
+ classifier->RecordBindingPatternError(
+ scanner()->peek_location(),
+ MessageTemplate::kInvalidEscapedReservedWord);
+ }
case Token::LET:
case Token::STATIC:
case Token::YIELD:
@@ -2547,7 +2569,8 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseArrayLiteral(
template <class Traits>
typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParsePropertyName(
IdentifierT* name, bool* is_get, bool* is_set, bool* is_static,
- bool* is_computed_name, ExpressionClassifier* classifier, bool* ok) {
+ bool* is_computed_name, bool* is_id, bool* is_escaped_keyword,
adamk 2015/11/03 23:00:57 Please keep the "is_identifier" name here as in th
caitp (gmail) 2015/11/04 04:49:24 Done.
+ ExpressionClassifier* classifier, bool* ok) {
Token::Value token = peek();
int pos = peek_position();
@@ -2593,6 +2616,8 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParsePropertyName(
// Fall through.
default:
+ *is_id = true;
+ *is_escaped_keyword = IsNextEscapedReservedWord();
*name = ParseIdentifierNameOrGetOrSet(is_get, is_set, CHECK_OK);
break;
}
@@ -2621,8 +2646,11 @@ ParserBase<Traits>::ParsePropertyDefinition(
Token::Value name_token = peek();
int next_beg_pos = scanner()->peek_location().beg_pos;
int next_end_pos = scanner()->peek_location().end_pos;
+ bool is_ident = false;
adamk 2015/11/03 23:00:57 Please use "is_identifier" here too for consistenc
caitp (gmail) 2015/11/04 04:49:24 Done.
+ bool is_escaped_keyword = false;
ExpressionT name_expression = ParsePropertyName(
- &name, &is_get, &is_set, &name_is_static, is_computed_name, classifier,
+ &name, &is_get, &is_set, &name_is_static, is_computed_name, &is_ident,
+ &is_escaped_keyword, classifier,
CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
if (fni_ != nullptr && !*is_computed_name) {
@@ -2646,16 +2674,28 @@ ParserBase<Traits>::ParsePropertyDefinition(
*is_computed_name);
}
- if (Token::IsIdentifier(name_token, language_mode(),
- this->is_generator()) &&
- (peek() == Token::COMMA || peek() == Token::RBRACE ||
- peek() == Token::ASSIGN)) {
+ if (is_ident && (peek() == Token::COMMA || peek() == Token::RBRACE ||
+ peek() == Token::ASSIGN)) {
// PropertyDefinition
// IdentifierReference
// CoverInitializedName
//
// CoverInitializedName
// IdentifierReference Initializer?
+ if (!Token::IsIdentifier(name_token, language_mode(),
+ this->is_generator())) {
+ ReportUnexpectedTokenAt(scanner()->location(), name_token);
+ *ok = false;
+ return this->EmptyObjectLiteralProperty();
+ }
+ if (is_escaped_keyword) {
+ classifier->RecordExpressionError(
+ scanner()->location(),
+ MessageTemplate::kInvalidEscapedReservedWord);
+ classifier->RecordBindingPatternError(
+ scanner()->location(),
+ MessageTemplate::kInvalidEscapedReservedWord);
+ }
if (classifier->duplicate_finder() != nullptr &&
scanner()->FindSymbol(classifier->duplicate_finder(), 1) != 0) {
classifier->RecordDuplicateFormalParameterError(scanner()->location());
@@ -2738,7 +2778,7 @@ ParserBase<Traits>::ParsePropertyDefinition(
name_expression = ParsePropertyName(
&name, &dont_care, &dont_care, &dont_care, is_computed_name, classifier,
- CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
+ &dont_care, &dont_care, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
caitp (gmail) 2015/11/03 17:19:13 MethodDefinitions and accessors use the PropertyNa
if (!*is_computed_name) {
checker->CheckProperty(name_token, kAccessorProperty, is_static,

Powered by Google App Engine
This is Rietveld 408576698