| Index: src/type-feedback-vector.cc | 
| diff --git a/src/type-feedback-vector.cc b/src/type-feedback-vector.cc | 
| index a3fe0707c7d578fbbbcf204dc51a68694308b271..03ba7576236189e3e6d3f3032e9a928992cd8d3b 100644 | 
| --- a/src/type-feedback-vector.cc | 
| +++ b/src/type-feedback-vector.cc | 
| @@ -11,6 +11,36 @@ namespace v8 { | 
| namespace internal { | 
|  | 
| // static | 
| +Handle<TypeFeedbackVector> TypeFeedbackVector::Allocate(Isolate* isolate, | 
| +                                                        int slot_count, | 
| +                                                        int ic_slot_count) { | 
| +  int length = slot_count + ic_slot_count + kReservedIndexCount; | 
| +  if (length == kReservedIndexCount) { | 
| +    return Handle<TypeFeedbackVector>::cast( | 
| +        isolate->factory()->empty_fixed_array()); | 
| +  } | 
| + | 
| +  Handle<FixedArray> array = isolate->factory()->NewFixedArray(length, TENURED); | 
| +  if (ic_slot_count > 0) { | 
| +    array->set(kFirstICSlotIndex, | 
| +               Smi::FromInt(slot_count + kReservedIndexCount)); | 
| +  } else { | 
| +    array->set(kFirstICSlotIndex, Smi::FromInt(-1)); | 
| +  } | 
| +  array->set(kWithTypesIndex, Smi::FromInt(0)); | 
| +  array->set(kGenericCountIndex, 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++) { | 
| +    array->set(i, *uninitialized_sentinel, SKIP_WRITE_BARRIER); | 
| +  } | 
| +  return Handle<TypeFeedbackVector>::cast(array); | 
| +} | 
| + | 
| + | 
| +// static | 
| Handle<TypeFeedbackVector> TypeFeedbackVector::Copy( | 
| Isolate* isolate, Handle<TypeFeedbackVector> vector) { | 
| Handle<TypeFeedbackVector> result; | 
| @@ -18,5 +48,29 @@ Handle<TypeFeedbackVector> TypeFeedbackVector::Copy( | 
| isolate->factory()->CopyFixedArray(Handle<FixedArray>::cast(vector))); | 
| return result; | 
| } | 
| + | 
| + | 
| +void TypeFeedbackVector::ClearSlots() { | 
| +  int slots = Slots(); | 
| +  Heap* heap = GetIsolate()->heap(); | 
| +  for (int i = 0; i < slots; i++) { | 
| +    Object* obj = get(kReservedIndexCount + i); | 
| +    if (obj->IsHeapObject()) { | 
| +      InstanceType instance_type = | 
| +          HeapObject::cast(obj)->map()->instance_type(); | 
| +      switch (instance_type) { | 
| +        case ALLOCATION_SITE_TYPE: | 
| +          // AllocationSites are not cleared because they do not store | 
| +          // information that leaks. | 
| +          break; | 
| +        // Fall through... | 
| +        default: | 
| +          set(kReservedIndexCount + i, | 
| +              TypeFeedbackVector::RawUninitializedSentinel(heap), | 
| +              SKIP_WRITE_BARRIER); | 
| +      } | 
| +    } | 
| +  } | 
| +} | 
| } | 
| }  // namespace v8::internal | 
|  |