Index: src/type-feedback-vector.h |
diff --git a/src/type-feedback-vector.h b/src/type-feedback-vector.h |
index 0c921ed2bfb671d53bedece11da60120d665bbbe..64fcda45e4904deed1e7fe5e44f8bce9d45f91bb 100644 |
--- a/src/type-feedback-vector.h |
+++ b/src/type-feedback-vector.h |
@@ -33,13 +33,11 @@ enum class FeedbackVectorSlotKind { |
std::ostream& operator<<(std::ostream& os, FeedbackVectorSlotKind kind); |
-class FeedbackVectorSpec { |
+class StaticFeedbackVectorSpec { |
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, |
- FeedbackVectorSlotKind* ic_slot_kinds) |
+ 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) {} |
int slots() const { return slots_; } |
@@ -58,25 +56,70 @@ class FeedbackVectorSpec { |
}; |
-class ZoneFeedbackVectorSpec { |
+class FeedbackVectorSpec { |
public: |
- explicit ZoneFeedbackVectorSpec(Zone* zone) |
+ explicit FeedbackVectorSpec(Zone* zone) |
: slots_(0), ic_slots_(0), ic_slot_kinds_(zone) {} |
- ZoneFeedbackVectorSpec(Zone* zone, int slots, int ic_slots) |
- : slots_(slots), ic_slots_(ic_slots), ic_slot_kinds_(ic_slots, zone) {} |
- |
int slots() const { return slots_; } |
- void increase_slots(int count) { slots_ += count; } |
+ 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_); |
} |
- void SetKind(int ic_slot, FeedbackVectorSlotKind kind) { |
- ic_slot_kinds_[ic_slot] = static_cast<unsigned char>(kind); |
+ FeedbackVectorICSlot AddSlot(FeedbackVectorSlotKind kind) { |
+ int slot = ic_slots_; |
+ increase_ic_slots(1); |
+ ic_slot_kinds_[slot] = static_cast<unsigned char>(kind); |
+ return FeedbackVectorICSlot(slot); |
+ } |
+ |
+ 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); |
+ } |
+ |
+ FeedbackVectorICSlot AddCallICSlot() { |
+ return AddSlot(FeedbackVectorSlotKind::CALL_IC); |
+ } |
+ |
+ FeedbackVectorICSlot AddLoadICSlot() { |
+ return AddSlot(FeedbackVectorSlotKind::LOAD_IC); |
+ } |
+ |
+ FeedbackVectorICSlot AddLoadICSlots(int count) { |
+ return AddSlots(FeedbackVectorSlotKind::LOAD_IC, count); |
+ } |
+ |
+ FeedbackVectorICSlot AddKeyedLoadICSlot() { |
+ return AddSlot(FeedbackVectorSlotKind::KEYED_LOAD_IC); |
+ } |
+ |
+ FeedbackVectorICSlot AddStoreICSlots(int count) { |
+ return AddSlots(FeedbackVectorSlotKind::STORE_IC, count); |
+ } |
+ |
+ FeedbackVectorSlot AddStubSlot() { |
+ int slot = slots_; |
+ increase_slots(1); |
+ return FeedbackVectorSlot(slot); |
+ } |
+ |
+ FeedbackVectorSlot AddStubSlots(int count) { |
+ int slot = slots_; |
+ increase_slots(count); |
+ return FeedbackVectorSlot(slot); |
} |
FeedbackVectorSlotKind GetKind(int ic_slot) const { |
@@ -120,7 +163,7 @@ class TypeFeedbackVector : public FixedArray { |
inline void change_ic_generic_count(int delta); |
inline int ic_metadata_length() const; |
- bool SpecDiffersFrom(const ZoneFeedbackVectorSpec* other_spec) const; |
+ bool SpecDiffersFrom(const FeedbackVectorSpec* other_spec) const; |
inline int Slots() const; |
inline int ICSlots() const; |