| Index: src/type-feedback-vector-inl.h
|
| diff --git a/src/type-feedback-vector-inl.h b/src/type-feedback-vector-inl.h
|
| index 4389cfe94495b15d7c194ee3a5cf539f181c6e47..fed28b671e5d3c3555b56fa22f1eae8fdb5fcdf7 100644
|
| --- a/src/type-feedback-vector-inl.h
|
| +++ b/src/type-feedback-vector-inl.h
|
| @@ -17,7 +17,7 @@ FeedbackVectorSlot FeedbackVectorSpecBase<Derived>::AddSlot(
|
| Derived* derived = static_cast<Derived*>(this);
|
|
|
| int slot = derived->slots();
|
| - int entries_per_slot = TypeFeedbackVector::GetSlotSize(kind);
|
| + int entries_per_slot = TypeFeedbackMetadata::GetSlotSize(kind);
|
| derived->append(kind);
|
| for (int i = 1; i < entries_per_slot; i++) {
|
| derived->append(FeedbackVectorSlotKind::INVALID);
|
| @@ -27,13 +27,27 @@ FeedbackVectorSlot FeedbackVectorSpecBase<Derived>::AddSlot(
|
|
|
|
|
| // static
|
| +TypeFeedbackMetadata* TypeFeedbackMetadata::cast(Object* obj) {
|
| + DCHECK(obj->IsTypeFeedbackVector());
|
| + return reinterpret_cast<TypeFeedbackMetadata*>(obj);
|
| +}
|
| +
|
| +
|
| +int TypeFeedbackMetadata::slot_count() const {
|
| + if (length() == 0) return 0;
|
| + DCHECK(length() > kReservedIndexCount);
|
| + return Smi::cast(get(kSlotsCountIndex))->value();
|
| +}
|
| +
|
| +
|
| +// static
|
| TypeFeedbackVector* TypeFeedbackVector::cast(Object* obj) {
|
| DCHECK(obj->IsTypeFeedbackVector());
|
| return reinterpret_cast<TypeFeedbackVector*>(obj);
|
| }
|
|
|
|
|
| -int TypeFeedbackVector::GetSlotSize(FeedbackVectorSlotKind kind) {
|
| +int TypeFeedbackMetadata::GetSlotSize(FeedbackVectorSlotKind kind) {
|
| DCHECK_NE(FeedbackVectorSlotKind::INVALID, kind);
|
| DCHECK_NE(FeedbackVectorSlotKind::KINDS_NUMBER, kind);
|
| return kind == FeedbackVectorSlotKind::GENERAL ? 1 : 2;
|
| @@ -42,15 +56,28 @@ int TypeFeedbackVector::GetSlotSize(FeedbackVectorSlotKind kind) {
|
|
|
| bool TypeFeedbackVector::is_empty() const {
|
| if (length() == 0) return true;
|
| - DCHECK(length() >= kReservedIndexCount);
|
| + DCHECK(length() > kReservedIndexCount);
|
| return false;
|
| }
|
|
|
|
|
| -int TypeFeedbackVector::Slots() const {
|
| +int TypeFeedbackVector::slot_count() const {
|
| if (length() == 0) return 0;
|
| - DCHECK(length() >= kReservedIndexCount);
|
| - return Smi::cast(get(kSlotsCountIndex))->value();
|
| + DCHECK(length() > kReservedIndexCount);
|
| + return length() - kReservedIndexCount;
|
| +}
|
| +
|
| +
|
| +TypeFeedbackMetadata* TypeFeedbackVector::metadata() const {
|
| + return is_empty() ? TypeFeedbackMetadata::cast(GetHeap()->empty_fixed_array())
|
| + : TypeFeedbackMetadata::cast(get(kMetadataIndex));
|
| +}
|
| +
|
| +
|
| +FeedbackVectorSlotKind TypeFeedbackVector::GetKind(
|
| + FeedbackVectorSlot slot) const {
|
| + DCHECK(!is_empty());
|
| + return metadata()->GetKind(slot);
|
| }
|
|
|
|
|
| @@ -83,23 +110,17 @@ void TypeFeedbackVector::change_ic_generic_count(int delta) {
|
| }
|
|
|
|
|
| -int TypeFeedbackVector::ic_metadata_length() const {
|
| - return VectorICComputer::word_count(Slots());
|
| -}
|
| -
|
| -
|
| int TypeFeedbackVector::GetIndex(FeedbackVectorSlot slot) const {
|
| - DCHECK(slot.ToInt() < Slots());
|
| - return kReservedIndexCount + ic_metadata_length() + slot.ToInt();
|
| + DCHECK(slot.ToInt() < slot_count());
|
| + return kReservedIndexCount + slot.ToInt();
|
| }
|
|
|
|
|
| // 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 + ic_metadata_length() &&
|
| - index < length());
|
| - return FeedbackVectorSlot(index - ic_metadata_length() - kReservedIndexCount);
|
| + DCHECK(index >= kReservedIndexCount && index < length());
|
| + return FeedbackVectorSlot(index - kReservedIndexCount);
|
| }
|
|
|
|
|
| @@ -140,7 +161,7 @@ Object* FeedbackNexus::GetFeedback() const { return vector()->Get(slot()); }
|
| Object* FeedbackNexus::GetFeedbackExtra() const {
|
| #ifdef DEBUG
|
| FeedbackVectorSlotKind kind = vector()->GetKind(slot());
|
| - DCHECK_LT(1, TypeFeedbackVector::GetSlotSize(kind));
|
| + DCHECK_LT(1, TypeFeedbackMetadata::GetSlotSize(kind));
|
| #endif
|
| int extra_index = vector()->GetIndex(slot()) + 1;
|
| return vector()->get(extra_index);
|
| @@ -156,7 +177,7 @@ void FeedbackNexus::SetFeedbackExtra(Object* feedback_extra,
|
| WriteBarrierMode mode) {
|
| #ifdef DEBUG
|
| FeedbackVectorSlotKind kind = vector()->GetKind(slot());
|
| - DCHECK_LT(1, TypeFeedbackVector::GetSlotSize(kind));
|
| + DCHECK_LT(1, TypeFeedbackMetadata::GetSlotSize(kind));
|
| #endif
|
| int index = vector()->GetIndex(slot()) + 1;
|
| vector()->set(index, feedback_extra, mode);
|
|
|