| Index: src/parsing/preparser.h
 | 
| diff --git a/src/parsing/preparser.h b/src/parsing/preparser.h
 | 
| index bb18f986718304430ae5f1e4820c132213ff587a..4d83c00e0b79e1e13f72fc7fceb641d8bbb5a370 100644
 | 
| --- a/src/parsing/preparser.h
 | 
| +++ b/src/parsing/preparser.h
 | 
| @@ -18,7 +18,6 @@
 | 
|  namespace v8 {
 | 
|  namespace internal {
 | 
|  
 | 
| -
 | 
|  class PreParserIdentifier {
 | 
|   public:
 | 
|    PreParserIdentifier() : type_(kUnknownIdentifier) {}
 | 
| @@ -588,15 +587,16 @@ class PreParser;
 | 
|  template <>
 | 
|  class ParserBaseTraits<PreParser> {
 | 
|   public:
 | 
| -  typedef ParserBaseTraits<PreParser> PreParserTraits;
 | 
| -
 | 
|    struct Type {
 | 
| +    typedef ParserBase<PreParser> Base;
 | 
| +    typedef PreParser Impl;
 | 
| +
 | 
|      // PreParser doesn't need to store generator variables.
 | 
|      typedef void GeneratorVariable;
 | 
|  
 | 
|      typedef int AstProperties;
 | 
|  
 | 
| -    typedef v8::internal::ExpressionClassifier<PreParserTraits>
 | 
| +    typedef v8::internal::ExpressionClassifier<ParserBaseTraits<PreParser>>
 | 
|          ExpressionClassifier;
 | 
|  
 | 
|      // Return types for traversing functions.
 | 
| @@ -616,66 +616,6 @@ class ParserBaseTraits<PreParser> {
 | 
|      // For constructing objects returned by the traversing functions.
 | 
|      typedef PreParserFactory Factory;
 | 
|    };
 | 
| -
 | 
| -  // TODO(nikolaos): The traits methods should not need to call methods
 | 
| -  // of the implementation object.
 | 
| -  PreParser* delegate() { return reinterpret_cast<PreParser*>(this); }
 | 
| -  const PreParser* delegate() const {
 | 
| -    return reinterpret_cast<const PreParser*>(this);
 | 
| -  }
 | 
| -
 | 
| -  // A dummy function, just useful as an argument to CHECK_OK_CUSTOM.
 | 
| -  static void Void() {}
 | 
| -
 | 
| -  void AddParameterInitializationBlock(
 | 
| -      const PreParserFormalParameters& parameters, PreParserStatementList body,
 | 
| -      bool is_async, bool* ok) {}
 | 
| -
 | 
| -  void AddFormalParameter(PreParserFormalParameters* parameters,
 | 
| -                          PreParserExpression pattern,
 | 
| -                          PreParserExpression initializer,
 | 
| -                          int initializer_end_position, bool is_rest) {
 | 
| -    ++parameters->arity;
 | 
| -  }
 | 
| -
 | 
| -  void DeclareFormalParameter(DeclarationScope* scope,
 | 
| -                              PreParserIdentifier parameter,
 | 
| -                              Type::ExpressionClassifier* classifier) {
 | 
| -    if (!classifier->is_simple_parameter_list()) {
 | 
| -      scope->SetHasNonSimpleParameters();
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  V8_INLINE void ParseArrowFunctionFormalParameterList(
 | 
| -      PreParserFormalParameters* parameters, PreParserExpression params,
 | 
| -      const Scanner::Location& params_loc, Scanner::Location* duplicate_loc,
 | 
| -      const Scope::Snapshot& scope_snapshot, bool* ok);
 | 
| -
 | 
| -  void ReindexLiterals(const PreParserFormalParameters& parameters) {}
 | 
| -
 | 
| -  V8_INLINE PreParserExpression NoTemplateTag() {
 | 
| -    return PreParserExpression::NoTemplateTag();
 | 
| -  }
 | 
| -  V8_INLINE static bool IsTaggedTemplate(const PreParserExpression tag) {
 | 
| -    return !tag.IsNoTemplateTag();
 | 
| -  }
 | 
| -
 | 
| -  inline void MaterializeUnspreadArgumentsLiterals(int count);
 | 
| -
 | 
| -  inline PreParserExpression ExpressionListToExpression(
 | 
| -      PreParserExpressionList args) {
 | 
| -    return PreParserExpression::Default();
 | 
| -  }
 | 
| -
 | 
| -  void SetFunctionNameFromPropertyName(PreParserExpression property,
 | 
| -                                       PreParserIdentifier name) {}
 | 
| -  void SetFunctionNameFromIdentifierRef(PreParserExpression value,
 | 
| -                                        PreParserExpression identifier) {}
 | 
| -
 | 
| -  V8_INLINE ZoneList<typename Type::ExpressionClassifier::Error>*
 | 
| -      GetReportedErrorList() const;
 | 
| -  V8_INLINE Zone* zone() const;
 | 
| -  V8_INLINE ZoneList<PreParserExpression>* GetNonPatternList() const;
 | 
|  };
 | 
|  
 | 
|  
 | 
| @@ -693,9 +633,7 @@ class ParserBaseTraits<PreParser> {
 | 
|  // it is used) are generally omitted.
 | 
|  class PreParser : public ParserBase<PreParser> {
 | 
|    friend class ParserBase<PreParser>;
 | 
| -  // TODO(nikolaos): This should not be necessary. It will be removed
 | 
| -  // when the traits object stops delegating to the implementation object.
 | 
| -  friend class ParserBaseTraits<PreParser>;
 | 
| +  friend class v8::internal::ExpressionClassifier<ParserBaseTraits<PreParser>>;
 | 
|  
 | 
|   public:
 | 
|    typedef PreParserIdentifier Identifier;
 | 
| @@ -763,6 +701,9 @@ class PreParser : public ParserBase<PreParser> {
 | 
|                                        Scanner::BookmarkScope* bookmark,
 | 
|                                        int* use_counts);
 | 
|  
 | 
| +  // A dummy function, just useful as an argument to CHECK_OK_CUSTOM.
 | 
| +  static void Void() {}
 | 
| +
 | 
|   private:
 | 
|    static const int kLazyParseTrialLimit = 200;
 | 
|  
 | 
| @@ -1139,18 +1080,75 @@ class PreParser : public ParserBase<PreParser> {
 | 
|      return PreParserStatementList();
 | 
|    }
 | 
|  
 | 
| +  V8_INLINE void AddParameterInitializationBlock(
 | 
| +      const PreParserFormalParameters& parameters, PreParserStatementList body,
 | 
| +      bool is_async, bool* ok) {}
 | 
| +
 | 
| +  V8_INLINE void AddFormalParameter(PreParserFormalParameters* parameters,
 | 
| +                                    PreParserExpression pattern,
 | 
| +                                    PreParserExpression initializer,
 | 
| +                                    int initializer_end_position,
 | 
| +                                    bool is_rest) {
 | 
| +    ++parameters->arity;
 | 
| +  }
 | 
| +
 | 
| +  V8_INLINE void DeclareFormalParameter(
 | 
| +      DeclarationScope* scope, PreParserIdentifier parameter,
 | 
| +      Type::ExpressionClassifier* classifier) {
 | 
| +    if (!classifier->is_simple_parameter_list()) {
 | 
| +      scope->SetHasNonSimpleParameters();
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  V8_INLINE void ParseArrowFunctionFormalParameterList(
 | 
| +      PreParserFormalParameters* parameters, PreParserExpression params,
 | 
| +      const Scanner::Location& params_loc, Scanner::Location* duplicate_loc,
 | 
| +      const Scope::Snapshot& scope_snapshot, bool* ok) {
 | 
| +    // TODO(wingo): Detect duplicated identifiers in paramlists.  Detect
 | 
| +    // parameter
 | 
| +    // lists that are too long.
 | 
| +  }
 | 
| +
 | 
| +  V8_INLINE void ReindexLiterals(const PreParserFormalParameters& parameters) {}
 | 
| +
 | 
| +  V8_INLINE PreParserExpression NoTemplateTag() {
 | 
| +    return PreParserExpression::NoTemplateTag();
 | 
| +  }
 | 
| +
 | 
| +  V8_INLINE static bool IsTaggedTemplate(const PreParserExpression tag) {
 | 
| +    return !tag.IsNoTemplateTag();
 | 
| +  }
 | 
| +
 | 
| +  V8_INLINE void MaterializeUnspreadArgumentsLiterals(int count) {
 | 
| +    for (int i = 0; i < count; ++i) {
 | 
| +      function_state_->NextMaterializedLiteralIndex();
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  V8_INLINE PreParserExpression
 | 
| +  ExpressionListToExpression(PreParserExpressionList args) {
 | 
| +    return PreParserExpression::Default();
 | 
| +  }
 | 
| +
 | 
| +  V8_INLINE void SetFunctionNameFromPropertyName(PreParserExpression property,
 | 
| +                                                 PreParserIdentifier name) {}
 | 
| +  V8_INLINE void SetFunctionNameFromIdentifierRef(
 | 
| +      PreParserExpression value, PreParserExpression identifier) {}
 | 
| +
 | 
| +  V8_INLINE ZoneList<typename Type::ExpressionClassifier::Error>*
 | 
| +  GetReportedErrorList() const {
 | 
| +    return function_state_->GetReportedErrorList();
 | 
| +  }
 | 
| +
 | 
| +  V8_INLINE ZoneList<PreParserExpression>* GetNonPatternList() const {
 | 
| +    return function_state_->non_patterns_to_rewrite();
 | 
| +  }
 | 
| +
 | 
|    // Preparser's private field members.
 | 
|  
 | 
|    int* use_counts_;
 | 
|  };
 | 
|  
 | 
| -void ParserBaseTraits<PreParser>::MaterializeUnspreadArgumentsLiterals(
 | 
| -    int count) {
 | 
| -  for (int i = 0; i < count; ++i) {
 | 
| -    delegate()->function_state_->NextMaterializedLiteralIndex();
 | 
| -  }
 | 
| -}
 | 
| -
 | 
|  PreParserExpression PreParser::SpreadCall(PreParserExpression function,
 | 
|                                            PreParserExpressionList args,
 | 
|                                            int pos) {
 | 
| @@ -1163,29 +1161,6 @@ PreParserExpression PreParser::SpreadCallNew(PreParserExpression function,
 | 
|    return factory()->NewCallNew(function, args, pos);
 | 
|  }
 | 
|  
 | 
| -void ParserBaseTraits<PreParser>::ParseArrowFunctionFormalParameterList(
 | 
| -    PreParserFormalParameters* parameters, PreParserExpression params,
 | 
| -    const Scanner::Location& params_loc, Scanner::Location* duplicate_loc,
 | 
| -    const Scope::Snapshot& scope_snapshot, bool* ok) {
 | 
| -  // TODO(wingo): Detect duplicated identifiers in paramlists.  Detect parameter
 | 
| -  // lists that are too long.
 | 
| -}
 | 
| -
 | 
| -ZoneList<PreParserExpression>* ParserBaseTraits<PreParser>::GetNonPatternList()
 | 
| -    const {
 | 
| -  return delegate()->function_state_->non_patterns_to_rewrite();
 | 
| -}
 | 
| -
 | 
| -ZoneList<
 | 
| -    typename ParserBaseTraits<PreParser>::Type::ExpressionClassifier::Error>*
 | 
| -ParserBaseTraits<PreParser>::GetReportedErrorList() const {
 | 
| -  return delegate()->function_state_->GetReportedErrorList();
 | 
| -}
 | 
| -
 | 
| -Zone* ParserBaseTraits<PreParser>::zone() const {
 | 
| -  return delegate()->function_state_->scope()->zone();
 | 
| -}
 | 
| -
 | 
|  PreParserStatementList PreParser::ParseEagerFunctionBody(
 | 
|      PreParserIdentifier function_name, int pos,
 | 
|      const PreParserFormalParameters& parameters, FunctionKind kind,
 | 
| 
 |