Chromium Code Reviews| Index: src/heap/object-stats.cc |
| diff --git a/src/heap/object-stats.cc b/src/heap/object-stats.cc |
| index 93a74e655bce78a5a9bb7c6eb93a544e50cfbafe..e856df36d4fb7227aa5be2f23fd434e8e35006af 100644 |
| --- a/src/heap/object-stats.cc |
| +++ b/src/heap/object-stats.cc |
| @@ -161,42 +161,69 @@ void ObjectStats::CheckpointObjectStats() { |
| Isolate* ObjectStats::isolate() { return heap()->isolate(); } |
| -void ObjectStatsCollector::CollectStatistics(ObjectStats* stats, |
| - HeapObject* obj) { |
| +void ObjectStatsCollector::CollectStatistics(HeapObject* obj) { |
| Map* map = obj->map(); |
| - Heap* heap = obj->GetHeap(); |
| // Record for the InstanceType. |
| int object_size = obj->Size(); |
| - stats->RecordObjectStats(map->instance_type(), object_size); |
| + stats_->RecordObjectStats(map->instance_type(), object_size); |
| // Record specific sub types where possible. |
| - if (obj->IsMap()) { |
| - RecordMapDetails(stats, heap, obj); |
| - } |
| - if (obj->IsCode()) { |
| - RecordCodeDetails(stats, heap, obj); |
| - } |
| + if (obj->IsMap()) RecordMapDetails(Map::cast(obj)); |
| + if (obj->IsCode()) RecordCodeDetails(Code::cast(obj)); |
| if (obj->IsSharedFunctionInfo()) { |
| - RecordSharedFunctionInfoDetails(stats, heap, obj); |
| - } |
| - if (obj->IsFixedArray()) { |
| - RecordFixedArrayDetails(stats, heap, obj); |
| - } |
| - if (obj->IsJSObject()) { |
| - RecordJSObjectDetails(stats, heap, JSObject::cast(obj)); |
| + RecordSharedFunctionInfoDetails(SharedFunctionInfo::cast(obj)); |
| } |
| + if (obj->IsFixedArray()) RecordFixedArrayDetails(FixedArray::cast(obj)); |
| + if (obj->IsJSObject()) RecordJSObjectDetails(JSObject::cast(obj)); |
| if (obj->IsJSWeakCollection()) { |
| - RecordJSWeakCollectionDetails(stats, heap, JSWeakCollection::cast(obj)); |
| + RecordJSWeakCollectionDetails(JSWeakCollection::cast(obj)); |
| } |
| - if (obj->IsScript()) { |
| - RecordScriptDetails(stats, heap, Script::cast(obj)); |
| + if (obj->IsJSCollection()) { |
| + RecordJSCollectionDetails(JSObject::cast(obj)); |
| } |
| + if (obj->IsJSFunction()) RecordJSFunctionDetails(JSFunction::cast(obj)); |
| + if (obj->IsScript()) RecordScriptDetails(Script::cast(obj)); |
| +} |
| + |
| +void ObjectStatsCollector::CollectGlobalStatistics() { |
| + // Global FixedArrays. |
| + RecordFixedArrayHelper(nullptr, heap_->weak_new_space_object_to_code_list(), |
| + WEAK_NEW_SPACE_OBJECT_TO_CODE_SUB_TYPE, 0); |
| + RecordFixedArrayHelper(nullptr, heap_->serialized_templates(), |
| + SERIALIZED_TEMPLATES_SUB_TYPE, 0); |
| + RecordFixedArrayHelper(nullptr, heap_->number_string_cache(), |
| + NUMBER_STRING_CACHE_SUB_TYPE, 0); |
| + RecordFixedArrayHelper(nullptr, heap_->single_character_string_cache(), |
| + SINGLE_CHARACTER_STRING_CACHE_SUB_TYPE, 0); |
| + RecordFixedArrayHelper(nullptr, heap_->string_split_cache(), |
| + STRING_SPLIT_CACHE_SUB_TYPE, 0); |
| + RecordFixedArrayHelper(nullptr, heap_->regexp_multiple_cache(), |
| + REGEXP_MULTIPLE_CACHE_SUB_TYPE, 0); |
| + RecordFixedArrayHelper(nullptr, heap_->retained_maps(), |
| + RETAINED_MAPS_SUB_TYPE, 0); |
| + |
| + // Global weak FixedArrays. |
| + RecordFixedArrayHelper( |
| + nullptr, WeakFixedArray::cast(heap_->noscript_shared_function_infos()), |
| + NOSCRIPT_SHARED_FUNCTION_INFOS_SUB_TYPE, 0); |
| + RecordFixedArrayHelper(nullptr, WeakFixedArray::cast(heap_->script_list()), |
| + SCRIPT_LIST_SUB_TYPE, 0); |
| + |
| + // Global hash tables. |
| + RecordHashTableHelper(nullptr, heap_->string_table(), STRING_TABLE_SUB_TYPE); |
| + RecordHashTableHelper(nullptr, heap_->weak_object_to_code_table(), |
| + OBJECT_TO_CODE_SUB_TYPE); |
| + RecordHashTableHelper(nullptr, heap_->code_stubs(), |
| + CODE_STUBS_TABLE_SUB_TYPE); |
| + RecordHashTableHelper(nullptr, heap_->intrinsic_function_names(), |
| + INTRINSIC_FUNCTION_NAMES_SUB_TYPE); |
| + RecordHashTableHelper(nullptr, heap_->empty_properties_dictionary(), |
| + EMPTY_PROPERTIES_DICTIONARY_SUB_TYPE); |
| } |
| static bool CanRecordFixedArray(Heap* heap, FixedArrayBase* array) { |
| return array->map()->instance_type() == FIXED_ARRAY_TYPE && |
| - array->map() != heap->fixed_cow_array_map() && |
| array->map() != heap->fixed_double_array_map() && |
| array != heap->empty_fixed_array() && |
| array != heap->empty_byte_array() && |
| @@ -207,33 +234,57 @@ static bool CanRecordFixedArray(Heap* heap, FixedArrayBase* array) { |
| array != heap->empty_properties_dictionary(); |
| } |
| +static bool CowArray(Heap* heap, FixedArrayBase* array) { |
|
ulan
2016/07/25 16:47:30
Nit: IsCowArray
Michael Lippautz
2016/07/25 16:52:29
Done.
|
| + return array->map() == heap->fixed_cow_array_map(); |
| +} |
| + |
| static bool SameLiveness(HeapObject* obj1, HeapObject* obj2) { |
| - return ObjectMarking::Color(obj1) == ObjectMarking::Color(obj2); |
| + return obj1 == nullptr || obj2 == nullptr || |
| + ObjectMarking::Color(obj1) == ObjectMarking::Color(obj2); |
| } |
| -void ObjectStatsCollector::RecordFixedArrayHelper( |
| - ObjectStats* stats, Heap* heap, HeapObject* parent, FixedArray* array, |
| - int subtype, size_t overhead) { |
| - if (SameLiveness(parent, array) && CanRecordFixedArray(heap, array)) { |
| - stats->RecordFixedArraySubTypeStats(array, subtype, array->Size(), |
| - overhead); |
| +bool ObjectStatsCollector::RecordFixedArrayHelper(HeapObject* parent, |
| + FixedArray* array, |
| + int subtype, |
| + size_t overhead) { |
| + if (SameLiveness(parent, array) && CanRecordFixedArray(heap_, array) && |
| + !CowArray(heap_, array)) { |
| + return stats_->RecordFixedArraySubTypeStats(array, subtype, array->Size(), |
| + overhead); |
| } |
| + return false; |
| } |
| -void ObjectStatsCollector::RecordJSObjectDetails(ObjectStats* stats, Heap* heap, |
| - JSObject* object) { |
| - DCHECK(object->IsJSObject()); |
| +void ObjectStatsCollector::RecursivelyRecordFixedArrayHelper(HeapObject* parent, |
| + FixedArray* array, |
| + int subtype) { |
| + if (RecordFixedArrayHelper(parent, array, subtype, 0)) { |
| + for (int i = 0; i < array->length(); i++) { |
| + if (array->get(i)->IsFixedArray()) { |
| + RecursivelyRecordFixedArrayHelper( |
| + parent, FixedArray::cast(array->get(i)), subtype); |
| + } |
| + } |
| + } |
| +} |
| +template <class HashTable> |
| +void ObjectStatsCollector::RecordHashTableHelper(HeapObject* parent, |
| + HashTable* array, |
| + int subtype) { |
| + int used = array->NumberOfElements() * HashTable::kEntrySize; |
| + CHECK_GE(array->Size(), used); |
| + size_t overhead = array->Size() - used; |
| + RecordFixedArrayHelper(parent, array, subtype, overhead); |
| +} |
| + |
| +void ObjectStatsCollector::RecordJSObjectDetails(JSObject* object) { |
| size_t overhead = 0; |
| FixedArrayBase* elements = object->elements(); |
| - if (CanRecordFixedArray(heap, elements)) { |
| + if (CanRecordFixedArray(heap_, elements) && !CowArray(heap_, elements)) { |
| if (elements->IsDictionary() && SameLiveness(object, elements)) { |
| SeededNumberDictionary* dict = SeededNumberDictionary::cast(elements); |
| - int used = dict->NumberOfElements() * SeededNumberDictionary::kEntrySize; |
| - CHECK_GE(elements->Size(), used); |
| - overhead = elements->Size() - used; |
| - stats->RecordFixedArraySubTypeStats( |
| - elements, DICTIONARY_ELEMENTS_SUB_TYPE, elements->Size(), overhead); |
| + RecordHashTableHelper(object, dict, DICTIONARY_ELEMENTS_SUB_TYPE); |
| } else { |
| if (IsFastHoleyElementsKind(object->GetElementsKind())) { |
| int used = object->GetFastElementsUsage() * kPointerSize; |
| @@ -241,108 +292,131 @@ void ObjectStatsCollector::RecordJSObjectDetails(ObjectStats* stats, Heap* heap, |
| CHECK_GE(elements->Size(), used); |
| overhead = elements->Size() - used; |
| } |
| - stats->RecordFixedArraySubTypeStats(elements, FAST_ELEMENTS_SUB_TYPE, |
| - elements->Size(), overhead); |
| + stats_->RecordFixedArraySubTypeStats(elements, FAST_ELEMENTS_SUB_TYPE, |
| + elements->Size(), overhead); |
| } |
| } |
| overhead = 0; |
| FixedArrayBase* properties = object->properties(); |
| - if (CanRecordFixedArray(heap, properties) && |
| - SameLiveness(object, properties)) { |
| + if (CanRecordFixedArray(heap_, properties) && |
| + SameLiveness(object, properties) && !CowArray(heap_, properties)) { |
| if (properties->IsDictionary()) { |
| NameDictionary* dict = NameDictionary::cast(properties); |
| - int used = dict->NumberOfElements() * NameDictionary::kEntrySize; |
| - CHECK_GE(properties->Size(), used); |
| - overhead = properties->Size() - used; |
| - stats->RecordFixedArraySubTypeStats(properties, |
| - DICTIONARY_PROPERTIES_SUB_TYPE, |
| - properties->Size(), overhead); |
| + RecordHashTableHelper(object, dict, DICTIONARY_PROPERTIES_SUB_TYPE); |
| } else { |
| - stats->RecordFixedArraySubTypeStats(properties, FAST_PROPERTIES_SUB_TYPE, |
| - properties->Size(), overhead); |
| + stats_->RecordFixedArraySubTypeStats(properties, FAST_PROPERTIES_SUB_TYPE, |
| + properties->Size(), overhead); |
| } |
| } |
| } |
| void ObjectStatsCollector::RecordJSWeakCollectionDetails( |
| - ObjectStats* stats, Heap* heap, JSWeakCollection* obj) { |
| + JSWeakCollection* obj) { |
| if (obj->table()->IsHashTable()) { |
| ObjectHashTable* table = ObjectHashTable::cast(obj->table()); |
| int used = table->NumberOfElements() * ObjectHashTable::kEntrySize; |
| size_t overhead = table->Size() - used; |
| - RecordFixedArrayHelper(stats, heap, obj, table, WEAK_COLLECTION_SUB_TYPE, |
| - overhead); |
| + RecordFixedArrayHelper(obj, table, JS_WEAK_COLLECTION_SUB_TYPE, overhead); |
| + } |
| +} |
| + |
| +void ObjectStatsCollector::RecordJSCollectionDetails(JSObject* obj) { |
| + if (obj->IsJSMap()) { |
| + RecordHashTableHelper(nullptr, |
| + OrderedHashMap::cast(JSMap::cast(obj)->table()), |
| + JS_COLLECTION_SUB_TYPE); |
| + } |
| + if (obj->IsJSSet()) { |
| + RecordHashTableHelper(nullptr, |
| + OrderedHashSet::cast(JSSet::cast(obj)->table()), |
| + JS_COLLECTION_SUB_TYPE); |
| } |
| } |
| -void ObjectStatsCollector::RecordScriptDetails(ObjectStats* stats, Heap* heap, |
| - Script* obj) { |
| +void ObjectStatsCollector::RecordScriptDetails(Script* obj) { |
| Object* infos = WeakFixedArray::cast(obj->shared_function_infos()); |
| if (infos->IsWeakFixedArray()) |
| - RecordFixedArrayHelper(stats, heap, obj, WeakFixedArray::cast(infos), |
| + RecordFixedArrayHelper(obj, WeakFixedArray::cast(infos), |
| SHARED_FUNCTION_INFOS_SUB_TYPE, 0); |
| } |
| -void ObjectStatsCollector::RecordMapDetails(ObjectStats* stats, Heap* heap, |
| - HeapObject* obj) { |
| - Map* map_obj = Map::cast(obj); |
| - DCHECK(obj->map()->instance_type() == MAP_TYPE); |
| +void ObjectStatsCollector::RecordMapDetails(Map* map_obj) { |
| DescriptorArray* array = map_obj->instance_descriptors(); |
| - if (map_obj->owns_descriptors() && array != heap->empty_descriptor_array() && |
| + if (map_obj->owns_descriptors() && array != heap_->empty_descriptor_array() && |
| SameLiveness(map_obj, array)) { |
| - RecordFixedArrayHelper(stats, heap, map_obj, array, |
| - DESCRIPTOR_ARRAY_SUB_TYPE, 0); |
| + RecordFixedArrayHelper(map_obj, array, DESCRIPTOR_ARRAY_SUB_TYPE, 0); |
| if (array->HasEnumCache()) { |
| - RecordFixedArrayHelper(stats, heap, array, array->GetEnumCache(), |
| - ENUM_CACHE_SUB_TYPE, 0); |
| + RecordFixedArrayHelper(array, array->GetEnumCache(), ENUM_CACHE_SUB_TYPE, |
| + 0); |
| } |
| if (array->HasEnumIndicesCache()) { |
| - RecordFixedArrayHelper(stats, heap, array, array->GetEnumIndicesCache(), |
| + RecordFixedArrayHelper(array, array->GetEnumIndicesCache(), |
| ENUM_INDICES_CACHE_SUB_TYPE, 0); |
| } |
| } |
| if (map_obj->has_code_cache()) { |
| - RecordFixedArrayHelper(stats, heap, map_obj, map_obj->code_cache(), |
| + RecordFixedArrayHelper(map_obj, map_obj->code_cache(), |
| MAP_CODE_CACHE_SUB_TYPE, 0); |
| } |
| + |
| + for (DependentCode* cur_dependent_code = map_obj->dependent_code(); |
| + cur_dependent_code != heap_->empty_fixed_array(); |
| + cur_dependent_code = DependentCode::cast( |
| + cur_dependent_code->get(DependentCode::kNextLinkIndex))) { |
| + RecordFixedArrayHelper(map_obj, cur_dependent_code, DEPENDENT_CODE_SUB_TYPE, |
| + 0); |
| + } |
| + |
| + if (map_obj->is_prototype_map()) { |
| + if (map_obj->prototype_info()->IsPrototypeInfo()) { |
| + PrototypeInfo* info = PrototypeInfo::cast(map_obj->prototype_info()); |
| + Object* users = info->prototype_users(); |
| + if (users->IsWeakFixedArray()) { |
| + RecordFixedArrayHelper(map_obj, WeakFixedArray::cast(users), |
| + PROTOTYPE_USERS_SUB_TYPE, 0); |
| + } |
| + } |
| + } |
| } |
| -void ObjectStatsCollector::RecordCodeDetails(ObjectStats* stats, Heap* heap, |
| - HeapObject* obj) { |
| - int object_size = obj->Size(); |
| - DCHECK(obj->map()->instance_type() == CODE_TYPE); |
| - Code* code_obj = Code::cast(obj); |
| - stats->RecordCodeSubTypeStats(code_obj->kind(), code_obj->GetAge(), |
| - object_size); |
| - Code* code = Code::cast(obj); |
| - RecordFixedArrayHelper(stats, heap, code, code->deoptimization_data(), |
| +void ObjectStatsCollector::RecordCodeDetails(Code* code) { |
| + stats_->RecordCodeSubTypeStats(code->kind(), code->GetAge(), code->Size()); |
| + RecordFixedArrayHelper(code, code->deoptimization_data(), |
| DEOPTIMIZATION_DATA_SUB_TYPE, 0); |
| - for (RelocIterator it(code); !it.done(); it.next()) { |
| + RecordFixedArrayHelper(code, code->handler_table(), HANDLER_TABLE_SUB_TYPE, |
| + 0); |
| + int const mode_mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); |
| + for (RelocIterator it(code, mode_mask); !it.done(); it.next()) { |
| RelocInfo::Mode mode = it.rinfo()->rmode(); |
| if (mode == RelocInfo::EMBEDDED_OBJECT) { |
| Object* target = it.rinfo()->target_object(); |
| if (target->IsFixedArray()) { |
| - RecordFixedArrayHelper(stats, heap, code, FixedArray::cast(target), |
| - EMBEDDED_OBJECT_SUB_TYPE, 0); |
| + RecursivelyRecordFixedArrayHelper(code, FixedArray::cast(target), |
| + EMBEDDED_OBJECT_SUB_TYPE); |
| } |
| } |
| } |
| } |
| -void ObjectStatsCollector::RecordSharedFunctionInfoDetails(ObjectStats* stats, |
| - Heap* heap, |
| - HeapObject* obj) { |
| - SharedFunctionInfo* sfi = SharedFunctionInfo::cast(obj); |
| +void ObjectStatsCollector::RecordSharedFunctionInfoDetails( |
| + SharedFunctionInfo* sfi) { |
| FixedArray* scope_info = sfi->scope_info(); |
| - RecordFixedArrayHelper(stats, heap, sfi, scope_info, SCOPE_INFO_SUB_TYPE, 0); |
| - FixedArray* feedback_metadata = sfi->feedback_metadata(); |
| - RecordFixedArrayHelper(stats, heap, sfi, feedback_metadata, |
| - TYPE_FEEDBACK_METADATA_SUB_TYPE, 0); |
| + RecordFixedArrayHelper(sfi, scope_info, SCOPE_INFO_SUB_TYPE, 0); |
| + TypeFeedbackMetadata* feedback_metadata = sfi->feedback_metadata(); |
| + if (!feedback_metadata->is_empty()) { |
| + RecordFixedArrayHelper(sfi, feedback_metadata, |
| + TYPE_FEEDBACK_METADATA_SUB_TYPE, 0); |
| + UnseededNumberDictionary* names = UnseededNumberDictionary::cast( |
| + feedback_metadata->get(TypeFeedbackMetadata::kNamesTableIndex)); |
| + RecordHashTableHelper(sfi, names, TYPE_FEEDBACK_METADATA_SUB_TYPE); |
| + } |
| if (!sfi->OptimizedCodeMapIsCleared()) { |
| FixedArray* optimized_code_map = sfi->optimized_code_map(); |
| + RecordFixedArrayHelper(sfi, optimized_code_map, OPTIMIZED_CODE_MAP_SUB_TYPE, |
| + 0); |
| // Optimized code map should be small, so skip accounting. |
| int len = optimized_code_map->length(); |
| for (int i = SharedFunctionInfo::kEntriesStart; i < len; |
| @@ -359,73 +433,35 @@ void ObjectStatsCollector::RecordSharedFunctionInfoDetails(ObjectStats* stats, |
| literals = LiteralsArray::cast(slot); |
| } |
| if (literals != nullptr) { |
| - RecordFixedArrayHelper(stats, heap, sfi, literals, |
| - LITERALS_ARRAY_SUB_TYPE, 0); |
| - RecordFixedArrayHelper(stats, heap, sfi, literals->feedback_vector(), |
| + RecordFixedArrayHelper(sfi, literals, LITERALS_ARRAY_SUB_TYPE, 0); |
| + RecordFixedArrayHelper(sfi, literals->feedback_vector(), |
| TYPE_FEEDBACK_VECTOR_SUB_TYPE, 0); |
| } |
| } |
| } |
| } |
| -void ObjectStatsCollector::RecordFixedArrayDetails(ObjectStats* stats, |
| - Heap* heap, |
| - HeapObject* obj) { |
| - FixedArray* array = FixedArray::cast(obj); |
| - |
| - // Special fixed arrays. |
| - int subtype = -1; |
| - if (array == heap->weak_new_space_object_to_code_list()) |
| - subtype = WEAK_NEW_SPACE_OBJECT_TO_CODE_SUB_TYPE; |
| - if (array == heap->serialized_templates()) |
| - subtype = SERIALIZED_TEMPLATES_SUB_TYPE; |
| - if (array == heap->string_table()) subtype = STRING_TABLE_SUB_TYPE; |
| - if (array == heap->number_string_cache()) |
| - subtype = NUMBER_STRING_CACHE_SUB_TYPE; |
| - if (array == heap->single_character_string_cache()) |
| - subtype = SINGLE_CHARACTER_STRING_CACHE_SUB_TYPE; |
| - if (array == heap->string_split_cache()) |
| - subtype = STRING_SPLIT_CACHE_SUB_TYPE; |
| - if (array == heap->regexp_multiple_cache()) |
| - subtype = REGEXP_MULTIPLE_CACHE_SUB_TYPE; |
| - if (array->IsContext()) subtype = CONTEXT_SUB_TYPE; |
| - if (array->map() == heap->fixed_cow_array_map()) |
| - subtype = COPY_ON_WRITE_SUB_TYPE; |
| - if (subtype != -1) { |
| - stats->RecordFixedArraySubTypeStats(array, subtype, array->Size(), 0); |
| - } |
| +void ObjectStatsCollector::RecordJSFunctionDetails(JSFunction* function) { |
| + LiteralsArray* literals = function->literals(); |
| + RecordFixedArrayHelper(function, literals, LITERALS_ARRAY_SUB_TYPE, 0); |
| + RecordFixedArrayHelper(function, literals->feedback_vector(), |
| + TYPE_FEEDBACK_VECTOR_SUB_TYPE, 0); |
| +} |
| - // Special hash maps. |
| - if (array == heap->weak_object_to_code_table()) { |
| - WeakHashTable* table = reinterpret_cast<WeakHashTable*>(array); |
| - int used = table->NumberOfElements() * WeakHashTable::kEntrySize; |
| - CHECK_GE(array->Size(), used); |
| - size_t overhead = array->Size() - used; |
| - stats->RecordFixedArraySubTypeStats(table, OBJECT_TO_CODE_SUB_TYPE, |
| - table->Size(), overhead); |
| +void ObjectStatsCollector::RecordFixedArrayDetails(FixedArray* array) { |
| + if (array->IsContext()) { |
| + RecordFixedArrayHelper(nullptr, array, CONTEXT_SUB_TYPE, 0); |
| + } |
| + if (array->map() == heap_->fixed_cow_array_map()) { |
|
ulan
2016/07/25 16:47:30
if (IsCowArray(heap, array) &&...
Michael Lippautz
2016/07/25 16:52:29
Done.
|
| + if (CanRecordFixedArray(heap_, array)) { |
| + stats_->RecordFixedArraySubTypeStats(array, COPY_ON_WRITE_SUB_TYPE, |
| + array->Size(), 0); |
| + } |
| } |
| if (array->IsNativeContext()) { |
| Context* native_ctx = Context::cast(array); |
| - UnseededNumberDictionary* dict = |
| - native_ctx->template_instantiations_cache(); |
| - int used = dict->NumberOfElements() * UnseededNumberDictionary::kEntrySize; |
| - size_t overhead = dict->Size() - used; |
| - RecordFixedArrayHelper(stats, heap, array, dict, |
| - TEMPLATE_INSTANTIATIONS_CACHE_SUB_TYPE, overhead); |
| - } |
| - if (array == heap->code_stubs()) { |
| - UnseededNumberDictionary* dict = UnseededNumberDictionary::cast(array); |
| - int used = dict->NumberOfElements() * UnseededNumberDictionary::kEntrySize; |
| - size_t overhead = dict->Size() - used; |
| - stats->RecordFixedArraySubTypeStats(dict, CODE_STUBS_TABLE_SUB_TYPE, |
| - dict->Size(), overhead); |
| - } |
| - if (array == heap->intrinsic_function_names()) { |
| - NameDictionary* dict = NameDictionary::cast(array); |
| - int used = dict->NumberOfElements() * NameDictionary::kEntrySize; |
| - size_t overhead = dict->Size() - used; |
| - stats->RecordFixedArraySubTypeStats(dict, INTRINSIC_FUNCTION_NAMES_SUB_TYPE, |
| - dict->Size(), overhead); |
| + RecordHashTableHelper(array, native_ctx->template_instantiations_cache(), |
| + TEMPLATE_INSTANTIATIONS_CACHE_SUB_TYPE); |
| } |
| } |