Chromium Code Reviews| Index: src/type-feedback-vector.cc |
| diff --git a/src/type-feedback-vector.cc b/src/type-feedback-vector.cc |
| index dcae7c72e657bacba67c4ee206fb28c57365098f..a48fcec7f9317cfdcdef9c6737a66bfa7d50c5ed 100644 |
| --- a/src/type-feedback-vector.cc |
| +++ b/src/type-feedback-vector.cc |
| @@ -12,10 +12,69 @@ namespace v8 { |
| namespace internal { |
| // static |
| +TypeFeedbackVector::VectorICKind TypeFeedbackVector::FromCodeKind( |
| + Code::Kind kind) { |
| + if (kind == Code::CALL_IC) { |
|
Igor Sheludko
2014/10/27 15:23:24
What about using switch?
|
| + return KindCallIC; |
| + } else if (kind == Code::LOAD_IC) { |
| + return KindLoadIC; |
| + } else if (kind == Code::KEYED_LOAD_IC) { |
| + return KindKeyedLoadIC; |
| + } |
| + |
| + // Shouldn't get here. |
| + UNREACHABLE(); |
| + return KindUnused; |
| +} |
| + |
| + |
| +// static |
| +Code::Kind TypeFeedbackVector::FromVectorICKind(VectorICKind kind) { |
| + if (kind == KindCallIC) |
|
Igor Sheludko
2014/10/27 15:23:24
Same here.
|
| + return Code::CALL_IC; |
| + else if (kind == KindLoadIC) |
| + return Code::LOAD_IC; |
| + else if (kind == KindKeyedLoadIC) |
| + return Code::KEYED_LOAD_IC; |
| + DCHECK(kind == KindUnused); |
| + return Code::NUMBER_OF_KINDS; // Sentinel for no information. |
| +} |
| + |
| + |
| +Code::Kind TypeFeedbackVector::GetKind(FeedbackVectorICSlot slot) const { |
| + if (!FLAG_vector_ics) { |
| + // We only have CALL_ICs |
| + return Code::CALL_IC; |
| + } |
| + |
| + int index = VectorICComputer::index(kReservedIndexCount, slot.ToInt()); |
| + int data = Smi::cast(get(index))->value(); |
| + VectorICKind b = VectorICComputer::decode(data, slot.ToInt()); |
| + return FromVectorICKind(b); |
| +} |
| + |
| + |
| +void TypeFeedbackVector::SetKind(FeedbackVectorICSlot slot, Code::Kind kind) { |
| + if (!FLAG_vector_ics) { |
| + // Nothing to do if we only have CALL_ICs |
| + return; |
| + } |
| + |
| + VectorICKind b = FromCodeKind(kind); |
| + int index = VectorICComputer::index(kReservedIndexCount, slot.ToInt()); |
| + int data = Smi::cast(get(index))->value(); |
| + int new_data = VectorICComputer::encode(data, slot.ToInt(), b); |
| + set(index, Smi::FromInt(new_data)); |
| +} |
| + |
| + |
| +// static |
| Handle<TypeFeedbackVector> TypeFeedbackVector::Allocate(Isolate* isolate, |
| int slot_count, |
| int ic_slot_count) { |
| - int length = slot_count + ic_slot_count + kReservedIndexCount; |
| + int index_count = |
| + FLAG_vector_ics ? VectorICComputer::word_count(ic_slot_count) : 0; |
| + int length = slot_count + ic_slot_count + index_count + kReservedIndexCount; |
| if (length == kReservedIndexCount) { |
| return Handle<TypeFeedbackVector>::cast( |
| isolate->factory()->empty_fixed_array()); |
| @@ -24,17 +83,21 @@ Handle<TypeFeedbackVector> TypeFeedbackVector::Allocate(Isolate* isolate, |
| Handle<FixedArray> array = isolate->factory()->NewFixedArray(length, TENURED); |
| if (ic_slot_count > 0) { |
| array->set(kFirstICSlotIndex, |
| - Smi::FromInt(slot_count + kReservedIndexCount)); |
| + Smi::FromInt(slot_count + index_count + kReservedIndexCount)); |
| } else { |
| array->set(kFirstICSlotIndex, Smi::FromInt(length)); |
| } |
| array->set(kWithTypesIndex, Smi::FromInt(0)); |
| array->set(kGenericCountIndex, Smi::FromInt(0)); |
| + // Fill the indexes with zeros. |
| + for (int i = 0; i < index_count; i++) { |
| + array->set(kReservedIndexCount + i, Smi::FromInt(0)); |
| + } |
| // Ensure we can skip the write barrier |
| Handle<Object> uninitialized_sentinel = UninitializedSentinel(isolate); |
| DCHECK_EQ(isolate->heap()->uninitialized_symbol(), *uninitialized_sentinel); |
| - for (int i = kReservedIndexCount; i < length; i++) { |
| + for (int i = kReservedIndexCount + index_count; i < length; i++) { |
| array->set(i, *uninitialized_sentinel, SKIP_WRITE_BARRIER); |
| } |
| return Handle<TypeFeedbackVector>::cast(array); |