| Index: src/parsing/parser.cc
|
| diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc
|
| index 7cb930564fa60942506a56af4b2286beb3abe89e..907948129aae320fc51f8349cca011c1b1a8d7c0 100644
|
| --- a/src/parsing/parser.cc
|
| +++ b/src/parsing/parser.cc
|
| @@ -768,13 +768,12 @@
|
| {
|
| Scope* outer = original_scope_;
|
| DCHECK_NOT_NULL(outer);
|
| - parsing_module_ = info->is_module();
|
| if (info->is_eval()) {
|
| if (!outer->is_script_scope() || is_strict(info->language_mode())) {
|
| parsing_mode = PARSE_EAGERLY;
|
| }
|
| outer = NewEvalScope(outer);
|
| - } else if (parsing_module_) {
|
| + } else if (info->is_module()) {
|
| DCHECK_EQ(outer, info->script_scope());
|
| outer = NewModuleScope(info->script_scope());
|
| // Never do lazy parsing in modules. If we want to support this in the
|
| @@ -794,6 +793,7 @@
|
| ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone());
|
| bool ok = true;
|
| int beg_pos = scanner()->location().beg_pos;
|
| + parsing_module_ = info->is_module();
|
| if (parsing_module_) {
|
| // Declare the special module parameter.
|
| auto name = ast_value_factory()->empty_string();
|
| @@ -804,13 +804,6 @@
|
| &is_duplicate, ast_value_factory());
|
| DCHECK(!is_duplicate);
|
| var->AllocateTo(VariableLocation::PARAMETER, 0);
|
| -
|
| - PrepareGeneratorVariables(&function_state);
|
| - Expression* initial_yield =
|
| - BuildInitialYield(kNoSourcePosition, kGeneratorFunction);
|
| - body->Add(
|
| - factory()->NewExpressionStatement(initial_yield, kNoSourcePosition),
|
| - zone());
|
|
|
| ParseModuleItemList(body, &ok);
|
| ok = ok &&
|
| @@ -2536,20 +2529,6 @@
|
| }
|
| }
|
|
|
| -void Parser::PrepareGeneratorVariables(FunctionState* function_state) {
|
| - // For generators, allocating variables in contexts is currently a win
|
| - // because it minimizes the work needed to suspend and resume an
|
| - // activation. The machine code produced for generators (by full-codegen)
|
| - // relies on this forced context allocation, but not in an essential way.
|
| - scope()->ForceContextAllocation();
|
| -
|
| - // Calling a generator returns a generator object. That object is stored
|
| - // in a temporary variable, a definition that is used by "yield"
|
| - // expressions.
|
| - Variable* temp =
|
| - NewTemporary(ast_value_factory()->dot_generator_object_string());
|
| - function_state->set_generator_object_variable(temp);
|
| -}
|
|
|
| FunctionLiteral* Parser::ParseFunctionLiteral(
|
| const AstRawString* function_name, Scanner::Location function_name_location,
|
| @@ -2671,7 +2650,20 @@
|
|
|
| ExpressionClassifier formals_classifier(this, &duplicate_finder);
|
|
|
| - if (is_generator) PrepareGeneratorVariables(&function_state);
|
| + if (is_generator) {
|
| + // For generators, allocating variables in contexts is currently a win
|
| + // because it minimizes the work needed to suspend and resume an
|
| + // activation. The machine code produced for generators (by full-codegen)
|
| + // relies on this forced context allocation, but not in an essential way.
|
| + this->scope()->ForceContextAllocation();
|
| +
|
| + // Calling a generator returns a generator object. That object is stored
|
| + // in a temporary variable, a definition that is used by "yield"
|
| + // expressions. This also marks the FunctionState as a generator.
|
| + Variable* temp =
|
| + NewTemporary(ast_value_factory()->dot_generator_object_string());
|
| + function_state.set_generator_object_variable(temp);
|
| + }
|
|
|
| Expect(Token::LPAREN, CHECK_OK);
|
| int start_position = scanner()->location().beg_pos;
|
| @@ -3132,21 +3124,6 @@
|
| return promise;
|
| }
|
|
|
| -Expression* Parser::BuildInitialYield(int pos, FunctionKind kind) {
|
| - Expression* allocation = BuildCreateJSGeneratorObject(pos, kind);
|
| - VariableProxy* init_proxy =
|
| - factory()->NewVariableProxy(function_state_->generator_object_variable());
|
| - Assignment* assignment = factory()->NewAssignment(
|
| - Token::INIT, init_proxy, allocation, kNoSourcePosition);
|
| - VariableProxy* get_proxy =
|
| - factory()->NewVariableProxy(function_state_->generator_object_variable());
|
| - // The position of the yield is important for reporting the exception
|
| - // caused by calling the .throw method on a generator suspended at the
|
| - // initial yield (i.e. right after generator instantiation).
|
| - return factory()->NewYield(get_proxy, assignment, scope()->start_position(),
|
| - Yield::kOnExceptionThrow);
|
| -}
|
| -
|
| ZoneList<Statement*>* Parser::ParseEagerFunctionBody(
|
| const AstRawString* function_name, int pos,
|
| const ParserFormalParameters& parameters, FunctionKind kind,
|
| @@ -3199,10 +3176,26 @@
|
|
|
| Block* try_block =
|
| factory()->NewBlock(nullptr, 3, false, kNoSourcePosition);
|
| - Expression* initial_yield = BuildInitialYield(pos, kind);
|
| - try_block->statements()->Add(
|
| - factory()->NewExpressionStatement(initial_yield, kNoSourcePosition),
|
| - zone());
|
| +
|
| + {
|
| + Expression* allocation = BuildCreateJSGeneratorObject(pos, kind);
|
| + VariableProxy* init_proxy = factory()->NewVariableProxy(
|
| + function_state_->generator_object_variable());
|
| + Assignment* assignment = factory()->NewAssignment(
|
| + Token::INIT, init_proxy, allocation, kNoSourcePosition);
|
| + VariableProxy* get_proxy = factory()->NewVariableProxy(
|
| + function_state_->generator_object_variable());
|
| + // The position of the yield is important for reporting the exception
|
| + // caused by calling the .throw method on a generator suspended at the
|
| + // initial yield (i.e. right after generator instantiation).
|
| + Yield* yield = factory()->NewYield(get_proxy, assignment,
|
| + scope()->start_position(),
|
| + Yield::kOnExceptionThrow);
|
| + try_block->statements()->Add(
|
| + factory()->NewExpressionStatement(yield, kNoSourcePosition),
|
| + zone());
|
| + }
|
| +
|
| ParseStatementList(try_block->statements(), Token::RBRACE, CHECK_OK);
|
|
|
| Statement* final_return = factory()->NewReturnStatement(
|
|
|