| Index: src/type-feedback-vector.h
|
| diff --git a/src/type-feedback-vector.h b/src/type-feedback-vector.h
|
| index 2d394b0ca40e364add2e1e6a13d339e301c6cc3e..f9a3fe3e4623d14a20032cabead34132f6686f80 100644
|
| --- a/src/type-feedback-vector.h
|
| +++ b/src/type-feedback-vector.h
|
| @@ -19,13 +19,20 @@ namespace internal {
|
|
|
|
|
| enum class FeedbackVectorSlotKind {
|
| - UNUSED,
|
| + // This kind means that the slot points to the middle of other slot
|
| + // which occupies more than one feedback vector element.
|
| + // There must be no such slots in the system.
|
| + INVALID,
|
| +
|
| CALL_IC,
|
| LOAD_IC,
|
| KEYED_LOAD_IC,
|
| STORE_IC,
|
| KEYED_STORE_IC,
|
|
|
| + // This is a general purpose slot that occupies one feedback vector element.
|
| + GENERAL,
|
| +
|
| KINDS_NUMBER // Last value indicating number of kinds.
|
| };
|
|
|
| @@ -33,130 +40,110 @@ enum class FeedbackVectorSlotKind {
|
| std::ostream& operator<<(std::ostream& os, FeedbackVectorSlotKind kind);
|
|
|
|
|
| -class StaticFeedbackVectorSpec {
|
| +template <typename Derived>
|
| +class FeedbackVectorSpecBase {
|
| public:
|
| - StaticFeedbackVectorSpec() : slots_(0), ic_slots_(0), ic_kinds_(NULL) {}
|
| - StaticFeedbackVectorSpec(int slots, int ic_slots,
|
| - FeedbackVectorSlotKind* ic_slot_kinds)
|
| - : slots_(slots), ic_slots_(ic_slots), ic_kinds_(ic_slot_kinds) {}
|
| + inline FeedbackVectorSlot AddSlot(FeedbackVectorSlotKind kind);
|
|
|
| - int slots() const { return slots_; }
|
| + FeedbackVectorSlot AddCallICSlot() {
|
| + return AddSlot(FeedbackVectorSlotKind::CALL_IC);
|
| + }
|
|
|
| - int ic_slots() const { return ic_slots_; }
|
| + FeedbackVectorSlot AddLoadICSlot() {
|
| + return AddSlot(FeedbackVectorSlotKind::LOAD_IC);
|
| + }
|
|
|
| - FeedbackVectorSlotKind GetKind(int ic_slot) const {
|
| - DCHECK(ic_slots_ > 0 && ic_slot < ic_slots_);
|
| - return ic_kinds_[ic_slot];
|
| + FeedbackVectorSlot AddKeyedLoadICSlot() {
|
| + return AddSlot(FeedbackVectorSlotKind::KEYED_LOAD_IC);
|
| }
|
|
|
| - private:
|
| - int slots_;
|
| - int ic_slots_;
|
| - FeedbackVectorSlotKind* ic_kinds_;
|
| + FeedbackVectorSlot AddStoreICSlot() {
|
| + return AddSlot(FeedbackVectorSlotKind::STORE_IC);
|
| + }
|
| +
|
| + FeedbackVectorSlot AddKeyedStoreICSlot() {
|
| + return AddSlot(FeedbackVectorSlotKind::KEYED_STORE_IC);
|
| + }
|
| +
|
| + FeedbackVectorSlot AddGeneralSlot() {
|
| + return AddSlot(FeedbackVectorSlotKind::GENERAL);
|
| + }
|
| };
|
|
|
|
|
| -class FeedbackVectorSpec {
|
| +class StaticFeedbackVectorSpec
|
| + : public FeedbackVectorSpecBase<StaticFeedbackVectorSpec> {
|
| public:
|
| - explicit FeedbackVectorSpec(Zone* zone)
|
| - : slots_(0), ic_slots_(0), ic_slot_kinds_(zone) {}
|
| + StaticFeedbackVectorSpec() : slots_(0) {}
|
|
|
| int slots() const { return slots_; }
|
| - void increase_slots(int count) {
|
| - DCHECK_LT(0, count);
|
| - slots_ += count;
|
| - }
|
|
|
| - int ic_slots() const { return ic_slots_; }
|
| - void increase_ic_slots(int count) {
|
| - DCHECK_LT(0, count);
|
| - ic_slots_ += count;
|
| - ic_slot_kinds_.resize(ic_slots_);
|
| + FeedbackVectorSlotKind GetKind(int slot) const {
|
| + DCHECK(slot >= 0 && slot < slots_);
|
| + return kinds_[slot];
|
| }
|
|
|
| - FeedbackVectorICSlot AddSlot(FeedbackVectorSlotKind kind) {
|
| - int slot = ic_slots_;
|
| - increase_ic_slots(1);
|
| - ic_slot_kinds_[slot] = static_cast<unsigned char>(kind);
|
| - return FeedbackVectorICSlot(slot);
|
| - }
|
| + private:
|
| + friend class FeedbackVectorSpecBase<StaticFeedbackVectorSpec>;
|
|
|
| - FeedbackVectorICSlot AddSlots(FeedbackVectorSlotKind kind, int count) {
|
| - int slot = ic_slots_;
|
| - increase_ic_slots(count);
|
| - for (int i = 0; i < count; i++) {
|
| - ic_slot_kinds_[slot + i] = static_cast<unsigned char>(kind);
|
| - }
|
| - return FeedbackVectorICSlot(slot);
|
| + void append(FeedbackVectorSlotKind kind) {
|
| + DCHECK(slots_ < kMaxLength);
|
| + kinds_[slots_++] = kind;
|
| }
|
|
|
| - FeedbackVectorICSlot AddCallICSlot() {
|
| - return AddSlot(FeedbackVectorSlotKind::CALL_IC);
|
| - }
|
| + static const int kMaxLength = 12;
|
|
|
| - FeedbackVectorICSlot AddLoadICSlot() {
|
| - return AddSlot(FeedbackVectorSlotKind::LOAD_IC);
|
| - }
|
| + int slots_;
|
| + FeedbackVectorSlotKind kinds_[kMaxLength];
|
| +};
|
|
|
| - FeedbackVectorICSlot AddLoadICSlots(int count) {
|
| - return AddSlots(FeedbackVectorSlotKind::LOAD_IC, count);
|
| - }
|
|
|
| - FeedbackVectorICSlot AddKeyedLoadICSlot() {
|
| - return AddSlot(FeedbackVectorSlotKind::KEYED_LOAD_IC);
|
| +class FeedbackVectorSpec : public FeedbackVectorSpecBase<FeedbackVectorSpec> {
|
| + public:
|
| + explicit FeedbackVectorSpec(Zone* zone) : slot_kinds_(zone) {
|
| + slot_kinds_.reserve(16);
|
| }
|
|
|
| - FeedbackVectorICSlot AddStoreICSlot() {
|
| - return AddSlot(FeedbackVectorSlotKind::STORE_IC);
|
| - }
|
| + int slots() const { return static_cast<int>(slot_kinds_.size()); }
|
|
|
| - FeedbackVectorSlot AddStubSlot() {
|
| - int slot = slots_;
|
| - increase_slots(1);
|
| - return FeedbackVectorSlot(slot);
|
| + FeedbackVectorSlotKind GetKind(int slot) const {
|
| + return static_cast<FeedbackVectorSlotKind>(slot_kinds_.at(slot));
|
| }
|
|
|
| - FeedbackVectorSlot AddStubSlots(int count) {
|
| - int slot = slots_;
|
| - increase_slots(count);
|
| - return FeedbackVectorSlot(slot);
|
| - }
|
| + private:
|
| + friend class FeedbackVectorSpecBase<FeedbackVectorSpec>;
|
|
|
| - FeedbackVectorSlotKind GetKind(int ic_slot) const {
|
| - return static_cast<FeedbackVectorSlotKind>(ic_slot_kinds_.at(ic_slot));
|
| + void append(FeedbackVectorSlotKind kind) {
|
| + slot_kinds_.push_back(static_cast<unsigned char>(kind));
|
| }
|
|
|
| - private:
|
| - int slots_;
|
| - int ic_slots_;
|
| - ZoneVector<unsigned char> ic_slot_kinds_;
|
| + ZoneVector<unsigned char> slot_kinds_;
|
| };
|
|
|
|
|
| // The shape of the TypeFeedbackVector is an array with:
|
| -// 0: first_ic_slot_index (== length() if no ic slots are present)
|
| +// 0: slot_count
|
| // 1: ics_with_types
|
| // 2: ics_with_generic_info
|
| -// 3: type information for ic slots, if any
|
| +// 3: slots metadata (a bit vector of slot kinds)
|
| // ...
|
| -// N: first feedback slot (N >= 3)
|
| +// N: feedback slot #0 (N >= 3)
|
| // ...
|
| -// [<first_ic_slot_index>: feedback slot]
|
| -// ...to length() - 1
|
| +// N + slot_count - 1: feedback slot #(slot_count-1)
|
| //
|
| class TypeFeedbackVector : public FixedArray {
|
| public:
|
| // Casting.
|
| static inline TypeFeedbackVector* cast(Object* obj);
|
|
|
| - static const int kReservedIndexCount = 3;
|
| - static const int kFirstICSlotIndex = 0;
|
| + static const int kSlotsCountIndex = 0;
|
| static const int kWithTypesIndex = 1;
|
| static const int kGenericCountIndex = 2;
|
| + static const int kReservedIndexCount = 3;
|
|
|
| - static int elements_per_ic_slot() { return 2; }
|
| + // Returns number of feedback vector elements used by given slot kind.
|
| + static inline int GetSlotSize(FeedbackVectorSlotKind kind);
|
|
|
| - inline int first_ic_slot_index() const;
|
| inline int ic_with_type_info_count();
|
| inline void change_ic_with_type_info_count(int delta);
|
| inline int ic_generic_count();
|
| @@ -165,36 +152,27 @@ class TypeFeedbackVector : public FixedArray {
|
|
|
| bool SpecDiffersFrom(const FeedbackVectorSpec* other_spec) const;
|
|
|
| + inline bool is_empty() const;
|
| +
|
| + // Returns number of slots in the vector.
|
| inline int Slots() const;
|
| - inline int ICSlots() const;
|
|
|
| - // Conversion from a slot or ic slot to an integer index to the underlying
|
| - // array.
|
| + // Conversion from a slot to an integer index to the underlying array.
|
| inline int GetIndex(FeedbackVectorSlot slot) const;
|
| - inline int GetIndex(FeedbackVectorICSlot slot) const;
|
| + static int GetIndexFromSpec(const FeedbackVectorSpec* spec,
|
| + FeedbackVectorSlot slot);
|
|
|
| - template <typename Spec>
|
| - static int GetIndexFromSpec(const Spec* spec, FeedbackVectorSlot slot);
|
| - template <typename Spec>
|
| - static int GetIndexFromSpec(const Spec* spec, FeedbackVectorICSlot slot);
|
| -
|
| - // Conversion from an integer index to either a slot or an ic slot. The caller
|
| - // should know what kind she expects.
|
| + // Conversion from an integer index to the underlying array to a slot.
|
| inline FeedbackVectorSlot ToSlot(int index) const;
|
| - inline FeedbackVectorICSlot ToICSlot(int index) const;
|
| inline Object* Get(FeedbackVectorSlot slot) const;
|
| inline void Set(FeedbackVectorSlot slot, Object* value,
|
| WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
|
| - inline Object* Get(FeedbackVectorICSlot slot) const;
|
| - inline void Set(FeedbackVectorICSlot slot, Object* value,
|
| - WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
|
|
|
| - // IC slots need metadata to recognize the type of IC.
|
| - FeedbackVectorSlotKind GetKind(FeedbackVectorICSlot slot) const;
|
| + // Returns slot kind for given slot.
|
| + FeedbackVectorSlotKind GetKind(FeedbackVectorSlot slot) const;
|
|
|
| template <typename Spec>
|
| - static Handle<TypeFeedbackVector> Allocate(Isolate* isolate,
|
| - const Spec* spec);
|
| + static Handle<TypeFeedbackVector> New(Isolate* isolate, const Spec* spec);
|
|
|
| static Handle<TypeFeedbackVector> Copy(Isolate* isolate,
|
| Handle<TypeFeedbackVector> vector);
|
| @@ -206,19 +184,13 @@ class TypeFeedbackVector : public FixedArray {
|
|
|
| DECLARE_PRINTER(TypeFeedbackVector)
|
|
|
| - // Clears the vector slots and the vector ic slots.
|
| + // Clears the vector slots.
|
| void ClearSlots(SharedFunctionInfo* shared) { ClearSlotsImpl(shared, true); }
|
| +
|
| void ClearSlotsAtGCTime(SharedFunctionInfo* shared) {
|
| ClearSlotsImpl(shared, false);
|
| }
|
|
|
| - void ClearICSlots(SharedFunctionInfo* shared) {
|
| - ClearICSlotsImpl(shared, true);
|
| - }
|
| - void ClearICSlotsAtGCTime(SharedFunctionInfo* shared) {
|
| - ClearICSlotsImpl(shared, false);
|
| - }
|
| -
|
| static void ClearAllKeyedStoreICs(Isolate* isolate);
|
| void ClearKeyedStoreICs(SharedFunctionInfo* shared);
|
|
|
| @@ -233,17 +205,17 @@ class TypeFeedbackVector : public FixedArray {
|
|
|
| // A raw version of the uninitialized sentinel that's safe to read during
|
| // garbage collection (e.g., for patching the cache).
|
| - static inline Object* RawUninitializedSentinel(Heap* heap);
|
| + static inline Object* RawUninitializedSentinel(Isolate* isolate);
|
|
|
| static const int kDummyLoadICSlot = 0;
|
| - static const int kDummyKeyedLoadICSlot = 1;
|
| - static const int kDummyStoreICSlot = 2;
|
| - static const int kDummyKeyedStoreICSlot = 3;
|
| + static const int kDummyKeyedLoadICSlot = 2;
|
| + static const int kDummyStoreICSlot = 4;
|
| + static const int kDummyKeyedStoreICSlot = 6;
|
|
|
| static Handle<TypeFeedbackVector> DummyVector(Isolate* isolate);
|
| - static FeedbackVectorICSlot DummySlot(int dummyIndex) {
|
| + static FeedbackVectorSlot DummySlot(int dummyIndex) {
|
| DCHECK(dummyIndex >= 0 && dummyIndex <= kDummyKeyedStoreICSlot);
|
| - return FeedbackVectorICSlot(dummyIndex);
|
| + return FeedbackVectorSlot(dummyIndex);
|
| }
|
|
|
| static int PushAppliedArgumentsIndex();
|
| @@ -257,13 +229,12 @@ class TypeFeedbackVector : public FixedArray {
|
| STATIC_ASSERT(static_cast<int>(FeedbackVectorSlotKind::KINDS_NUMBER) <
|
| (1 << kFeedbackVectorSlotKindBits));
|
|
|
| - void SetKind(FeedbackVectorICSlot slot, FeedbackVectorSlotKind kind);
|
| + void SetKind(FeedbackVectorSlot slot, FeedbackVectorSlotKind kind);
|
|
|
| typedef BitSetComputer<FeedbackVectorSlotKind, kFeedbackVectorSlotKindBits,
|
| kSmiValueSize, uint32_t> VectorICComputer;
|
|
|
| void ClearSlotsImpl(SharedFunctionInfo* shared, bool force_clear);
|
| - void ClearICSlotsImpl(SharedFunctionInfo* shared, bool force_clear);
|
|
|
| DISALLOW_IMPLICIT_CONSTRUCTORS(TypeFeedbackVector);
|
| };
|
| @@ -284,13 +255,60 @@ STATIC_ASSERT(Name::kEmptyHashField == 0x3);
|
| STATIC_ASSERT(Name::kHashNotComputedMask == kHeapObjectTag);
|
|
|
|
|
| +class TypeFeedbackMetadataIterator {
|
| + public:
|
| + explicit TypeFeedbackMetadataIterator(Handle<TypeFeedbackVector> metadata)
|
| + : metadata_handle_(metadata),
|
| + slot_(FeedbackVectorSlot(0)),
|
| + slot_kind_(FeedbackVectorSlotKind::INVALID) {}
|
| +
|
| + explicit TypeFeedbackMetadataIterator(TypeFeedbackVector* metadata)
|
| + : metadata_(metadata),
|
| + slot_(FeedbackVectorSlot(0)),
|
| + slot_kind_(FeedbackVectorSlotKind::INVALID) {}
|
| +
|
| + bool HasNext() const { return slot_.ToInt() < metadata()->Slots(); }
|
| +
|
| + FeedbackVectorSlot Next() {
|
| + DCHECK(HasNext());
|
| + FeedbackVectorSlot slot = slot_;
|
| + slot_kind_ = metadata()->GetKind(slot);
|
| + slot_ = FeedbackVectorSlot(slot_.ToInt() + entry_size());
|
| + return slot;
|
| + }
|
| +
|
| + // Returns slot kind of the last slot returned by Next().
|
| + FeedbackVectorSlotKind kind() const {
|
| + DCHECK_NE(FeedbackVectorSlotKind::INVALID, slot_kind_);
|
| + DCHECK_NE(FeedbackVectorSlotKind::KINDS_NUMBER, slot_kind_);
|
| + return slot_kind_;
|
| + }
|
| +
|
| + // Returns entry size of the last slot returned by Next().
|
| + int entry_size() const { return TypeFeedbackVector::GetSlotSize(kind()); }
|
| +
|
| + private:
|
| + TypeFeedbackVector* metadata() const {
|
| + return !metadata_handle_.is_null() ? *metadata_handle_ : metadata_;
|
| + }
|
| +
|
| + // The reason for having a handle and a raw pointer to the meta data is
|
| + // to have a single iterator implementation for both "handlified" and raw
|
| + // pointer use cases.
|
| + Handle<TypeFeedbackVector> metadata_handle_;
|
| + TypeFeedbackVector* metadata_;
|
| + FeedbackVectorSlot slot_;
|
| + FeedbackVectorSlotKind slot_kind_;
|
| +};
|
| +
|
| +
|
| // A FeedbackNexus is the combination of a TypeFeedbackVector and a slot.
|
| // Derived classes customize the update and retrieval of feedback.
|
| class FeedbackNexus {
|
| public:
|
| - FeedbackNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot)
|
| + FeedbackNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot)
|
| : vector_handle_(vector), vector_(NULL), slot_(slot) {}
|
| - FeedbackNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot)
|
| + FeedbackNexus(TypeFeedbackVector* vector, FeedbackVectorSlot slot)
|
| : vector_(vector), slot_(slot) {}
|
| virtual ~FeedbackNexus() {}
|
|
|
| @@ -301,7 +319,7 @@ class FeedbackNexus {
|
| TypeFeedbackVector* vector() const {
|
| return vector_handle_.is_null() ? vector_ : *vector_handle_;
|
| }
|
| - FeedbackVectorICSlot slot() const { return slot_; }
|
| + FeedbackVectorSlot slot() const { return slot_; }
|
|
|
| InlineCacheState ic_state() const { return StateFromFeedback(); }
|
| Map* FindFirstMap() const {
|
| @@ -347,7 +365,7 @@ class FeedbackNexus {
|
| // be done, like allocation.
|
| Handle<TypeFeedbackVector> vector_handle_;
|
| TypeFeedbackVector* vector_;
|
| - FeedbackVectorICSlot slot_;
|
| + FeedbackVectorSlot slot_;
|
| };
|
|
|
|
|
| @@ -357,11 +375,11 @@ class CallICNexus : public FeedbackNexus {
|
| // the count appropriately (ie, by 2).
|
| static const int kCallCountIncrement = 2;
|
|
|
| - CallICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot)
|
| + CallICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot)
|
| : FeedbackNexus(vector, slot) {
|
| DCHECK_EQ(FeedbackVectorSlotKind::CALL_IC, vector->GetKind(slot));
|
| }
|
| - CallICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot)
|
| + CallICNexus(TypeFeedbackVector* vector, FeedbackVectorSlot slot)
|
| : FeedbackNexus(vector, slot) {
|
| DCHECK_EQ(FeedbackVectorSlotKind::CALL_IC, vector->GetKind(slot));
|
| }
|
| @@ -390,15 +408,15 @@ class CallICNexus : public FeedbackNexus {
|
|
|
| class LoadICNexus : public FeedbackNexus {
|
| public:
|
| - LoadICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot)
|
| + LoadICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot)
|
| : FeedbackNexus(vector, slot) {
|
| DCHECK_EQ(FeedbackVectorSlotKind::LOAD_IC, vector->GetKind(slot));
|
| }
|
| explicit LoadICNexus(Isolate* isolate)
|
| - : FeedbackNexus(TypeFeedbackVector::DummyVector(isolate),
|
| - TypeFeedbackVector::DummySlot(
|
| - TypeFeedbackVector::kDummyLoadICSlot)) {}
|
| - LoadICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot)
|
| + : FeedbackNexus(
|
| + TypeFeedbackVector::DummyVector(isolate),
|
| + FeedbackVectorSlot(TypeFeedbackVector::kDummyLoadICSlot)) {}
|
| + LoadICNexus(TypeFeedbackVector* vector, FeedbackVectorSlot slot)
|
| : FeedbackNexus(vector, slot) {
|
| DCHECK_EQ(FeedbackVectorSlotKind::LOAD_IC, vector->GetKind(slot));
|
| }
|
| @@ -415,11 +433,11 @@ class LoadICNexus : public FeedbackNexus {
|
|
|
| class KeyedLoadICNexus : public FeedbackNexus {
|
| public:
|
| - KeyedLoadICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot)
|
| + KeyedLoadICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot)
|
| : FeedbackNexus(vector, slot) {
|
| DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, vector->GetKind(slot));
|
| }
|
| - KeyedLoadICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot)
|
| + KeyedLoadICNexus(TypeFeedbackVector* vector, FeedbackVectorSlot slot)
|
| : FeedbackNexus(vector, slot) {
|
| DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, vector->GetKind(slot));
|
| }
|
| @@ -440,15 +458,15 @@ class KeyedLoadICNexus : public FeedbackNexus {
|
|
|
| class StoreICNexus : public FeedbackNexus {
|
| public:
|
| - StoreICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot)
|
| + StoreICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot)
|
| : FeedbackNexus(vector, slot) {
|
| DCHECK_EQ(FeedbackVectorSlotKind::STORE_IC, vector->GetKind(slot));
|
| }
|
| explicit StoreICNexus(Isolate* isolate)
|
| - : FeedbackNexus(TypeFeedbackVector::DummyVector(isolate),
|
| - TypeFeedbackVector::DummySlot(
|
| - TypeFeedbackVector::kDummyStoreICSlot)) {}
|
| - StoreICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot)
|
| + : FeedbackNexus(
|
| + TypeFeedbackVector::DummyVector(isolate),
|
| + FeedbackVectorSlot(TypeFeedbackVector::kDummyStoreICSlot)) {}
|
| + StoreICNexus(TypeFeedbackVector* vector, FeedbackVectorSlot slot)
|
| : FeedbackNexus(vector, slot) {
|
| DCHECK_EQ(FeedbackVectorSlotKind::STORE_IC, vector->GetKind(slot));
|
| }
|
| @@ -465,16 +483,15 @@ class StoreICNexus : public FeedbackNexus {
|
|
|
| class KeyedStoreICNexus : public FeedbackNexus {
|
| public:
|
| - KeyedStoreICNexus(Handle<TypeFeedbackVector> vector,
|
| - FeedbackVectorICSlot slot)
|
| + KeyedStoreICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot)
|
| : FeedbackNexus(vector, slot) {
|
| DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC, vector->GetKind(slot));
|
| }
|
| explicit KeyedStoreICNexus(Isolate* isolate)
|
| - : FeedbackNexus(TypeFeedbackVector::DummyVector(isolate),
|
| - TypeFeedbackVector::DummySlot(
|
| - TypeFeedbackVector::kDummyKeyedStoreICSlot)) {}
|
| - KeyedStoreICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot)
|
| + : FeedbackNexus(
|
| + TypeFeedbackVector::DummyVector(isolate),
|
| + FeedbackVectorSlot(TypeFeedbackVector::kDummyKeyedStoreICSlot)) {}
|
| + KeyedStoreICNexus(TypeFeedbackVector* vector, FeedbackVectorSlot slot)
|
| : FeedbackNexus(vector, slot) {
|
| DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC, vector->GetKind(slot));
|
| }
|
|
|