| 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);
 | 
| 
 |