Chromium Code Reviews| Index: src/parser.cc |
| diff --git a/src/parser.cc b/src/parser.cc |
| index b4ab623829b9657382ab58bcbe347ce4b31d3dff..8ec5b6a4a095c6c506ce2bc5bd43b24d9bf28376 100644 |
| --- a/src/parser.cc |
| +++ b/src/parser.cc |
| @@ -2510,16 +2510,24 @@ Statement* Parser::ParseReturnStatement(bool* ok) { |
| Token::Value tok = peek(); |
| Statement* result; |
| + Expression* return_value; |
| if (scanner().HasAnyLineTerminatorBeforeNext() || |
| tok == Token::SEMICOLON || |
| tok == Token::RBRACE || |
| tok == Token::EOS) { |
| - ExpectSemicolon(CHECK_OK); |
| - result = factory()->NewReturnStatement(GetLiteralUndefined()); |
| + return_value = GetLiteralUndefined(); |
| } else { |
| - Expression* expr = ParseExpression(true, CHECK_OK); |
| - ExpectSemicolon(CHECK_OK); |
| - result = factory()->NewReturnStatement(expr); |
| + return_value = ParseExpression(true, CHECK_OK); |
| + } |
| + ExpectSemicolon(CHECK_OK); |
| + if (is_generator()) { |
| + Expression* iterator = factory()->NewVariableProxy( |
|
Michael Starzinger
2013/04/17 13:43:48
Hehe, you really like calling generator objects "i
|
| + current_function_state_->generator_object_variable()); |
| + Expression* yield = factory()->NewYield( |
| + iterator, return_value, Yield::FINAL, RelocInfo::kNoPosition); |
| + result = factory()->NewExpressionStatement(yield); |
|
Michael Starzinger
2013/04/17 13:43:48
Could we add parsing tests to generators-parsing.j
|
| + } else { |
| + result = factory()->NewReturnStatement(return_value); |
| } |
| // An ECMAScript program is considered syntactically incorrect if it |
| @@ -3099,12 +3107,12 @@ Expression* Parser::ParseYieldExpression(bool* ok) { |
| // 'yield' '*'? AssignmentExpression |
| int position = scanner().peek_location().beg_pos; |
| Expect(Token::YIELD, CHECK_OK); |
| - bool is_yield_star = Check(Token::MUL); |
| + Yield::Kind kind = |
| + Check(Token::MUL) ? Yield::DELEGATING : Yield::SUSPEND; |
| Expression* generator_object = factory()->NewVariableProxy( |
| current_function_state_->generator_object_variable()); |
| Expression* expression = ParseAssignmentExpression(false, CHECK_OK); |
| - return factory()->NewYield(generator_object, expression, is_yield_star, |
| - position); |
| + return factory()->NewYield(generator_object, expression, kind, position); |
| } |
| @@ -4580,7 +4588,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> function_name, |
| VariableProxy* get_proxy = factory()->NewVariableProxy( |
| current_function_state_->generator_object_variable()); |
| Yield* yield = factory()->NewYield( |
| - get_proxy, assignment, false, RelocInfo::kNoPosition); |
| + get_proxy, assignment, Yield::INITIAL, RelocInfo::kNoPosition); |
| body->Add(factory()->NewExpressionStatement(yield), zone()); |
| } |