Index: src/heap/object-stats.cc |
diff --git a/src/heap/object-stats.cc b/src/heap/object-stats.cc |
index 34621a95a92bb72b6dfb756b3e781562b22bdd8e..3f43212151da4e8aa8b8aabe033d415c7a036b87 100644 |
--- a/src/heap/object-stats.cc |
+++ b/src/heap/object-stats.cc |
@@ -4,6 +4,7 @@ |
#include "src/heap/object-stats.h" |
+#include "src/compilation-cache.h" |
#include "src/counters.h" |
#include "src/heap/heap-inl.h" |
#include "src/isolate.h" |
@@ -173,6 +174,9 @@ void ObjectStatsCollector::CollectStatistics(HeapObject* obj) { |
// Record specific sub types where possible. |
if (obj->IsMap()) RecordMapDetails(Map::cast(obj)); |
+ if (obj->IsObjectTemplateInfo() || obj->IsFunctionTemplateInfo()) { |
+ RecordTemplateInfoDetails(TemplateInfo::cast(obj)); |
+ } |
if (obj->IsBytecodeArray()) { |
RecordBytecodeArrayDetails(BytecodeArray::cast(obj)); |
} |
@@ -192,6 +196,26 @@ void ObjectStatsCollector::CollectStatistics(HeapObject* obj) { |
if (obj->IsScript()) RecordScriptDetails(Script::cast(obj)); |
} |
+class ObjectStatsCollector::CompilationCacheTableVisitor |
+ : public ObjectVisitor { |
+ public: |
+ explicit CompilationCacheTableVisitor(ObjectStatsCollector* parent) |
+ : parent_(parent) {} |
+ |
+ void VisitPointers(Object** start, Object** end) override { |
+ for (Object** current = start; current < end; current++) { |
+ HeapObject* obj = HeapObject::cast(*current); |
+ if (obj->IsUndefined(parent_->heap_->isolate())) continue; |
+ CHECK(obj->IsCompilationCacheTable()); |
+ parent_->RecordHashTableHelper(nullptr, CompilationCacheTable::cast(obj), |
+ COMPILATION_CACHE_TABLE_SUB_TYPE); |
+ } |
+ } |
+ |
+ private: |
+ ObjectStatsCollector* parent_; |
+}; |
+ |
void ObjectStatsCollector::CollectGlobalStatistics() { |
// Global FixedArrays. |
RecordFixedArrayHelper(nullptr, heap_->weak_new_space_object_to_code_list(), |
@@ -226,6 +250,9 @@ void ObjectStatsCollector::CollectGlobalStatistics() { |
INTRINSIC_FUNCTION_NAMES_SUB_TYPE); |
RecordHashTableHelper(nullptr, heap_->empty_properties_dictionary(), |
EMPTY_PROPERTIES_DICTIONARY_SUB_TYPE); |
+ CompilationCache* compilation_cache = heap_->isolate()->compilation_cache(); |
+ CompilationCacheTableVisitor v(this); |
+ compilation_cache->Iterate(&v); |
} |
static bool CanRecordFixedArray(Heap* heap, FixedArrayBase* array) { |
@@ -366,8 +393,13 @@ void ObjectStatsCollector::RecordMapDetails(Map* map_obj) { |
} |
if (map_obj->has_code_cache()) { |
- RecordFixedArrayHelper(map_obj, map_obj->code_cache(), |
- MAP_CODE_CACHE_SUB_TYPE, 0); |
+ FixedArray* code_cache = map_obj->code_cache(); |
+ if (code_cache->IsCodeCacheHashTable()) { |
+ RecordHashTableHelper(map_obj, CodeCacheHashTable::cast(code_cache), |
+ MAP_CODE_CACHE_SUB_TYPE); |
+ } else { |
+ RecordFixedArrayHelper(map_obj, code_cache, MAP_CODE_CACHE_SUB_TYPE, 0); |
+ } |
} |
for (DependentCode* cur_dependent_code = map_obj->dependent_code(); |
@@ -390,6 +422,17 @@ void ObjectStatsCollector::RecordMapDetails(Map* map_obj) { |
} |
} |
+void ObjectStatsCollector::RecordTemplateInfoDetails(TemplateInfo* obj) { |
+ if (obj->property_accessors()->IsFixedArray()) { |
+ RecordFixedArrayHelper(obj, FixedArray::cast(obj->property_accessors()), |
+ TEMPLATE_INFO_SUB_TYPE, 0); |
+ } |
+ if (obj->property_list()->IsFixedArray()) { |
+ RecordFixedArrayHelper(obj, FixedArray::cast(obj->property_list()), |
+ TEMPLATE_INFO_SUB_TYPE, 0); |
+ } |
+} |
+ |
void ObjectStatsCollector::RecordBytecodeArrayDetails(BytecodeArray* obj) { |
RecordFixedArrayHelper(obj, obj->constant_pool(), |
BYTECODE_ARRAY_CONSTANT_POOL_SUB_TYPE, 0); |
@@ -401,6 +444,13 @@ void ObjectStatsCollector::RecordCodeDetails(Code* code) { |
stats_->RecordCodeSubTypeStats(code->kind(), code->GetAge(), code->Size()); |
RecordFixedArrayHelper(code, code->deoptimization_data(), |
DEOPTIMIZATION_DATA_SUB_TYPE, 0); |
+ if (code->kind() == Code::Kind::OPTIMIZED_FUNCTION) { |
+ DeoptimizationInputData* input_data = |
+ DeoptimizationInputData::cast(code->deoptimization_data()); |
+ RecordFixedArrayHelper(code->deoptimization_data(), |
+ input_data->LiteralArray(), |
+ OPTIMIZED_CODE_LITERALS_SUB_TYPE, 0); |
+ } |
RecordFixedArrayHelper(code, code->handler_table(), HANDLER_TABLE_SUB_TYPE, |
0); |
int const mode_mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); |