| Index: src/heap/object-stats.cc
|
| diff --git a/src/heap/object-stats.cc b/src/heap/object-stats.cc
|
| index 0198c6bacf8075dc1721282781eba6e1dae61077..0da1e57438eee7d1cb777dfe125873d0bfa8f7fd 100644
|
| --- a/src/heap/object-stats.cc
|
| +++ b/src/heap/object-stats.cc
|
| @@ -134,8 +134,7 @@ void ObjectStats::CheckpointObjectStats() {
|
|
|
| Isolate* ObjectStats::isolate() { return heap()->isolate(); }
|
|
|
| -
|
| -void ObjectStatsVisitor::CountFixedArray(
|
| +void ObjectStatsCollector::CountFixedArray(
|
| FixedArrayBase* fixed_array, FixedArraySubInstanceType fast_type,
|
| FixedArraySubInstanceType dictionary_type) {
|
| Heap* heap = fixed_array->map()->GetHeap();
|
| @@ -152,12 +151,32 @@ void ObjectStatsVisitor::CountFixedArray(
|
| }
|
| }
|
|
|
| +void ObjectStatsCollector::CollectStatistics(StaticVisitorBase::VisitorId id,
|
| + Map* map, HeapObject* obj) {
|
| + // Record any type specific statistics here.
|
| + switch (id) {
|
| + case StaticVisitorBase::kVisitMap:
|
| + RecordMapStats(map, obj);
|
| + break;
|
| + case StaticVisitorBase::kVisitCode:
|
| + RecordCodeStats(map, obj);
|
| + break;
|
| + case StaticVisitorBase::kVisitSharedFunctionInfo:
|
| + RecordSharedFunctionInfoStats(map, obj);
|
| + break;
|
| + case StaticVisitorBase::kVisitFixedArray:
|
| + RecordFixedArrayStats(map, obj);
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
|
|
| -void ObjectStatsVisitor::VisitBase(VisitorId id, Map* map, HeapObject* obj) {
|
| Heap* heap = map->GetHeap();
|
| int object_size = obj->Size();
|
| heap->object_stats_->RecordObjectStats(map->instance_type(), object_size);
|
| - table_.GetVisitorById(id)(map, obj);
|
| +}
|
| +
|
| +void ObjectStatsCollector::CollectFixedArrayStatistics(HeapObject* obj) {
|
| if (obj->IsJSObject()) {
|
| JSObject* object = JSObject::cast(obj);
|
| CountFixedArray(object->elements(), DICTIONARY_ELEMENTS_SUB_TYPE,
|
| @@ -167,16 +186,7 @@ void ObjectStatsVisitor::VisitBase(VisitorId id, Map* map, HeapObject* obj) {
|
| }
|
| }
|
|
|
| -
|
| -template <ObjectStatsVisitor::VisitorId id>
|
| -void ObjectStatsVisitor::Visit(Map* map, HeapObject* obj) {
|
| - VisitBase(id, map, obj);
|
| -}
|
| -
|
| -
|
| -template <>
|
| -void ObjectStatsVisitor::Visit<ObjectStatsVisitor::kVisitMap>(Map* map,
|
| - HeapObject* obj) {
|
| +void ObjectStatsCollector::RecordMapStats(Map* map, HeapObject* obj) {
|
| Heap* heap = map->GetHeap();
|
| Map* map_obj = Map::cast(obj);
|
| DCHECK(map->instance_type() == MAP_TYPE);
|
| @@ -191,50 +201,55 @@ void ObjectStatsVisitor::Visit<ObjectStatsVisitor::kVisitMap>(Map* map,
|
| heap->object_stats_->RecordFixedArraySubTypeStats(MAP_CODE_CACHE_SUB_TYPE,
|
| cache->Size());
|
| }
|
| - VisitBase(kVisitMap, map, obj);
|
| }
|
|
|
| -
|
| -template <>
|
| -void ObjectStatsVisitor::Visit<ObjectStatsVisitor::kVisitCode>(
|
| - Map* map, HeapObject* obj) {
|
| +void ObjectStatsCollector::RecordCodeStats(Map* map, HeapObject* obj) {
|
| Heap* heap = map->GetHeap();
|
| int object_size = obj->Size();
|
| DCHECK(map->instance_type() == CODE_TYPE);
|
| Code* code_obj = Code::cast(obj);
|
| heap->object_stats_->RecordCodeSubTypeStats(code_obj->kind(),
|
| code_obj->GetAge(), object_size);
|
| - VisitBase(kVisitCode, map, obj);
|
| }
|
|
|
| -
|
| -template <>
|
| -void ObjectStatsVisitor::Visit<ObjectStatsVisitor::kVisitSharedFunctionInfo>(
|
| - Map* map, HeapObject* obj) {
|
| +void ObjectStatsCollector::RecordSharedFunctionInfoStats(Map* map,
|
| + HeapObject* obj) {
|
| Heap* heap = map->GetHeap();
|
| SharedFunctionInfo* sfi = SharedFunctionInfo::cast(obj);
|
| if (sfi->scope_info() != heap->empty_fixed_array()) {
|
| heap->object_stats_->RecordFixedArraySubTypeStats(
|
| SCOPE_INFO_SUB_TYPE, FixedArray::cast(sfi->scope_info())->Size());
|
| }
|
| - VisitBase(kVisitSharedFunctionInfo, map, obj);
|
| }
|
|
|
| -
|
| -template <>
|
| -void ObjectStatsVisitor::Visit<ObjectStatsVisitor::kVisitFixedArray>(
|
| - Map* map, HeapObject* obj) {
|
| +void ObjectStatsCollector::RecordFixedArrayStats(Map* map, HeapObject* obj) {
|
| Heap* heap = map->GetHeap();
|
| FixedArray* fixed_array = FixedArray::cast(obj);
|
| if (fixed_array == heap->string_table()) {
|
| heap->object_stats_->RecordFixedArraySubTypeStats(STRING_TABLE_SUB_TYPE,
|
| fixed_array->Size());
|
| }
|
| - VisitBase(kVisitFixedArray, map, obj);
|
| }
|
|
|
| +void MarkCompactObjectStatsVisitor::Initialize(
|
| + VisitorDispatchTable<Callback>* original) {
|
| + // Copy the original visitor table to make call-through possible. After we
|
| + // preserved a copy locally, we patch the original table to call us.
|
| + table_.CopyFrom(original);
|
| +#define COUNT_FUNCTION(id) original->Register(kVisit##id, Visit<kVisit##id>);
|
| + VISITOR_ID_LIST(COUNT_FUNCTION)
|
| +#undef COUNT_FUNCTION
|
| +}
|
|
|
| -void ObjectStatsVisitor::Initialize(VisitorDispatchTable<Callback>* original) {
|
| +template <MarkCompactObjectStatsVisitor::VisitorId id>
|
| +void MarkCompactObjectStatsVisitor::Visit(Map* map, HeapObject* obj) {
|
| + ObjectStatsCollector::CollectStatistics(id, map, obj);
|
| + table_.GetVisitorById(id)(map, obj);
|
| + ObjectStatsCollector::CollectFixedArrayStatistics(obj);
|
| +}
|
| +
|
| +void IncrementalMarkingObjectStatsVisitor::Initialize(
|
| + VisitorDispatchTable<Callback>* original) {
|
| // Copy the original visitor table to make call-through possible. After we
|
| // preserved a copy locally, we patch the original table to call us.
|
| table_.CopyFrom(original);
|
| @@ -243,5 +258,12 @@ void ObjectStatsVisitor::Initialize(VisitorDispatchTable<Callback>* original) {
|
| #undef COUNT_FUNCTION
|
| }
|
|
|
| +template <IncrementalMarkingObjectStatsVisitor::VisitorId id>
|
| +void IncrementalMarkingObjectStatsVisitor::Visit(Map* map, HeapObject* obj) {
|
| + ObjectStatsCollector::CollectStatistics(id, map, obj);
|
| + table_.GetVisitorById(id)(map, obj);
|
| + ObjectStatsCollector::CollectFixedArrayStatistics(obj);
|
| +}
|
| +
|
| } // namespace internal
|
| } // namespace v8
|
|
|