Home | History | Annotate | Download | only in parsing
      1 // Copyright 2012 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef V8_PARSING_PREPARSER_H
      6 #define V8_PARSING_PREPARSER_H
      7 
      8 #include "src/ast/scopes.h"
      9 #include "src/parsing/parser-base.h"
     10 
     11 namespace v8 {
     12 namespace internal {
     13 
     14 // Whereas the Parser generates AST during the recursive descent,
     15 // the PreParser doesn't create a tree. Instead, it passes around minimal
     16 // data objects (PreParserExpression, PreParserIdentifier etc.) which contain
     17 // just enough data for the upper layer functions. PreParserFactory is
     18 // responsible for creating these dummy objects. It provides a similar kind of
     19 // interface as AstNodeFactory, so ParserBase doesn't need to care which one is
     20 // used.
     21 
     22 class PreParserIdentifier {
     23  public:
     24   PreParserIdentifier() : type_(kUnknownIdentifier) {}
     25   static PreParserIdentifier Default() {
     26     return PreParserIdentifier(kUnknownIdentifier);
     27   }
     28   static PreParserIdentifier Empty() {
     29     return PreParserIdentifier(kEmptyIdentifier);
     30   }
     31   static PreParserIdentifier Eval() {
     32     return PreParserIdentifier(kEvalIdentifier);
     33   }
     34   static PreParserIdentifier Arguments() {
     35     return PreParserIdentifier(kArgumentsIdentifier);
     36   }
     37   static PreParserIdentifier Undefined() {
     38     return PreParserIdentifier(kUndefinedIdentifier);
     39   }
     40   static PreParserIdentifier FutureReserved() {
     41     return PreParserIdentifier(kFutureReservedIdentifier);
     42   }
     43   static PreParserIdentifier FutureStrictReserved() {
     44     return PreParserIdentifier(kFutureStrictReservedIdentifier);
     45   }
     46   static PreParserIdentifier Let() {
     47     return PreParserIdentifier(kLetIdentifier);
     48   }
     49   static PreParserIdentifier Static() {
     50     return PreParserIdentifier(kStaticIdentifier);
     51   }
     52   static PreParserIdentifier Yield() {
     53     return PreParserIdentifier(kYieldIdentifier);
     54   }
     55   static PreParserIdentifier Prototype() {
     56     return PreParserIdentifier(kPrototypeIdentifier);
     57   }
     58   static PreParserIdentifier Constructor() {
     59     return PreParserIdentifier(kConstructorIdentifier);
     60   }
     61   static PreParserIdentifier Enum() {
     62     return PreParserIdentifier(kEnumIdentifier);
     63   }
     64   static PreParserIdentifier Await() {
     65     return PreParserIdentifier(kAwaitIdentifier);
     66   }
     67   static PreParserIdentifier Async() {
     68     return PreParserIdentifier(kAsyncIdentifier);
     69   }
     70   bool IsEmpty() const { return type_ == kEmptyIdentifier; }
     71   bool IsEval() const { return type_ == kEvalIdentifier; }
     72   bool IsArguments() const { return type_ == kArgumentsIdentifier; }
     73   bool IsEvalOrArguments() const { return IsEval() || IsArguments(); }
     74   bool IsUndefined() const { return type_ == kUndefinedIdentifier; }
     75   bool IsLet() const { return type_ == kLetIdentifier; }
     76   bool IsStatic() const { return type_ == kStaticIdentifier; }
     77   bool IsYield() const { return type_ == kYieldIdentifier; }
     78   bool IsPrototype() const { return type_ == kPrototypeIdentifier; }
     79   bool IsConstructor() const { return type_ == kConstructorIdentifier; }
     80   bool IsEnum() const { return type_ == kEnumIdentifier; }
     81   bool IsAwait() const { return type_ == kAwaitIdentifier; }
     82   bool IsFutureStrictReserved() const {
     83     return type_ == kFutureStrictReservedIdentifier ||
     84            type_ == kLetIdentifier || type_ == kStaticIdentifier ||
     85            type_ == kYieldIdentifier;
     86   }
     87 
     88   // Allow identifier->name()[->length()] to work. The preparser
     89   // does not need the actual positions/lengths of the identifiers.
     90   const PreParserIdentifier* operator->() const { return this; }
     91   const PreParserIdentifier raw_name() const { return *this; }
     92 
     93   int position() const { return 0; }
     94   int length() const { return 0; }
     95 
     96  private:
     97   enum Type {
     98     kEmptyIdentifier,
     99     kUnknownIdentifier,
    100     kFutureReservedIdentifier,
    101     kFutureStrictReservedIdentifier,
    102     kLetIdentifier,
    103     kStaticIdentifier,
    104     kYieldIdentifier,
    105     kEvalIdentifier,
    106     kArgumentsIdentifier,
    107     kUndefinedIdentifier,
    108     kPrototypeIdentifier,
    109     kConstructorIdentifier,
    110     kEnumIdentifier,
    111     kAwaitIdentifier,
    112     kAsyncIdentifier
    113   };
    114 
    115   explicit PreParserIdentifier(Type type) : type_(type), string_(nullptr) {}
    116   Type type_;
    117   // Only non-nullptr when PreParser.track_unresolved_variables_ is true.
    118   const AstRawString* string_;
    119   friend class PreParserExpression;
    120   friend class PreParser;
    121   friend class PreParserFactory;
    122 };
    123 
    124 
    125 class PreParserExpression {
    126  public:
    127   PreParserExpression()
    128       : code_(TypeField::encode(kEmpty)), identifiers_(nullptr) {}
    129 
    130   static PreParserExpression Empty() { return PreParserExpression(); }
    131 
    132   static PreParserExpression Default(
    133       ZoneList<const AstRawString*>* identifiers = nullptr) {
    134     return PreParserExpression(TypeField::encode(kExpression), identifiers);
    135   }
    136 
    137   static PreParserExpression Spread(PreParserExpression expression) {
    138     return PreParserExpression(TypeField::encode(kSpreadExpression),
    139                                expression.identifiers_);
    140   }
    141 
    142   static PreParserExpression FromIdentifier(PreParserIdentifier id,
    143                                             Zone* zone) {
    144     PreParserExpression expression(TypeField::encode(kIdentifierExpression) |
    145                                    IdentifierTypeField::encode(id.type_));
    146     expression.AddIdentifier(id.string_, zone);
    147     return expression;
    148   }
    149 
    150   static PreParserExpression BinaryOperation(PreParserExpression left,
    151                                              Token::Value op,
    152                                              PreParserExpression right) {
    153     return PreParserExpression(TypeField::encode(kBinaryOperationExpression));
    154   }
    155 
    156   static PreParserExpression Assignment() {
    157     return PreParserExpression(TypeField::encode(kExpression) |
    158                                ExpressionTypeField::encode(kAssignment));
    159   }
    160 
    161   static PreParserExpression ObjectLiteral(
    162       ZoneList<const AstRawString*>* identifiers = nullptr) {
    163     return PreParserExpression(TypeField::encode(kObjectLiteralExpression),
    164                                identifiers);
    165   }
    166 
    167   static PreParserExpression ArrayLiteral(
    168       ZoneList<const AstRawString*>* identifiers = nullptr) {
    169     return PreParserExpression(TypeField::encode(kArrayLiteralExpression),
    170                                identifiers);
    171   }
    172 
    173   static PreParserExpression StringLiteral() {
    174     return PreParserExpression(TypeField::encode(kStringLiteralExpression));
    175   }
    176 
    177   static PreParserExpression UseStrictStringLiteral() {
    178     return PreParserExpression(TypeField::encode(kStringLiteralExpression) |
    179                                IsUseStrictField::encode(true));
    180   }
    181 
    182   static PreParserExpression UseAsmStringLiteral() {
    183     return PreParserExpression(TypeField::encode(kStringLiteralExpression) |
    184                                IsUseAsmField::encode(true));
    185   }
    186 
    187   static PreParserExpression This() {
    188     return PreParserExpression(TypeField::encode(kExpression) |
    189                                ExpressionTypeField::encode(kThisExpression));
    190   }
    191 
    192   static PreParserExpression ThisProperty() {
    193     return PreParserExpression(
    194         TypeField::encode(kExpression) |
    195         ExpressionTypeField::encode(kThisPropertyExpression));
    196   }
    197 
    198   static PreParserExpression Property() {
    199     return PreParserExpression(
    200         TypeField::encode(kExpression) |
    201         ExpressionTypeField::encode(kPropertyExpression));
    202   }
    203 
    204   static PreParserExpression Call() {
    205     return PreParserExpression(TypeField::encode(kExpression) |
    206                                ExpressionTypeField::encode(kCallExpression));
    207   }
    208 
    209   static PreParserExpression CallEval() {
    210     return PreParserExpression(
    211         TypeField::encode(kExpression) |
    212         ExpressionTypeField::encode(kCallEvalExpression));
    213   }
    214 
    215   static PreParserExpression SuperCallReference() {
    216     return PreParserExpression(
    217         TypeField::encode(kExpression) |
    218         ExpressionTypeField::encode(kSuperCallReference));
    219   }
    220 
    221   static PreParserExpression NoTemplateTag() {
    222     return PreParserExpression(
    223         TypeField::encode(kExpression) |
    224         ExpressionTypeField::encode(kNoTemplateTagExpression));
    225   }
    226 
    227   bool IsEmpty() const { return TypeField::decode(code_) == kEmpty; }
    228 
    229   bool IsIdentifier() const {
    230     return TypeField::decode(code_) == kIdentifierExpression;
    231   }
    232 
    233   PreParserIdentifier AsIdentifier() const {
    234     DCHECK(IsIdentifier());
    235     return PreParserIdentifier(IdentifierTypeField::decode(code_));
    236   }
    237 
    238   bool IsAssignment() const {
    239     return TypeField::decode(code_) == kExpression &&
    240            ExpressionTypeField::decode(code_) == kAssignment;
    241   }
    242 
    243   bool IsObjectLiteral() const {
    244     return TypeField::decode(code_) == kObjectLiteralExpression;
    245   }
    246 
    247   bool IsArrayLiteral() const {
    248     return TypeField::decode(code_) == kArrayLiteralExpression;
    249   }
    250 
    251   bool IsStringLiteral() const {
    252     return TypeField::decode(code_) == kStringLiteralExpression;
    253   }
    254 
    255   bool IsUseStrictLiteral() const {
    256     return TypeField::decode(code_) == kStringLiteralExpression &&
    257            IsUseStrictField::decode(code_);
    258   }
    259 
    260   bool IsUseAsmLiteral() const {
    261     return TypeField::decode(code_) == kStringLiteralExpression &&
    262            IsUseAsmField::decode(code_);
    263   }
    264 
    265   bool IsThis() const {
    266     return TypeField::decode(code_) == kExpression &&
    267            ExpressionTypeField::decode(code_) == kThisExpression;
    268   }
    269 
    270   bool IsThisProperty() const {
    271     return TypeField::decode(code_) == kExpression &&
    272            ExpressionTypeField::decode(code_) == kThisPropertyExpression;
    273   }
    274 
    275   bool IsProperty() const {
    276     return TypeField::decode(code_) == kExpression &&
    277            (ExpressionTypeField::decode(code_) == kPropertyExpression ||
    278             ExpressionTypeField::decode(code_) == kThisPropertyExpression);
    279   }
    280 
    281   bool IsCall() const {
    282     return TypeField::decode(code_) == kExpression &&
    283            (ExpressionTypeField::decode(code_) == kCallExpression ||
    284             ExpressionTypeField::decode(code_) == kCallEvalExpression);
    285   }
    286 
    287   bool IsDirectEvalCall() const {
    288     return TypeField::decode(code_) == kExpression &&
    289            ExpressionTypeField::decode(code_) == kCallEvalExpression;
    290   }
    291 
    292   bool IsSuperCallReference() const {
    293     return TypeField::decode(code_) == kExpression &&
    294            ExpressionTypeField::decode(code_) == kSuperCallReference;
    295   }
    296 
    297   bool IsValidReferenceExpression() const {
    298     return IsIdentifier() || IsProperty();
    299   }
    300 
    301   // At the moment PreParser doesn't track these expression types.
    302   bool IsFunctionLiteral() const { return false; }
    303   bool IsCallNew() const { return false; }
    304 
    305   bool IsNoTemplateTag() const {
    306     return TypeField::decode(code_) == kExpression &&
    307            ExpressionTypeField::decode(code_) == kNoTemplateTagExpression;
    308   }
    309 
    310   bool IsSpread() const {
    311     return TypeField::decode(code_) == kSpreadExpression;
    312   }
    313 
    314   PreParserExpression AsFunctionLiteral() { return *this; }
    315 
    316   bool IsBinaryOperation() const {
    317     return TypeField::decode(code_) == kBinaryOperationExpression;
    318   }
    319 
    320   // Dummy implementation for making expression->somefunc() work in both Parser
    321   // and PreParser.
    322   PreParserExpression* operator->() { return this; }
    323 
    324   // More dummy implementations of things PreParser doesn't need to track:
    325   void set_index(int index) {}  // For YieldExpressions
    326   void SetShouldEagerCompile() {}
    327   void set_should_be_used_once_hint() {}
    328 
    329   int position() const { return kNoSourcePosition; }
    330   void set_function_token_position(int position) {}
    331 
    332   void set_is_class_field_initializer(bool is_class_field_initializer) {}
    333 
    334  private:
    335   enum Type {
    336     kEmpty,
    337     kExpression,
    338     kIdentifierExpression,
    339     kStringLiteralExpression,
    340     kBinaryOperationExpression,
    341     kSpreadExpression,
    342     kObjectLiteralExpression,
    343     kArrayLiteralExpression
    344   };
    345 
    346   enum ExpressionType {
    347     kThisExpression,
    348     kThisPropertyExpression,
    349     kPropertyExpression,
    350     kCallExpression,
    351     kCallEvalExpression,
    352     kSuperCallReference,
    353     kNoTemplateTagExpression,
    354     kAssignment
    355   };
    356 
    357   explicit PreParserExpression(
    358       uint32_t expression_code,
    359       ZoneList<const AstRawString*>* identifiers = nullptr)
    360       : code_(expression_code), identifiers_(identifiers) {}
    361 
    362   void AddIdentifier(const AstRawString* identifier, Zone* zone) {
    363     if (identifier == nullptr) {
    364       return;
    365     }
    366     if (identifiers_ == nullptr) {
    367       identifiers_ = new (zone) ZoneList<const AstRawString*>(1, zone);
    368     }
    369     identifiers_->Add(identifier, zone);
    370   }
    371 
    372   // The first three bits are for the Type.
    373   typedef BitField<Type, 0, 3> TypeField;
    374 
    375   // The high order bit applies only to nodes which would inherit from the
    376   // Expression ASTNode --- This is by necessity, due to the fact that
    377   // Expression nodes may be represented as multiple Types, not exclusively
    378   // through kExpression.
    379   // TODO(caitp, adamk): clean up PreParserExpression bitfields.
    380   typedef BitField<bool, 31, 1> ParenthesizedField;
    381 
    382   // The rest of the bits are interpreted depending on the value
    383   // of the Type field, so they can share the storage.
    384   typedef BitField<ExpressionType, TypeField::kNext, 3> ExpressionTypeField;
    385   typedef BitField<bool, TypeField::kNext, 1> IsUseStrictField;
    386   typedef BitField<bool, IsUseStrictField::kNext, 1> IsUseAsmField;
    387   typedef BitField<PreParserIdentifier::Type, TypeField::kNext, 10>
    388       IdentifierTypeField;
    389   typedef BitField<bool, TypeField::kNext, 1> HasCoverInitializedNameField;
    390 
    391   uint32_t code_;
    392   // If the PreParser is used in the identifier tracking mode,
    393   // PreParserExpression accumulates identifiers in that expression.
    394   ZoneList<const AstRawString*>* identifiers_;
    395 
    396   friend class PreParser;
    397   friend class PreParserFactory;
    398   template <typename T>
    399   friend class PreParserList;
    400 };
    401 
    402 
    403 // The pre-parser doesn't need to build lists of expressions, identifiers, or
    404 // the like. If the PreParser is used in identifier tracking mode, it needs to
    405 // build lists of identifiers though.
    406 template <typename T>
    407 class PreParserList {
    408  public:
    409   // These functions make list->Add(some_expression) work (and do nothing).
    410   PreParserList() : length_(0), identifiers_(nullptr) {}
    411   PreParserList* operator->() { return this; }
    412   void Add(T, Zone* zone);
    413   int length() const { return length_; }
    414   static PreParserList Null() { return PreParserList(-1); }
    415   bool IsNull() const { return length_ == -1; }
    416 
    417  private:
    418   explicit PreParserList(int n) : length_(n), identifiers_(nullptr) {}
    419   int length_;
    420   ZoneList<const AstRawString*>* identifiers_;
    421 
    422   friend class PreParser;
    423   friend class PreParserFactory;
    424 };
    425 
    426 template <>
    427 inline void PreParserList<PreParserExpression>::Add(
    428     PreParserExpression expression, Zone* zone) {
    429   if (expression.identifiers_ != nullptr) {
    430     DCHECK(FLAG_lazy_inner_functions);
    431     DCHECK(zone != nullptr);
    432     if (identifiers_ == nullptr) {
    433       identifiers_ = new (zone) ZoneList<const AstRawString*>(1, zone);
    434     }
    435     for (auto identifier : (*expression.identifiers_)) {
    436       identifiers_->Add(identifier, zone);
    437     }
    438   }
    439   ++length_;
    440 }
    441 
    442 template <typename T>
    443 void PreParserList<T>::Add(T, Zone* zone) {
    444   ++length_;
    445 }
    446 
    447 typedef PreParserList<PreParserExpression> PreParserExpressionList;
    448 
    449 class PreParserStatement;
    450 typedef PreParserList<PreParserStatement> PreParserStatementList;
    451 
    452 class PreParserStatement {
    453  public:
    454   static PreParserStatement Default() {
    455     return PreParserStatement(kUnknownStatement);
    456   }
    457 
    458   static PreParserStatement Null() {
    459     return PreParserStatement(kNullStatement);
    460   }
    461 
    462   static PreParserStatement Empty() {
    463     return PreParserStatement(kEmptyStatement);
    464   }
    465 
    466   static PreParserStatement Jump() {
    467     return PreParserStatement(kJumpStatement);
    468   }
    469 
    470   // Creates expression statement from expression.
    471   // Preserves being an unparenthesized string literal, possibly
    472   // "use strict".
    473   static PreParserStatement ExpressionStatement(
    474       PreParserExpression expression) {
    475     if (expression.IsUseStrictLiteral()) {
    476       return PreParserStatement(kUseStrictExpressionStatement);
    477     }
    478     if (expression.IsUseAsmLiteral()) {
    479       return PreParserStatement(kUseAsmExpressionStatement);
    480     }
    481     if (expression.IsStringLiteral()) {
    482       return PreParserStatement(kStringLiteralExpressionStatement);
    483     }
    484     return Default();
    485   }
    486 
    487   bool IsStringLiteral() {
    488     return code_ == kStringLiteralExpressionStatement || IsUseStrictLiteral() ||
    489            IsUseAsmLiteral();
    490   }
    491 
    492   bool IsUseStrictLiteral() {
    493     return code_ == kUseStrictExpressionStatement;
    494   }
    495 
    496   bool IsUseAsmLiteral() { return code_ == kUseAsmExpressionStatement; }
    497 
    498   bool IsJumpStatement() {
    499     return code_ == kJumpStatement;
    500   }
    501 
    502   bool IsNullStatement() { return code_ == kNullStatement; }
    503 
    504   bool IsEmptyStatement() { return code_ == kEmptyStatement; }
    505 
    506   // Dummy implementation for making statement->somefunc() work in both Parser
    507   // and PreParser.
    508   PreParserStatement* operator->() { return this; }
    509 
    510   PreParserStatementList statements() { return PreParserStatementList(); }
    511   void set_scope(Scope* scope) {}
    512   void Initialize(PreParserExpression cond, PreParserStatement body) {}
    513   void Initialize(PreParserStatement init, PreParserExpression cond,
    514                   PreParserStatement next, PreParserStatement body) {}
    515 
    516  private:
    517   enum Type {
    518     kNullStatement,
    519     kEmptyStatement,
    520     kUnknownStatement,
    521     kJumpStatement,
    522     kStringLiteralExpressionStatement,
    523     kUseStrictExpressionStatement,
    524     kUseAsmExpressionStatement,
    525   };
    526 
    527   explicit PreParserStatement(Type code) : code_(code) {}
    528   Type code_;
    529 };
    530 
    531 
    532 class PreParserFactory {
    533  public:
    534   explicit PreParserFactory(AstValueFactory* ast_value_factory)
    535       : zone_(ast_value_factory->zone()) {}
    536 
    537   void set_zone(Zone* zone) { zone_ = zone; }
    538 
    539   PreParserExpression NewStringLiteral(PreParserIdentifier identifier,
    540                                        int pos) {
    541     // This is needed for object literal property names. Property names are
    542     // normalized to string literals during object literal parsing.
    543     PreParserExpression expression = PreParserExpression::Default();
    544     expression.AddIdentifier(identifier.string_, zone_);
    545     return expression;
    546   }
    547   PreParserExpression NewNumberLiteral(double number,
    548                                        int pos) {
    549     return PreParserExpression::Default();
    550   }
    551   PreParserExpression NewUndefinedLiteral(int pos) {
    552     return PreParserExpression::Default();
    553   }
    554   PreParserExpression NewRegExpLiteral(PreParserIdentifier js_pattern,
    555                                        int js_flags, int literal_index,
    556                                        int pos) {
    557     return PreParserExpression::Default();
    558   }
    559   PreParserExpression NewArrayLiteral(PreParserExpressionList values,
    560                                       int first_spread_index, int literal_index,
    561                                       int pos) {
    562     return PreParserExpression::ArrayLiteral(values.identifiers_);
    563   }
    564   PreParserExpression NewClassLiteralProperty(PreParserExpression key,
    565                                               PreParserExpression value,
    566                                               ClassLiteralProperty::Kind kind,
    567                                               bool is_static,
    568                                               bool is_computed_name) {
    569     return PreParserExpression::Default();
    570   }
    571   PreParserExpression NewObjectLiteralProperty(PreParserExpression key,
    572                                                PreParserExpression value,
    573                                                ObjectLiteralProperty::Kind kind,
    574                                                bool is_computed_name) {
    575     return PreParserExpression::Default(value.identifiers_);
    576   }
    577   PreParserExpression NewObjectLiteralProperty(PreParserExpression key,
    578                                                PreParserExpression value,
    579                                                bool is_computed_name) {
    580     return PreParserExpression::Default(value.identifiers_);
    581   }
    582   PreParserExpression NewObjectLiteral(PreParserExpressionList properties,
    583                                        int literal_index,
    584                                        int boilerplate_properties,
    585                                        int pos) {
    586     return PreParserExpression::ObjectLiteral(properties.identifiers_);
    587   }
    588   PreParserExpression NewVariableProxy(void* variable) {
    589     return PreParserExpression::Default();
    590   }
    591   PreParserExpression NewProperty(PreParserExpression obj,
    592                                   PreParserExpression key,
    593                                   int pos) {
    594     if (obj.IsThis()) {
    595       return PreParserExpression::ThisProperty();
    596     }
    597     return PreParserExpression::Property();
    598   }
    599   PreParserExpression NewUnaryOperation(Token::Value op,
    600                                         PreParserExpression expression,
    601                                         int pos) {
    602     return PreParserExpression::Default();
    603   }
    604   PreParserExpression NewBinaryOperation(Token::Value op,
    605                                          PreParserExpression left,
    606                                          PreParserExpression right, int pos) {
    607     return PreParserExpression::BinaryOperation(left, op, right);
    608   }
    609   PreParserExpression NewCompareOperation(Token::Value op,
    610                                           PreParserExpression left,
    611                                           PreParserExpression right, int pos) {
    612     return PreParserExpression::Default();
    613   }
    614   PreParserExpression NewRewritableExpression(PreParserExpression expression) {
    615     return expression;
    616   }
    617   PreParserExpression NewAssignment(Token::Value op,
    618                                     PreParserExpression left,
    619                                     PreParserExpression right,
    620                                     int pos) {
    621     return PreParserExpression::Assignment();
    622   }
    623   PreParserExpression NewYield(PreParserExpression generator_object,
    624                                PreParserExpression expression, int pos,
    625                                Yield::OnException on_exception) {
    626     return PreParserExpression::Default();
    627   }
    628   PreParserExpression NewConditional(PreParserExpression condition,
    629                                      PreParserExpression then_expression,
    630                                      PreParserExpression else_expression,
    631                                      int pos) {
    632     return PreParserExpression::Default();
    633   }
    634   PreParserExpression NewCountOperation(Token::Value op,
    635                                         bool is_prefix,
    636                                         PreParserExpression expression,
    637                                         int pos) {
    638     return PreParserExpression::Default();
    639   }
    640   PreParserExpression NewCall(
    641       PreParserExpression expression, PreParserExpressionList arguments,
    642       int pos, Call::PossiblyEval possibly_eval = Call::NOT_EVAL) {
    643     if (possibly_eval == Call::IS_POSSIBLY_EVAL) {
    644       DCHECK(expression.IsIdentifier() && expression.AsIdentifier().IsEval());
    645       return PreParserExpression::CallEval();
    646     }
    647     return PreParserExpression::Call();
    648   }
    649   PreParserExpression NewCallNew(PreParserExpression expression,
    650                                  PreParserExpressionList arguments,
    651                                  int pos) {
    652     return PreParserExpression::Default();
    653   }
    654   PreParserStatement NewReturnStatement(PreParserExpression expression,
    655                                         int pos) {
    656     return PreParserStatement::Jump();
    657   }
    658   PreParserExpression NewFunctionLiteral(
    659       PreParserIdentifier name, Scope* scope, PreParserStatementList body,
    660       int materialized_literal_count, int expected_property_count,
    661       int parameter_count, int function_length,
    662       FunctionLiteral::ParameterFlag has_duplicate_parameters,
    663       FunctionLiteral::FunctionType function_type,
    664       FunctionLiteral::EagerCompileHint eager_compile_hint, int position,
    665       bool has_braces) {
    666     return PreParserExpression::Default();
    667   }
    668 
    669   PreParserExpression NewSpread(PreParserExpression expression, int pos,
    670                                 int expr_pos) {
    671     return PreParserExpression::Spread(expression);
    672   }
    673 
    674   PreParserExpression NewEmptyParentheses(int pos) {
    675     return PreParserExpression::Default();
    676   }
    677 
    678   PreParserStatement NewEmptyStatement(int pos) {
    679     return PreParserStatement::Default();
    680   }
    681 
    682   PreParserStatement NewBlock(ZoneList<const AstRawString*>* labels,
    683                               int capacity, bool ignore_completion_value,
    684                               int pos) {
    685     return PreParserStatement::Default();
    686   }
    687 
    688   PreParserStatement NewDebuggerStatement(int pos) {
    689     return PreParserStatement::Default();
    690   }
    691 
    692   PreParserStatement NewExpressionStatement(PreParserExpression expr, int pos) {
    693     return PreParserStatement::ExpressionStatement(expr);
    694   }
    695 
    696   PreParserStatement NewIfStatement(PreParserExpression condition,
    697                                     PreParserStatement then_statement,
    698                                     PreParserStatement else_statement,
    699                                     int pos) {
    700     // This must return a jump statement iff both clauses are jump statements.
    701     return else_statement.IsJumpStatement() ? then_statement : else_statement;
    702   }
    703 
    704   PreParserStatement NewBreakStatement(PreParserStatement target, int pos) {
    705     return PreParserStatement::Jump();
    706   }
    707 
    708   PreParserStatement NewContinueStatement(PreParserStatement target, int pos) {
    709     return PreParserStatement::Jump();
    710   }
    711 
    712   PreParserStatement NewWithStatement(Scope* scope,
    713                                       PreParserExpression expression,
    714                                       PreParserStatement statement, int pos) {
    715     return PreParserStatement::Default();
    716   }
    717 
    718   PreParserStatement NewDoWhileStatement(ZoneList<const AstRawString*>* labels,
    719                                          int pos) {
    720     return PreParserStatement::Default();
    721   }
    722 
    723   PreParserStatement NewWhileStatement(ZoneList<const AstRawString*>* labels,
    724                                        int pos) {
    725     return PreParserStatement::Default();
    726   }
    727 
    728   PreParserStatement NewSwitchStatement(ZoneList<const AstRawString*>* labels,
    729                                         int pos) {
    730     return PreParserStatement::Default();
    731   }
    732 
    733   PreParserStatement NewCaseClause(PreParserExpression label,
    734                                    PreParserStatementList statements, int pos) {
    735     return PreParserStatement::Default();
    736   }
    737 
    738   PreParserStatement NewForStatement(ZoneList<const AstRawString*>* labels,
    739                                      int pos) {
    740     return PreParserStatement::Default();
    741   }
    742 
    743   PreParserStatement NewForEachStatement(ForEachStatement::VisitMode visit_mode,
    744                                          ZoneList<const AstRawString*>* labels,
    745                                          int pos) {
    746     return PreParserStatement::Default();
    747   }
    748 
    749   // Return the object itself as AstVisitor and implement the needed
    750   // dummy method right in this class.
    751   PreParserFactory* visitor() { return this; }
    752   int* ast_properties() {
    753     static int dummy = 42;
    754     return &dummy;
    755   }
    756 
    757  private:
    758   Zone* zone_;
    759 };
    760 
    761 
    762 struct PreParserFormalParameters : FormalParametersBase {
    763   explicit PreParserFormalParameters(DeclarationScope* scope)
    764       : FormalParametersBase(scope) {}
    765   PreParserIdentifier at(int i) { return PreParserIdentifier(); }  // Dummy
    766 };
    767 
    768 
    769 class PreParser;
    770 
    771 class PreParserTarget {
    772  public:
    773   PreParserTarget(ParserBase<PreParser>* preparser,
    774                   PreParserStatement statement) {}
    775 };
    776 
    777 class PreParserTargetScope {
    778  public:
    779   explicit PreParserTargetScope(ParserBase<PreParser>* preparser) {}
    780 };
    781 
    782 template <>
    783 struct ParserTypes<PreParser> {
    784   typedef ParserBase<PreParser> Base;
    785   typedef PreParser Impl;
    786 
    787   // PreParser doesn't need to store generator variables.
    788   typedef void Variable;
    789 
    790   // Return types for traversing functions.
    791   typedef PreParserIdentifier Identifier;
    792   typedef PreParserExpression Expression;
    793   typedef PreParserExpression FunctionLiteral;
    794   typedef PreParserExpression ObjectLiteralProperty;
    795   typedef PreParserExpression ClassLiteralProperty;
    796   typedef PreParserExpressionList ExpressionList;
    797   typedef PreParserExpressionList ObjectPropertyList;
    798   typedef PreParserExpressionList ClassPropertyList;
    799   typedef PreParserFormalParameters FormalParameters;
    800   typedef PreParserStatement Statement;
    801   typedef PreParserStatementList StatementList;
    802   typedef PreParserStatement Block;
    803   typedef PreParserStatement BreakableStatement;
    804   typedef PreParserStatement IterationStatement;
    805 
    806   // For constructing objects returned by the traversing functions.
    807   typedef PreParserFactory Factory;
    808 
    809   typedef PreParserTarget Target;
    810   typedef PreParserTargetScope TargetScope;
    811 };
    812 
    813 
    814 // Preparsing checks a JavaScript program and emits preparse-data that helps
    815 // a later parsing to be faster.
    816 // See preparse-data-format.h for the data format.
    817 
    818 // The PreParser checks that the syntax follows the grammar for JavaScript,
    819 // and collects some information about the program along the way.
    820 // The grammar check is only performed in order to understand the program
    821 // sufficiently to deduce some information about it, that can be used
    822 // to speed up later parsing. Finding errors is not the goal of pre-parsing,
    823 // rather it is to speed up properly written and correct programs.
    824 // That means that contextual checks (like a label being declared where
    825 // it is used) are generally omitted.
    826 class PreParser : public ParserBase<PreParser> {
    827   friend class ParserBase<PreParser>;
    828   friend class v8::internal::ExpressionClassifier<ParserTypes<PreParser>>;
    829 
    830  public:
    831   typedef PreParserIdentifier Identifier;
    832   typedef PreParserExpression Expression;
    833   typedef PreParserStatement Statement;
    834 
    835   enum PreParseResult {
    836     kPreParseStackOverflow,
    837     kPreParseAbort,
    838     kPreParseSuccess
    839   };
    840 
    841   PreParser(Zone* zone, Scanner* scanner, AstValueFactory* ast_value_factory,
    842             PendingCompilationErrorHandler* pending_error_handler,
    843             RuntimeCallStats* runtime_call_stats, uintptr_t stack_limit)
    844       : ParserBase<PreParser>(zone, scanner, stack_limit, nullptr,
    845                               ast_value_factory, runtime_call_stats),
    846         use_counts_(nullptr),
    847         track_unresolved_variables_(false),
    848         pending_error_handler_(pending_error_handler) {}
    849 
    850   static bool const IsPreParser() { return true; }
    851 
    852   PreParserLogger* logger() { return &log_; }
    853 
    854   // Pre-parse the program from the character stream; returns true on
    855   // success (even if parsing failed, the pre-parse data successfully
    856   // captured the syntax error), and false if a stack-overflow happened
    857   // during parsing.
    858   PreParseResult PreParseProgram(int* materialized_literals = 0,
    859                                  bool is_module = false) {
    860     DCHECK_NULL(scope_state_);
    861     DeclarationScope* scope = NewScriptScope();
    862 
    863     // ModuleDeclarationInstantiation for Source Text Module Records creates a
    864     // new Module Environment Record whose outer lexical environment record is
    865     // the global scope.
    866     if (is_module) scope = NewModuleScope(scope);
    867 
    868     FunctionState top_scope(&function_state_, &scope_state_, scope);
    869     bool ok = true;
    870     int start_position = scanner()->peek_location().beg_pos;
    871     parsing_module_ = is_module;
    872     PreParserStatementList body;
    873     ParseStatementList(body, Token::EOS, &ok);
    874     if (stack_overflow()) return kPreParseStackOverflow;
    875     if (!ok) {
    876       ReportUnexpectedToken(scanner()->current_token());
    877     } else if (is_strict(this->scope()->language_mode())) {
    878       CheckStrictOctalLiteral(start_position, scanner()->location().end_pos,
    879                               &ok);
    880       CheckDecimalLiteralWithLeadingZero(start_position,
    881                                          scanner()->location().end_pos);
    882     }
    883     if (materialized_literals) {
    884       *materialized_literals = function_state_->materialized_literal_count();
    885     }
    886     return kPreParseSuccess;
    887   }
    888 
    889   // Parses a single function literal, from the opening parentheses before
    890   // parameters to the closing brace after the body.
    891   // Returns a FunctionEntry describing the body of the function in enough
    892   // detail that it can be lazily compiled.
    893   // The scanner is expected to have matched the "function" or "function*"
    894   // keyword and parameters, and have consumed the initial '{'.
    895   // At return, unless an error occurred, the scanner is positioned before the
    896   // the final '}'.
    897   PreParseResult PreParseFunction(FunctionKind kind,
    898                                   DeclarationScope* function_scope,
    899                                   bool parsing_module,
    900                                   bool track_unresolved_variables,
    901                                   bool may_abort, int* use_counts);
    902 
    903  private:
    904   // These types form an algebra over syntactic categories that is just
    905   // rich enough to let us recognize and propagate the constructs that
    906   // are either being counted in the preparser data, or is important
    907   // to throw the correct syntax error exceptions.
    908 
    909   // All ParseXXX functions take as the last argument an *ok parameter
    910   // which is set to false if parsing failed; it is unchanged otherwise.
    911   // By making the 'exception handling' explicit, we are forced to check
    912   // for failure at the call sites.
    913 
    914   V8_INLINE PreParserStatementList ParseEagerFunctionBody(
    915       PreParserIdentifier function_name, int pos,
    916       const PreParserFormalParameters& parameters, FunctionKind kind,
    917       FunctionLiteral::FunctionType function_type, bool* ok);
    918 
    919   // Indicates that we won't switch from the preparser to the preparser; we'll
    920   // just stay where we are.
    921   bool AllowsLazyParsingWithoutUnresolvedVariables() const { return false; }
    922   bool parse_lazily() const { return false; }
    923 
    924   V8_INLINE LazyParsingResult SkipFunction(
    925       FunctionKind kind, DeclarationScope* function_scope, int* num_parameters,
    926       int* function_length, bool* has_duplicate_parameters,
    927       int* materialized_literal_count, int* expected_property_count,
    928       bool is_inner_function, bool may_abort, bool* ok) {
    929     UNREACHABLE();
    930     return kLazyParsingComplete;
    931   }
    932   Expression ParseFunctionLiteral(
    933       Identifier name, Scanner::Location function_name_location,
    934       FunctionNameValidity function_name_validity, FunctionKind kind,
    935       int function_token_pos, FunctionLiteral::FunctionType function_type,
    936       LanguageMode language_mode, bool* ok);
    937   LazyParsingResult ParseStatementListAndLogFunction(
    938       PreParserFormalParameters* formals, bool has_duplicate_parameters,
    939       bool maybe_abort, bool* ok);
    940 
    941   struct TemplateLiteralState {};
    942 
    943   V8_INLINE TemplateLiteralState OpenTemplateLiteral(int pos) {
    944     return TemplateLiteralState();
    945   }
    946   V8_INLINE void AddTemplateExpression(TemplateLiteralState* state,
    947                                        PreParserExpression expression) {}
    948   V8_INLINE void AddTemplateSpan(TemplateLiteralState* state, bool tail) {}
    949   V8_INLINE PreParserExpression CloseTemplateLiteral(
    950       TemplateLiteralState* state, int start, PreParserExpression tag);
    951   V8_INLINE void CheckConflictingVarDeclarations(Scope* scope, bool* ok) {}
    952 
    953   V8_INLINE void SetLanguageMode(Scope* scope, LanguageMode mode) {
    954     scope->SetLanguageMode(mode);
    955   }
    956   V8_INLINE void SetAsmModule() {}
    957 
    958   V8_INLINE void MarkCollectedTailCallExpressions() {}
    959   V8_INLINE void MarkTailPosition(PreParserExpression expression) {}
    960 
    961   V8_INLINE PreParserExpressionList
    962   PrepareSpreadArguments(PreParserExpressionList list) {
    963     return list;
    964   }
    965 
    966   V8_INLINE PreParserExpression SpreadCall(PreParserExpression function,
    967                                            PreParserExpressionList args,
    968                                            int pos);
    969   V8_INLINE PreParserExpression SpreadCallNew(PreParserExpression function,
    970                                               PreParserExpressionList args,
    971                                               int pos);
    972 
    973   V8_INLINE PreParserExpression
    974   RewriteSuperCall(PreParserExpression call_expression) {
    975     return call_expression;
    976   }
    977 
    978   V8_INLINE void RewriteDestructuringAssignments() {}
    979 
    980   V8_INLINE PreParserExpression RewriteExponentiation(PreParserExpression left,
    981                                                       PreParserExpression right,
    982                                                       int pos) {
    983     return left;
    984   }
    985   V8_INLINE PreParserExpression RewriteAssignExponentiation(
    986       PreParserExpression left, PreParserExpression right, int pos) {
    987     return left;
    988   }
    989 
    990   V8_INLINE PreParserExpression
    991   RewriteAwaitExpression(PreParserExpression value, int pos) {
    992     return value;
    993   }
    994   V8_INLINE void PrepareAsyncFunctionBody(PreParserStatementList body,
    995                                           FunctionKind kind, int pos) {}
    996   V8_INLINE void RewriteAsyncFunctionBody(PreParserStatementList body,
    997                                           PreParserStatement block,
    998                                           PreParserExpression return_value,
    999                                           bool* ok) {}
   1000   V8_INLINE PreParserExpression RewriteYieldStar(PreParserExpression generator,
   1001                                                  PreParserExpression expression,
   1002                                                  int pos) {
   1003     return PreParserExpression::Default();
   1004   }
   1005   V8_INLINE void RewriteNonPattern(bool* ok) { ValidateExpression(ok); }
   1006 
   1007   void DeclareAndInitializeVariables(
   1008       PreParserStatement block,
   1009       const DeclarationDescriptor* declaration_descriptor,
   1010       const DeclarationParsingResult::Declaration* declaration,
   1011       ZoneList<const AstRawString*>* names, bool* ok);
   1012 
   1013   V8_INLINE ZoneList<const AstRawString*>* DeclareLabel(
   1014       ZoneList<const AstRawString*>* labels, PreParserExpression expr,
   1015       bool* ok) {
   1016     DCHECK(!expr.AsIdentifier().IsEnum());
   1017     DCHECK(!parsing_module_ || !expr.AsIdentifier().IsAwait());
   1018     DCHECK(is_sloppy(language_mode()) ||
   1019            !IsFutureStrictReserved(expr.AsIdentifier()));
   1020     return labels;
   1021   }
   1022 
   1023   // TODO(nikolaos): The preparser currently does not keep track of labels.
   1024   V8_INLINE bool ContainsLabel(ZoneList<const AstRawString*>* labels,
   1025                                PreParserIdentifier label) {
   1026     return false;
   1027   }
   1028 
   1029   V8_INLINE PreParserExpression RewriteReturn(PreParserExpression return_value,
   1030                                               int pos) {
   1031     return return_value;
   1032   }
   1033   V8_INLINE PreParserStatement RewriteSwitchStatement(
   1034       PreParserExpression tag, PreParserStatement switch_statement,
   1035       PreParserStatementList cases, Scope* scope) {
   1036     return PreParserStatement::Default();
   1037   }
   1038   V8_INLINE void RewriteCatchPattern(CatchInfo* catch_info, bool* ok) {}
   1039   V8_INLINE void ValidateCatchBlock(const CatchInfo& catch_info, bool* ok) {}
   1040   V8_INLINE PreParserStatement RewriteTryStatement(
   1041       PreParserStatement try_block, PreParserStatement catch_block,
   1042       PreParserStatement finally_block, const CatchInfo& catch_info, int pos) {
   1043     return PreParserStatement::Default();
   1044   }
   1045 
   1046   V8_INLINE PreParserExpression RewriteDoExpression(PreParserStatement body,
   1047                                                     int pos, bool* ok) {
   1048     return PreParserExpression::Default();
   1049   }
   1050 
   1051   // TODO(nikolaos): The preparser currently does not keep track of labels
   1052   // and targets.
   1053   V8_INLINE PreParserStatement LookupBreakTarget(PreParserIdentifier label,
   1054                                                  bool* ok) {
   1055     return PreParserStatement::Default();
   1056   }
   1057   V8_INLINE PreParserStatement LookupContinueTarget(PreParserIdentifier label,
   1058                                                     bool* ok) {
   1059     return PreParserStatement::Default();
   1060   }
   1061 
   1062   V8_INLINE PreParserStatement DeclareFunction(
   1063       PreParserIdentifier variable_name, PreParserExpression function, int pos,
   1064       bool is_generator, bool is_async, ZoneList<const AstRawString*>* names,
   1065       bool* ok) {
   1066     return Statement::Default();
   1067   }
   1068 
   1069   V8_INLINE PreParserStatement
   1070   DeclareClass(PreParserIdentifier variable_name, PreParserExpression value,
   1071                ZoneList<const AstRawString*>* names, int class_token_pos,
   1072                int end_pos, bool* ok) {
   1073     return PreParserStatement::Default();
   1074   }
   1075   V8_INLINE void DeclareClassVariable(PreParserIdentifier name,
   1076                                       Scope* block_scope, ClassInfo* class_info,
   1077                                       int class_token_pos, bool* ok) {}
   1078   V8_INLINE void DeclareClassProperty(PreParserIdentifier class_name,
   1079                                       PreParserExpression property,
   1080                                       ClassInfo* class_info, bool* ok) {}
   1081   V8_INLINE PreParserExpression RewriteClassLiteral(PreParserIdentifier name,
   1082                                                     ClassInfo* class_info,
   1083                                                     int pos, bool* ok) {
   1084     return PreParserExpression::Default();
   1085   }
   1086 
   1087   V8_INLINE PreParserStatement DeclareNative(PreParserIdentifier name, int pos,
   1088                                              bool* ok) {
   1089     return PreParserStatement::Default();
   1090   }
   1091 
   1092   V8_INLINE void QueueDestructuringAssignmentForRewriting(
   1093       PreParserExpression assignment) {}
   1094   V8_INLINE void QueueNonPatternForRewriting(PreParserExpression expr,
   1095                                              bool* ok) {}
   1096 
   1097   // Helper functions for recursive descent.
   1098   V8_INLINE bool IsEval(PreParserIdentifier identifier) const {
   1099     return identifier.IsEval();
   1100   }
   1101 
   1102   V8_INLINE bool IsArguments(PreParserIdentifier identifier) const {
   1103     return identifier.IsArguments();
   1104   }
   1105 
   1106   V8_INLINE bool IsEvalOrArguments(PreParserIdentifier identifier) const {
   1107     return identifier.IsEvalOrArguments();
   1108   }
   1109 
   1110   V8_INLINE bool IsUndefined(PreParserIdentifier identifier) const {
   1111     return identifier.IsUndefined();
   1112   }
   1113 
   1114   V8_INLINE bool IsAwait(PreParserIdentifier identifier) const {
   1115     return identifier.IsAwait();
   1116   }
   1117 
   1118   V8_INLINE bool IsFutureStrictReserved(PreParserIdentifier identifier) const {
   1119     return identifier.IsFutureStrictReserved();
   1120   }
   1121 
   1122   // Returns true if the expression is of type "this.foo".
   1123   V8_INLINE static bool IsThisProperty(PreParserExpression expression) {
   1124     return expression.IsThisProperty();
   1125   }
   1126 
   1127   V8_INLINE static bool IsIdentifier(PreParserExpression expression) {
   1128     return expression.IsIdentifier();
   1129   }
   1130 
   1131   V8_INLINE static PreParserIdentifier AsIdentifier(
   1132       PreParserExpression expression) {
   1133     return expression.AsIdentifier();
   1134   }
   1135 
   1136   V8_INLINE static PreParserExpression AsIdentifierExpression(
   1137       PreParserExpression expression) {
   1138     return expression;
   1139   }
   1140 
   1141   V8_INLINE bool IsPrototype(PreParserIdentifier identifier) const {
   1142     return identifier.IsPrototype();
   1143   }
   1144 
   1145   V8_INLINE bool IsConstructor(PreParserIdentifier identifier) const {
   1146     return identifier.IsConstructor();
   1147   }
   1148 
   1149   V8_INLINE bool IsDirectEvalCall(PreParserExpression expression) const {
   1150     return expression.IsDirectEvalCall();
   1151   }
   1152 
   1153   V8_INLINE static bool IsBoilerplateProperty(PreParserExpression property) {
   1154     // PreParser doesn't count boilerplate properties.
   1155     return false;
   1156   }
   1157 
   1158   V8_INLINE bool IsNative(PreParserExpression expr) const {
   1159     // Preparsing is disabled for extensions (because the extension
   1160     // details aren't passed to lazily compiled functions), so we
   1161     // don't accept "native function" in the preparser and there is
   1162     // no need to keep track of "native".
   1163     return false;
   1164   }
   1165 
   1166   V8_INLINE static bool IsArrayIndex(PreParserIdentifier string,
   1167                                      uint32_t* index) {
   1168     return false;
   1169   }
   1170 
   1171   V8_INLINE bool IsUseStrictDirective(PreParserStatement statement) const {
   1172     return statement.IsUseStrictLiteral();
   1173   }
   1174 
   1175   V8_INLINE bool IsUseAsmDirective(PreParserStatement statement) const {
   1176     return statement.IsUseAsmLiteral();
   1177   }
   1178 
   1179   V8_INLINE bool IsStringLiteral(PreParserStatement statement) const {
   1180     return statement.IsStringLiteral();
   1181   }
   1182 
   1183   V8_INLINE static PreParserExpression GetPropertyValue(
   1184       PreParserExpression property) {
   1185     return PreParserExpression::Default();
   1186   }
   1187 
   1188   V8_INLINE static void GetDefaultStrings(
   1189       PreParserIdentifier* default_string,
   1190       PreParserIdentifier* star_default_star_string) {}
   1191 
   1192   // Functions for encapsulating the differences between parsing and preparsing;
   1193   // operations interleaved with the recursive descent.
   1194   V8_INLINE static void PushLiteralName(PreParserIdentifier id) {}
   1195   V8_INLINE static void PushVariableName(PreParserIdentifier id) {}
   1196   V8_INLINE void PushPropertyName(PreParserExpression expression) {}
   1197   V8_INLINE void PushEnclosingName(PreParserIdentifier name) {}
   1198   V8_INLINE static void AddFunctionForNameInference(
   1199       PreParserExpression expression) {}
   1200   V8_INLINE static void InferFunctionName() {}
   1201 
   1202   V8_INLINE static void CheckAssigningFunctionLiteralToProperty(
   1203       PreParserExpression left, PreParserExpression right) {}
   1204 
   1205   V8_INLINE static PreParserExpression MarkExpressionAsAssigned(
   1206       PreParserExpression expression) {
   1207     // TODO(marja): To be able to produce the same errors, the preparser needs
   1208     // to start tracking which expressions are variables and which are assigned.
   1209     return expression;
   1210   }
   1211 
   1212   V8_INLINE bool ShortcutNumericLiteralBinaryExpression(PreParserExpression* x,
   1213                                                         PreParserExpression y,
   1214                                                         Token::Value op,
   1215                                                         int pos) {
   1216     return false;
   1217   }
   1218 
   1219   V8_INLINE PreParserExpression BuildUnaryExpression(
   1220       PreParserExpression expression, Token::Value op, int pos) {
   1221     return PreParserExpression::Default();
   1222   }
   1223 
   1224   V8_INLINE PreParserExpression BuildIteratorResult(PreParserExpression value,
   1225                                                     bool done) {
   1226     return PreParserExpression::Default();
   1227   }
   1228 
   1229   V8_INLINE PreParserStatement
   1230   BuildInitializationBlock(DeclarationParsingResult* parsing_result,
   1231                            ZoneList<const AstRawString*>* names, bool* ok) {
   1232     return PreParserStatement::Default();
   1233   }
   1234 
   1235   V8_INLINE PreParserStatement
   1236   InitializeForEachStatement(PreParserStatement stmt, PreParserExpression each,
   1237                              PreParserExpression subject,
   1238                              PreParserStatement body, int each_keyword_pos) {
   1239     return stmt;
   1240   }
   1241 
   1242   V8_INLINE PreParserStatement RewriteForVarInLegacy(const ForInfo& for_info) {
   1243     return PreParserStatement::Null();
   1244   }
   1245   V8_INLINE void DesugarBindingInForEachStatement(
   1246       ForInfo* for_info, PreParserStatement* body_block,
   1247       PreParserExpression* each_variable, bool* ok) {}
   1248   V8_INLINE PreParserStatement CreateForEachStatementTDZ(
   1249       PreParserStatement init_block, const ForInfo& for_info, bool* ok) {
   1250     return init_block;
   1251   }
   1252 
   1253   V8_INLINE StatementT DesugarLexicalBindingsInForStatement(
   1254       PreParserStatement loop, PreParserStatement init,
   1255       PreParserExpression cond, PreParserStatement next,
   1256       PreParserStatement body, Scope* inner_scope, const ForInfo& for_info,
   1257       bool* ok) {
   1258     return loop;
   1259   }
   1260 
   1261   V8_INLINE PreParserExpression
   1262   NewThrowReferenceError(MessageTemplate::Template message, int pos) {
   1263     return PreParserExpression::Default();
   1264   }
   1265 
   1266   V8_INLINE PreParserExpression NewThrowSyntaxError(
   1267       MessageTemplate::Template message, PreParserIdentifier arg, int pos) {
   1268     return PreParserExpression::Default();
   1269   }
   1270 
   1271   V8_INLINE PreParserExpression NewThrowTypeError(
   1272       MessageTemplate::Template message, PreParserIdentifier arg, int pos) {
   1273     return PreParserExpression::Default();
   1274   }
   1275 
   1276   // Reporting errors.
   1277   V8_INLINE void ReportMessageAt(Scanner::Location source_location,
   1278                                  MessageTemplate::Template message,
   1279                                  const char* arg = NULL,
   1280                                  ParseErrorType error_type = kSyntaxError) {
   1281     pending_error_handler_->ReportMessageAt(source_location.beg_pos,
   1282                                             source_location.end_pos, message,
   1283                                             arg, error_type);
   1284   }
   1285 
   1286   V8_INLINE void ReportMessageAt(Scanner::Location source_location,
   1287                                  MessageTemplate::Template message,
   1288                                  PreParserIdentifier arg,
   1289                                  ParseErrorType error_type = kSyntaxError) {
   1290     UNREACHABLE();
   1291   }
   1292 
   1293   // "null" return type creators.
   1294   V8_INLINE static PreParserIdentifier EmptyIdentifier() {
   1295     return PreParserIdentifier::Empty();
   1296   }
   1297   V8_INLINE static bool IsEmptyIdentifier(PreParserIdentifier name) {
   1298     return name.IsEmpty();
   1299   }
   1300   V8_INLINE static PreParserExpression EmptyExpression() {
   1301     return PreParserExpression::Empty();
   1302   }
   1303   V8_INLINE static PreParserExpression EmptyLiteral() {
   1304     return PreParserExpression::Default();
   1305   }
   1306   V8_INLINE static PreParserExpression EmptyObjectLiteralProperty() {
   1307     return PreParserExpression::Default();
   1308   }
   1309   V8_INLINE static PreParserExpression EmptyClassLiteralProperty() {
   1310     return PreParserExpression::Default();
   1311   }
   1312   V8_INLINE static PreParserExpression EmptyFunctionLiteral() {
   1313     return PreParserExpression::Default();
   1314   }
   1315 
   1316   V8_INLINE static bool IsEmptyExpression(PreParserExpression expr) {
   1317     return expr.IsEmpty();
   1318   }
   1319 
   1320   V8_INLINE static PreParserExpressionList NullExpressionList() {
   1321     return PreParserExpressionList::Null();
   1322   }
   1323 
   1324   V8_INLINE static bool IsNullExpressionList(PreParserExpressionList exprs) {
   1325     return exprs.IsNull();
   1326   }
   1327 
   1328   V8_INLINE static PreParserStatementList NullStatementList() {
   1329     return PreParserStatementList::Null();
   1330   }
   1331 
   1332   V8_INLINE static bool IsNullStatementList(PreParserStatementList stmts) {
   1333     return stmts.IsNull();
   1334   }
   1335 
   1336   V8_INLINE static PreParserStatement NullStatement() {
   1337     return PreParserStatement::Null();
   1338   }
   1339 
   1340   V8_INLINE bool IsNullStatement(PreParserStatement stmt) {
   1341     return stmt.IsNullStatement();
   1342   }
   1343 
   1344   V8_INLINE bool IsEmptyStatement(PreParserStatement stmt) {
   1345     return stmt.IsEmptyStatement();
   1346   }
   1347 
   1348   V8_INLINE static PreParserStatement NullBlock() {
   1349     return PreParserStatement::Null();
   1350   }
   1351 
   1352   V8_INLINE PreParserIdentifier EmptyIdentifierString() const {
   1353     return PreParserIdentifier::Default();
   1354   }
   1355 
   1356   // Odd-ball literal creators.
   1357   V8_INLINE PreParserExpression GetLiteralTheHole(int position) {
   1358     return PreParserExpression::Default();
   1359   }
   1360 
   1361   V8_INLINE PreParserExpression GetLiteralUndefined(int position) {
   1362     return PreParserExpression::Default();
   1363   }
   1364 
   1365   // Producing data during the recursive descent.
   1366   PreParserIdentifier GetSymbol() const;
   1367 
   1368   V8_INLINE PreParserIdentifier GetNextSymbol() const {
   1369     return PreParserIdentifier::Default();
   1370   }
   1371 
   1372   V8_INLINE PreParserIdentifier GetNumberAsSymbol() const {
   1373     return PreParserIdentifier::Default();
   1374   }
   1375 
   1376   V8_INLINE PreParserExpression ThisExpression(int pos = kNoSourcePosition) {
   1377     return PreParserExpression::This();
   1378   }
   1379 
   1380   V8_INLINE PreParserExpression NewSuperPropertyReference(int pos) {
   1381     return PreParserExpression::Default();
   1382   }
   1383 
   1384   V8_INLINE PreParserExpression NewSuperCallReference(int pos) {
   1385     return PreParserExpression::SuperCallReference();
   1386   }
   1387 
   1388   V8_INLINE PreParserExpression NewTargetExpression(int pos) {
   1389     return PreParserExpression::Default();
   1390   }
   1391 
   1392   V8_INLINE PreParserExpression FunctionSentExpression(int pos) {
   1393     return PreParserExpression::Default();
   1394   }
   1395 
   1396   V8_INLINE PreParserExpression ExpressionFromLiteral(Token::Value token,
   1397                                                       int pos) {
   1398     return PreParserExpression::Default();
   1399   }
   1400 
   1401   PreParserExpression ExpressionFromIdentifier(
   1402       PreParserIdentifier name, int start_position,
   1403       InferName infer = InferName::kYes);
   1404 
   1405   V8_INLINE PreParserExpression ExpressionFromString(int pos) {
   1406     if (scanner()->UnescapedLiteralMatches("use strict", 10)) {
   1407       return PreParserExpression::UseStrictStringLiteral();
   1408     }
   1409     return PreParserExpression::StringLiteral();
   1410   }
   1411 
   1412   V8_INLINE PreParserExpressionList NewExpressionList(int size) const {
   1413     return PreParserExpressionList();
   1414   }
   1415 
   1416   V8_INLINE PreParserExpressionList NewObjectPropertyList(int size) const {
   1417     return PreParserExpressionList();
   1418   }
   1419 
   1420   V8_INLINE PreParserExpressionList NewClassPropertyList(int size) const {
   1421     return PreParserExpressionList();
   1422   }
   1423 
   1424   V8_INLINE PreParserStatementList NewStatementList(int size) const {
   1425     return PreParserStatementList();
   1426   }
   1427 
   1428   PreParserStatementList NewCaseClauseList(int size) {
   1429     return PreParserStatementList();
   1430   }
   1431 
   1432   V8_INLINE PreParserExpression
   1433   NewV8Intrinsic(PreParserIdentifier name, PreParserExpressionList arguments,
   1434                  int pos, bool* ok) {
   1435     return PreParserExpression::Default();
   1436   }
   1437 
   1438   V8_INLINE PreParserStatement NewThrowStatement(PreParserExpression exception,
   1439                                                  int pos) {
   1440     return PreParserStatement::Jump();
   1441   }
   1442 
   1443   V8_INLINE void AddParameterInitializationBlock(
   1444       const PreParserFormalParameters& parameters, PreParserStatementList body,
   1445       bool is_async, bool* ok) {}
   1446 
   1447   V8_INLINE void AddFormalParameter(PreParserFormalParameters* parameters,
   1448                                     PreParserExpression pattern,
   1449                                     PreParserExpression initializer,
   1450                                     int initializer_end_position,
   1451                                     bool is_rest) {
   1452     parameters->UpdateArityAndFunctionLength(!initializer.IsEmpty(), is_rest);
   1453   }
   1454 
   1455   V8_INLINE void DeclareFormalParameter(DeclarationScope* scope,
   1456                                         PreParserIdentifier parameter) {
   1457     if (!classifier()->is_simple_parameter_list()) {
   1458       scope->SetHasNonSimpleParameters();
   1459     }
   1460   }
   1461 
   1462   V8_INLINE void DeclareArrowFunctionFormalParameters(
   1463       PreParserFormalParameters* parameters, PreParserExpression params,
   1464       const Scanner::Location& params_loc, Scanner::Location* duplicate_loc,
   1465       bool* ok) {
   1466     // TODO(wingo): Detect duplicated identifiers in paramlists.  Detect
   1467     // parameter lists that are too long.
   1468   }
   1469 
   1470   V8_INLINE void ReindexLiterals(const PreParserFormalParameters& parameters) {}
   1471 
   1472   V8_INLINE PreParserExpression NoTemplateTag() {
   1473     return PreParserExpression::NoTemplateTag();
   1474   }
   1475 
   1476   V8_INLINE static bool IsTaggedTemplate(const PreParserExpression tag) {
   1477     return !tag.IsNoTemplateTag();
   1478   }
   1479 
   1480   V8_INLINE void MaterializeUnspreadArgumentsLiterals(int count) {
   1481     for (int i = 0; i < count; ++i) {
   1482       function_state_->NextMaterializedLiteralIndex();
   1483     }
   1484   }
   1485 
   1486   V8_INLINE PreParserExpression
   1487   ExpressionListToExpression(PreParserExpressionList args) {
   1488     return PreParserExpression::Default(args.identifiers_);
   1489   }
   1490 
   1491   V8_INLINE void AddAccessorPrefixToFunctionName(bool is_get,
   1492                                                  PreParserExpression function,
   1493                                                  PreParserIdentifier name) {}
   1494   V8_INLINE void SetFunctionNameFromPropertyName(PreParserExpression property,
   1495                                                  PreParserIdentifier name) {}
   1496   V8_INLINE void SetFunctionNameFromIdentifierRef(
   1497       PreParserExpression value, PreParserExpression identifier) {}
   1498 
   1499   V8_INLINE ZoneList<typename ExpressionClassifier::Error>*
   1500   GetReportedErrorList() const {
   1501     return function_state_->GetReportedErrorList();
   1502   }
   1503 
   1504   V8_INLINE ZoneList<PreParserExpression>* GetNonPatternList() const {
   1505     return function_state_->non_patterns_to_rewrite();
   1506   }
   1507 
   1508   V8_INLINE void CountUsage(v8::Isolate::UseCounterFeature feature) {
   1509     if (use_counts_ != nullptr) ++use_counts_[feature];
   1510   }
   1511 
   1512   // Preparser's private field members.
   1513 
   1514   int* use_counts_;
   1515   bool track_unresolved_variables_;
   1516   PreParserLogger log_;
   1517   PendingCompilationErrorHandler* pending_error_handler_;
   1518 };
   1519 
   1520 PreParserExpression PreParser::SpreadCall(PreParserExpression function,
   1521                                           PreParserExpressionList args,
   1522                                           int pos) {
   1523   return factory()->NewCall(function, args, pos);
   1524 }
   1525 
   1526 PreParserExpression PreParser::SpreadCallNew(PreParserExpression function,
   1527                                              PreParserExpressionList args,
   1528                                              int pos) {
   1529   return factory()->NewCallNew(function, args, pos);
   1530 }
   1531 
   1532 PreParserStatementList PreParser::ParseEagerFunctionBody(
   1533     PreParserIdentifier function_name, int pos,
   1534     const PreParserFormalParameters& parameters, FunctionKind kind,
   1535     FunctionLiteral::FunctionType function_type, bool* ok) {
   1536   PreParserStatementList result;
   1537 
   1538   Scope* inner_scope = scope();
   1539   if (!parameters.is_simple) inner_scope = NewScope(BLOCK_SCOPE);
   1540 
   1541   {
   1542     BlockState block_state(&scope_state_, inner_scope);
   1543     ParseStatementList(result, Token::RBRACE, ok);
   1544     if (!*ok) return PreParserStatementList();
   1545   }
   1546 
   1547   Expect(Token::RBRACE, ok);
   1548   return result;
   1549 }
   1550 
   1551 PreParserExpression PreParser::CloseTemplateLiteral(TemplateLiteralState* state,
   1552                                                     int start,
   1553                                                     PreParserExpression tag) {
   1554   if (IsTaggedTemplate(tag)) {
   1555     // Emulate generation of array literals for tag callsite
   1556     // 1st is array of cooked strings, second is array of raw strings
   1557     function_state_->NextMaterializedLiteralIndex();
   1558     function_state_->NextMaterializedLiteralIndex();
   1559   }
   1560   return EmptyExpression();
   1561 }
   1562 
   1563 }  // namespace internal
   1564 }  // namespace v8
   1565 
   1566 #endif  // V8_PARSING_PREPARSER_H
   1567