Index: src/preparser.h |
diff --git a/src/preparser.h b/src/preparser.h |
index 499240e63acc6b43bdcefd74edc183113600f432..c64c8de95b69efa2bb46f53ae933e9a3b8a4f249 100644 |
--- a/src/preparser.h |
+++ b/src/preparser.h |
@@ -1792,15 +1792,29 @@ template <class Traits> |
typename ParserBase<Traits>::ExpressionT |
ParserBase<Traits>::ParseYieldExpression(bool* ok) { |
// YieldExpression :: |
- // 'yield' '*'? AssignmentExpression |
+ // 'yield' ([no line terminator] '*'? AssignmentExpression)? |
int pos = peek_position(); |
Expect(Token::YIELD, CHECK_OK); |
- Yield::Kind kind = |
- Check(Token::MUL) ? Yield::DELEGATING : Yield::SUSPEND; |
ExpressionT generator_object = |
factory()->NewVariableProxy(function_state_->generator_object_variable()); |
- ExpressionT expression = |
- ParseAssignmentExpression(false, CHECK_OK); |
+ ExpressionT expression = Traits::EmptyExpression(); |
+ Yield::Kind kind = Yield::SUSPEND; |
+ if (!scanner()->HasAnyLineTerminatorBeforeNext()) { |
+ if (Check(Token::MUL)) kind = Yield::DELEGATING; |
+ switch (peek()) { |
+ case Token::EOS: |
+ case Token::SEMICOLON: |
+ case Token::RBRACE: |
+ case Token::RBRACK: |
+ case Token::RPAREN: |
+ case Token::COLON: |
+ case Token::COMMA: |
+ break; |
+ default: |
+ expression = ParseAssignmentExpression(false, CHECK_OK); |
+ break; |
+ } |
+ } |
typename Traits::Type::YieldExpression yield = |
factory()->NewYield(generator_object, expression, kind, pos); |
if (kind == Yield::DELEGATING) { |