Home | History | Annotate | Download | only in compiler
      1 // Copyright 2013 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_COMPILER_JS_OPERATOR_H_
      6 #define V8_COMPILER_JS_OPERATOR_H_
      7 
      8 #include "src/base/compiler-specific.h"
      9 #include "src/globals.h"
     10 #include "src/maybe-handles.h"
     11 #include "src/runtime/runtime.h"
     12 #include "src/type-hints.h"
     13 #include "src/vector-slot-pair.h"
     14 
     15 namespace v8 {
     16 namespace internal {
     17 
     18 class AllocationSite;
     19 class ObjectBoilerplateDescription;
     20 class ArrayBoilerplateDescription;
     21 class FeedbackCell;
     22 class SharedFunctionInfo;
     23 
     24 namespace compiler {
     25 
     26 // Forward declarations.
     27 class Operator;
     28 struct JSOperatorGlobalCache;
     29 
     30 // Defines the frequency a given Call/Construct site was executed. For some
     31 // call sites the frequency is not known.
     32 class CallFrequency final {
     33  public:
     34   CallFrequency() : value_(std::numeric_limits<float>::quiet_NaN()) {}
     35   explicit CallFrequency(float value) : value_(value) {
     36     DCHECK(!std::isnan(value));
     37   }
     38 
     39   bool IsKnown() const { return !IsUnknown(); }
     40   bool IsUnknown() const { return std::isnan(value_); }
     41   float value() const {
     42     DCHECK(IsKnown());
     43     return value_;
     44   }
     45 
     46   bool operator==(CallFrequency const& that) const {
     47     return bit_cast<uint32_t>(this->value_) == bit_cast<uint32_t>(that.value_);
     48   }
     49   bool operator!=(CallFrequency const& that) const { return !(*this == that); }
     50 
     51   friend size_t hash_value(CallFrequency f) {
     52     return bit_cast<uint32_t>(f.value_);
     53   }
     54 
     55  private:
     56   float value_;
     57 };
     58 
     59 std::ostream& operator<<(std::ostream&, CallFrequency);
     60 
     61 CallFrequency CallFrequencyOf(Operator const* op) V8_WARN_UNUSED_RESULT;
     62 
     63 // Defines the flags for a JavaScript call forwarding parameters. This
     64 // is used as parameter by JSConstructForwardVarargs operators.
     65 class ConstructForwardVarargsParameters final {
     66  public:
     67   ConstructForwardVarargsParameters(size_t arity, uint32_t start_index)
     68       : bit_field_(ArityField::encode(arity) |
     69                    StartIndexField::encode(start_index)) {}
     70 
     71   size_t arity() const { return ArityField::decode(bit_field_); }
     72   uint32_t start_index() const { return StartIndexField::decode(bit_field_); }
     73 
     74   bool operator==(ConstructForwardVarargsParameters const& that) const {
     75     return this->bit_field_ == that.bit_field_;
     76   }
     77   bool operator!=(ConstructForwardVarargsParameters const& that) const {
     78     return !(*this == that);
     79   }
     80 
     81  private:
     82   friend size_t hash_value(ConstructForwardVarargsParameters const& p) {
     83     return p.bit_field_;
     84   }
     85 
     86   typedef BitField<size_t, 0, 16> ArityField;
     87   typedef BitField<uint32_t, 16, 16> StartIndexField;
     88 
     89   uint32_t const bit_field_;
     90 };
     91 
     92 std::ostream& operator<<(std::ostream&,
     93                          ConstructForwardVarargsParameters const&);
     94 
     95 ConstructForwardVarargsParameters const& ConstructForwardVarargsParametersOf(
     96     Operator const*) V8_WARN_UNUSED_RESULT;
     97 
     98 // Defines the arity and the feedback for a JavaScript constructor call. This is
     99 // used as a parameter by JSConstruct and JSConstructWithSpread operators.
    100 class ConstructParameters final {
    101  public:
    102   ConstructParameters(uint32_t arity, CallFrequency frequency,
    103                       VectorSlotPair const& feedback)
    104       : arity_(arity), frequency_(frequency), feedback_(feedback) {}
    105 
    106   uint32_t arity() const { return arity_; }
    107   CallFrequency frequency() const { return frequency_; }
    108   VectorSlotPair const& feedback() const { return feedback_; }
    109 
    110  private:
    111   uint32_t const arity_;
    112   CallFrequency const frequency_;
    113   VectorSlotPair const feedback_;
    114 };
    115 
    116 bool operator==(ConstructParameters const&, ConstructParameters const&);
    117 bool operator!=(ConstructParameters const&, ConstructParameters const&);
    118 
    119 size_t hash_value(ConstructParameters const&);
    120 
    121 std::ostream& operator<<(std::ostream&, ConstructParameters const&);
    122 
    123 ConstructParameters const& ConstructParametersOf(Operator const*);
    124 
    125 // Defines the flags for a JavaScript call forwarding parameters. This
    126 // is used as parameter by JSCallForwardVarargs operators.
    127 class CallForwardVarargsParameters final {
    128  public:
    129   CallForwardVarargsParameters(size_t arity, uint32_t start_index)
    130       : bit_field_(ArityField::encode(arity) |
    131                    StartIndexField::encode(start_index)) {}
    132 
    133   size_t arity() const { return ArityField::decode(bit_field_); }
    134   uint32_t start_index() const { return StartIndexField::decode(bit_field_); }
    135 
    136   bool operator==(CallForwardVarargsParameters const& that) const {
    137     return this->bit_field_ == that.bit_field_;
    138   }
    139   bool operator!=(CallForwardVarargsParameters const& that) const {
    140     return !(*this == that);
    141   }
    142 
    143  private:
    144   friend size_t hash_value(CallForwardVarargsParameters const& p) {
    145     return p.bit_field_;
    146   }
    147 
    148   typedef BitField<size_t, 0, 15> ArityField;
    149   typedef BitField<uint32_t, 15, 15> StartIndexField;
    150 
    151   uint32_t const bit_field_;
    152 };
    153 
    154 std::ostream& operator<<(std::ostream&, CallForwardVarargsParameters const&);
    155 
    156 CallForwardVarargsParameters const& CallForwardVarargsParametersOf(
    157     Operator const*) V8_WARN_UNUSED_RESULT;
    158 
    159 // Defines the arity and the call flags for a JavaScript function call. This is
    160 // used as a parameter by JSCall and JSCallWithSpread operators.
    161 class CallParameters final {
    162  public:
    163   CallParameters(size_t arity, CallFrequency const& frequency,
    164                  VectorSlotPair const& feedback,
    165                  ConvertReceiverMode convert_mode,
    166                  SpeculationMode speculation_mode)
    167       : bit_field_(ArityField::encode(arity) |
    168                    SpeculationModeField::encode(speculation_mode) |
    169                    ConvertReceiverModeField::encode(convert_mode)),
    170         frequency_(frequency),
    171         feedback_(feedback) {}
    172 
    173   size_t arity() const { return ArityField::decode(bit_field_); }
    174   CallFrequency const& frequency() const { return frequency_; }
    175   ConvertReceiverMode convert_mode() const {
    176     return ConvertReceiverModeField::decode(bit_field_);
    177   }
    178   VectorSlotPair const& feedback() const { return feedback_; }
    179 
    180   SpeculationMode speculation_mode() const {
    181     return SpeculationModeField::decode(bit_field_);
    182   }
    183 
    184   bool operator==(CallParameters const& that) const {
    185     return this->bit_field_ == that.bit_field_ &&
    186            this->frequency_ == that.frequency_ &&
    187            this->feedback_ == that.feedback_;
    188   }
    189   bool operator!=(CallParameters const& that) const { return !(*this == that); }
    190 
    191  private:
    192   friend size_t hash_value(CallParameters const& p) {
    193     return base::hash_combine(p.bit_field_, p.frequency_, p.feedback_);
    194   }
    195 
    196   typedef BitField<size_t, 0, 28> ArityField;
    197   typedef BitField<SpeculationMode, 28, 1> SpeculationModeField;
    198   typedef BitField<ConvertReceiverMode, 29, 2> ConvertReceiverModeField;
    199 
    200   uint32_t const bit_field_;
    201   CallFrequency const frequency_;
    202   VectorSlotPair const feedback_;
    203 };
    204 
    205 size_t hash_value(CallParameters const&);
    206 
    207 std::ostream& operator<<(std::ostream&, CallParameters const&);
    208 
    209 const CallParameters& CallParametersOf(const Operator* op);
    210 
    211 
    212 // Defines the arity and the ID for a runtime function call. This is used as a
    213 // parameter by JSCallRuntime operators.
    214 class CallRuntimeParameters final {
    215  public:
    216   CallRuntimeParameters(Runtime::FunctionId id, size_t arity)
    217       : id_(id), arity_(arity) {}
    218 
    219   Runtime::FunctionId id() const { return id_; }
    220   size_t arity() const { return arity_; }
    221 
    222  private:
    223   const Runtime::FunctionId id_;
    224   const size_t arity_;
    225 };
    226 
    227 bool operator==(CallRuntimeParameters const&, CallRuntimeParameters const&);
    228 bool operator!=(CallRuntimeParameters const&, CallRuntimeParameters const&);
    229 
    230 size_t hash_value(CallRuntimeParameters const&);
    231 
    232 std::ostream& operator<<(std::ostream&, CallRuntimeParameters const&);
    233 
    234 const CallRuntimeParameters& CallRuntimeParametersOf(const Operator* op);
    235 
    236 
    237 // Defines the location of a context slot relative to a specific scope. This is
    238 // used as a parameter by JSLoadContext and JSStoreContext operators and allows
    239 // accessing a context-allocated variable without keeping track of the scope.
    240 class ContextAccess final {
    241  public:
    242   ContextAccess(size_t depth, size_t index, bool immutable);
    243 
    244   size_t depth() const { return depth_; }
    245   size_t index() const { return index_; }
    246   bool immutable() const { return immutable_; }
    247 
    248  private:
    249   // For space reasons, we keep this tightly packed, otherwise we could just use
    250   // a simple int/int/bool POD.
    251   const bool immutable_;
    252   const uint16_t depth_;
    253   const uint32_t index_;
    254 };
    255 
    256 bool operator==(ContextAccess const&, ContextAccess const&);
    257 bool operator!=(ContextAccess const&, ContextAccess const&);
    258 
    259 size_t hash_value(ContextAccess const&);
    260 
    261 V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream&, ContextAccess const&);
    262 
    263 V8_EXPORT_PRIVATE ContextAccess const& ContextAccessOf(Operator const*);
    264 
    265 // Defines the slot count and ScopeType for a new function or eval context. This
    266 // is used as a parameter by the JSCreateFunctionContext operator.
    267 class CreateFunctionContextParameters final {
    268  public:
    269   CreateFunctionContextParameters(Handle<ScopeInfo> scope_info, int slot_count,
    270                                   ScopeType scope_type);
    271 
    272   Handle<ScopeInfo> scope_info() const { return scope_info_; }
    273   int slot_count() const { return slot_count_; }
    274   ScopeType scope_type() const { return scope_type_; }
    275 
    276  private:
    277   Handle<ScopeInfo> scope_info_;
    278   int const slot_count_;
    279   ScopeType const scope_type_;
    280 };
    281 
    282 bool operator==(CreateFunctionContextParameters const& lhs,
    283                 CreateFunctionContextParameters const& rhs);
    284 bool operator!=(CreateFunctionContextParameters const& lhs,
    285                 CreateFunctionContextParameters const& rhs);
    286 
    287 size_t hash_value(CreateFunctionContextParameters const& parameters);
    288 
    289 std::ostream& operator<<(std::ostream& os,
    290                          CreateFunctionContextParameters const& parameters);
    291 
    292 CreateFunctionContextParameters const& CreateFunctionContextParametersOf(
    293     Operator const*);
    294 
    295 // Defines parameters for JSStoreNamedOwn operator.
    296 class StoreNamedOwnParameters final {
    297  public:
    298   StoreNamedOwnParameters(Handle<Name> name, VectorSlotPair const& feedback)
    299       : name_(name), feedback_(feedback) {}
    300 
    301   Handle<Name> name() const { return name_; }
    302   VectorSlotPair const& feedback() const { return feedback_; }
    303 
    304  private:
    305   Handle<Name> const name_;
    306   VectorSlotPair const feedback_;
    307 };
    308 
    309 bool operator==(StoreNamedOwnParameters const&, StoreNamedOwnParameters const&);
    310 bool operator!=(StoreNamedOwnParameters const&, StoreNamedOwnParameters const&);
    311 
    312 size_t hash_value(StoreNamedOwnParameters const&);
    313 
    314 std::ostream& operator<<(std::ostream&, StoreNamedOwnParameters const&);
    315 
    316 const StoreNamedOwnParameters& StoreNamedOwnParametersOf(const Operator* op);
    317 
    318 // Defines the feedback, i.e., vector and index, for storing a data property in
    319 // an object literal. This is used as a parameter by JSCreateEmptyLiteralArray
    320 // and JSStoreDataPropertyInLiteral operators.
    321 class FeedbackParameter final {
    322  public:
    323   explicit FeedbackParameter(VectorSlotPair const& feedback)
    324       : feedback_(feedback) {}
    325 
    326   VectorSlotPair const& feedback() const { return feedback_; }
    327 
    328  private:
    329   VectorSlotPair const feedback_;
    330 };
    331 
    332 bool operator==(FeedbackParameter const&, FeedbackParameter const&);
    333 bool operator!=(FeedbackParameter const&, FeedbackParameter const&);
    334 
    335 size_t hash_value(FeedbackParameter const&);
    336 
    337 std::ostream& operator<<(std::ostream&, FeedbackParameter const&);
    338 
    339 const FeedbackParameter& FeedbackParameterOf(const Operator* op);
    340 
    341 // Defines the property of an object for a named access. This is
    342 // used as a parameter by the JSLoadNamed and JSStoreNamed operators.
    343 class NamedAccess final {
    344  public:
    345   NamedAccess(LanguageMode language_mode, Handle<Name> name,
    346               VectorSlotPair const& feedback)
    347       : name_(name), feedback_(feedback), language_mode_(language_mode) {}
    348 
    349   Handle<Name> name() const { return name_; }
    350   LanguageMode language_mode() const { return language_mode_; }
    351   VectorSlotPair const& feedback() const { return feedback_; }
    352 
    353  private:
    354   Handle<Name> const name_;
    355   VectorSlotPair const feedback_;
    356   LanguageMode const language_mode_;
    357 };
    358 
    359 bool operator==(NamedAccess const&, NamedAccess const&);
    360 bool operator!=(NamedAccess const&, NamedAccess const&);
    361 
    362 size_t hash_value(NamedAccess const&);
    363 
    364 std::ostream& operator<<(std::ostream&, NamedAccess const&);
    365 
    366 const NamedAccess& NamedAccessOf(const Operator* op);
    367 
    368 
    369 // Defines the property being loaded from an object by a named load. This is
    370 // used as a parameter by JSLoadGlobal operator.
    371 class LoadGlobalParameters final {
    372  public:
    373   LoadGlobalParameters(const Handle<Name>& name, const VectorSlotPair& feedback,
    374                        TypeofMode typeof_mode)
    375       : name_(name), feedback_(feedback), typeof_mode_(typeof_mode) {}
    376 
    377   const Handle<Name>& name() const { return name_; }
    378   TypeofMode typeof_mode() const { return typeof_mode_; }
    379 
    380   const VectorSlotPair& feedback() const { return feedback_; }
    381 
    382  private:
    383   const Handle<Name> name_;
    384   const VectorSlotPair feedback_;
    385   const TypeofMode typeof_mode_;
    386 };
    387 
    388 bool operator==(LoadGlobalParameters const&, LoadGlobalParameters const&);
    389 bool operator!=(LoadGlobalParameters const&, LoadGlobalParameters const&);
    390 
    391 size_t hash_value(LoadGlobalParameters const&);
    392 
    393 std::ostream& operator<<(std::ostream&, LoadGlobalParameters const&);
    394 
    395 const LoadGlobalParameters& LoadGlobalParametersOf(const Operator* op);
    396 
    397 
    398 // Defines the property being stored to an object by a named store. This is
    399 // used as a parameter by JSStoreGlobal operator.
    400 class StoreGlobalParameters final {
    401  public:
    402   StoreGlobalParameters(LanguageMode language_mode,
    403                         const VectorSlotPair& feedback,
    404                         const Handle<Name>& name)
    405       : language_mode_(language_mode), name_(name), feedback_(feedback) {}
    406 
    407   LanguageMode language_mode() const { return language_mode_; }
    408   const VectorSlotPair& feedback() const { return feedback_; }
    409   const Handle<Name>& name() const { return name_; }
    410 
    411  private:
    412   const LanguageMode language_mode_;
    413   const Handle<Name> name_;
    414   const VectorSlotPair feedback_;
    415 };
    416 
    417 bool operator==(StoreGlobalParameters const&, StoreGlobalParameters const&);
    418 bool operator!=(StoreGlobalParameters const&, StoreGlobalParameters const&);
    419 
    420 size_t hash_value(StoreGlobalParameters const&);
    421 
    422 std::ostream& operator<<(std::ostream&, StoreGlobalParameters const&);
    423 
    424 const StoreGlobalParameters& StoreGlobalParametersOf(const Operator* op);
    425 
    426 
    427 // Defines the property of an object for a keyed access. This is used
    428 // as a parameter by the JSLoadProperty and JSStoreProperty operators.
    429 class PropertyAccess final {
    430  public:
    431   PropertyAccess(LanguageMode language_mode, VectorSlotPair const& feedback)
    432       : feedback_(feedback), language_mode_(language_mode) {}
    433 
    434   LanguageMode language_mode() const { return language_mode_; }
    435   VectorSlotPair const& feedback() const { return feedback_; }
    436 
    437  private:
    438   VectorSlotPair const feedback_;
    439   LanguageMode const language_mode_;
    440 };
    441 
    442 bool operator==(PropertyAccess const&, PropertyAccess const&);
    443 bool operator!=(PropertyAccess const&, PropertyAccess const&);
    444 
    445 size_t hash_value(PropertyAccess const&);
    446 
    447 std::ostream& operator<<(std::ostream&, PropertyAccess const&);
    448 
    449 PropertyAccess const& PropertyAccessOf(const Operator* op);
    450 
    451 
    452 // CreateArgumentsType is used as parameter to JSCreateArguments nodes.
    453 CreateArgumentsType const& CreateArgumentsTypeOf(const Operator* op);
    454 
    455 
    456 // Defines shared information for the array that should be created. This is
    457 // used as parameter by JSCreateArray operators.
    458 class CreateArrayParameters final {
    459  public:
    460   explicit CreateArrayParameters(size_t arity, MaybeHandle<AllocationSite> site)
    461       : arity_(arity), site_(site) {}
    462 
    463   size_t arity() const { return arity_; }
    464   MaybeHandle<AllocationSite> site() const { return site_; }
    465 
    466  private:
    467   size_t const arity_;
    468   MaybeHandle<AllocationSite> const site_;
    469 };
    470 
    471 bool operator==(CreateArrayParameters const&, CreateArrayParameters const&);
    472 bool operator!=(CreateArrayParameters const&, CreateArrayParameters const&);
    473 
    474 size_t hash_value(CreateArrayParameters const&);
    475 
    476 std::ostream& operator<<(std::ostream&, CreateArrayParameters const&);
    477 
    478 const CreateArrayParameters& CreateArrayParametersOf(const Operator* op);
    479 
    480 // Defines shared information for the array iterator that should be created.
    481 // This is used as parameter by JSCreateArrayIterator operators.
    482 class CreateArrayIteratorParameters final {
    483  public:
    484   explicit CreateArrayIteratorParameters(IterationKind kind) : kind_(kind) {}
    485 
    486   IterationKind kind() const { return kind_; }
    487 
    488  private:
    489   IterationKind const kind_;
    490 };
    491 
    492 bool operator==(CreateArrayIteratorParameters const&,
    493                 CreateArrayIteratorParameters const&);
    494 bool operator!=(CreateArrayIteratorParameters const&,
    495                 CreateArrayIteratorParameters const&);
    496 
    497 size_t hash_value(CreateArrayIteratorParameters const&);
    498 
    499 std::ostream& operator<<(std::ostream&, CreateArrayIteratorParameters const&);
    500 
    501 const CreateArrayIteratorParameters& CreateArrayIteratorParametersOf(
    502     const Operator* op);
    503 
    504 // Defines shared information for the array iterator that should be created.
    505 // This is used as parameter by JSCreateCollectionIterator operators.
    506 class CreateCollectionIteratorParameters final {
    507  public:
    508   explicit CreateCollectionIteratorParameters(CollectionKind collection_kind,
    509                                               IterationKind iteration_kind)
    510       : collection_kind_(collection_kind), iteration_kind_(iteration_kind) {
    511     CHECK(!(collection_kind == CollectionKind::kSet &&
    512             iteration_kind == IterationKind::kKeys));
    513   }
    514 
    515   CollectionKind collection_kind() const { return collection_kind_; }
    516   IterationKind iteration_kind() const { return iteration_kind_; }
    517 
    518  private:
    519   CollectionKind const collection_kind_;
    520   IterationKind const iteration_kind_;
    521 };
    522 
    523 bool operator==(CreateCollectionIteratorParameters const&,
    524                 CreateCollectionIteratorParameters const&);
    525 bool operator!=(CreateCollectionIteratorParameters const&,
    526                 CreateCollectionIteratorParameters const&);
    527 
    528 size_t hash_value(CreateCollectionIteratorParameters const&);
    529 
    530 std::ostream& operator<<(std::ostream&,
    531                          CreateCollectionIteratorParameters const&);
    532 
    533 const CreateCollectionIteratorParameters& CreateCollectionIteratorParametersOf(
    534     const Operator* op);
    535 
    536 // Defines shared information for the bound function that should be created.
    537 // This is used as parameter by JSCreateBoundFunction operators.
    538 class CreateBoundFunctionParameters final {
    539  public:
    540   CreateBoundFunctionParameters(size_t arity, Handle<Map> map)
    541       : arity_(arity), map_(map) {}
    542 
    543   size_t arity() const { return arity_; }
    544   Handle<Map> map() const { return map_; }
    545 
    546  private:
    547   size_t const arity_;
    548   Handle<Map> const map_;
    549 };
    550 
    551 bool operator==(CreateBoundFunctionParameters const&,
    552                 CreateBoundFunctionParameters const&);
    553 bool operator!=(CreateBoundFunctionParameters const&,
    554                 CreateBoundFunctionParameters const&);
    555 
    556 size_t hash_value(CreateBoundFunctionParameters const&);
    557 
    558 std::ostream& operator<<(std::ostream&, CreateBoundFunctionParameters const&);
    559 
    560 const CreateBoundFunctionParameters& CreateBoundFunctionParametersOf(
    561     const Operator* op);
    562 
    563 // Defines shared information for the closure that should be created. This is
    564 // used as a parameter by JSCreateClosure operators.
    565 class CreateClosureParameters final {
    566  public:
    567   CreateClosureParameters(Handle<SharedFunctionInfo> shared_info,
    568                           Handle<FeedbackCell> feedback_cell, Handle<Code> code,
    569                           PretenureFlag pretenure)
    570       : shared_info_(shared_info),
    571         feedback_cell_(feedback_cell),
    572         code_(code),
    573         pretenure_(pretenure) {}
    574 
    575   Handle<SharedFunctionInfo> shared_info() const { return shared_info_; }
    576   Handle<FeedbackCell> feedback_cell() const { return feedback_cell_; }
    577   Handle<Code> code() const { return code_; }
    578   PretenureFlag pretenure() const { return pretenure_; }
    579 
    580  private:
    581   Handle<SharedFunctionInfo> const shared_info_;
    582   Handle<FeedbackCell> const feedback_cell_;
    583   Handle<Code> const code_;
    584   PretenureFlag const pretenure_;
    585 };
    586 
    587 bool operator==(CreateClosureParameters const&, CreateClosureParameters const&);
    588 bool operator!=(CreateClosureParameters const&, CreateClosureParameters const&);
    589 
    590 size_t hash_value(CreateClosureParameters const&);
    591 
    592 std::ostream& operator<<(std::ostream&, CreateClosureParameters const&);
    593 
    594 const CreateClosureParameters& CreateClosureParametersOf(const Operator* op);
    595 
    596 // Defines shared information for the literal that should be created. This is
    597 // used as parameter by JSCreateLiteralArray, JSCreateLiteralObject and
    598 // JSCreateLiteralRegExp operators.
    599 class CreateLiteralParameters final {
    600  public:
    601   CreateLiteralParameters(Handle<HeapObject> constant,
    602                           VectorSlotPair const& feedback, int length, int flags)
    603       : constant_(constant),
    604         feedback_(feedback),
    605         length_(length),
    606         flags_(flags) {}
    607 
    608   Handle<HeapObject> constant() const { return constant_; }
    609   VectorSlotPair const& feedback() const { return feedback_; }
    610   int length() const { return length_; }
    611   int flags() const { return flags_; }
    612 
    613  private:
    614   Handle<HeapObject> const constant_;
    615   VectorSlotPair const feedback_;
    616   int const length_;
    617   int const flags_;
    618 };
    619 
    620 bool operator==(CreateLiteralParameters const&, CreateLiteralParameters const&);
    621 bool operator!=(CreateLiteralParameters const&, CreateLiteralParameters const&);
    622 
    623 size_t hash_value(CreateLiteralParameters const&);
    624 
    625 std::ostream& operator<<(std::ostream&, CreateLiteralParameters const&);
    626 
    627 const CreateLiteralParameters& CreateLiteralParametersOf(const Operator* op);
    628 
    629 class CloneObjectParameters final {
    630  public:
    631   CloneObjectParameters(VectorSlotPair const& feedback, int flags)
    632       : feedback_(feedback), flags_(flags) {}
    633 
    634   VectorSlotPair const& feedback() const { return feedback_; }
    635   int flags() const { return flags_; }
    636 
    637  private:
    638   VectorSlotPair const feedback_;
    639   int const flags_;
    640 };
    641 
    642 bool operator==(CloneObjectParameters const&, CloneObjectParameters const&);
    643 bool operator!=(CloneObjectParameters const&, CloneObjectParameters const&);
    644 
    645 size_t hash_value(CloneObjectParameters const&);
    646 
    647 std::ostream& operator<<(std::ostream&, CloneObjectParameters const&);
    648 
    649 const CloneObjectParameters& CloneObjectParametersOf(const Operator* op);
    650 
    651 // Descriptor used by the JSForInPrepare and JSForInNext opcodes.
    652 enum class ForInMode : uint8_t {
    653   kUseEnumCacheKeysAndIndices,
    654   kUseEnumCacheKeys,
    655   kGeneric
    656 };
    657 
    658 size_t hash_value(ForInMode);
    659 
    660 std::ostream& operator<<(std::ostream&, ForInMode);
    661 
    662 ForInMode ForInModeOf(Operator const* op) V8_WARN_UNUSED_RESULT;
    663 
    664 BinaryOperationHint BinaryOperationHintOf(const Operator* op);
    665 
    666 CompareOperationHint CompareOperationHintOf(const Operator* op);
    667 
    668 int GeneratorStoreValueCountOf(const Operator* op) V8_WARN_UNUSED_RESULT;
    669 int RestoreRegisterIndexOf(const Operator* op) V8_WARN_UNUSED_RESULT;
    670 
    671 Handle<ScopeInfo> ScopeInfoOf(const Operator* op) V8_WARN_UNUSED_RESULT;
    672 
    673 // Interface for building JavaScript-level operators, e.g. directly from the
    674 // AST. Most operators have no parameters, thus can be globally shared for all
    675 // graphs.
    676 class V8_EXPORT_PRIVATE JSOperatorBuilder final
    677     : public NON_EXPORTED_BASE(ZoneObject) {
    678  public:
    679   explicit JSOperatorBuilder(Zone* zone);
    680 
    681   const Operator* Equal(CompareOperationHint hint);
    682   const Operator* StrictEqual(CompareOperationHint hint);
    683   const Operator* LessThan(CompareOperationHint hint);
    684   const Operator* GreaterThan(CompareOperationHint hint);
    685   const Operator* LessThanOrEqual(CompareOperationHint hint);
    686   const Operator* GreaterThanOrEqual(CompareOperationHint hint);
    687 
    688   const Operator* BitwiseOr();
    689   const Operator* BitwiseXor();
    690   const Operator* BitwiseAnd();
    691   const Operator* ShiftLeft();
    692   const Operator* ShiftRight();
    693   const Operator* ShiftRightLogical();
    694   const Operator* Add(BinaryOperationHint hint);
    695   const Operator* Subtract();
    696   const Operator* Multiply();
    697   const Operator* Divide();
    698   const Operator* Modulus();
    699   const Operator* Exponentiate();
    700 
    701   const Operator* BitwiseNot();
    702   const Operator* Decrement();
    703   const Operator* Increment();
    704   const Operator* Negate();
    705 
    706   const Operator* ToInteger();
    707   const Operator* ToLength();
    708   const Operator* ToName();
    709   const Operator* ToNumber();
    710   const Operator* ToNumberConvertBigInt();
    711   const Operator* ToNumeric();
    712   const Operator* ToObject();
    713   const Operator* ToString();
    714 
    715   const Operator* Create();
    716   const Operator* CreateArguments(CreateArgumentsType type);
    717   const Operator* CreateArray(size_t arity, MaybeHandle<AllocationSite> site);
    718   const Operator* CreateArrayIterator(IterationKind);
    719   const Operator* CreateCollectionIterator(CollectionKind, IterationKind);
    720   const Operator* CreateBoundFunction(size_t arity, Handle<Map> map);
    721   const Operator* CreateClosure(Handle<SharedFunctionInfo> shared_info,
    722                                 Handle<FeedbackCell> feedback_cell,
    723                                 Handle<Code> code,
    724                                 PretenureFlag pretenure = NOT_TENURED);
    725   const Operator* CreateIterResultObject();
    726   const Operator* CreateStringIterator();
    727   const Operator* CreateKeyValueArray();
    728   const Operator* CreateObject();
    729   const Operator* CreatePromise();
    730   const Operator* CreateTypedArray();
    731   const Operator* CreateLiteralArray(
    732       Handle<ArrayBoilerplateDescription> constant,
    733       VectorSlotPair const& feedback, int literal_flags,
    734       int number_of_elements);
    735   const Operator* CreateEmptyLiteralArray(VectorSlotPair const& feedback);
    736   const Operator* CreateEmptyLiteralObject();
    737 
    738   const Operator* CreateLiteralObject(
    739       Handle<ObjectBoilerplateDescription> constant,
    740       VectorSlotPair const& feedback, int literal_flags,
    741       int number_of_properties);
    742   const Operator* CloneObject(VectorSlotPair const& feedback,
    743                               int literal_flags);
    744   const Operator* CreateLiteralRegExp(Handle<String> constant_pattern,
    745                                       VectorSlotPair const& feedback,
    746                                       int literal_flags);
    747 
    748   const Operator* CallForwardVarargs(size_t arity, uint32_t start_index);
    749   const Operator* Call(
    750       size_t arity, CallFrequency const& frequency = CallFrequency(),
    751       VectorSlotPair const& feedback = VectorSlotPair(),
    752       ConvertReceiverMode convert_mode = ConvertReceiverMode::kAny,
    753       SpeculationMode speculation_mode = SpeculationMode::kDisallowSpeculation);
    754   const Operator* CallWithArrayLike(CallFrequency frequency);
    755   const Operator* CallWithSpread(
    756       uint32_t arity, CallFrequency const& frequency = CallFrequency(),
    757       VectorSlotPair const& feedback = VectorSlotPair(),
    758       SpeculationMode speculation_mode = SpeculationMode::kDisallowSpeculation);
    759   const Operator* CallRuntime(Runtime::FunctionId id);
    760   const Operator* CallRuntime(Runtime::FunctionId id, size_t arity);
    761   const Operator* CallRuntime(const Runtime::Function* function, size_t arity);
    762 
    763   const Operator* ConstructForwardVarargs(size_t arity, uint32_t start_index);
    764   const Operator* Construct(uint32_t arity,
    765                             CallFrequency frequency = CallFrequency(),
    766                             VectorSlotPair const& feedback = VectorSlotPair());
    767   const Operator* ConstructWithArrayLike(CallFrequency frequency);
    768   const Operator* ConstructWithSpread(
    769       uint32_t arity, CallFrequency frequency = CallFrequency(),
    770       VectorSlotPair const& feedback = VectorSlotPair());
    771 
    772   const Operator* LoadProperty(VectorSlotPair const& feedback);
    773   const Operator* LoadNamed(Handle<Name> name, VectorSlotPair const& feedback);
    774 
    775   const Operator* StoreProperty(LanguageMode language_mode,
    776                                 VectorSlotPair const& feedback);
    777   const Operator* StoreNamed(LanguageMode language_mode, Handle<Name> name,
    778                              VectorSlotPair const& feedback);
    779 
    780   const Operator* StoreNamedOwn(Handle<Name> name,
    781                                 VectorSlotPair const& feedback);
    782   const Operator* StoreDataPropertyInLiteral(const VectorSlotPair& feedback);
    783   const Operator* StoreInArrayLiteral(const VectorSlotPair& feedback);
    784 
    785   const Operator* DeleteProperty();
    786 
    787   const Operator* HasProperty();
    788 
    789   const Operator* GetSuperConstructor();
    790 
    791   const Operator* CreateGeneratorObject();
    792 
    793   const Operator* LoadGlobal(const Handle<Name>& name,
    794                              const VectorSlotPair& feedback,
    795                              TypeofMode typeof_mode = NOT_INSIDE_TYPEOF);
    796   const Operator* StoreGlobal(LanguageMode language_mode,
    797                               const Handle<Name>& name,
    798                               const VectorSlotPair& feedback);
    799 
    800   const Operator* LoadContext(size_t depth, size_t index, bool immutable);
    801   const Operator* StoreContext(size_t depth, size_t index);
    802 
    803   const Operator* LoadModule(int32_t cell_index);
    804   const Operator* StoreModule(int32_t cell_index);
    805 
    806   const Operator* HasInPrototypeChain();
    807   const Operator* InstanceOf(const VectorSlotPair& feedback);
    808   const Operator* OrdinaryHasInstance();
    809 
    810   const Operator* ForInEnumerate();
    811   const Operator* ForInNext(ForInMode);
    812   const Operator* ForInPrepare(ForInMode);
    813 
    814   const Operator* LoadMessage();
    815   const Operator* StoreMessage();
    816 
    817   // Used to implement Ignition's SuspendGenerator bytecode.
    818   const Operator* GeneratorStore(int value_count);
    819 
    820   // Used to implement Ignition's SwitchOnGeneratorState bytecode.
    821   const Operator* GeneratorRestoreContinuation();
    822   const Operator* GeneratorRestoreContext();
    823 
    824   // Used to implement Ignition's ResumeGenerator bytecode.
    825   const Operator* GeneratorRestoreRegister(int index);
    826   const Operator* GeneratorRestoreInputOrDebugPos();
    827 
    828   const Operator* StackCheck();
    829   const Operator* Debugger();
    830 
    831   const Operator* FulfillPromise();
    832   const Operator* PerformPromiseThen();
    833   const Operator* PromiseResolve();
    834   const Operator* RejectPromise();
    835   const Operator* ResolvePromise();
    836 
    837   const Operator* CreateFunctionContext(Handle<ScopeInfo> scope_info,
    838                                         int slot_count, ScopeType scope_type);
    839   const Operator* CreateCatchContext(const Handle<ScopeInfo>& scope_info);
    840   const Operator* CreateWithContext(const Handle<ScopeInfo>& scope_info);
    841   const Operator* CreateBlockContext(const Handle<ScopeInfo>& scpope_info);
    842 
    843   const Operator* ObjectIsArray();
    844   const Operator* ParseInt();
    845   const Operator* RegExpTest();
    846 
    847  private:
    848   Zone* zone() const { return zone_; }
    849 
    850   const JSOperatorGlobalCache& cache_;
    851   Zone* const zone_;
    852 
    853   DISALLOW_COPY_AND_ASSIGN(JSOperatorBuilder);
    854 };
    855 
    856 }  // namespace compiler
    857 }  // namespace internal
    858 }  // namespace v8
    859 
    860 #endif  // V8_COMPILER_JS_OPERATOR_H_
    861