Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index 29b1fe74c6058a344f12d75e5d9407f0b86d1ae6..0c1ed2bde96d28c4e2ac8c28d7fe000ef5dde3cb 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -3594,6 +3594,7 @@ Expression* Parser::ParsePrimaryExpression(bool* ok) { |
break; |
case Token::IDENTIFIER: |
+ case Token::YIELD: |
case Token::FUTURE_STRICT_RESERVED_WORD: { |
Handle<String> name = ParseIdentifier(CHECK_OK); |
if (fni_ != NULL) fni_->PushVariableName(name); |
@@ -4662,7 +4663,8 @@ bool Parser::peek_any_identifier() { |
Token::Value next = peek(); |
return next == Token::IDENTIFIER || |
next == Token::FUTURE_RESERVED_WORD || |
- next == Token::FUTURE_STRICT_RESERVED_WORD; |
+ next == Token::FUTURE_STRICT_RESERVED_WORD || |
+ next == Token::YIELD; |
} |
@@ -4737,7 +4739,10 @@ Handle<String> Parser::ParseIdentifier(bool* ok) { |
if (!top_scope_->is_classic_mode()) { |
Expect(Token::IDENTIFIER, ok); |
} else if (!Check(Token::IDENTIFIER)) { |
- Expect(Token::FUTURE_STRICT_RESERVED_WORD, ok); |
+ if (Check(Token::YIELD)) |
+ *ok = !inside_generator(); |
+ else |
+ Expect(Token::FUTURE_STRICT_RESERVED_WORD, ok); |
} |
if (!*ok) return Handle<String>(); |
return GetSymbol(ok); |
@@ -4750,8 +4755,15 @@ Handle<String> Parser::ParseIdentifierOrStrictReservedWord( |
bool* is_strict_reserved, bool* ok) { |
*is_strict_reserved = false; |
if (!Check(Token::IDENTIFIER)) { |
- Expect(Token::FUTURE_STRICT_RESERVED_WORD, ok); |
- *is_strict_reserved = true; |
+ if (Check(Token::YIELD)) { |
+ if (inside_generator()) |
+ *ok = false; |
+ else |
+ *is_strict_reserved = true; |
+ } else { |
+ Expect(Token::FUTURE_STRICT_RESERVED_WORD, ok); |
+ *is_strict_reserved = true; |
+ } |
} |
if (!*ok) return Handle<String>(); |
return GetSymbol(ok); |