Index: src/type-feedback-vector-inl.h |
diff --git a/src/type-feedback-vector-inl.h b/src/type-feedback-vector-inl.h |
index 2301f03a45ffc856bc69a5ee4d218aeda94755bb..4389cfe94495b15d7c194ee3a5cf539f181c6e47 100644 |
--- a/src/type-feedback-vector-inl.h |
+++ b/src/type-feedback-vector-inl.h |
@@ -10,6 +10,22 @@ |
namespace v8 { |
namespace internal { |
+ |
+template <typename Derived> |
+FeedbackVectorSlot FeedbackVectorSpecBase<Derived>::AddSlot( |
+ FeedbackVectorSlotKind kind) { |
+ Derived* derived = static_cast<Derived*>(this); |
+ |
+ int slot = derived->slots(); |
+ int entries_per_slot = TypeFeedbackVector::GetSlotSize(kind); |
+ derived->append(kind); |
+ for (int i = 1; i < entries_per_slot; i++) { |
+ derived->append(FeedbackVectorSlotKind::INVALID); |
+ } |
+ return FeedbackVectorSlot(slot); |
+} |
+ |
+ |
// static |
TypeFeedbackVector* TypeFeedbackVector::cast(Object* obj) { |
DCHECK(obj->IsTypeFeedbackVector()); |
@@ -17,9 +33,24 @@ TypeFeedbackVector* TypeFeedbackVector::cast(Object* obj) { |
} |
-int TypeFeedbackVector::first_ic_slot_index() const { |
+int TypeFeedbackVector::GetSlotSize(FeedbackVectorSlotKind kind) { |
+ DCHECK_NE(FeedbackVectorSlotKind::INVALID, kind); |
+ DCHECK_NE(FeedbackVectorSlotKind::KINDS_NUMBER, kind); |
+ return kind == FeedbackVectorSlotKind::GENERAL ? 1 : 2; |
+} |
+ |
+ |
+bool TypeFeedbackVector::is_empty() const { |
+ if (length() == 0) return true; |
+ DCHECK(length() >= kReservedIndexCount); |
+ return false; |
+} |
+ |
+ |
+int TypeFeedbackVector::Slots() const { |
+ if (length() == 0) return 0; |
DCHECK(length() >= kReservedIndexCount); |
- return Smi::cast(get(kFirstICSlotIndex))->value(); |
+ return Smi::cast(get(kSlotsCountIndex))->value(); |
} |
@@ -52,54 +83,26 @@ void TypeFeedbackVector::change_ic_generic_count(int delta) { |
} |
-int TypeFeedbackVector::Slots() const { |
- if (length() == 0) return 0; |
- return Max( |
- 0, first_ic_slot_index() - ic_metadata_length() - kReservedIndexCount); |
-} |
- |
- |
-int TypeFeedbackVector::ICSlots() const { |
- if (length() == 0) return 0; |
- return (length() - first_ic_slot_index()) / elements_per_ic_slot(); |
-} |
- |
- |
int TypeFeedbackVector::ic_metadata_length() const { |
- return VectorICComputer::word_count(ICSlots()); |
+ return VectorICComputer::word_count(Slots()); |
} |
-// Conversion from a slot or ic slot to an integer index to the underlying |
-// array. |
int TypeFeedbackVector::GetIndex(FeedbackVectorSlot slot) const { |
- DCHECK(slot.ToInt() < first_ic_slot_index()); |
+ DCHECK(slot.ToInt() < Slots()); |
return kReservedIndexCount + ic_metadata_length() + slot.ToInt(); |
} |
-int TypeFeedbackVector::GetIndex(FeedbackVectorICSlot slot) const { |
- int first_ic_slot = first_ic_slot_index(); |
- DCHECK(slot.ToInt() < ICSlots()); |
- return first_ic_slot + slot.ToInt() * elements_per_ic_slot(); |
-} |
- |
- |
// Conversion from an integer index to either a slot or an ic slot. The caller |
// should know what kind she expects. |
FeedbackVectorSlot TypeFeedbackVector::ToSlot(int index) const { |
- DCHECK(index >= kReservedIndexCount && index < first_ic_slot_index()); |
+ DCHECK(index >= kReservedIndexCount + ic_metadata_length() && |
+ index < length()); |
return FeedbackVectorSlot(index - ic_metadata_length() - kReservedIndexCount); |
} |
-FeedbackVectorICSlot TypeFeedbackVector::ToICSlot(int index) const { |
- DCHECK(index >= first_ic_slot_index() && index < length()); |
- int ic_slot = (index - first_ic_slot_index()) / elements_per_ic_slot(); |
- return FeedbackVectorICSlot(ic_slot); |
-} |
- |
- |
Object* TypeFeedbackVector::Get(FeedbackVectorSlot slot) const { |
return get(GetIndex(slot)); |
} |
@@ -111,17 +114,6 @@ void TypeFeedbackVector::Set(FeedbackVectorSlot slot, Object* value, |
} |
-Object* TypeFeedbackVector::Get(FeedbackVectorICSlot slot) const { |
- return get(GetIndex(slot)); |
-} |
- |
- |
-void TypeFeedbackVector::Set(FeedbackVectorICSlot slot, Object* value, |
- WriteBarrierMode mode) { |
- set(GetIndex(slot), value, mode); |
-} |
- |
- |
Handle<Object> TypeFeedbackVector::UninitializedSentinel(Isolate* isolate) { |
return isolate->factory()->uninitialized_symbol(); |
} |
@@ -137,8 +129,8 @@ Handle<Object> TypeFeedbackVector::PremonomorphicSentinel(Isolate* isolate) { |
} |
-Object* TypeFeedbackVector::RawUninitializedSentinel(Heap* heap) { |
- return heap->uninitialized_symbol(); |
+Object* TypeFeedbackVector::RawUninitializedSentinel(Isolate* isolate) { |
+ return isolate->heap()->uninitialized_symbol(); |
} |
@@ -146,7 +138,10 @@ Object* FeedbackNexus::GetFeedback() const { return vector()->Get(slot()); } |
Object* FeedbackNexus::GetFeedbackExtra() const { |
- DCHECK(TypeFeedbackVector::elements_per_ic_slot() > 1); |
+#ifdef DEBUG |
+ FeedbackVectorSlotKind kind = vector()->GetKind(slot()); |
+ DCHECK_LT(1, TypeFeedbackVector::GetSlotSize(kind)); |
+#endif |
int extra_index = vector()->GetIndex(slot()) + 1; |
return vector()->get(extra_index); |
} |
@@ -159,7 +154,10 @@ void FeedbackNexus::SetFeedback(Object* feedback, WriteBarrierMode mode) { |
void FeedbackNexus::SetFeedbackExtra(Object* feedback_extra, |
WriteBarrierMode mode) { |
- DCHECK(TypeFeedbackVector::elements_per_ic_slot() > 1); |
+#ifdef DEBUG |
+ FeedbackVectorSlotKind kind = vector()->GetKind(slot()); |
+ DCHECK_LT(1, TypeFeedbackVector::GetSlotSize(kind)); |
+#endif |
int index = vector()->GetIndex(slot()) + 1; |
vector()->set(index, feedback_extra, mode); |
} |