| Index: src/type-feedback-vector.h
|
| diff --git a/src/type-feedback-vector.h b/src/type-feedback-vector.h
|
| index 4fb01997483655aeba19cc9d393afcf9c238806f..c92a6205cb1b42c81a67161e231caa20d6c4b8e5 100644
|
| --- a/src/type-feedback-vector.h
|
| +++ b/src/type-feedback-vector.h
|
| @@ -17,19 +17,36 @@
|
| namespace v8 {
|
| namespace internal {
|
|
|
| +
|
| +enum class FeedbackVectorSlotKind {
|
| + UNUSED,
|
| + CALL_IC,
|
| + LOAD_IC,
|
| + KEYED_LOAD_IC,
|
| + STORE_IC,
|
| + KEYED_STORE_IC,
|
| +
|
| + KINDS_NUMBER // Last value indicating number of kinds.
|
| +};
|
| +
|
| +
|
| +std::ostream& operator<<(std::ostream& os, FeedbackVectorSlotKind kind);
|
| +
|
| +
|
| class FeedbackVectorSpec {
|
| public:
|
| FeedbackVectorSpec() : slots_(0), ic_slots_(0), ic_kinds_(NULL) {}
|
| explicit FeedbackVectorSpec(int slots)
|
| : slots_(slots), ic_slots_(0), ic_kinds_(NULL) {}
|
| - FeedbackVectorSpec(int slots, int ic_slots, Code::Kind* ic_slot_kinds)
|
| + FeedbackVectorSpec(int slots, int ic_slots,
|
| + FeedbackVectorSlotKind* ic_slot_kinds)
|
| : slots_(slots), ic_slots_(ic_slots), ic_kinds_(ic_slot_kinds) {}
|
|
|
| int slots() const { return slots_; }
|
|
|
| int ic_slots() const { return ic_slots_; }
|
|
|
| - Code::Kind GetKind(int ic_slot) const {
|
| + FeedbackVectorSlotKind GetKind(int ic_slot) const {
|
| DCHECK(ic_slots_ > 0 && ic_slot < ic_slots_);
|
| return ic_kinds_[ic_slot];
|
| }
|
| @@ -37,7 +54,7 @@ class FeedbackVectorSpec {
|
| private:
|
| int slots_;
|
| int ic_slots_;
|
| - Code::Kind* ic_kinds_;
|
| + FeedbackVectorSlotKind* ic_kinds_;
|
| };
|
|
|
|
|
| @@ -58,12 +75,12 @@ class ZoneFeedbackVectorSpec {
|
| ic_slot_kinds_.resize(ic_slots_);
|
| }
|
|
|
| - void SetKind(int ic_slot, Code::Kind kind) {
|
| - ic_slot_kinds_[ic_slot] = kind;
|
| + void SetKind(int ic_slot, FeedbackVectorSlotKind kind) {
|
| + ic_slot_kinds_[ic_slot] = static_cast<unsigned char>(kind);
|
| }
|
|
|
| - Code::Kind GetKind(int ic_slot) const {
|
| - return static_cast<Code::Kind>(ic_slot_kinds_.at(ic_slot));
|
| + FeedbackVectorSlotKind GetKind(int ic_slot) const {
|
| + return static_cast<FeedbackVectorSlotKind>(ic_slot_kinds_.at(ic_slot));
|
| }
|
|
|
| private:
|
| @@ -125,7 +142,7 @@ class TypeFeedbackVector : public FixedArray {
|
| WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
|
|
|
| // IC slots need metadata to recognize the type of IC.
|
| - Code::Kind GetKind(FeedbackVectorICSlot slot) const;
|
| + FeedbackVectorSlotKind GetKind(FeedbackVectorICSlot slot) const;
|
|
|
| template <typename Spec>
|
| static Handle<TypeFeedbackVector> Allocate(Isolate* isolate,
|
| @@ -185,23 +202,17 @@ class TypeFeedbackVector : public FixedArray {
|
| static Handle<TypeFeedbackVector> CreatePushAppliedArgumentsVector(
|
| Isolate* isolate);
|
|
|
| + static const char* Kind2String(FeedbackVectorSlotKind kind);
|
| +
|
| private:
|
| - enum VectorICKind {
|
| - KindUnused = 0x0,
|
| - KindCallIC = 0x1,
|
| - KindLoadIC = 0x2,
|
| - KindKeyedLoadIC = 0x3,
|
| - KindStoreIC = 0x4,
|
| - KindKeyedStoreIC = 0x5,
|
| - };
|
| -
|
| - static const int kVectorICKindBits = 3;
|
| - static VectorICKind FromCodeKind(Code::Kind kind);
|
| - static Code::Kind FromVectorICKind(VectorICKind kind);
|
| - void SetKind(FeedbackVectorICSlot slot, Code::Kind kind);
|
| -
|
| - typedef BitSetComputer<VectorICKind, kVectorICKindBits, kSmiValueSize,
|
| - uint32_t> VectorICComputer;
|
| + static const int kFeedbackVectorSlotKindBits = 3;
|
| + STATIC_ASSERT(static_cast<int>(FeedbackVectorSlotKind::KINDS_NUMBER) <
|
| + (1 << kFeedbackVectorSlotKindBits));
|
| +
|
| + void SetKind(FeedbackVectorICSlot 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);
|
| @@ -300,11 +311,11 @@ class CallICNexus : public FeedbackNexus {
|
|
|
| CallICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot)
|
| : FeedbackNexus(vector, slot) {
|
| - DCHECK(vector->GetKind(slot) == Code::CALL_IC);
|
| + DCHECK_EQ(FeedbackVectorSlotKind::CALL_IC, vector->GetKind(slot));
|
| }
|
| CallICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot)
|
| : FeedbackNexus(vector, slot) {
|
| - DCHECK(vector->GetKind(slot) == Code::CALL_IC);
|
| + DCHECK_EQ(FeedbackVectorSlotKind::CALL_IC, vector->GetKind(slot));
|
| }
|
|
|
| void Clear(Code* host);
|
| @@ -333,7 +344,7 @@ class LoadICNexus : public FeedbackNexus {
|
| public:
|
| LoadICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot)
|
| : FeedbackNexus(vector, slot) {
|
| - DCHECK(vector->GetKind(slot) == Code::LOAD_IC);
|
| + DCHECK_EQ(FeedbackVectorSlotKind::LOAD_IC, vector->GetKind(slot));
|
| }
|
| explicit LoadICNexus(Isolate* isolate)
|
| : FeedbackNexus(TypeFeedbackVector::DummyVector(isolate),
|
| @@ -341,7 +352,7 @@ class LoadICNexus : public FeedbackNexus {
|
| TypeFeedbackVector::kDummyLoadICSlot)) {}
|
| LoadICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot)
|
| : FeedbackNexus(vector, slot) {
|
| - DCHECK(vector->GetKind(slot) == Code::LOAD_IC);
|
| + DCHECK_EQ(FeedbackVectorSlotKind::LOAD_IC, vector->GetKind(slot));
|
| }
|
|
|
| void Clear(Code* host);
|
| @@ -358,11 +369,11 @@ class KeyedLoadICNexus : public FeedbackNexus {
|
| public:
|
| KeyedLoadICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot)
|
| : FeedbackNexus(vector, slot) {
|
| - DCHECK(vector->GetKind(slot) == Code::KEYED_LOAD_IC);
|
| + DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, vector->GetKind(slot));
|
| }
|
| KeyedLoadICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot)
|
| : FeedbackNexus(vector, slot) {
|
| - DCHECK(vector->GetKind(slot) == Code::KEYED_LOAD_IC);
|
| + DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, vector->GetKind(slot));
|
| }
|
|
|
| void Clear(Code* host);
|
| @@ -383,7 +394,7 @@ class StoreICNexus : public FeedbackNexus {
|
| public:
|
| StoreICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot)
|
| : FeedbackNexus(vector, slot) {
|
| - DCHECK(vector->GetKind(slot) == Code::STORE_IC);
|
| + DCHECK_EQ(FeedbackVectorSlotKind::STORE_IC, vector->GetKind(slot));
|
| }
|
| explicit StoreICNexus(Isolate* isolate)
|
| : FeedbackNexus(TypeFeedbackVector::DummyVector(isolate),
|
| @@ -391,7 +402,7 @@ class StoreICNexus : public FeedbackNexus {
|
| TypeFeedbackVector::kDummyStoreICSlot)) {}
|
| StoreICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot)
|
| : FeedbackNexus(vector, slot) {
|
| - DCHECK(vector->GetKind(slot) == Code::STORE_IC);
|
| + DCHECK_EQ(FeedbackVectorSlotKind::STORE_IC, vector->GetKind(slot));
|
| }
|
|
|
| void Clear(Code* host);
|
| @@ -409,7 +420,7 @@ class KeyedStoreICNexus : public FeedbackNexus {
|
| KeyedStoreICNexus(Handle<TypeFeedbackVector> vector,
|
| FeedbackVectorICSlot slot)
|
| : FeedbackNexus(vector, slot) {
|
| - DCHECK(vector->GetKind(slot) == Code::KEYED_STORE_IC);
|
| + DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC, vector->GetKind(slot));
|
| }
|
| explicit KeyedStoreICNexus(Isolate* isolate)
|
| : FeedbackNexus(TypeFeedbackVector::DummyVector(isolate),
|
| @@ -417,7 +428,7 @@ class KeyedStoreICNexus : public FeedbackNexus {
|
| TypeFeedbackVector::kDummyKeyedStoreICSlot)) {}
|
| KeyedStoreICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot)
|
| : FeedbackNexus(vector, slot) {
|
| - DCHECK(vector->GetKind(slot) == Code::KEYED_STORE_IC);
|
| + DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC, vector->GetKind(slot));
|
| }
|
|
|
| void Clear(Code* host);
|
|
|