| Index: src/parsing/parser-base.h | 
| diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h | 
| index d4d4b74c9e7abbd964fca31adcbd82193cc2d602..ae0539c86efe54826e8a87a2736834fe294119f8 100644 | 
| --- a/src/parsing/parser-base.h | 
| +++ b/src/parsing/parser-base.h | 
| @@ -127,7 +127,7 @@ struct FormalParametersBase { | 
| // is correct (e.g. an if statement branch w/o braces)! | 
|  | 
| #define CHECK_OK_CUSTOM(x) ok); \ | 
| -  if (!*ok) return this->x();   \ | 
| +  if (!*ok) return impl()->x(); \ | 
| ((void)0 | 
| #define DUMMY )  // to make indentation work | 
| #undef DUMMY | 
| @@ -818,7 +818,7 @@ class ParserBase : public ParserBaseTraits<Impl> { | 
| Scanner::Location octal = scanner()->octal_position(); | 
| if (octal.IsValid() && beg_pos <= octal.beg_pos && | 
| octal.end_pos <= end_pos) { | 
| -      ReportMessageAt(octal, message); | 
| +      impl()->ReportMessageAt(octal, message); | 
| scanner()->clear_octal_position(); | 
| *ok = false; | 
| } | 
| @@ -860,13 +860,13 @@ class ParserBase : public ParserBaseTraits<Impl> { | 
| if (is_sloppy(language_mode)) return; | 
|  | 
| if (impl()->IsEvalOrArguments(function_name)) { | 
| -      Traits::ReportMessageAt(function_name_loc, | 
| +      impl()->ReportMessageAt(function_name_loc, | 
| MessageTemplate::kStrictEvalArguments); | 
| *ok = false; | 
| return; | 
| } | 
| if (function_name_validity == kFunctionNameIsStrictReserved) { | 
| -      Traits::ReportMessageAt(function_name_loc, | 
| +      impl()->ReportMessageAt(function_name_loc, | 
| MessageTemplate::kUnexpectedStrictReserved); | 
| *ok = false; | 
| return; | 
| @@ -896,34 +896,20 @@ class ParserBase : public ParserBaseTraits<Impl> { | 
| void ReportMessage(MessageTemplate::Template message, const char* arg = NULL, | 
| ParseErrorType error_type = kSyntaxError) { | 
| Scanner::Location source_location = scanner()->location(); | 
| -    Traits::ReportMessageAt(source_location, message, arg, error_type); | 
| +    impl()->ReportMessageAt(source_location, message, arg, error_type); | 
| } | 
|  | 
| void ReportMessage(MessageTemplate::Template message, const AstRawString* arg, | 
| ParseErrorType error_type = kSyntaxError) { | 
| Scanner::Location source_location = scanner()->location(); | 
| -    Traits::ReportMessageAt(source_location, message, arg, error_type); | 
| -  } | 
| - | 
| -  void ReportMessageAt(Scanner::Location location, | 
| -                       MessageTemplate::Template message, | 
| -                       const char* arg = NULL, | 
| -                       ParseErrorType error_type = kSyntaxError) { | 
| -    Traits::ReportMessageAt(location, message, arg, error_type); | 
| -  } | 
| - | 
| -  void ReportMessageAt(Scanner::Location location, | 
| -                       MessageTemplate::Template message, | 
| -                       const AstRawString* arg, | 
| -                       ParseErrorType error_type = kSyntaxError) { | 
| -    Traits::ReportMessageAt(location, message, arg, error_type); | 
| +    impl()->ReportMessageAt(source_location, message, arg, error_type); | 
| } | 
|  | 
| void ReportMessageAt(Scanner::Location location, | 
| MessageTemplate::Template message, | 
| ParseErrorType error_type) { | 
| -    ReportMessageAt(location, message, static_cast<const char*>(nullptr), | 
| -                    error_type); | 
| +    impl()->ReportMessageAt(location, message, | 
| +                            static_cast<const char*>(nullptr), error_type); | 
| } | 
|  | 
| void GetUnexpectedTokenMessage( | 
| @@ -938,7 +924,7 @@ class ParserBase : public ParserBaseTraits<Impl> { | 
|  | 
| void ReportClassifierError( | 
| const typename ExpressionClassifier::Error& error) { | 
| -    Traits::ReportMessageAt(error.location, error.message, error.arg, | 
| +    impl()->ReportMessageAt(error.location, error.message, error.arg, | 
| error.type); | 
| } | 
|  | 
| @@ -1006,7 +992,7 @@ class ParserBase : public ParserBaseTraits<Impl> { | 
| if (classifier->is_valid_binding_pattern()) { | 
| // A simple arrow formal parameter: IDENTIFIER => BODY. | 
| if (!impl()->IsIdentifier(expr)) { | 
| -        Traits::ReportMessageAt(scanner()->location(), | 
| +        impl()->ReportMessageAt(scanner()->location(), | 
| MessageTemplate::kUnexpectedToken, | 
| Token::String(scanner()->current_token())); | 
| *ok = false; | 
| @@ -1413,7 +1399,7 @@ void ParserBase<Impl>::ReportUnexpectedTokenAt( | 
| MessageTemplate::Template message) { | 
| const char* arg; | 
| GetUnexpectedTokenMessage(token, &message, &source_location, &arg); | 
| -  Traits::ReportMessageAt(source_location, message, arg); | 
| +  impl()->ReportMessageAt(source_location, message, arg); | 
| } | 
|  | 
| template <typename Impl> | 
| @@ -1473,7 +1459,7 @@ ParserBase<Impl>::ParseAndClassifyIdentifier(ExpressionClassifier* classifier, | 
| is_strict(language_mode())) { | 
| ReportUnexpectedToken(next); | 
| *ok = false; | 
| -      return Traits::EmptyIdentifier(); | 
| +      return impl()->EmptyIdentifier(); | 
| } | 
| if (next == Token::LET || | 
| (next == Token::ESCAPED_STRICT_RESERVED_WORD && | 
| @@ -1485,7 +1471,7 @@ ParserBase<Impl>::ParseAndClassifyIdentifier(ExpressionClassifier* classifier, | 
| } else { | 
| this->ReportUnexpectedToken(next); | 
| *ok = false; | 
| -    return Traits::EmptyIdentifier(); | 
| +    return impl()->EmptyIdentifier(); | 
| } | 
| } | 
|  | 
| @@ -1505,7 +1491,7 @@ ParserBase<Impl>::ParseIdentifierOrStrictReservedWord( | 
| } else { | 
| ReportUnexpectedToken(next); | 
| *ok = false; | 
| -    return Traits::EmptyIdentifier(); | 
| +    return impl()->EmptyIdentifier(); | 
| } | 
|  | 
| return this->GetSymbol(scanner()); | 
| @@ -1523,7 +1509,7 @@ typename ParserBase<Impl>::IdentifierT ParserBase<Impl>::ParseIdentifierName( | 
| next != Token::ESCAPED_STRICT_RESERVED_WORD && !Token::IsKeyword(next)) { | 
| this->ReportUnexpectedToken(next); | 
| *ok = false; | 
| -    return Traits::EmptyIdentifier(); | 
| +    return impl()->EmptyIdentifier(); | 
| } | 
|  | 
| return this->GetSymbol(scanner()); | 
| @@ -1537,7 +1523,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseRegExpLiteral( | 
| Next(); | 
| ReportMessage(MessageTemplate::kUnterminatedRegExp); | 
| *ok = false; | 
| -    return Traits::EmptyExpression(); | 
| +    return impl()->EmptyExpression(); | 
| } | 
|  | 
| int literal_index = function_state_->NextMaterializedLiteralIndex(); | 
| @@ -1548,7 +1534,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseRegExpLiteral( | 
| Next(); | 
| ReportMessage(MessageTemplate::kMalformedRegExpFlags); | 
| *ok = false; | 
| -    return Traits::EmptyExpression(); | 
| +    return impl()->EmptyExpression(); | 
| } | 
| int js_flags = flags.FromJust(); | 
| Next(); | 
| @@ -1671,10 +1657,10 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParsePrimaryExpression( | 
| MessageTemplate::kInvalidRestParameter); | 
| } | 
| if (peek() == Token::COMMA) { | 
| -          ReportMessageAt(scanner()->peek_location(), | 
| -                          MessageTemplate::kParamAfterRest); | 
| +          impl()->ReportMessageAt(scanner()->peek_location(), | 
| +                                  MessageTemplate::kParamAfterRest); | 
| *ok = false; | 
| -          return this->EmptyExpression(); | 
| +          return impl()->EmptyExpression(); | 
| } | 
| Expect(Token::RPAREN, CHECK_OK); | 
| return factory()->NewSpread(expr, ellipsis_pos, expr_pos); | 
| @@ -1692,7 +1678,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParsePrimaryExpression( | 
| BindingPatternUnexpectedToken(classifier); | 
| Consume(Token::CLASS); | 
| int class_token_position = position(); | 
| -      IdentifierT name = this->EmptyIdentifier(); | 
| +      IdentifierT name = impl()->EmptyIdentifier(); | 
| bool is_strict_reserved_name = false; | 
| Scanner::Location class_name_location = Scanner::Location::invalid(); | 
| if (peek_any_identifier()) { | 
| @@ -1731,7 +1717,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParsePrimaryExpression( | 
|  | 
| ReportUnexpectedToken(Next()); | 
| *ok = false; | 
| -  return this->EmptyExpression(); | 
| +  return impl()->EmptyExpression(); | 
| } | 
|  | 
| template <typename Impl> | 
| @@ -1822,7 +1808,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseArrayLiteral( | 
| while (peek() != Token::RBRACK) { | 
| ExpressionT elem; | 
| if (peek() == Token::COMMA) { | 
| -      elem = this->GetLiteralTheHole(peek_position(), factory()); | 
| +      elem = impl()->GetLiteralTheHole(peek_position()); | 
| } else if (peek() == Token::ELLIPSIS) { | 
| int start_pos = peek_position(); | 
| Consume(Token::ELLIPSIS); | 
| @@ -1878,7 +1864,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseArrayLiteral( | 
| // to change.  Also, this error message will never appear while pre- | 
| // parsing (this is OK, as it is an implementation limitation). | 
| ReportMessage(MessageTemplate::kTooManySpreads); | 
| -      return this->EmptyExpression(); | 
| +      return impl()->EmptyExpression(); | 
| } | 
| } | 
| return result; | 
| @@ -2107,7 +2093,7 @@ ParserBase<Impl>::ParsePropertyDefinition( | 
| if (in_class && name_token == Token::STATIC && IsNormalMethod(method_kind)) { | 
| // ClassElement (static) | 
| //    'static' MethodDefinition | 
| -    *name = this->EmptyIdentifier(); | 
| +    *name = impl()->EmptyIdentifier(); | 
| ObjectLiteralPropertyT property = ParsePropertyDefinition( | 
| checker, true, has_extends, MethodKind::kStatic, is_computed_name, | 
| nullptr, classifier, name, ok); | 
| @@ -2119,7 +2105,7 @@ ParserBase<Impl>::ParsePropertyDefinition( | 
| // MethodDefinition (Accessors) | 
| //    get PropertyName '(' ')' '{' FunctionBody '}' | 
| //    set PropertyName '(' PropertySetParameterList ')' '{' FunctionBody '}' | 
| -    *name = this->EmptyIdentifier(); | 
| +    *name = impl()->EmptyIdentifier(); | 
| bool dont_care = false; | 
| name_token = peek(); | 
|  | 
| @@ -2156,7 +2142,7 @@ ParserBase<Impl>::ParsePropertyDefinition( | 
| Token::Value next = Next(); | 
| ReportUnexpectedToken(next); | 
| *ok = false; | 
| -  return this->EmptyObjectLiteralProperty(); | 
| +  return impl()->EmptyObjectLiteralProperty(); | 
| } | 
|  | 
| template <typename Impl> | 
| @@ -2180,7 +2166,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseObjectLiteral( | 
| const bool in_class = false; | 
| const bool has_extends = false; | 
| bool is_computed_name = false; | 
| -    IdentifierT name = this->EmptyIdentifier(); | 
| +    IdentifierT name = impl()->EmptyIdentifier(); | 
| ObjectLiteralPropertyT property = this->ParsePropertyDefinition( | 
| &checker, in_class, has_extends, MethodKind::kNormal, &is_computed_name, | 
| NULL, classifier, &name, CHECK_OK); | 
| @@ -2263,7 +2249,7 @@ ParserBase<Impl>::ParseArguments(Scanner::Location* first_spread_arg_loc, | 
| if (result->length() > Code::kMaxArguments) { | 
| ReportMessage(MessageTemplate::kTooManyArguments); | 
| *ok = false; | 
| -      return this->NullExpressionList(); | 
| +      return impl()->NullExpressionList(); | 
| } | 
| done = (peek() != Token::COMMA); | 
| if (!done) { | 
| @@ -2276,9 +2262,9 @@ ParserBase<Impl>::ParseArguments(Scanner::Location* first_spread_arg_loc, | 
| } | 
| Scanner::Location location = scanner_->location(); | 
| if (Token::RPAREN != Next()) { | 
| -    ReportMessageAt(location, MessageTemplate::kUnterminatedArgList); | 
| +    impl()->ReportMessageAt(location, MessageTemplate::kUnterminatedArgList); | 
| *ok = false; | 
| -    return this->NullExpressionList(); | 
| +    return impl()->NullExpressionList(); | 
| } | 
| *first_spread_arg_loc = spread_arg; | 
|  | 
| @@ -2520,7 +2506,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseYieldExpression( | 
| ExpressionT generator_object = | 
| factory()->NewVariableProxy(function_state_->generator_object_variable()); | 
| // The following initialization is necessary. | 
| -  ExpressionT expression = Traits::EmptyExpression(); | 
| +  ExpressionT expression = impl()->EmptyExpression(); | 
| bool delegating = false;  // yield* | 
| if (!scanner()->HasAnyLineTerminatorBeforeNext()) { | 
| if (Check(Token::MUL)) delegating = true; | 
| @@ -2549,7 +2535,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseYieldExpression( | 
| return impl()->RewriteYieldStar(generator_object, expression, pos); | 
| } | 
|  | 
| -  expression = Traits::BuildIteratorResult(expression, false); | 
| +  expression = impl()->BuildIteratorResult(expression, false); | 
| // Hackily disambiguate o from o.next and o [Symbol.iterator](). | 
| // TODO(verwaest): Come up with a better solution. | 
| typename Traits::Type::YieldExpression yield = factory()->NewYield( | 
| @@ -2576,20 +2562,22 @@ ParserBase<Impl>::ParseTailCallExpression(ExpressionClassifier* classifier, | 
| Scanner::Location loc(pos, scanner()->location().end_pos); | 
| if (!expression->IsCall()) { | 
| Scanner::Location sub_loc(sub_expression_pos, loc.end_pos); | 
| -    ReportMessageAt(sub_loc, MessageTemplate::kUnexpectedInsideTailCall); | 
| +    impl()->ReportMessageAt(sub_loc, | 
| +                            MessageTemplate::kUnexpectedInsideTailCall); | 
| *ok = false; | 
| -    return Traits::EmptyExpression(); | 
| +    return impl()->EmptyExpression(); | 
| } | 
| if (impl()->IsDirectEvalCall(expression)) { | 
| Scanner::Location sub_loc(sub_expression_pos, loc.end_pos); | 
| -    ReportMessageAt(sub_loc, MessageTemplate::kUnexpectedTailCallOfEval); | 
| +    impl()->ReportMessageAt(sub_loc, | 
| +                            MessageTemplate::kUnexpectedTailCallOfEval); | 
| *ok = false; | 
| -    return Traits::EmptyExpression(); | 
| +    return impl()->EmptyExpression(); | 
| } | 
| if (!is_strict(language_mode())) { | 
| -    ReportMessageAt(loc, MessageTemplate::kUnexpectedSloppyTailCall); | 
| +    impl()->ReportMessageAt(loc, MessageTemplate::kUnexpectedSloppyTailCall); | 
| *ok = false; | 
| -    return Traits::EmptyExpression(); | 
| +    return impl()->EmptyExpression(); | 
| } | 
| ReturnExprContext return_expr_context = | 
| function_state_->return_expr_context(); | 
| @@ -2598,7 +2586,7 @@ ParserBase<Impl>::ParseTailCallExpression(ExpressionClassifier* classifier, | 
| switch (return_expr_context) { | 
| case ReturnExprContext::kInsideValidReturnStatement: | 
| UNREACHABLE(); | 
| -        return Traits::EmptyExpression(); | 
| +        return impl()->EmptyExpression(); | 
| case ReturnExprContext::kInsideValidBlock: | 
| msg = MessageTemplate::kUnexpectedTailCall; | 
| break; | 
| @@ -2609,9 +2597,9 @@ ParserBase<Impl>::ParseTailCallExpression(ExpressionClassifier* classifier, | 
| msg = MessageTemplate::kUnexpectedTailCallInForInOf; | 
| break; | 
| } | 
| -    ReportMessageAt(loc, msg); | 
| +    impl()->ReportMessageAt(loc, msg); | 
| *ok = false; | 
| -    return Traits::EmptyExpression(); | 
| +    return impl()->EmptyExpression(); | 
| } | 
| classifier->RecordTailCallExpressionError( | 
| loc, MessageTemplate::kUnexpectedTailCall); | 
| @@ -2740,18 +2728,18 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseUnaryExpression( | 
| // "delete identifier" is a syntax error in strict mode. | 
| ReportMessage(MessageTemplate::kStrictDelete); | 
| *ok = false; | 
| -        return this->EmptyExpression(); | 
| +        return impl()->EmptyExpression(); | 
| } | 
| } | 
|  | 
| if (peek() == Token::EXP) { | 
| ReportUnexpectedToken(Next()); | 
| *ok = false; | 
| -      return this->EmptyExpression(); | 
| +      return impl()->EmptyExpression(); | 
| } | 
|  | 
| // Allow Traits do rewrite the expression. | 
| -    return this->BuildUnaryExpression(expression, op, pos, factory()); | 
| +    return impl()->BuildUnaryExpression(expression, op, pos); | 
| } else if (Token::IsCountOp(op)) { | 
| BindingPatternUnexpectedToken(classifier); | 
| ArrowFormalParametersUnexpectedToken(classifier); | 
| @@ -2887,7 +2875,7 @@ ParserBase<Impl>::ParseLeftHandSideExpression(ExpressionClassifier* classifier, | 
| ReportClassifierError( | 
| async_classifier.async_arrow_formal_parameters_error()); | 
| *ok = false; | 
| -              return this->EmptyExpression(); | 
| +              return impl()->EmptyExpression(); | 
| } | 
| if (args->length()) { | 
| // async ( Arguments ) => ... | 
| @@ -3057,10 +3045,10 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseMemberExpression( | 
|  | 
| if (!is_generator()) { | 
| // TODO(neis): allow escaping into closures? | 
| -        ReportMessageAt(scanner()->location(), | 
| -                        MessageTemplate::kUnexpectedFunctionSent); | 
| +        impl()->ReportMessageAt(scanner()->location(), | 
| +                                MessageTemplate::kUnexpectedFunctionSent); | 
| *ok = false; | 
| -        return this->EmptyExpression(); | 
| +        return impl()->EmptyExpression(); | 
| } | 
|  | 
| return this->FunctionSentExpression(factory(), pos); | 
| @@ -3069,7 +3057,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseMemberExpression( | 
| FunctionKind function_kind = Check(Token::MUL) | 
| ? FunctionKind::kGeneratorFunction | 
| : FunctionKind::kNormalFunction; | 
| -    IdentifierT name = this->EmptyIdentifier(); | 
| +    IdentifierT name = impl()->EmptyIdentifier(); | 
| bool is_strict_reserved_name = false; | 
| Scanner::Location function_name_location = Scanner::Location::invalid(); | 
| FunctionLiteral::FunctionType function_type = | 
| @@ -3121,9 +3109,10 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseSuperExpression( | 
| } | 
| } | 
|  | 
| -  ReportMessageAt(scanner()->location(), MessageTemplate::kUnexpectedSuper); | 
| +  impl()->ReportMessageAt(scanner()->location(), | 
| +                          MessageTemplate::kUnexpectedSuper); | 
| *ok = false; | 
| -  return this->EmptyExpression(); | 
| +  return impl()->EmptyExpression(); | 
| } | 
|  | 
| template <typename Impl> | 
| @@ -3133,7 +3122,7 @@ void ParserBase<Impl>::ExpectMetaProperty(Vector<const char> property_name, | 
| Consume(Token::PERIOD); | 
| ExpectContextualKeyword(property_name, CHECK_OK_CUSTOM(Void)); | 
| if (scanner()->literal_contains_escapes()) { | 
| -    Traits::ReportMessageAt( | 
| +    impl()->ReportMessageAt( | 
| Scanner::Location(pos, scanner()->location().end_pos), | 
| MessageTemplate::kInvalidEscapedMetaProperty, full_name); | 
| *ok = false; | 
| @@ -3147,10 +3136,10 @@ ParserBase<Impl>::ParseNewTargetExpression(bool* ok) { | 
| ExpectMetaProperty(CStrVector("target"), "new.target", pos, CHECK_OK); | 
|  | 
| if (!GetReceiverScope()->is_function_scope()) { | 
| -    ReportMessageAt(scanner()->location(), | 
| -                    MessageTemplate::kUnexpectedNewTarget); | 
| +    impl()->ReportMessageAt(scanner()->location(), | 
| +                            MessageTemplate::kUnexpectedNewTarget); | 
| *ok = false; | 
| -    return this->EmptyExpression(); | 
| +    return impl()->EmptyExpression(); | 
| } | 
|  | 
| return this->NewTargetExpression(pos); | 
| @@ -3222,14 +3211,14 @@ ParserBase<Impl>::ParseMemberExpressionContinuation( | 
| case Token::ILLEGAL: { | 
| ReportUnexpectedTokenAt(scanner()->peek_location(), Token::ILLEGAL); | 
| *ok = false; | 
| -        return this->EmptyExpression(); | 
| +        return impl()->EmptyExpression(); | 
| } | 
| default: | 
| return expression; | 
| } | 
| } | 
| DCHECK(false); | 
| -  return this->EmptyExpression(); | 
| +  return impl()->EmptyExpression(); | 
| } | 
|  | 
| template <typename Impl> | 
| @@ -3250,7 +3239,7 @@ void ParserBase<Impl>::ParseFormalParameter(FormalParametersT* parameters, | 
| classifier->RecordNonSimpleParameter(); | 
| } | 
|  | 
| -  ExpressionT initializer = Traits::EmptyExpression(); | 
| +  ExpressionT initializer = impl()->EmptyExpression(); | 
| if (!is_rest && Check(Token::ASSIGN)) { | 
| ExpressionClassifier init_classifier(this); | 
| initializer = ParseAssignmentExpression(true, &init_classifier, | 
| @@ -3298,8 +3287,8 @@ void ParserBase<Impl>::ParseFormalParameterList( | 
| parameters->is_simple = false; | 
| classifier->RecordNonSimpleParameter(); | 
| if (peek() == Token::COMMA) { | 
| -          ReportMessageAt(scanner()->peek_location(), | 
| -                          MessageTemplate::kParamAfterRest); | 
| +          impl()->ReportMessageAt(scanner()->peek_location(), | 
| +                                  MessageTemplate::kParamAfterRest); | 
| *ok = false; | 
| return; | 
| } | 
| @@ -3327,19 +3316,22 @@ void ParserBase<Impl>::CheckArityRestrictions(int param_count, | 
| int formals_end_pos, bool* ok) { | 
| if (IsGetterFunction(function_kind)) { | 
| if (param_count != 0) { | 
| -      ReportMessageAt(Scanner::Location(formals_start_pos, formals_end_pos), | 
| -                      MessageTemplate::kBadGetterArity); | 
| +      impl()->ReportMessageAt( | 
| +          Scanner::Location(formals_start_pos, formals_end_pos), | 
| +          MessageTemplate::kBadGetterArity); | 
| *ok = false; | 
| } | 
| } else if (IsSetterFunction(function_kind)) { | 
| if (param_count != 1) { | 
| -      ReportMessageAt(Scanner::Location(formals_start_pos, formals_end_pos), | 
| -                      MessageTemplate::kBadSetterArity); | 
| +      impl()->ReportMessageAt( | 
| +          Scanner::Location(formals_start_pos, formals_end_pos), | 
| +          MessageTemplate::kBadSetterArity); | 
| *ok = false; | 
| } | 
| if (has_rest) { | 
| -      ReportMessageAt(Scanner::Location(formals_start_pos, formals_end_pos), | 
| -                      MessageTemplate::kBadSetterRestParameter); | 
| +      impl()->ReportMessageAt( | 
| +          Scanner::Location(formals_start_pos, formals_end_pos), | 
| +          MessageTemplate::kBadSetterRestParameter); | 
| *ok = false; | 
| } | 
| } | 
| @@ -3399,7 +3391,7 @@ ParserBase<Impl>::ParseArrowFunctionLiteral( | 
| // If next token is not `=>`, it's a syntax error anyways. | 
| ReportUnexpectedTokenAt(scanner_->peek_location(), Token::ARROW); | 
| *ok = false; | 
| -    return this->EmptyExpression(); | 
| +    return impl()->EmptyExpression(); | 
| } | 
|  | 
| typename Traits::Type::StatementList body; | 
| @@ -3435,7 +3427,7 @@ ParserBase<Impl>::ParseArrowFunctionLiteral( | 
| } | 
| } else { | 
| body = impl()->ParseEagerFunctionBody( | 
| -            this->EmptyIdentifier(), kNoSourcePosition, formal_parameters, | 
| +            impl()->EmptyIdentifier(), kNoSourcePosition, formal_parameters, | 
| arrow_kind, FunctionLiteral::kAnonymousExpression, CHECK_OK); | 
| materialized_literal_count = | 
| function_state.materialized_literal_count(); | 
| @@ -3492,7 +3484,7 @@ ParserBase<Impl>::ParseArrowFunctionLiteral( | 
| } | 
|  | 
| FunctionLiteralT function_literal = factory()->NewFunctionLiteral( | 
| -      this->EmptyIdentifierString(), formal_parameters.scope, body, | 
| +      impl()->EmptyIdentifierString(), formal_parameters.scope, body, | 
| materialized_literal_count, expected_property_count, num_parameters, | 
| FunctionLiteral::kNoDuplicateParameters, | 
| FunctionLiteral::kAnonymousExpression, | 
| @@ -3548,16 +3540,16 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseTemplateLiteral( | 
| CheckTemplateOctalLiteral(pos, peek_position(), CHECK_OK); | 
| next = peek(); | 
| if (next == Token::EOS) { | 
| -      ReportMessageAt(Scanner::Location(start, peek_position()), | 
| -                      MessageTemplate::kUnterminatedTemplate); | 
| +      impl()->ReportMessageAt(Scanner::Location(start, peek_position()), | 
| +                              MessageTemplate::kUnterminatedTemplate); | 
| *ok = false; | 
| -      return Traits::EmptyExpression(); | 
| +      return impl()->EmptyExpression(); | 
| } else if (next == Token::ILLEGAL) { | 
| -      Traits::ReportMessageAt( | 
| +      impl()->ReportMessageAt( | 
| Scanner::Location(position() + 1, peek_position()), | 
| MessageTemplate::kUnexpectedToken, "ILLEGAL", kSyntaxError); | 
| *ok = false; | 
| -      return Traits::EmptyExpression(); | 
| +      return impl()->EmptyExpression(); | 
| } | 
|  | 
| int expr_pos = peek_position(); | 
| @@ -3567,10 +3559,10 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseTemplateLiteral( | 
| impl()->AddTemplateExpression(&ts, expression); | 
|  | 
| if (peek() != Token::RBRACE) { | 
| -      ReportMessageAt(Scanner::Location(expr_pos, peek_position()), | 
| -                      MessageTemplate::kUnterminatedTemplateExpr); | 
| +      impl()->ReportMessageAt(Scanner::Location(expr_pos, peek_position()), | 
| +                              MessageTemplate::kUnterminatedTemplateExpr); | 
| *ok = false; | 
| -      return Traits::EmptyExpression(); | 
| +      return impl()->EmptyExpression(); | 
| } | 
|  | 
| // If we didn't die parsing that expression, our next token should be a | 
| @@ -3580,16 +3572,16 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseTemplateLiteral( | 
| pos = position(); | 
|  | 
| if (next == Token::EOS) { | 
| -      ReportMessageAt(Scanner::Location(start, pos), | 
| -                      MessageTemplate::kUnterminatedTemplate); | 
| +      impl()->ReportMessageAt(Scanner::Location(start, pos), | 
| +                              MessageTemplate::kUnterminatedTemplate); | 
| *ok = false; | 
| -      return Traits::EmptyExpression(); | 
| +      return impl()->EmptyExpression(); | 
| } else if (next == Token::ILLEGAL) { | 
| -      Traits::ReportMessageAt( | 
| +      impl()->ReportMessageAt( | 
| Scanner::Location(position() + 1, peek_position()), | 
| MessageTemplate::kUnexpectedToken, "ILLEGAL", kSyntaxError); | 
| *ok = false; | 
| -      return Traits::EmptyExpression(); | 
| +      return impl()->EmptyExpression(); | 
| } | 
|  | 
| impl()->AddTemplateSpan(&ts, next == Token::TEMPLATE_TAIL); | 
| @@ -3620,7 +3612,7 @@ ParserBase<Impl>::CheckAndRewriteReferenceExpression( | 
| ReportMessageAt(Scanner::Location(beg_pos, end_pos), | 
| MessageTemplate::kStrictEvalArguments, kSyntaxError); | 
| *ok = false; | 
| -    return this->EmptyExpression(); | 
| +    return impl()->EmptyExpression(); | 
| } | 
| if (expression->IsValidReferenceExpression()) { | 
| return expression; | 
| @@ -3628,12 +3620,12 @@ ParserBase<Impl>::CheckAndRewriteReferenceExpression( | 
| if (expression->IsCall()) { | 
| // If it is a call, make it a runtime error for legacy web compatibility. | 
| // Rewrite `expr' to `expr[throw ReferenceError]'. | 
| -    ExpressionT error = this->NewThrowReferenceError(message, beg_pos); | 
| +    ExpressionT error = impl()->NewThrowReferenceError(message, beg_pos); | 
| return factory()->NewProperty(expression, error, beg_pos); | 
| } | 
| ReportMessageAt(Scanner::Location(beg_pos, end_pos), message, type); | 
| *ok = false; | 
| -  return this->EmptyExpression(); | 
| +  return impl()->EmptyExpression(); | 
| } | 
|  | 
| template <typename Impl> | 
|  |