Index: src/type-feedback-vector.cc |
diff --git a/src/type-feedback-vector.cc b/src/type-feedback-vector.cc |
index fcb1787411b063955c77b46f3a5092ffdd39aacb..c808fb9bfefa5055a2e7a9ff21ed086f55f58c2d 100644 |
--- a/src/type-feedback-vector.cc |
+++ b/src/type-feedback-vector.cc |
@@ -197,19 +197,6 @@ Handle<TypeFeedbackVector> TypeFeedbackVector::New( |
array->set_map_no_write_barrier(isolate->heap()->type_feedback_vector_map()); |
array->set(kMetadataIndex, *metadata); |
array->set(kInvocationCountIndex, Smi::kZero); |
- for (int i = 0; i < slot_count;) { |
mvstanton
2017/02/01 15:57:12
Actually if you can keep this here I'd prefer it,
Igor Sheludko
2017/02/01 16:10:01
As discussed offline, we should better remove the
|
- FeedbackVectorSlot slot(i); |
- FeedbackVectorSlotKind kind = metadata->GetKind(slot); |
- int index = TypeFeedbackVector::GetIndex(slot); |
- int entry_size = TypeFeedbackMetadata::GetSlotSize(kind); |
- |
- if (kind == FeedbackVectorSlotKind::CREATE_CLOSURE) { |
- // TODO(mvstanton): Root feedback vectors in this location. |
- array->set(index, *factory->empty_type_feedback_vector(), |
- SKIP_WRITE_BARRIER); |
- } |
- i += entry_size; |
- } |
DisallowHeapAllocation no_gc; |
@@ -224,24 +211,44 @@ Handle<TypeFeedbackVector> TypeFeedbackVector::New( |
int entry_size = TypeFeedbackMetadata::GetSlotSize(kind); |
Object* value; |
- if (kind == FeedbackVectorSlotKind::LOAD_GLOBAL_IC) { |
- value = isolate->heap()->empty_weak_cell(); |
- } else if (kind == FeedbackVectorSlotKind::INTERPRETER_COMPARE_IC || |
- kind == FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC) { |
- value = Smi::kZero; |
- } else if (kind == FeedbackVectorSlotKind::LITERAL) { |
- value = *undefined_value; |
- } else { |
- value = *uninitialized_sentinel; |
+ Object* extra_value = *uninitialized_sentinel; |
+ switch (kind) { |
+ case FeedbackVectorSlotKind::LOAD_GLOBAL_IC: |
+ value = isolate->heap()->empty_weak_cell(); |
+ break; |
+ case FeedbackVectorSlotKind::INTERPRETER_COMPARE_IC: |
+ case FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC: |
+ value = Smi::kZero; |
+ break; |
+ case FeedbackVectorSlotKind::CREATE_CLOSURE: |
+ // TODO(mvstanton): Root feedback vectors in this location. |
+ value = isolate->heap()->empty_type_feedback_vector(); |
+ break; |
+ case FeedbackVectorSlotKind::LITERAL: |
+ value = *undefined_value; |
+ break; |
+ case FeedbackVectorSlotKind::CALL_IC: |
+ value = *uninitialized_sentinel; |
+ extra_value = Smi::kZero; |
+ break; |
+ case FeedbackVectorSlotKind::LOAD_IC: |
+ case FeedbackVectorSlotKind::KEYED_LOAD_IC: |
+ case FeedbackVectorSlotKind::STORE_IC: |
+ case FeedbackVectorSlotKind::KEYED_STORE_IC: |
+ case FeedbackVectorSlotKind::STORE_DATA_PROPERTY_IN_LITERAL_IC: |
+ case FeedbackVectorSlotKind::GENERAL: |
+ value = *uninitialized_sentinel; |
+ break; |
+ |
+ case FeedbackVectorSlotKind::INVALID: |
+ case FeedbackVectorSlotKind::KINDS_NUMBER: |
+ UNREACHABLE(); |
+ value = Smi::kZero; |
+ break; |
} |
- |
- if (kind != FeedbackVectorSlotKind::CREATE_CLOSURE) { |
- array->set(index, value, SKIP_WRITE_BARRIER); |
- value = kind == FeedbackVectorSlotKind::CALL_IC ? Smi::kZero |
- : *uninitialized_sentinel; |
- for (int j = 1; j < entry_size; j++) { |
- array->set(index + j, value, SKIP_WRITE_BARRIER); |
- } |
+ array->set(index, value, SKIP_WRITE_BARRIER); |
+ for (int j = 1; j < entry_size; j++) { |
+ array->set(index + j, extra_value, SKIP_WRITE_BARRIER); |
} |
i += entry_size; |
} |
@@ -418,8 +425,8 @@ void FeedbackNexus::ConfigurePremonomorphic() { |
void FeedbackNexus::ConfigureMegamorphic() { |
// Keyed ICs must use ConfigureMegamorphicKeyed. |
- DCHECK_NE(FeedbackVectorSlotKind::KEYED_LOAD_IC, vector()->GetKind(slot())); |
- DCHECK_NE(FeedbackVectorSlotKind::KEYED_STORE_IC, vector()->GetKind(slot())); |
+ DCHECK(!vector()->IsKeyedLoadIC(slot())); |
+ DCHECK(!vector()->IsKeyedStoreIC(slot())); |
Isolate* isolate = GetIsolate(); |
SetFeedback(*TypeFeedbackVector::MegamorphicSentinel(isolate), |