Chromium Code Reviews| Index: src/type-feedback-vector.h |
| diff --git a/src/type-feedback-vector.h b/src/type-feedback-vector.h |
| index b6fadba73ea0623ea62ee852f15eda9af3394207..8c8ab8f59ff8b81593862cdf75d31443119fa87f 100644 |
| --- a/src/type-feedback-vector.h |
| +++ b/src/type-feedback-vector.h |
| @@ -14,6 +14,15 @@ |
| namespace v8 { |
| namespace internal { |
| +// The shape of the TypeFeedbackVector is an array with: |
| +// 0: first_ic_slot_index (-1 if no ic slots present) |
|
Jakob Kummerow
2014/10/20 10:29:43
the "-1" part is outdated, right?
mvstanton
2014/10/20 11:09:22
Indeed, thanks!
|
| +// 1: ics_with_types |
| +// 2: ics_with_generic_info |
| +// 3: first feedback slot |
| +// ... |
| +// [<first_ic_slot_index>: feedback slot] |
| +// ...to length() - 1 |
| +// |
| class TypeFeedbackVector : public FixedArray { |
| public: |
| // Casting. |
| @@ -22,9 +31,98 @@ class TypeFeedbackVector : public FixedArray { |
| return reinterpret_cast<TypeFeedbackVector*>(obj); |
| } |
| + static const int kReservedIndexCount = 3; |
| + static const int kFirstICSlotIndex = 0; |
| + static const int kWithTypesIndex = 1; |
| + static const int kGenericCountIndex = 2; |
| + |
| + int first_ic_slot_index() { |
| + DCHECK(length() >= kReservedIndexCount); |
| + return Smi::cast(get(kFirstICSlotIndex))->value(); |
| + } |
| + |
| + int ic_with_type_info_count() { |
| + return length() > 0 ? Smi::cast(get(kWithTypesIndex))->value() : 0; |
| + } |
| + |
| + void change_ic_with_type_info_count(int delta) { |
| + if (delta == 0) return; |
| + int value = ic_with_type_info_count() + delta; |
| + // Could go negative because of the debugger. |
| + if (value >= 0) { |
| + set(kWithTypesIndex, Smi::FromInt(value)); |
| + } |
| + } |
| + |
| + int ic_generic_count() { |
| + return length() > 0 ? Smi::cast(get(kGenericCountIndex))->value() : 0; |
| + } |
| + |
| + void change_ic_generic_count(int delta) { |
| + if (delta == 0) return; |
| + int value = ic_generic_count() + delta; |
| + if (value >= 0) { |
| + set(kGenericCountIndex, Smi::FromInt(value)); |
| + } |
| + } |
| + |
| + int Slots() { |
| + if (length() == 0) return 0; |
| + return Max(0, first_ic_slot_index() - kReservedIndexCount); |
| + } |
| + |
| + int ICSlots() { |
| + if (length() == 0) return 0; |
| + return length() - first_ic_slot_index(); |
| + } |
| + |
| + // Conversion from a slot or ic slot to an integer index to the underlying |
| + // array. |
| + int GetIndex(FeedbackVectorSlot slot) { |
| + return kReservedIndexCount + slot.ToInt(); |
| + } |
| + |
| + int GetIndex(FeedbackVectorICSlot slot) { |
| + int first_ic_slot = first_ic_slot_index(); |
| + DCHECK(slot.ToInt() < ICSlots()); |
| + return first_ic_slot + slot.ToInt(); |
| + } |
| + |
| + |
| + // Conversion from an integer index to either a slot or an ic slot. The caller |
| + // should know what kind she expects. |
| + FeedbackVectorSlot ToSlot(int index) { |
| + DCHECK(index >= kReservedIndexCount && index < first_ic_slot_index()); |
| + return FeedbackVectorSlot(index - kReservedIndexCount); |
| + } |
| + |
| + FeedbackVectorICSlot ToICSlot(int index) { |
| + DCHECK(index >= first_ic_slot_index() && index < length()); |
| + return FeedbackVectorICSlot(index - first_ic_slot_index()); |
| + } |
| + |
| + Object* Get(FeedbackVectorSlot slot) { return get(GetIndex(slot)); } |
| + void Set(FeedbackVectorSlot slot, Object* value, |
| + WriteBarrierMode mode = UPDATE_WRITE_BARRIER) { |
| + set(GetIndex(slot), value, mode); |
| + } |
| + |
| + Object* Get(FeedbackVectorICSlot slot) { return get(GetIndex(slot)); } |
| + void Set(FeedbackVectorICSlot slot, Object* value, |
| + WriteBarrierMode mode = UPDATE_WRITE_BARRIER) { |
| + set(GetIndex(slot), value, mode); |
| + } |
| + |
| + |
| + static Handle<TypeFeedbackVector> Allocate(Isolate* isolate, int slot_count, |
| + int ic_slot_count); |
| + |
| static Handle<TypeFeedbackVector> Copy(Isolate* isolate, |
| Handle<TypeFeedbackVector> vector); |
| + // Clears vector slots, and leaves vector ic slots alone. |
| + void ClearSlots(SharedFunctionInfo* shared); |
| + |
| // The object that indicates an uninitialized cache. |
| static inline Handle<Object> UninitializedSentinel(Isolate* isolate); |