Index: src/mark-compact.cc |
diff --git a/src/mark-compact.cc b/src/mark-compact.cc |
index b842a34b646b1d678dd9706bc7f88f564278ef28..a62196e3806df1a16cee82a702333f0ea8dcc5ae 100644 |
--- a/src/mark-compact.cc |
+++ b/src/mark-compact.cc |
@@ -944,7 +944,15 @@ class StaticMarkingVisitor : public StaticVisitorBase { |
table_.GetVisitor(map)(map, obj); |
} |
- template<int id> |
+ static void ObjectStatsVisitBase(StaticVisitorBase::VisitorId id, |
+ Map* map, HeapObject* obj); |
+ |
+ static void ObjectStatsCountFixedArray( |
+ FixedArrayBase* fixed_array, |
+ FixedArraySubInstanceType fast_type, |
+ FixedArraySubInstanceType dictionary_type); |
+ |
+ template<StaticMarkingVisitor::VisitorId id> |
class ObjectStatsTracker { |
public: |
static inline void Visit(Map* map, HeapObject* obj); |
@@ -1499,28 +1507,130 @@ class StaticMarkingVisitor : public StaticVisitorBase { |
}; |
-template<int id> |
-void StaticMarkingVisitor::ObjectStatsTracker<id>::Visit( |
- Map* map, HeapObject* obj) { |
+void StaticMarkingVisitor::ObjectStatsCountFixedArray( |
+ FixedArrayBase* fixed_array, |
+ FixedArraySubInstanceType fast_type, |
+ FixedArraySubInstanceType dictionary_type) { |
+ Heap* heap = fixed_array->map()->GetHeap(); |
+ if (fixed_array->map() != heap->fixed_cow_array_map() && |
+ fixed_array->map() != heap->fixed_double_array_map() && |
+ fixed_array != heap->empty_fixed_array()) { |
+ if (fixed_array->IsDictionary()) { |
+ heap->RecordObjectStats(FIXED_ARRAY_TYPE, |
+ dictionary_type, |
+ fixed_array->Size()); |
+ } else { |
+ heap->RecordObjectStats(FIXED_ARRAY_TYPE, |
+ fast_type, |
+ fixed_array->Size()); |
+ } |
+ } |
+} |
+ |
+ |
+void StaticMarkingVisitor::ObjectStatsVisitBase( |
+ StaticVisitorBase::VisitorId id, Map* map, HeapObject* obj) { |
Heap* heap = map->GetHeap(); |
int object_size = obj->Size(); |
heap->RecordObjectStats(map->instance_type(), -1, object_size); |
- non_count_table_.GetVisitorById(static_cast<VisitorId>(id))(map, obj); |
+ non_count_table_.GetVisitorById(id)(map, obj); |
+ if (obj->IsJSObject()) { |
+ JSObject* object = JSObject::cast(obj); |
+ ObjectStatsCountFixedArray(object->elements(), |
+ DICTIONARY_ELEMENTS_SUB_TYPE, |
+ FAST_ELEMENTS_SUB_TYPE); |
+ ObjectStatsCountFixedArray(object->properties(), |
+ DICTIONARY_PROPERTIES_SUB_TYPE, |
+ FAST_PROPERTIES_SUB_TYPE); |
+ } |
+} |
+ |
+ |
+template<StaticMarkingVisitor::VisitorId id> |
+void StaticMarkingVisitor::ObjectStatsTracker<id>::Visit( |
+ Map* map, HeapObject* obj) { |
+ ObjectStatsVisitBase(id, map, obj); |
} |
template<> |
class StaticMarkingVisitor::ObjectStatsTracker< |
+ StaticMarkingVisitor::kVisitMap> { |
+ public: |
+ static inline void Visit(Map* map, HeapObject* obj) { |
+ Heap* heap = map->GetHeap(); |
+ Map* map_obj = Map::cast(obj); |
+ ASSERT(map->instance_type() == MAP_TYPE); |
+ DescriptorArray* array = map_obj->instance_descriptors(); |
+ if (array != heap->empty_descriptor_array()) { |
+ int fixed_array_size = array->Size(); |
+ heap->RecordObjectStats(FIXED_ARRAY_TYPE, |
+ DESCRIPTOR_ARRAY_SUB_TYPE, |
+ fixed_array_size); |
+ } |
+ if (map_obj->HasTransitionArray()) { |
+ int fixed_array_size = map_obj->transitions()->Size(); |
+ heap->RecordObjectStats(FIXED_ARRAY_TYPE, |
+ TRANSITION_ARRAY_SUB_TYPE, |
+ fixed_array_size); |
+ } |
+ if (map_obj->code_cache() != heap->empty_fixed_array()) { |
+ heap->RecordObjectStats( |
+ FIXED_ARRAY_TYPE, |
+ MAP_CODE_CACHE_SUB_TYPE, |
+ FixedArray::cast(map_obj->code_cache())->Size()); |
+ } |
+ ObjectStatsVisitBase(kVisitMap, map, obj); |
+ } |
+}; |
+ |
+ |
+template<> |
+class StaticMarkingVisitor::ObjectStatsTracker< |
StaticMarkingVisitor::kVisitCode> { |
public: |
static inline void Visit(Map* map, HeapObject* obj) { |
Heap* heap = map->GetHeap(); |
int object_size = obj->Size(); |
ASSERT(map->instance_type() == CODE_TYPE); |
- heap->RecordObjectStats(CODE_TYPE, -1, object_size); |
heap->RecordObjectStats(CODE_TYPE, Code::cast(obj)->kind(), object_size); |
- non_count_table_.GetVisitorById( |
- static_cast<VisitorId>(kVisitCode))(map, obj); |
+ ObjectStatsVisitBase(kVisitCode, map, obj); |
+ } |
+}; |
+ |
+ |
+template<> |
+class StaticMarkingVisitor::ObjectStatsTracker< |
+ StaticMarkingVisitor::kVisitSharedFunctionInfo> { |
+ public: |
+ static inline void Visit(Map* map, HeapObject* obj) { |
+ Heap* heap = map->GetHeap(); |
+ SharedFunctionInfo* sfi = SharedFunctionInfo::cast(obj); |
+ if (sfi->scope_info() != heap->empty_fixed_array()) { |
+ heap->RecordObjectStats( |
+ FIXED_ARRAY_TYPE, |
+ SCOPE_INFO_SUB_TYPE, |
+ FixedArray::cast(sfi->scope_info())->Size()); |
+ } |
+ ObjectStatsVisitBase(kVisitSharedFunctionInfo, map, obj); |
+ } |
+}; |
+ |
+ |
+template<> |
+class StaticMarkingVisitor::ObjectStatsTracker< |
+ StaticMarkingVisitor::kVisitFixedArray> { |
+ public: |
+ static inline void Visit(Map* map, HeapObject* obj) { |
+ Heap* heap = map->GetHeap(); |
+ FixedArray* fixed_array = FixedArray::cast(obj); |
+ if (fixed_array == heap->symbol_table()) { |
+ heap->RecordObjectStats( |
+ FIXED_ARRAY_TYPE, |
+ SYMBOL_TABLE_SUB_TYPE, |
+ fixed_array->Size()); |
+ } |
+ ObjectStatsVisitBase(kVisitFixedArray, map, obj); |
} |
}; |