| Index: src/parsing/parser.cc
|
| diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc
|
| index a27c6dc9797ef1f289babc0ab03b982580c4f219..b14cdaf15e16e325ea4b3f83d7f12ee09a480353 100644
|
| --- a/src/parsing/parser.cc
|
| +++ b/src/parsing/parser.cc
|
| @@ -6018,9 +6018,10 @@ void ParserTraits::SetFunctionNameFromIdentifierRef(Expression* value,
|
| // IteratorClose(iterator) expands to the following:
|
| //
|
| // let iteratorReturn = iterator.return;
|
| -// if (IS_NULL_OR_UNDEFINED(iteratorReturn)) return;
|
| -// let output = %_Call(iteratorReturn, iterator);
|
| -// if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output);
|
| +// if (!IS_NULL_OR_UNDEFINED(iteratorReturn)) {
|
| +// let output = %_Call(iteratorReturn, iterator);
|
| +// if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output);
|
| +// }
|
| //
|
| // IteratorClose(iterator, input, output) expands to the following:
|
| //
|
| @@ -6029,7 +6030,6 @@ void ParserTraits::SetFunctionNameFromIdentifierRef(Expression* value,
|
| // output = %_Call(iteratorReturn, iterator, input);
|
| // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output);
|
|
|
| -
|
| Expression* ParserTraits::RewriteYieldStar(
|
| Expression* generator, Expression* iterable, int pos) {
|
|
|
| @@ -6192,9 +6192,9 @@ Expression* ParserTraits::RewriteYieldStar(
|
| Statement* throw_call = factory->NewExpressionStatement(call, nopos);
|
|
|
| Block* then = factory->NewBlock(nullptr, 4+1, false, nopos);
|
| - Variable* var_tmp = scope->NewTemporary(avfactory->empty_string());
|
| - BuildIteratorClose(then->statements(), var_iterator, Nothing<Variable*>(),
|
| - var_tmp);
|
| + parser_->BuildIteratorCloseForCompletion(
|
| + then->statements(), var_iterator,
|
| + factory->NewSmiLiteral(Parser::kNormalCompletion, nopos));
|
| then->statements()->Add(throw_call, zone);
|
| check_throw = factory->NewIfStatement(
|
| condition, then, factory->NewEmptyStatement(nopos), nopos);
|
| @@ -6391,7 +6391,7 @@ Expression* ParserTraits::RewriteYieldStar(
|
| case_next->Add(factory->NewBreakStatement(switch_mode, nopos), zone);
|
|
|
| auto case_return = new (zone) ZoneList<Statement*>(5, zone);
|
| - BuildIteratorClose(case_return, var_iterator, Just(var_input), var_output);
|
| + BuildIteratorClose(case_return, var_iterator, var_input, var_output);
|
| case_return->Add(factory->NewBreakStatement(switch_mode, nopos), zone);
|
|
|
| auto case_throw = new (zone) ZoneList<Statement*>(5, zone);
|
| @@ -6478,8 +6478,7 @@ Statement* ParserTraits::CheckCallable(Variable* var, Expression* error,
|
| }
|
|
|
| void ParserTraits::BuildIteratorClose(ZoneList<Statement*>* statements,
|
| - Variable* iterator,
|
| - Maybe<Variable*> input,
|
| + Variable* iterator, Variable* input,
|
| Variable* var_output) {
|
| //
|
| // This function adds four statements to [statements], corresponding to the
|
| @@ -6492,14 +6491,6 @@ void ParserTraits::BuildIteratorClose(ZoneList<Statement*>* statements,
|
| // output = %_Call(iteratorReturn, iterator, input);
|
| // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output);
|
| //
|
| - // When the input variable is not given, the return statement becomes
|
| - // return {value: undefined, done: true};
|
| - // and %_Call has only two arguments:
|
| - // output = %_Call(iteratorReturn, iterator);
|
| - //
|
| - // The reason for allowing input is that BuildIteratorClose
|
| - // can then be reused to handle the return case in yield*.
|
| - //
|
|
|
| const int nopos = RelocInfo::kNoPosition;
|
| auto factory = parser_->factory();
|
| @@ -6530,10 +6521,7 @@ void ParserTraits::BuildIteratorClose(ZoneList<Statement*>* statements,
|
| Token::EQ, factory->NewVariableProxy(var_return),
|
| factory->NewNullLiteral(nopos), nopos);
|
|
|
| - Expression* value = input.IsJust()
|
| - ? static_cast<Expression*>(
|
| - factory->NewVariableProxy(input.FromJust()))
|
| - : factory->NewUndefinedLiteral(nopos);
|
| + Expression* value = factory->NewVariableProxy(input);
|
|
|
| Statement* return_input =
|
| factory->NewReturnStatement(BuildIteratorResult(value, true), nopos);
|
| @@ -6548,9 +6536,7 @@ void ParserTraits::BuildIteratorClose(ZoneList<Statement*>* statements,
|
| auto args = new (zone) ZoneList<Expression*>(3, zone);
|
| args->Add(factory->NewVariableProxy(var_return), zone);
|
| args->Add(factory->NewVariableProxy(iterator), zone);
|
| - if (input.IsJust()) {
|
| - args->Add(factory->NewVariableProxy(input.FromJust()), zone);
|
| - }
|
| + args->Add(factory->NewVariableProxy(input), zone);
|
|
|
| Expression* call =
|
| factory->NewCallRuntime(Runtime::kInlineCall, args, nopos);
|
| @@ -6650,8 +6636,8 @@ void ParserTraits::FinalizeIteratorUse(Variable* completion,
|
| Block* maybe_close;
|
| {
|
| Block* block = factory->NewBlock(nullptr, 2, true, nopos);
|
| - parser_->BuildIteratorCloseForCompletion(block->statements(), iter,
|
| - completion);
|
| + Expression* proxy = factory->NewVariableProxy(completion);
|
| + parser_->BuildIteratorCloseForCompletion(block->statements(), iter, proxy);
|
| DCHECK(block->statements()->length() == 2);
|
|
|
| maybe_close = factory->NewBlock(nullptr, 1, true, nopos);
|
| @@ -6710,7 +6696,7 @@ void ParserTraits::FinalizeIteratorUse(Variable* completion,
|
|
|
| void ParserTraits::BuildIteratorCloseForCompletion(
|
| ZoneList<Statement*>* statements, Variable* iterator,
|
| - Variable* completion) {
|
| + Expression* completion) {
|
| //
|
| // This function adds two statements to [statements], corresponding to the
|
| // following code:
|
| @@ -6845,7 +6831,7 @@ void ParserTraits::BuildIteratorCloseForCompletion(
|
| Statement* call_return_carefully;
|
| {
|
| Expression* condition = factory->NewCompareOperation(
|
| - Token::EQ_STRICT, factory->NewVariableProxy(completion),
|
| + Token::EQ_STRICT, completion,
|
| factory->NewSmiLiteral(Parser::kThrowCompletion, nopos), nopos);
|
|
|
| Block* then_block = factory->NewBlock(nullptr, 2, false, nopos);
|
|
|