| Index: src/mark-compact.cc
|
| diff --git a/src/mark-compact.cc b/src/mark-compact.cc
|
| index a62196e3806df1a16cee82a702333f0ea8dcc5ae..18c0f4bf571461ac7d76428ac2f0eea71a9d5757 100644
|
| --- a/src/mark-compact.cc
|
| +++ b/src/mark-compact.cc
|
| @@ -944,20 +944,6 @@ class StaticMarkingVisitor : public StaticVisitorBase {
|
| table_.GetVisitor(map)(map, obj);
|
| }
|
|
|
| - 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);
|
| - };
|
| -
|
| static void Initialize();
|
|
|
| INLINE(static void VisitPointer(Heap* heap, Object** p)) {
|
| @@ -1096,6 +1082,12 @@ class StaticMarkingVisitor : public StaticVisitorBase {
|
| StructBodyDescriptor,
|
| void> StructObjectVisitor;
|
|
|
| + template<StaticVisitorBase::VisitorId id>
|
| + static inline void TrackObjectStatsAndVisit(Map* map, HeapObject* obj);
|
| +
|
| + static inline void TrackObjectStatsAndVisitBase(
|
| + StaticVisitorBase::VisitorId id, Map* map, HeapObject* obj);
|
| +
|
| static void VisitJSWeakMap(Map* map, HeapObject* object) {
|
| MarkCompactCollector* collector = map->GetHeap()->mark_compact_collector();
|
| JSWeakMap* weak_map = reinterpret_cast<JSWeakMap*>(object);
|
| @@ -1507,7 +1499,7 @@ class StaticMarkingVisitor : public StaticVisitorBase {
|
| };
|
|
|
|
|
| -void StaticMarkingVisitor::ObjectStatsCountFixedArray(
|
| +static void ObjectStatsCountFixedArray(
|
| FixedArrayBase* fixed_array,
|
| FixedArraySubInstanceType fast_type,
|
| FixedArraySubInstanceType dictionary_type) {
|
| @@ -1528,7 +1520,7 @@ void StaticMarkingVisitor::ObjectStatsCountFixedArray(
|
| }
|
|
|
|
|
| -void StaticMarkingVisitor::ObjectStatsVisitBase(
|
| +void StaticMarkingVisitor::TrackObjectStatsAndVisitBase(
|
| StaticVisitorBase::VisitorId id, Map* map, HeapObject* obj) {
|
| Heap* heap = map->GetHeap();
|
| int object_size = obj->Size();
|
| @@ -1546,93 +1538,80 @@ void StaticMarkingVisitor::ObjectStatsVisitBase(
|
| }
|
|
|
|
|
| -template<StaticMarkingVisitor::VisitorId id>
|
| -void StaticMarkingVisitor::ObjectStatsTracker<id>::Visit(
|
| - Map* map, HeapObject* obj) {
|
| - ObjectStatsVisitBase(id, map, obj);
|
| +template<StaticVisitorBase::VisitorId id>
|
| +void StaticMarkingVisitor::TrackObjectStatsAndVisit(Map* map, HeapObject* obj) {
|
| + TrackObjectStatsAndVisitBase(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);
|
| - }
|
| -};
|
| +void StaticMarkingVisitor::TrackObjectStatsAndVisit<
|
| + StaticMarkingVisitor::kVisitMap>(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());
|
| + }
|
| + TrackObjectStatsAndVisitBase(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, Code::cast(obj)->kind(), object_size);
|
| - ObjectStatsVisitBase(kVisitCode, map, obj);
|
| - }
|
| -};
|
| +void StaticMarkingVisitor::TrackObjectStatsAndVisit<
|
| + StaticMarkingVisitor::kVisitCode>(Map* map, HeapObject* obj) {
|
| + Heap* heap = map->GetHeap();
|
| + int object_size = obj->Size();
|
| + ASSERT(map->instance_type() == CODE_TYPE);
|
| + heap->RecordObjectStats(CODE_TYPE, Code::cast(obj)->kind(), object_size);
|
| + TrackObjectStatsAndVisitBase(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);
|
| - }
|
| -};
|
| +void StaticMarkingVisitor::TrackObjectStatsAndVisit<
|
| + StaticMarkingVisitor::kVisitSharedFunctionInfo>(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());
|
| + }
|
| + TrackObjectStatsAndVisitBase(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);
|
| - }
|
| -};
|
| +void StaticMarkingVisitor::TrackObjectStatsAndVisit<
|
| + StaticMarkingVisitor::kVisitFixedArray>(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());
|
| + }
|
| + TrackObjectStatsAndVisitBase(kVisitFixedArray, map, obj);
|
| +}
|
|
|
|
|
| void StaticMarkingVisitor::Initialize() {
|
| @@ -1708,7 +1687,7 @@ void StaticMarkingVisitor::Initialize() {
|
| // Copy the visitor table to make call-through possible.
|
| non_count_table_.CopyFrom(&table_);
|
| #define VISITOR_ID_COUNT_FUNCTION(id) \
|
| - table_.Register(kVisit##id, ObjectStatsTracker<kVisit##id>::Visit);
|
| + table_.Register(kVisit##id, TrackObjectStatsAndVisit<kVisit##id>);
|
| VISITOR_ID_LIST(VISITOR_ID_COUNT_FUNCTION)
|
| #undef VISITOR_ID_COUNT_FUNCTION
|
| }
|
|
|