| Index: src/parsing/parser-base.h | 
| diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h | 
| index 07b031a65b254d3e6a7942b766d85b71a8f5d2f1..2b8c10c5f84999f1a15d662b3e73b05866e574d4 100644 | 
| --- a/src/parsing/parser-base.h | 
| +++ b/src/parsing/parser-base.h | 
| @@ -1141,6 +1141,11 @@ class ParserBase { | 
| DeclarationParsingResult* parsing_result, | 
| ZoneList<const AstRawString*>* names, | 
| bool* ok); | 
| +  StatementT ParseHoistableDeclaration(ZoneList<const AstRawString*>* names, | 
| +                                       bool default_export, bool* ok); | 
| +  StatementT ParseHoistableDeclaration(int pos, ParseFunctionFlags flags, | 
| +                                       ZoneList<const AstRawString*>* names, | 
| +                                       bool default_export, bool* ok); | 
|  | 
| // Under some circumstances, we allow preparsing to abort if the preparsed | 
| // function is "long and trivial", and fully parse instead. Our current | 
| @@ -3593,6 +3598,68 @@ typename ParserBase<Impl>::BlockT ParserBase<Impl>::ParseVariableDeclarations( | 
| } | 
|  | 
| template <typename Impl> | 
| +typename ParserBase<Impl>::StatementT | 
| +ParserBase<Impl>::ParseHoistableDeclaration( | 
| +    ZoneList<const AstRawString*>* names, bool default_export, bool* ok) { | 
| +  Expect(Token::FUNCTION, CHECK_OK_CUSTOM(NullStatement)); | 
| +  int pos = position(); | 
| +  ParseFunctionFlags flags = ParseFunctionFlags::kIsNormal; | 
| +  if (Check(Token::MUL)) { | 
| +    flags |= ParseFunctionFlags::kIsGenerator; | 
| +  } | 
| +  return ParseHoistableDeclaration(pos, flags, names, default_export, ok); | 
| +} | 
| + | 
| +template <typename Impl> | 
| +typename ParserBase<Impl>::StatementT | 
| +ParserBase<Impl>::ParseHoistableDeclaration( | 
| +    int pos, ParseFunctionFlags flags, ZoneList<const AstRawString*>* names, | 
| +    bool default_export, bool* ok) { | 
| +  // FunctionDeclaration :: | 
| +  //   'function' Identifier '(' FormalParameters ')' '{' FunctionBody '}' | 
| +  //   'function' '(' FormalParameters ')' '{' FunctionBody '}' | 
| +  // GeneratorDeclaration :: | 
| +  //   'function' '*' Identifier '(' FormalParameters ')' '{' FunctionBody '}' | 
| +  //   'function' '*' '(' FormalParameters ')' '{' FunctionBody '}' | 
| +  // | 
| +  // The anonymous forms are allowed iff [default_export] is true. | 
| +  // | 
| +  // 'function' and '*' (if present) have been consumed by the caller. | 
| + | 
| +  const bool is_generator = flags & ParseFunctionFlags::kIsGenerator; | 
| +  const bool is_async = flags & ParseFunctionFlags::kIsAsync; | 
| +  DCHECK(!is_generator || !is_async); | 
| + | 
| +  IdentifierT name; | 
| +  FunctionNameValidity name_validity; | 
| +  IdentifierT variable_name; | 
| +  if (default_export && peek() == Token::LPAREN) { | 
| +    impl()->GetDefaultStrings(&name, &variable_name); | 
| +    name_validity = kSkipFunctionNameCheck; | 
| +  } else { | 
| +    bool is_strict_reserved; | 
| +    name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved, | 
| +                                               CHECK_OK_CUSTOM(NullStatement)); | 
| +    name_validity = is_strict_reserved ? kFunctionNameIsStrictReserved | 
| +                                       : kFunctionNameValidityUnknown; | 
| +    variable_name = name; | 
| +  } | 
| + | 
| +  FuncNameInferrer::State fni_state(fni_); | 
| +  impl()->PushEnclosingName(name); | 
| +  FunctionLiteralT function = impl()->ParseFunctionLiteral( | 
| +      name, scanner()->location(), name_validity, | 
| +      is_generator ? FunctionKind::kGeneratorFunction | 
| +                   : is_async ? FunctionKind::kAsyncFunction | 
| +                              : FunctionKind::kNormalFunction, | 
| +      pos, FunctionLiteral::kDeclaration, language_mode(), | 
| +      CHECK_OK_CUSTOM(NullStatement)); | 
| + | 
| +  return impl()->DeclareFunction(variable_name, function, pos, is_generator, | 
| +                                 is_async, names, ok); | 
| +} | 
| + | 
| +template <typename Impl> | 
| void ParserBase<Impl>::CheckArityRestrictions(int param_count, | 
| FunctionKind function_kind, | 
| bool has_rest, | 
|  |