Index: src/preparser.h |
diff --git a/src/preparser.h b/src/preparser.h |
index 2db88e7bc2687cd7bfdc3399665934c6a77ae100..9bebb4e1178c2cea91e6989330f2d959053e8bd9 100644 |
--- a/src/preparser.h |
+++ b/src/preparser.h |
@@ -336,11 +336,9 @@ class ParserBase : public Traits { |
bool peek_any_identifier() { |
Token::Value next = peek(); |
- return next == Token::IDENTIFIER || |
- next == Token::FUTURE_RESERVED_WORD || |
- next == Token::FUTURE_STRICT_RESERVED_WORD || |
- next == Token::LET || |
- next == Token::YIELD; |
+ return next == Token::IDENTIFIER || next == Token::FUTURE_RESERVED_WORD || |
+ next == Token::FUTURE_STRICT_RESERVED_WORD || next == Token::LET || |
+ next == Token::STATIC || next == Token::YIELD; |
} |
bool CheckContextualKeyword(Vector<const char> keyword) { |
@@ -606,6 +604,9 @@ class PreParserIdentifier { |
static PreParserIdentifier Let() { |
return PreParserIdentifier(kLetIdentifier); |
} |
+ static PreParserIdentifier Static() { |
+ return PreParserIdentifier(kStaticIdentifier); |
+ } |
static PreParserIdentifier Yield() { |
return PreParserIdentifier(kYieldIdentifier); |
} |
@@ -619,6 +620,8 @@ class PreParserIdentifier { |
bool IsArguments(const AstValueFactory* = NULL) const { |
return type_ == kArgumentsIdentifier; |
} |
+ bool IsLet() const { return type_ == kLetIdentifier; } |
+ bool IsStatic() const { return type_ == kStaticIdentifier; } |
bool IsYield() const { return type_ == kYieldIdentifier; } |
bool IsPrototype() const { return type_ == kPrototypeIdentifier; } |
bool IsConstructor() const { return type_ == kConstructorIdentifier; } |
@@ -627,14 +630,15 @@ class PreParserIdentifier { |
} |
bool IsFutureReserved() const { return type_ == kFutureReservedIdentifier; } |
bool IsFutureStrictReserved() const { |
- return type_ == kFutureStrictReservedIdentifier; |
+ return type_ == kFutureStrictReservedIdentifier || |
+ type_ == kLetIdentifier || type_ == kStaticIdentifier || |
arv (Not doing code reviews)
2014/10/31 12:11:54
This is where the bug was. I had kEvalIdentifier i
|
+ type_ == kYieldIdentifier; |
} |
bool IsValidStrictVariable() const { return type_ == kUnknownIdentifier; } |
V8_INLINE bool IsValidArrowParam() const { |
// A valid identifier can be an arrow function parameter |
// except for eval, arguments, yield, and reserved keywords. |
- return !(IsEval() || IsArguments() || IsYield() || |
- IsFutureStrictReserved()); |
+ return !(IsEval() || IsArguments() || IsFutureStrictReserved()); |
} |
// Allow identifier->name()[->length()] to work. The preparser |
@@ -651,6 +655,7 @@ class PreParserIdentifier { |
kFutureReservedIdentifier, |
kFutureStrictReservedIdentifier, |
kLetIdentifier, |
+ kStaticIdentifier, |
kYieldIdentifier, |
kEvalIdentifier, |
kArgumentsIdentifier, |
@@ -1172,7 +1177,7 @@ class PreParserTraits { |
} |
static bool IsFutureStrictReserved(PreParserIdentifier identifier) { |
- return identifier.IsYield() || identifier.IsFutureStrictReserved(); |
+ return identifier.IsFutureStrictReserved(); |
} |
static bool IsBoilerplateProperty(PreParserExpression property) { |
@@ -1593,6 +1598,7 @@ void ParserBase<Traits>::ReportUnexpectedToken(Token::Value token) { |
case Token::FUTURE_RESERVED_WORD: |
return ReportMessageAt(source_location, "unexpected_reserved"); |
case Token::LET: |
+ case Token::STATIC: |
case Token::YIELD: |
case Token::FUTURE_STRICT_RESERVED_WORD: |
return ReportMessageAt(source_location, strict_mode() == SLOPPY |
@@ -1622,8 +1628,8 @@ typename ParserBase<Traits>::IdentifierT ParserBase<Traits>::ParseIdentifier( |
return name; |
} else if (strict_mode() == SLOPPY && |
(next == Token::FUTURE_STRICT_RESERVED_WORD || |
- (next == Token::LET) || |
- (next == Token::YIELD && !is_generator()))) { |
+ next == Token::LET || next == Token::STATIC || |
+ (next == Token::YIELD && !is_generator()))) { |
return this->GetSymbol(scanner()); |
} else { |
this->ReportUnexpectedToken(next); |
@@ -1640,8 +1646,8 @@ typename ParserBase<Traits>::IdentifierT ParserBase< |
Token::Value next = Next(); |
if (next == Token::IDENTIFIER) { |
*is_strict_reserved = false; |
- } else if (next == Token::FUTURE_STRICT_RESERVED_WORD || |
- next == Token::LET || |
+ } else if (next == Token::FUTURE_STRICT_RESERVED_WORD || next == Token::LET || |
+ next == Token::STATIC || |
(next == Token::YIELD && !this->is_generator())) { |
*is_strict_reserved = true; |
} else { |
@@ -1662,7 +1668,7 @@ typename ParserBase<Traits>::IdentifierT |
ParserBase<Traits>::ParseIdentifierName(bool* ok) { |
Token::Value next = Next(); |
if (next != Token::IDENTIFIER && next != Token::FUTURE_RESERVED_WORD && |
- next != Token::LET && next != Token::YIELD && |
+ next != Token::LET && next != Token::STATIC && next != Token::YIELD && |
next != Token::FUTURE_STRICT_RESERVED_WORD && !Token::IsKeyword(next)) { |
this->ReportUnexpectedToken(next); |
*ok = false; |
@@ -1765,6 +1771,7 @@ ParserBase<Traits>::ParsePrimaryExpression(bool* ok) { |
case Token::IDENTIFIER: |
case Token::LET: |
+ case Token::STATIC: |
case Token::YIELD: |
case Token::FUTURE_STRICT_RESERVED_WORD: { |
// Using eval or arguments in this context is OK even in strict mode. |