Index: src/type-feedback-vector.cc |
diff --git a/src/type-feedback-vector.cc b/src/type-feedback-vector.cc |
index 546139e481e63a154198592c084029b3dcf3bbd9..fcb1787411b063955c77b46f3a5092ffdd39aacb 100644 |
--- a/src/type-feedback-vector.cc |
+++ b/src/type-feedback-vector.cc |
@@ -164,6 +164,8 @@ const char* TypeFeedbackMetadata::Kind2String(FeedbackVectorSlotKind kind) { |
return "STORE_DATA_PROPERTY_IN_LITERAL_IC"; |
case FeedbackVectorSlotKind::CREATE_CLOSURE: |
return "CREATE_CLOSURE"; |
+ case FeedbackVectorSlotKind::LITERAL: |
+ return "LITERAL"; |
case FeedbackVectorSlotKind::GENERAL: |
return "STUB"; |
case FeedbackVectorSlotKind::KINDS_NUMBER: |
@@ -202,8 +204,9 @@ Handle<TypeFeedbackVector> TypeFeedbackVector::New( |
int entry_size = TypeFeedbackMetadata::GetSlotSize(kind); |
if (kind == FeedbackVectorSlotKind::CREATE_CLOSURE) { |
- // TODO(mvstanton): Root literal arrays in this location. |
- array->set(index, *factory->empty_literals_array(), SKIP_WRITE_BARRIER); |
+ // TODO(mvstanton): Root feedback vectors in this location. |
+ array->set(index, *factory->empty_type_feedback_vector(), |
+ SKIP_WRITE_BARRIER); |
} |
i += entry_size; |
} |
@@ -212,6 +215,7 @@ Handle<TypeFeedbackVector> TypeFeedbackVector::New( |
// Ensure we can skip the write barrier |
Handle<Object> uninitialized_sentinel = UninitializedSentinel(isolate); |
+ Handle<Oddball> undefined_value = factory->undefined_value(); |
DCHECK_EQ(isolate->heap()->uninitialized_symbol(), *uninitialized_sentinel); |
for (int i = 0; i < slot_count;) { |
FeedbackVectorSlot slot(i); |
@@ -225,6 +229,8 @@ Handle<TypeFeedbackVector> TypeFeedbackVector::New( |
} 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; |
} |
@@ -242,14 +248,6 @@ Handle<TypeFeedbackVector> TypeFeedbackVector::New( |
return Handle<TypeFeedbackVector>::cast(array); |
} |
- |
-// static |
-int TypeFeedbackVector::GetIndexFromSpec(const FeedbackVectorSpec* spec, |
- FeedbackVectorSlot slot) { |
- return kReservedIndexCount + slot.ToInt(); |
-} |
- |
- |
// static |
Handle<TypeFeedbackVector> TypeFeedbackVector::Copy( |
Isolate* isolate, Handle<TypeFeedbackVector> vector) { |
@@ -276,6 +274,7 @@ void TypeFeedbackVector::ClearSlotsImpl(SharedFunctionInfo* shared, |
Object* uninitialized_sentinel = |
TypeFeedbackVector::RawUninitializedSentinel(isolate); |
+ Oddball* undefined_value = isolate->heap()->undefined_value(); |
TypeFeedbackMetadataIterator iter(metadata()); |
while (iter.HasNext()) { |
@@ -323,11 +322,6 @@ void TypeFeedbackVector::ClearSlotsImpl(SharedFunctionInfo* shared, |
break; |
} |
case FeedbackVectorSlotKind::CREATE_CLOSURE: { |
- // Fill the array with undefined. |
- FixedArray* array = FixedArray::cast(Get(slot)); |
- for (int i = 1; i < array->length(); i++) { |
- array->set_undefined(i); |
- } |
break; |
} |
case FeedbackVectorSlotKind::GENERAL: { |
@@ -343,6 +337,10 @@ void TypeFeedbackVector::ClearSlotsImpl(SharedFunctionInfo* shared, |
} |
break; |
} |
+ case FeedbackVectorSlotKind::LITERAL: { |
+ Set(slot, undefined_value, SKIP_WRITE_BARRIER); |
+ break; |
+ } |
case FeedbackVectorSlotKind::STORE_DATA_PROPERTY_IN_LITERAL_IC: { |
StoreDataPropertyInLiteralICNexus nexus(this, slot); |
nexus.Clear(shared->code()); |