| Index: src/parsing/parser-base.h
|
| diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h
|
| index 56b40abf987917ad7df9b94180daacba8597ad24..6af95e6672e5107a922b022a6473a7379444cde2 100644
|
| --- a/src/parsing/parser-base.h
|
| +++ b/src/parsing/parser-base.h
|
| @@ -427,23 +427,12 @@ class ParserBase {
|
| FunctionKind kind() const { return scope()->function_kind(); }
|
| FunctionState* outer() const { return outer_function_state_; }
|
|
|
| - void set_generator_object_variable(typename Types::Variable* variable) {
|
| - DCHECK_NOT_NULL(variable);
|
| - DCHECK(IsResumableFunction(kind()));
|
| - DCHECK(scope()->has_forced_context_allocation());
|
| - generator_object_variable_ = variable;
|
| - }
|
| typename Types::Variable* generator_object_variable() const {
|
| - return generator_object_variable_;
|
| + return scope()->generator_object_var();
|
| }
|
|
|
| - void set_promise_variable(typename Types::Variable* variable) {
|
| - DCHECK(variable != NULL);
|
| - DCHECK(IsAsyncFunction(kind()));
|
| - promise_variable_ = variable;
|
| - }
|
| typename Types::Variable* promise_variable() const {
|
| - return promise_variable_;
|
| + return scope()->promise_var();
|
| }
|
|
|
| const ZoneList<DestructuringAssignment>&
|
| @@ -1233,9 +1222,9 @@ class ParserBase {
|
| StatementT ParseNativeDeclaration(bool* ok);
|
|
|
| // Consumes the ending }.
|
| - void ParseFunctionBody(StatementListT result, IdentifierT function_name,
|
| - int pos, const FormalParametersT& parameters,
|
| - FunctionKind kind,
|
| + void ParseFunctionBody(StatementListT result, BlockT* init_block,
|
| + IdentifierT function_name, int pos,
|
| + const FormalParametersT& parameters, FunctionKind kind,
|
| FunctionLiteral::FunctionType function_type, bool* ok);
|
|
|
| // Under some circumstances, we allow preparsing to abort if the preparsed
|
| @@ -3972,21 +3961,10 @@ ParserBase<Impl>::ParseAsyncFunctionDeclaration(
|
|
|
| template <typename Impl>
|
| void ParserBase<Impl>::ParseFunctionBody(
|
| - typename ParserBase<Impl>::StatementListT result, IdentifierT function_name,
|
| + typename ParserBase<Impl>::StatementListT result,
|
| + typename ParserBase<Impl>::BlockT* init_block, IdentifierT function_name,
|
| int pos, const FormalParametersT& parameters, FunctionKind kind,
|
| FunctionLiteral::FunctionType function_type, bool* ok) {
|
| - static const int kFunctionNameAssignmentIndex = 0;
|
| - if (function_type == FunctionLiteral::kNamedExpression) {
|
| - DCHECK(!impl()->IsEmptyIdentifier(function_name));
|
| - // If we have a named function expression, we add a local variable
|
| - // declaration to the body of the function with the name of the
|
| - // function and let it refer to the function itself (closure).
|
| - // Not having parsed the function body, the language mode may still change,
|
| - // so we reserve a spot and create the actual const assignment later.
|
| - DCHECK_EQ(kFunctionNameAssignmentIndex, result->length());
|
| - result->Add(impl()->NullStatement(), zone());
|
| - }
|
| -
|
| DeclarationScope* function_scope = scope()->AsDeclarationScope();
|
| DeclarationScope* inner_scope = function_scope;
|
| BlockT inner_block = impl()->NullBlock();
|
| @@ -4028,18 +4006,13 @@ void ParserBase<Impl>::ParseFunctionBody(
|
| DCHECK_EQ(function_scope, scope());
|
| DCHECK_EQ(function_scope, inner_scope->outer_scope());
|
| impl()->SetLanguageMode(function_scope, inner_scope->language_mode());
|
| - BlockT init_block =
|
| + *init_block =
|
| impl()->BuildParameterInitializationBlock(parameters, CHECK_OK_VOID);
|
|
|
| if (is_sloppy(inner_scope->language_mode())) {
|
| impl()->InsertSloppyBlockFunctionVarBindings(inner_scope);
|
| }
|
|
|
| - // TODO(littledan): Merge the two rejection blocks into one
|
| - if (IsAsyncFunction(kind)) {
|
| - init_block = impl()->BuildRejectPromiseOnException(init_block);
|
| - }
|
| -
|
| inner_scope->set_end_position(scanner()->location().end_pos);
|
| if (inner_scope->FinalizeBlockScope() != nullptr) {
|
| impl()->CheckConflictingVarDeclarations(inner_scope, CHECK_OK_VOID);
|
| @@ -4047,7 +4020,6 @@ void ParserBase<Impl>::ParseFunctionBody(
|
| }
|
| inner_scope = nullptr;
|
|
|
| - result->Add(init_block, zone());
|
| result->Add(inner_block, zone());
|
| } else {
|
| DCHECK_EQ(inner_scope, function_scope);
|
| @@ -4063,9 +4035,8 @@ void ParserBase<Impl>::ParseFunctionBody(
|
| function_scope->DeclareArguments(ast_value_factory());
|
| }
|
|
|
| - impl()->CreateFunctionNameAssignment(function_name, pos, function_type,
|
| - function_scope, result,
|
| - kFunctionNameAssignmentIndex);
|
| + impl()->CreateFunctionNameVariable(function_name, function_type,
|
| + function_scope);
|
| impl()->MarkCollectedTailCallExpressions();
|
| }
|
|
|
| @@ -4163,6 +4134,7 @@ ParserBase<Impl>::ParseArrowFunctionLiteral(
|
| return impl()->EmptyExpression();
|
| }
|
|
|
| + BlockT parameter_init_block = impl()->NullBlock();
|
| StatementListT body = impl()->NullStatementList();
|
| int materialized_literal_count = -1;
|
| int expected_property_count = -1;
|
| @@ -4231,10 +4203,10 @@ ParserBase<Impl>::ParseArrowFunctionLiteral(
|
| if (!is_lazy_top_level_function) {
|
| Consume(Token::LBRACE);
|
| body = impl()->NewStatementList(8);
|
| - impl()->ParseFunctionBody(body, impl()->EmptyIdentifier(),
|
| - kNoSourcePosition, formal_parameters, kind,
|
| - FunctionLiteral::kAnonymousExpression,
|
| - CHECK_OK);
|
| + impl()->ParseFunctionBody(
|
| + body, ¶meter_init_block, impl()->EmptyIdentifier(),
|
| + kNoSourcePosition, formal_parameters, kind,
|
| + FunctionLiteral::kAnonymousExpression, CHECK_OK);
|
| materialized_literal_count =
|
| function_state.materialized_literal_count();
|
| expected_property_count = function_state.expected_property_count();
|
| @@ -4248,8 +4220,10 @@ ParserBase<Impl>::ParseArrowFunctionLiteral(
|
| ReturnExprScope allow_tail_calls(
|
| function_state_, ReturnExprContext::kInsideValidReturnStatement);
|
| body = impl()->NewStatementList(1);
|
| - impl()->AddParameterInitializationBlock(
|
| - formal_parameters, body, kind == kAsyncArrowFunction, CHECK_OK);
|
| + if (!formal_parameters.is_simple) {
|
| + parameter_init_block = impl()->BuildParameterInitializationBlock(
|
| + formal_parameters, CHECK_OK);
|
| + }
|
| ExpressionClassifier classifier(this);
|
| if (kind == kAsyncArrowFunction) {
|
| ParseAsyncFunctionBody(scope(), body, kAsyncArrowFunction,
|
| @@ -4306,6 +4280,7 @@ ParserBase<Impl>::ParseArrowFunctionLiteral(
|
| FunctionLiteral::kAnonymousExpression, eager_compile_hint,
|
| formal_parameters.scope->start_position(), has_braces,
|
| function_literal_id);
|
| + function_literal->set_parameter_init_block(parameter_init_block);
|
|
|
| function_literal->set_function_token_position(
|
| formal_parameters.scope->start_position());
|
| @@ -4398,20 +4373,16 @@ void ParserBase<Impl>::ParseAsyncFunctionBody(Scope* scope, StatementListT body,
|
| bool* ok) {
|
| impl()->PrepareAsyncFunctionBody(body, kind, pos);
|
|
|
| - BlockT block = factory()->NewBlock(nullptr, 8, true, kNoSourcePosition);
|
| -
|
| ExpressionT return_value = impl()->EmptyExpression();
|
| if (body_type == FunctionBodyType::kNormal) {
|
| - ParseStatementList(block->statements(), Token::RBRACE,
|
| - CHECK_OK_CUSTOM(Void));
|
| + ParseStatementList(body, Token::RBRACE, CHECK_OK_CUSTOM(Void));
|
| return_value = factory()->NewUndefinedLiteral(kNoSourcePosition);
|
| } else {
|
| return_value = ParseAssignmentExpression(accept_IN, CHECK_OK_CUSTOM(Void));
|
| impl()->RewriteNonPattern(CHECK_OK_CUSTOM(Void));
|
| }
|
|
|
| - impl()->RewriteAsyncFunctionBody(body, block, return_value,
|
| - CHECK_OK_CUSTOM(Void));
|
| + impl()->RewriteAsyncFunctionBody(body, return_value, CHECK_OK_CUSTOM(Void));
|
| scope->set_end_position(scanner()->location().end_pos);
|
| }
|
|
|
|
|