Index: src/preparser.h |
diff --git a/src/preparser.h b/src/preparser.h |
index d1d1c53e0b16979d91c4d233b1dd0e3096e1f1f1..ff6bd2728c929e865e90d137cf9040177b8b5e9f 100644 |
--- a/src/preparser.h |
+++ b/src/preparser.h |
@@ -451,13 +451,6 @@ class ParserBase : public Traits { |
bool* ok); |
ExpressionT ParseArrowFunctionLiteral(int start_pos, ExpressionT params_ast, |
bool* ok); |
- ExpressionT ParseArrowFunctionLiteralBody( |
- FunctionState* function_state, typename Traits::Type::ScopePtr scope, |
- int num_parameters, const Scanner::Location& eval_args_error_loc, |
- const Scanner::Location& dupe_error_loc, |
- const Scanner::Location& reserved_loc, |
- FunctionLiteral::IsParenthesizedFlag parenthesized, int start_pos, |
- bool* ok); |
// Checks if the expression is a valid reference expression (e.g., on the |
// left-hand side of assignments). Although ruled out by ECMA as early errors, |
@@ -2450,108 +2443,100 @@ typename ParserBase<Traits>::ExpressionT ParserBase< |
// TODO(aperez): Change this to use ARROW_SCOPE |
typename Traits::Type::ScopePtr scope = |
this->NewScope(scope_, FUNCTION_SCOPE); |
- |
- FunctionState function_state(&function_state_, &scope_, &scope, zone(), |
- this->ast_value_factory()); |
- Scanner::Location dupe_error_loc = Scanner::Location::invalid(); |
- int num_params = Traits::DeclareArrowParametersFromExpression( |
- params_ast, scope_, &dupe_error_loc, ok); |
- if (!*ok) { |
- ReportMessageAt(Scanner::Location(start_pos, scanner()->location().beg_pos), |
- "malformed_arrow_function_parameter_list"); |
- return this->EmptyExpression(); |
- } |
- |
- if (num_params > Code::kMaxArguments) { |
- ReportMessageAt(Scanner::Location(params_ast->position(), position()), |
- "too_many_parameters"); |
- *ok = false; |
- return this->EmptyExpression(); |
- } |
- |
- ExpressionT expression = ParseArrowFunctionLiteralBody( |
- &function_state, scope, num_params, Scanner::Location::invalid(), |
- dupe_error_loc, Scanner::Location::invalid(), |
- FunctionLiteral::kNotParenthesized, start_pos, CHECK_OK); |
- return expression; |
-} |
- |
- |
-template <class Traits> |
-typename ParserBase<Traits>::ExpressionT |
-ParserBase<Traits>::ParseArrowFunctionLiteralBody( |
- FunctionState* function_state, typename Traits::Type::ScopePtr scope, |
- int num_parameters, const Scanner::Location& eval_args_error_loc, |
- const Scanner::Location& dupe_error_loc, |
- const Scanner::Location& reserved_loc, |
- FunctionLiteral::IsParenthesizedFlag parenthesized, int start_pos, |
- bool* ok) { |
typename Traits::Type::StatementList body; |
typename Traits::Type::AstProperties ast_properties; |
BailoutReason dont_optimize_reason = kNoReason; |
+ int num_parameters = -1; |
int materialized_literal_count = -1; |
int expected_property_count = -1; |
int handler_count = 0; |
- Expect(Token::ARROW, CHECK_OK); |
- |
- if (peek() == Token::LBRACE) { |
- // Multiple statemente body |
- Consume(Token::LBRACE); |
- bool is_lazily_parsed = |
- (mode() == PARSE_LAZILY && scope_->AllowsLazyCompilation()); |
- if (is_lazily_parsed) { |
- body = this->NewStatementList(0, zone()); |
- this->SkipLazyFunctionBody(this->EmptyIdentifier(), |
- &materialized_literal_count, |
- &expected_property_count, CHECK_OK); |
- } else { |
- body = this->ParseEagerFunctionBody( |
- this->EmptyIdentifier(), RelocInfo::kNoPosition, NULL, |
- Token::INIT_VAR, false, // Not a generator. |
- CHECK_OK); |
- materialized_literal_count = function_state->materialized_literal_count(); |
- expected_property_count = function_state->expected_property_count(); |
- handler_count = function_state->handler_count(); |
+ { |
+ FunctionState function_state(&function_state_, &scope_, &scope, zone(), |
+ this->ast_value_factory()); |
+ Scanner::Location dupe_error_loc = Scanner::Location::invalid(); |
+ num_parameters = Traits::DeclareArrowParametersFromExpression( |
+ params_ast, scope_, &dupe_error_loc, ok); |
+ if (!*ok) { |
+ ReportMessageAt( |
+ Scanner::Location(start_pos, scanner()->location().beg_pos), |
+ "malformed_arrow_function_parameter_list"); |
+ return this->EmptyExpression(); |
} |
- } else { |
- // Single-expression body |
- int pos = position(); |
- parenthesized_function_ = false; |
- ExpressionT expression = ParseAssignmentExpression(true, CHECK_OK); |
- body = this->NewStatementList(1, zone()); |
- body->Add(factory()->NewReturnStatement(expression, pos), zone()); |
- materialized_literal_count = function_state->materialized_literal_count(); |
- expected_property_count = function_state->expected_property_count(); |
- handler_count = function_state->handler_count(); |
- } |
- scope->set_start_position(start_pos); |
- scope->set_end_position(scanner()->location().end_pos); |
+ if (num_parameters > Code::kMaxArguments) { |
+ ReportMessageAt(Scanner::Location(params_ast->position(), position()), |
+ "too_many_parameters"); |
+ *ok = false; |
+ return this->EmptyExpression(); |
+ } |
- // Arrow function *parameter lists* are always checked as in strict mode. |
- this->CheckStrictFunctionNameAndParameters( |
- this->EmptyIdentifier(), false, Scanner::Location::invalid(), |
- Scanner::Location::invalid(), dupe_error_loc, |
- Scanner::Location::invalid(), CHECK_OK); |
+ Expect(Token::ARROW, CHECK_OK); |
+ |
+ if (peek() == Token::LBRACE) { |
+ // Multiple statemente body |
+ Consume(Token::LBRACE); |
+ bool is_lazily_parsed = |
+ (mode() == PARSE_LAZILY && scope_->AllowsLazyCompilation()); |
+ if (is_lazily_parsed) { |
+ body = this->NewStatementList(0, zone()); |
+ this->SkipLazyFunctionBody(this->EmptyIdentifier(), |
+ &materialized_literal_count, |
+ &expected_property_count, CHECK_OK); |
+ } else { |
+ body = this->ParseEagerFunctionBody( |
+ this->EmptyIdentifier(), RelocInfo::kNoPosition, NULL, |
+ Token::INIT_VAR, false, // Not a generator. |
+ CHECK_OK); |
+ materialized_literal_count = |
+ function_state.materialized_literal_count(); |
+ expected_property_count = function_state.expected_property_count(); |
+ handler_count = function_state.handler_count(); |
+ } |
+ } else { |
+ // Single-expression body |
+ int pos = position(); |
+ parenthesized_function_ = false; |
+ ExpressionT expression = ParseAssignmentExpression(true, CHECK_OK); |
+ body = this->NewStatementList(1, zone()); |
+ body->Add(factory()->NewReturnStatement(expression, pos), zone()); |
+ materialized_literal_count = function_state.materialized_literal_count(); |
+ expected_property_count = function_state.expected_property_count(); |
+ handler_count = function_state.handler_count(); |
+ } |
- // Validate strict mode. |
- if (strict_mode() == STRICT) { |
- CheckOctalLiteral(start_pos, scanner()->location().end_pos, CHECK_OK); |
- } |
+ scope->set_start_position(start_pos); |
+ scope->set_end_position(scanner()->location().end_pos); |
+ |
+ // Arrow function *parameter lists* are always checked as in strict mode. |
+ bool function_name_is_strict_reserved = false; |
+ Scanner::Location function_name_loc = Scanner::Location::invalid(); |
+ Scanner::Location eval_args_error_loc = Scanner::Location::invalid(); |
+ Scanner::Location reserved_loc = Scanner::Location::invalid(); |
+ this->CheckStrictFunctionNameAndParameters( |
+ this->EmptyIdentifier(), function_name_is_strict_reserved, |
+ function_name_loc, eval_args_error_loc, dupe_error_loc, reserved_loc, |
+ CHECK_OK); |
+ |
+ // Validate strict mode. |
+ if (strict_mode() == STRICT) { |
+ CheckOctalLiteral(start_pos, scanner()->location().end_pos, CHECK_OK); |
+ } |
- if (allow_harmony_scoping() && strict_mode() == STRICT) |
- this->CheckConflictingVarDeclarations(scope, CHECK_OK); |
+ if (allow_harmony_scoping() && strict_mode() == STRICT) |
+ this->CheckConflictingVarDeclarations(scope, CHECK_OK); |
- ast_properties = *factory()->visitor()->ast_properties(); |
- dont_optimize_reason = factory()->visitor()->dont_optimize_reason(); |
+ ast_properties = *factory()->visitor()->ast_properties(); |
+ dont_optimize_reason = factory()->visitor()->dont_optimize_reason(); |
+ } |
FunctionLiteralT function_literal = factory()->NewFunctionLiteral( |
this->EmptyIdentifierString(), this->ast_value_factory(), scope, body, |
materialized_literal_count, expected_property_count, handler_count, |
num_parameters, FunctionLiteral::kNoDuplicateParameters, |
FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kIsFunction, |
- parenthesized, FunctionLiteral::kArrowFunction, start_pos); |
+ FunctionLiteral::kNotParenthesized, FunctionLiteral::kArrowFunction, |
+ start_pos); |
function_literal->set_function_token_position(start_pos); |
function_literal->set_ast_properties(&ast_properties); |