| 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) {
|
|
|