| Index: src/parsing/parser-base.h | 
| diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h | 
| index 93dea7c565ef876ad61463fbdebfd9d74949f7ea..7712fd3dc4539ae5a7d88608b4b9b0e080e4cd18 100644 | 
| --- a/src/parsing/parser-base.h | 
| +++ b/src/parsing/parser-base.h | 
| @@ -161,10 +161,6 @@ struct FormalParametersBase { | 
| // | 
| //   class Parser : public ParserBase<Parser> { ... }; | 
| // | 
| -// TODO(nikolaos): Currently the traits objects contain many things | 
| -// that will be moved to the implementation objects or to the parser | 
| -// base.  The following comments will have to change, when this happens. | 
| - | 
| // The traits class template encapsulates the differences between | 
| // parser/pre-parser implementations.  In particular: | 
|  | 
| @@ -179,15 +175,14 @@ struct FormalParametersBase { | 
| // interface as AstNodeFactory, so ParserBase doesn't need to care which one is | 
| // used. | 
|  | 
| -// - Miscellaneous other tasks interleaved with the recursive descent. For | 
| -// example, Parser keeps track of which function literals should be marked as | 
| -// pretenured, and PreParser doesn't care. | 
| - | 
| // The traits are expected to contain the following typedefs: | 
| // template <> | 
| // class ParserBaseTraits<Impl> { | 
| //   // In particular... | 
| //   struct Type { | 
| +//     // Synonyms for ParserBase<Impl> and Impl, respectively. | 
| +//     typedef Base; | 
| +//     typedef Impl; | 
| //     typedef GeneratorVariable; | 
| //     typedef AstProperties; | 
| //     typedef ExpressionClassifier; | 
| @@ -280,6 +275,8 @@ class ParserBase : public ParserBaseTraits<Impl> { | 
|  | 
| void set_stack_limit(uintptr_t stack_limit) { stack_limit_ = stack_limit; } | 
|  | 
| +  Zone* zone() const { return zone_; } | 
| + | 
| protected: | 
| enum AllowRestrictedIdentifiers { | 
| kAllowRestrictedIdentifiers, | 
| @@ -696,7 +693,6 @@ class ParserBase : public ParserBaseTraits<Impl> { | 
| bool stack_overflow() const { return stack_overflow_; } | 
| void set_stack_overflow() { stack_overflow_ = true; } | 
| Mode mode() const { return mode_; } | 
| -  Zone* zone() const { return zone_; } | 
|  | 
| INLINE(Token::Value peek()) { | 
| if (stack_overflow_) return Token::ILLEGAL; | 
| @@ -1469,7 +1465,7 @@ ParserBase<Impl>::ParseAndClassifyIdentifier(ExpressionClassifier* classifier, | 
| } | 
| return impl()->GetSymbol(); | 
| } else { | 
| -    this->ReportUnexpectedToken(next); | 
| +    ReportUnexpectedToken(next); | 
| *ok = false; | 
| return impl()->EmptyIdentifier(); | 
| } | 
| @@ -1507,7 +1503,7 @@ typename ParserBase<Impl>::IdentifierT ParserBase<Impl>::ParseIdentifierName( | 
| next != Token::FUTURE_STRICT_RESERVED_WORD && | 
| next != Token::ESCAPED_KEYWORD && | 
| next != Token::ESCAPED_STRICT_RESERVED_WORD && !Token::IsKeyword(next)) { | 
| -    this->ReportUnexpectedToken(next); | 
| +    ReportUnexpectedToken(next); | 
| *ok = false; | 
| return impl()->EmptyIdentifier(); | 
| } | 
| @@ -1610,13 +1606,13 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParsePrimaryExpression( | 
| case Token::DIV: | 
| classifier->RecordBindingPatternError( | 
| scanner()->peek_location(), MessageTemplate::kUnexpectedTokenRegExp); | 
| -      return this->ParseRegExpLiteral(ok); | 
| +      return ParseRegExpLiteral(ok); | 
|  | 
| case Token::LBRACK: | 
| -      return this->ParseArrayLiteral(classifier, ok); | 
| +      return ParseArrayLiteral(classifier, ok); | 
|  | 
| case Token::LBRACE: | 
| -      return this->ParseObjectLiteral(classifier, ok); | 
| +      return ParseObjectLiteral(classifier, ok); | 
|  | 
| case Token::LPAREN: { | 
| // Arrow function formal parameters are either a single identifier or a | 
| @@ -1647,8 +1643,8 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParsePrimaryExpression( | 
| Token::String(Token::ELLIPSIS)); | 
| classifier->RecordNonSimpleParameter(); | 
| ExpressionClassifier binding_classifier(this); | 
| -        ExpressionT expr = this->ParseAssignmentExpression( | 
| -            true, &binding_classifier, CHECK_OK); | 
| +        ExpressionT expr = | 
| +            ParseAssignmentExpression(true, &binding_classifier, CHECK_OK); | 
| classifier->Accumulate(&binding_classifier, | 
| ExpressionClassifier::AllProductions); | 
| if (!impl()->IsIdentifier(expr) && !IsValidPattern(expr)) { | 
| @@ -1669,7 +1665,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParsePrimaryExpression( | 
| // seeing the call parentheses. | 
| function_state_->set_next_function_is_parenthesized(peek() == | 
| Token::FUNCTION); | 
| -      ExpressionT expr = this->ParseExpression(true, classifier, CHECK_OK); | 
| +      ExpressionT expr = ParseExpression(true, classifier, CHECK_OK); | 
| Expect(Token::RPAREN, CHECK_OK); | 
| return expr; | 
| } | 
| @@ -1694,8 +1690,8 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParsePrimaryExpression( | 
| case Token::TEMPLATE_SPAN: | 
| case Token::TEMPLATE_TAIL: | 
| BindingPatternUnexpectedToken(classifier); | 
| -      return this->ParseTemplateLiteral(Traits::NoTemplateTag(), beg_pos, | 
| -                                        classifier, ok); | 
| +      return ParseTemplateLiteral(impl()->NoTemplateTag(), beg_pos, classifier, | 
| +                                  ok); | 
|  | 
| case Token::MOD: | 
| if (allow_natives() || extension_ != NULL) { | 
| @@ -1739,8 +1735,8 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseExpression( | 
| ExpressionT result; | 
| { | 
| ExpressionClassifier binding_classifier(this); | 
| -    result = this->ParseAssignmentExpression(accept_IN, &binding_classifier, | 
| -                                             CHECK_OK); | 
| +    result = | 
| +        ParseAssignmentExpression(accept_IN, &binding_classifier, CHECK_OK); | 
| classifier->Accumulate(&binding_classifier, | 
| ExpressionClassifier::AllProductions); | 
| } | 
| @@ -1771,8 +1767,8 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseExpression( | 
| } | 
| int pos = position(), expr_pos = peek_position(); | 
| ExpressionClassifier binding_classifier(this); | 
| -    ExpressionT right = this->ParseAssignmentExpression( | 
| -        accept_IN, &binding_classifier, CHECK_OK); | 
| +    ExpressionT right = | 
| +        ParseAssignmentExpression(accept_IN, &binding_classifier, CHECK_OK); | 
| classifier->Accumulate(&binding_classifier, | 
| ExpressionClassifier::AllProductions); | 
| if (is_rest) { | 
| @@ -1813,7 +1809,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseArrayLiteral( | 
| Consume(Token::ELLIPSIS); | 
| int expr_pos = peek_position(); | 
| ExpressionT argument = | 
| -          this->ParseAssignmentExpression(true, classifier, CHECK_OK); | 
| +          ParseAssignmentExpression(true, classifier, CHECK_OK); | 
| CheckNoTailCallExpressions(classifier, CHECK_OK); | 
| elem = factory()->NewSpread(argument, start_pos, expr_pos); | 
|  | 
| @@ -1837,7 +1833,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseArrayLiteral( | 
| } | 
| } else { | 
| int beg_pos = peek_position(); | 
| -      elem = this->ParseAssignmentExpression(true, classifier, CHECK_OK); | 
| +      elem = ParseAssignmentExpression(true, classifier, CHECK_OK); | 
| CheckNoTailCallExpressions(classifier, CHECK_OK); | 
| CheckDestructuringElement(elem, classifier, beg_pos, | 
| scanner()->location().end_pos); | 
| @@ -1972,7 +1968,7 @@ ParserBase<Impl>::ParsePropertyDefinition( | 
| } | 
| Consume(Token::COLON); | 
| int beg_pos = peek_position(); | 
| -      ExpressionT value = this->ParseAssignmentExpression( | 
| +      ExpressionT value = ParseAssignmentExpression( | 
| true, classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); | 
| CheckDestructuringElement(value, classifier, beg_pos, | 
| scanner()->location().end_pos); | 
| @@ -2019,7 +2015,7 @@ ParserBase<Impl>::ParsePropertyDefinition( | 
| if (peek() == Token::ASSIGN) { | 
| Consume(Token::ASSIGN); | 
| ExpressionClassifier rhs_classifier(this); | 
| -        ExpressionT rhs = this->ParseAssignmentExpression( | 
| +        ExpressionT rhs = ParseAssignmentExpression( | 
| true, &rhs_classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); | 
| impl()->RewriteNonPattern(&rhs_classifier, | 
| CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); | 
| @@ -2031,7 +2027,7 @@ ParserBase<Impl>::ParsePropertyDefinition( | 
| Scanner::Location(next_beg_pos, scanner()->location().end_pos), | 
| MessageTemplate::kInvalidCoverInitializedName); | 
|  | 
| -        Traits::SetFunctionNameFromIdentifierRef(rhs, lhs); | 
| +        impl()->SetFunctionNameFromIdentifierRef(rhs, lhs); | 
| } else { | 
| value = lhs; | 
| } | 
| @@ -2165,7 +2161,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseObjectLiteral( | 
| const bool has_extends = false; | 
| bool is_computed_name = false; | 
| IdentifierT name = impl()->EmptyIdentifier(); | 
| -    ObjectLiteralPropertyT property = this->ParsePropertyDefinition( | 
| +    ObjectLiteralPropertyT property = ParsePropertyDefinition( | 
| &checker, in_class, has_extends, MethodKind::kNormal, &is_computed_name, | 
| NULL, classifier, &name, CHECK_OK); | 
|  | 
| @@ -2186,7 +2182,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseObjectLiteral( | 
|  | 
| if (fni_ != nullptr) fni_->Infer(); | 
|  | 
| -    Traits::SetFunctionNameFromPropertyName(property, name); | 
| +    impl()->SetFunctionNameFromPropertyName(property, name); | 
| } | 
| Expect(Token::RBRACE, CHECK_OK); | 
|  | 
| @@ -2218,7 +2214,7 @@ ParserBase<Impl>::ParseArguments(Scanner::Location* first_spread_arg_loc, | 
| bool is_spread = Check(Token::ELLIPSIS); | 
| int expr_pos = peek_position(); | 
|  | 
| -    ExpressionT argument = this->ParseAssignmentExpression( | 
| +    ExpressionT argument = ParseAssignmentExpression( | 
| true, classifier, CHECK_OK_CUSTOM(NullExpressionList)); | 
| CheckNoTailCallExpressions(classifier, CHECK_OK_CUSTOM(NullExpressionList)); | 
| if (!maybe_arrow) { | 
| @@ -2274,7 +2270,7 @@ ParserBase<Impl>::ParseArguments(Scanner::Location* first_spread_arg_loc, | 
| // Unspread parameter sequences are translated into array literals in the | 
| // parser. Ensure that the number of materialized literals matches between | 
| // the parser and preparser | 
| -      Traits::MaterializeUnspreadArgumentsLiterals(unspread_sequences_count); | 
| +      impl()->MaterializeUnspreadArgumentsLiterals(unspread_sequences_count); | 
| } | 
| } | 
|  | 
| @@ -2295,7 +2291,7 @@ ParserBase<Impl>::ParseAssignmentExpression(bool accept_IN, | 
| int lhs_beg_pos = peek_position(); | 
|  | 
| if (peek() == Token::YIELD && is_generator()) { | 
| -    return this->ParseYieldExpression(accept_IN, classifier, ok); | 
| +    return ParseYieldExpression(accept_IN, classifier, ok); | 
| } | 
|  | 
| FuncNameInferrer::State fni_state(fni_); | 
| @@ -2318,10 +2314,10 @@ ParserBase<Impl>::ParseAssignmentExpression(bool accept_IN, | 
| // that we have only a trivial expression to parse. | 
| ExpressionT expression; | 
| if (IsTrivialExpression()) { | 
| -    expression = this->ParsePrimaryExpression(&arrow_formals_classifier, | 
| -                                              &is_async, CHECK_OK); | 
| +    expression = | 
| +        ParsePrimaryExpression(&arrow_formals_classifier, &is_async, CHECK_OK); | 
| } else { | 
| -    expression = this->ParseConditionalExpression( | 
| +    expression = ParseConditionalExpression( | 
| accept_IN, &arrow_formals_classifier, CHECK_OK); | 
| } | 
|  | 
| @@ -2352,8 +2348,8 @@ ParserBase<Impl>::ParseAssignmentExpression(bool accept_IN, | 
|  | 
| Scanner::Location loc(lhs_beg_pos, scanner()->location().end_pos); | 
| DeclarationScope* scope = | 
| -        this->NewFunctionScope(is_async ? FunctionKind::kAsyncArrowFunction | 
| -                                        : FunctionKind::kArrowFunction); | 
| +        NewFunctionScope(is_async ? FunctionKind::kAsyncArrowFunction | 
| +                                  : FunctionKind::kArrowFunction); | 
| // Because the arrow's parameters were parsed in the outer scope, any | 
| // usage flags that might have been triggered there need to be copied | 
| // to the arrow scope. | 
| @@ -2368,14 +2364,14 @@ ParserBase<Impl>::ParseAssignmentExpression(bool accept_IN, | 
|  | 
| scope->set_start_position(lhs_beg_pos); | 
| Scanner::Location duplicate_loc = Scanner::Location::invalid(); | 
| -    this->ParseArrowFunctionFormalParameterList( | 
| +    impl()->ParseArrowFunctionFormalParameterList( | 
| ¶meters, expression, loc, &duplicate_loc, scope_snapshot, CHECK_OK); | 
| if (duplicate_loc.IsValid()) { | 
| arrow_formals_classifier.RecordDuplicateFormalParameterError( | 
| duplicate_loc); | 
| } | 
| -    expression = this->ParseArrowFunctionLiteral( | 
| -        accept_IN, parameters, is_async, arrow_formals_classifier, CHECK_OK); | 
| +    expression = ParseArrowFunctionLiteral(accept_IN, parameters, is_async, | 
| +                                           arrow_formals_classifier, CHECK_OK); | 
| arrow_formals_classifier.Discard(); | 
| classifier->RecordPatternError(arrow_loc, | 
| MessageTemplate::kUnexpectedToken, | 
| @@ -2433,7 +2429,7 @@ ParserBase<Impl>::ParseAssignmentExpression(bool accept_IN, | 
| if (is_destructuring_assignment) { | 
| ValidateAssignmentPattern(classifier, CHECK_OK); | 
| } else { | 
| -    expression = this->CheckAndRewriteReferenceExpression( | 
| +    expression = CheckAndRewriteReferenceExpression( | 
| expression, lhs_beg_pos, scanner()->location().end_pos, | 
| MessageTemplate::kInvalidLhsInAssignment, CHECK_OK); | 
| } | 
| @@ -2451,7 +2447,7 @@ ParserBase<Impl>::ParseAssignmentExpression(bool accept_IN, | 
| ExpressionClassifier rhs_classifier(this); | 
|  | 
| ExpressionT right = | 
| -      this->ParseAssignmentExpression(accept_IN, &rhs_classifier, CHECK_OK); | 
| +      ParseAssignmentExpression(accept_IN, &rhs_classifier, CHECK_OK); | 
| CheckNoTailCallExpressions(&rhs_classifier, CHECK_OK); | 
| impl()->RewriteNonPattern(&rhs_classifier, CHECK_OK); | 
| classifier->Accumulate( | 
| @@ -2484,7 +2480,7 @@ ParserBase<Impl>::ParseAssignmentExpression(bool accept_IN, | 
| } | 
|  | 
| if (op == Token::ASSIGN) { | 
| -    Traits::SetFunctionNameFromIdentifierRef(right, expression); | 
| +    impl()->SetFunctionNameFromIdentifierRef(right, expression); | 
| } | 
|  | 
| if (op == Token::ASSIGN_EXP) { | 
| @@ -2565,8 +2561,7 @@ ParserBase<Impl>::ParseTailCallExpression(ExpressionClassifier* classifier, | 
| Expect(Token::CONTINUE, CHECK_OK); | 
| int pos = position(); | 
| int sub_expression_pos = peek_position(); | 
| -  ExpressionT expression = | 
| -      this->ParseLeftHandSideExpression(classifier, CHECK_OK); | 
| +  ExpressionT expression = ParseLeftHandSideExpression(classifier, CHECK_OK); | 
| CheckNoTailCallExpressions(classifier, CHECK_OK); | 
|  | 
| Scanner::Location loc(pos, scanner()->location().end_pos); | 
| @@ -2630,7 +2625,7 @@ ParserBase<Impl>::ParseConditionalExpression(bool accept_IN, | 
| int pos = peek_position(); | 
| // We start using the binary expression parser for prec >= 4 only! | 
| ExpressionT expression = | 
| -      this->ParseBinaryExpression(4, accept_IN, classifier, CHECK_OK); | 
| +      ParseBinaryExpression(4, accept_IN, classifier, CHECK_OK); | 
| if (peek() != Token::CONDITIONAL) return expression; | 
| CheckNoTailCallExpressions(classifier, CHECK_OK); | 
| impl()->RewriteNonPattern(classifier, CHECK_OK); | 
| @@ -2655,7 +2650,7 @@ template <typename Impl> | 
| typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseBinaryExpression( | 
| int prec, bool accept_IN, ExpressionClassifier* classifier, bool* ok) { | 
| DCHECK(prec >= 4); | 
| -  ExpressionT x = this->ParseUnaryExpression(classifier, CHECK_OK); | 
| +  ExpressionT x = ParseUnaryExpression(classifier, CHECK_OK); | 
| for (int prec1 = Precedence(peek(), accept_IN); prec1 >= prec; prec1--) { | 
| // prec1 >= 4 | 
| while (Precedence(peek(), accept_IN) == prec1) { | 
| @@ -2755,9 +2750,9 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseUnaryExpression( | 
| ArrowFormalParametersUnexpectedToken(classifier); | 
| op = Next(); | 
| int beg_pos = peek_position(); | 
| -    ExpressionT expression = this->ParseUnaryExpression(classifier, CHECK_OK); | 
| +    ExpressionT expression = ParseUnaryExpression(classifier, CHECK_OK); | 
| CheckNoTailCallExpressions(classifier, CHECK_OK); | 
| -    expression = this->CheckAndRewriteReferenceExpression( | 
| +    expression = CheckAndRewriteReferenceExpression( | 
| expression, beg_pos, scanner()->location().end_pos, | 
| MessageTemplate::kInvalidLhsInPrefixOp, CHECK_OK); | 
| expression = impl()->MarkExpressionAsAssigned(expression); | 
| @@ -2780,7 +2775,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseUnaryExpression( | 
|  | 
| return impl()->RewriteAwaitExpression(value, await_pos); | 
| } else { | 
| -    return this->ParsePostfixExpression(classifier, ok); | 
| +    return ParsePostfixExpression(classifier, ok); | 
| } | 
| } | 
|  | 
| @@ -2791,15 +2786,14 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParsePostfixExpression( | 
| //   LeftHandSideExpression ('++' | '--')? | 
|  | 
| int lhs_beg_pos = peek_position(); | 
| -  ExpressionT expression = | 
| -      this->ParseLeftHandSideExpression(classifier, CHECK_OK); | 
| +  ExpressionT expression = ParseLeftHandSideExpression(classifier, CHECK_OK); | 
| if (!scanner()->HasAnyLineTerminatorBeforeNext() && | 
| Token::IsCountOp(peek())) { | 
| CheckNoTailCallExpressions(classifier, CHECK_OK); | 
| BindingPatternUnexpectedToken(classifier); | 
| ArrowFormalParametersUnexpectedToken(classifier); | 
|  | 
| -    expression = this->CheckAndRewriteReferenceExpression( | 
| +    expression = CheckAndRewriteReferenceExpression( | 
| expression, lhs_beg_pos, scanner()->location().end_pos, | 
| MessageTemplate::kInvalidLhsInPostfixOp, CHECK_OK); | 
| expression = impl()->MarkExpressionAsAssigned(expression); | 
| @@ -2823,12 +2817,12 @@ ParserBase<Impl>::ParseLeftHandSideExpression(ExpressionClassifier* classifier, | 
| //   (NewExpression | MemberExpression) ... | 
|  | 
| if (FLAG_harmony_explicit_tailcalls && peek() == Token::CONTINUE) { | 
| -    return this->ParseTailCallExpression(classifier, ok); | 
| +    return ParseTailCallExpression(classifier, ok); | 
| } | 
|  | 
| bool is_async = false; | 
| -  ExpressionT result = this->ParseMemberWithNewPrefixesExpression( | 
| -      classifier, &is_async, CHECK_OK); | 
| +  ExpressionT result = | 
| +      ParseMemberWithNewPrefixesExpression(classifier, &is_async, CHECK_OK); | 
|  | 
| while (true) { | 
| switch (peek()) { | 
| @@ -2890,7 +2884,7 @@ ParserBase<Impl>::ParseLeftHandSideExpression(ExpressionClassifier* classifier, | 
| } | 
| if (args->length()) { | 
| // async ( Arguments ) => ... | 
| -              return Traits::ExpressionListToExpression(args); | 
| +              return impl()->ExpressionListToExpression(args); | 
| } | 
| // async () => ... | 
| return factory()->NewEmptyParentheses(pos); | 
| @@ -3000,15 +2994,15 @@ ParserBase<Impl>::ParseMemberWithNewPrefixesExpression( | 
| } else if (peek() == Token::PERIOD) { | 
| return ParseNewTargetExpression(CHECK_OK); | 
| } else { | 
| -      result = this->ParseMemberWithNewPrefixesExpression(classifier, is_async, | 
| -                                                          CHECK_OK); | 
| +      result = | 
| +          ParseMemberWithNewPrefixesExpression(classifier, is_async, CHECK_OK); | 
| } | 
| impl()->RewriteNonPattern(classifier, CHECK_OK); | 
| if (peek() == Token::LPAREN) { | 
| // NewExpression with arguments. | 
| Scanner::Location spread_pos; | 
| typename Traits::Type::ExpressionList args = | 
| -          this->ParseArguments(&spread_pos, classifier, CHECK_OK); | 
| +          ParseArguments(&spread_pos, classifier, CHECK_OK); | 
|  | 
| if (spread_pos.IsValid()) { | 
| args = impl()->PrepareSpreadArguments(args); | 
| @@ -3017,15 +3011,15 @@ ParserBase<Impl>::ParseMemberWithNewPrefixesExpression( | 
| result = factory()->NewCallNew(result, args, new_pos); | 
| } | 
| // The expression can still continue with . or [ after the arguments. | 
| -      result = this->ParseMemberExpressionContinuation(result, is_async, | 
| -                                                       classifier, CHECK_OK); | 
| +      result = ParseMemberExpressionContinuation(result, is_async, classifier, | 
| +                                                 CHECK_OK); | 
| return result; | 
| } | 
| // NewExpression without arguments. | 
| return factory()->NewCallNew(result, impl()->NewExpressionList(0), new_pos); | 
| } | 
| // No 'new' or 'super' keyword. | 
| -  return this->ParseMemberExpression(classifier, is_async, ok); | 
| +  return ParseMemberExpression(classifier, is_async, ok); | 
| } | 
|  | 
| template <typename Impl> | 
| @@ -3172,7 +3166,7 @@ ParserBase<Impl>::ParseMemberExpressionContinuation( | 
|  | 
| Consume(Token::LBRACK); | 
| int pos = position(); | 
| -        ExpressionT index = this->ParseExpression(true, classifier, CHECK_OK); | 
| +        ExpressionT index = ParseExpression(true, classifier, CHECK_OK); | 
| impl()->RewriteNonPattern(classifier, CHECK_OK); | 
| expression = factory()->NewProperty(expression, index, pos); | 
| if (fni_ != NULL) { | 
| @@ -3260,10 +3254,10 @@ void ParserBase<Impl>::ParseFormalParameter(FormalParametersT* parameters, | 
| init_classifier.Discard(); | 
| classifier->RecordNonSimpleParameter(); | 
|  | 
| -    Traits::SetFunctionNameFromIdentifierRef(initializer, pattern); | 
| +    impl()->SetFunctionNameFromIdentifierRef(initializer, pattern); | 
| } | 
|  | 
| -  Traits::AddFormalParameter(parameters, pattern, initializer, | 
| +  impl()->AddFormalParameter(parameters, pattern, initializer, | 
| scanner()->location().end_pos, is_rest); | 
| } | 
|  | 
| @@ -3314,7 +3308,7 @@ void ParserBase<Impl>::ParseFormalParameterList( | 
|  | 
| for (int i = 0; i < parameters->Arity(); ++i) { | 
| auto parameter = parameters->at(i); | 
| -    Traits::DeclareFormalParameter(parameters->scope, parameter, classifier); | 
| +    impl()->DeclareFormalParameter(parameters->scope, parameter, classifier); | 
| } | 
| } | 
|  | 
| @@ -3417,7 +3411,7 @@ ParserBase<Impl>::ParseArrowFunctionLiteral( | 
| function_state.SkipMaterializedLiterals( | 
| formal_parameters.materialized_literals_count); | 
|  | 
| -    this->ReindexLiterals(formal_parameters); | 
| +    impl()->ReindexLiterals(formal_parameters); | 
|  | 
| Expect(Token::ARROW, CHECK_OK); | 
|  | 
| @@ -3451,8 +3445,8 @@ ParserBase<Impl>::ParseArrowFunctionLiteral( | 
| ReturnExprScope allow_tail_calls( | 
| function_state_, ReturnExprContext::kInsideValidReturnStatement); | 
| body = impl()->NewStatementList(1); | 
| -      this->AddParameterInitializationBlock(formal_parameters, body, is_async, | 
| -                                            CHECK_OK); | 
| +      impl()->AddParameterInitializationBlock(formal_parameters, body, is_async, | 
| +                                              CHECK_OK); | 
| ExpressionClassifier classifier(this); | 
| if (is_async) { | 
| impl()->ParseAsyncArrowSingleExpressionBody(body, accept_IN, | 
| @@ -3480,8 +3474,8 @@ ParserBase<Impl>::ParseArrowFunctionLiteral( | 
| // that duplicates are not allowed.  Of course, the arrow function may | 
| // itself be strict as well. | 
| const bool allow_duplicate_parameters = false; | 
| -    this->ValidateFormalParameters(&formals_classifier, language_mode(), | 
| -                                   allow_duplicate_parameters, CHECK_OK); | 
| +    ValidateFormalParameters(&formals_classifier, language_mode(), | 
| +                             allow_duplicate_parameters, CHECK_OK); | 
|  | 
| // Validate strict mode. | 
| if (is_strict(language_mode())) { | 
| @@ -3563,7 +3557,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseTemplateLiteral( | 
| } | 
|  | 
| int expr_pos = peek_position(); | 
| -    ExpressionT expression = this->ParseExpression(true, classifier, CHECK_OK); | 
| +    ExpressionT expression = ParseExpression(true, classifier, CHECK_OK); | 
| CheckNoTailCallExpressions(classifier, CHECK_OK); | 
| impl()->RewriteNonPattern(classifier, CHECK_OK); | 
| impl()->AddTemplateExpression(&ts, expression); | 
| @@ -3608,8 +3602,8 @@ typename ParserBase<Impl>::ExpressionT | 
| ParserBase<Impl>::CheckAndRewriteReferenceExpression( | 
| ExpressionT expression, int beg_pos, int end_pos, | 
| MessageTemplate::Template message, bool* ok) { | 
| -  return this->CheckAndRewriteReferenceExpression(expression, beg_pos, end_pos, | 
| -                                                  message, kReferenceError, ok); | 
| +  return CheckAndRewriteReferenceExpression(expression, beg_pos, end_pos, | 
| +                                            message, kReferenceError, ok); | 
| } | 
|  | 
| template <typename Impl> | 
|  |