OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // | 2 // |
3 // Tests for heap profiler | 3 // Tests for heap profiler |
4 | 4 |
5 #include <ctype.h> | 5 #include <ctype.h> |
6 | 6 |
7 #include "v8.h" | 7 #include "v8.h" |
8 | 8 |
9 #include "cctest.h" | 9 #include "cctest.h" |
10 #include "hashmap.h" | 10 #include "hashmap.h" |
(...skipping 1098 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1109 instance_ = this; | 1109 instance_ = this; |
1110 for (int i = 0; i < kObjectsCount; i++) { | 1110 for (int i = 0; i < kObjectsCount; i++) { |
1111 objects_[i] = v8::Persistent<v8::Object>::New(v8::Object::New()); | 1111 objects_[i] = v8::Persistent<v8::Object>::New(v8::Object::New()); |
1112 } | 1112 } |
1113 (*env)->Global()->Set(v8_str("root_object"), objects_[0]); | 1113 (*env)->Global()->Set(v8_str("root_object"), objects_[0]); |
1114 } | 1114 } |
1115 ~GraphWithImplicitRefs() { | 1115 ~GraphWithImplicitRefs() { |
1116 instance_ = NULL; | 1116 instance_ = NULL; |
1117 } | 1117 } |
1118 | 1118 |
1119 static void gcPrologue() { | 1119 static void gcPrologue(v8::GCType type, v8::GCCallbackFlags flags) { |
1120 instance_->AddImplicitReferences(); | 1120 instance_->AddImplicitReferences(); |
1121 } | 1121 } |
1122 | 1122 |
1123 private: | 1123 private: |
1124 void AddImplicitReferences() { | 1124 void AddImplicitReferences() { |
1125 // 0 -> 1 | 1125 // 0 -> 1 |
1126 v8::V8::AddImplicitReferences( | 1126 v8::V8::AddImplicitReferences( |
1127 v8::Persistent<v8::Object>::Cast(objects_[0]), &objects_[1], 1); | 1127 v8::Persistent<v8::Object>::Cast(objects_[0]), &objects_[1], 1); |
1128 // Adding two more references(note length=2 in params): 1 -> 2, 1 -> 3 | 1128 // Adding two more references(note length=2 in params): 1 -> 2, 1 -> 3 |
1129 v8::V8::AddImplicitReferences( | 1129 v8::V8::AddImplicitReferences( |
1130 v8::Persistent<v8::Object>::Cast(objects_[1]), &objects_[2], 2); | 1130 v8::Persistent<v8::Object>::Cast(objects_[1]), &objects_[2], 2); |
1131 } | 1131 } |
1132 | 1132 |
1133 v8::Persistent<v8::Value> objects_[kObjectsCount]; | 1133 v8::Persistent<v8::Value> objects_[kObjectsCount]; |
1134 static GraphWithImplicitRefs* instance_; | 1134 static GraphWithImplicitRefs* instance_; |
1135 }; | 1135 }; |
1136 | 1136 |
1137 GraphWithImplicitRefs* GraphWithImplicitRefs::instance_ = NULL; | 1137 GraphWithImplicitRefs* GraphWithImplicitRefs::instance_ = NULL; |
1138 | 1138 |
1139 | 1139 |
1140 TEST(HeapSnapshotImplicitReferences) { | 1140 TEST(HeapSnapshotImplicitReferences) { |
1141 v8::HandleScope scope; | 1141 v8::HandleScope scope; |
1142 LocalContext env; | 1142 LocalContext env; |
1143 | 1143 |
1144 GraphWithImplicitRefs graph(&env); | 1144 GraphWithImplicitRefs graph(&env); |
1145 v8::V8::SetGlobalGCPrologueCallback(&GraphWithImplicitRefs::gcPrologue); | 1145 v8::V8::AddGCPrologueCallback(&GraphWithImplicitRefs::gcPrologue); |
1146 | 1146 |
1147 const v8::HeapSnapshot* snapshot = | 1147 const v8::HeapSnapshot* snapshot = |
1148 v8::HeapProfiler::TakeSnapshot(v8_str("implicit_refs")); | 1148 v8::HeapProfiler::TakeSnapshot(v8_str("implicit_refs")); |
1149 | 1149 |
1150 const v8::HeapGraphNode* global_object = GetGlobalObject(snapshot); | 1150 const v8::HeapGraphNode* global_object = GetGlobalObject(snapshot); |
1151 const v8::HeapGraphNode* obj0 = GetProperty( | 1151 const v8::HeapGraphNode* obj0 = GetProperty( |
1152 global_object, v8::HeapGraphEdge::kProperty, "root_object"); | 1152 global_object, v8::HeapGraphEdge::kProperty, "root_object"); |
1153 CHECK(obj0); | 1153 CHECK(obj0); |
1154 CHECK_EQ(v8::HeapGraphNode::kObject, obj0->GetType()); | 1154 CHECK_EQ(v8::HeapGraphNode::kObject, obj0->GetType()); |
1155 const v8::HeapGraphNode* obj1 = GetProperty( | 1155 const v8::HeapGraphNode* obj1 = GetProperty( |
1156 obj0, v8::HeapGraphEdge::kInternal, "native"); | 1156 obj0, v8::HeapGraphEdge::kInternal, "native"); |
1157 CHECK(obj1); | 1157 CHECK(obj1); |
1158 int implicit_targets_count = 0; | 1158 int implicit_targets_count = 0; |
1159 for (int i = 0, count = obj1->GetChildrenCount(); i < count; ++i) { | 1159 for (int i = 0, count = obj1->GetChildrenCount(); i < count; ++i) { |
1160 const v8::HeapGraphEdge* prop = obj1->GetChild(i); | 1160 const v8::HeapGraphEdge* prop = obj1->GetChild(i); |
1161 v8::String::AsciiValue prop_name(prop->GetName()); | 1161 v8::String::AsciiValue prop_name(prop->GetName()); |
1162 if (prop->GetType() == v8::HeapGraphEdge::kInternal && | 1162 if (prop->GetType() == v8::HeapGraphEdge::kInternal && |
1163 strcmp("native", *prop_name) == 0) { | 1163 strcmp("native", *prop_name) == 0) { |
1164 ++implicit_targets_count; | 1164 ++implicit_targets_count; |
1165 } | 1165 } |
1166 } | 1166 } |
1167 CHECK_EQ(2, implicit_targets_count); | 1167 CHECK_EQ(2, implicit_targets_count); |
1168 v8::V8::SetGlobalGCPrologueCallback(NULL); | 1168 v8::V8::RemoveGCPrologueCallback(&GraphWithImplicitRefs::gcPrologue); |
1169 } | 1169 } |
1170 | 1170 |
1171 | 1171 |
1172 TEST(DeleteAllHeapSnapshots) { | 1172 TEST(DeleteAllHeapSnapshots) { |
1173 v8::HandleScope scope; | 1173 v8::HandleScope scope; |
1174 LocalContext env; | 1174 LocalContext env; |
1175 | 1175 |
1176 CHECK_EQ(0, v8::HeapProfiler::GetSnapshotsCount()); | 1176 CHECK_EQ(0, v8::HeapProfiler::GetSnapshotsCount()); |
1177 v8::HeapProfiler::DeleteAllSnapshots(); | 1177 v8::HeapProfiler::DeleteAllSnapshots(); |
1178 CHECK_EQ(0, v8::HeapProfiler::GetSnapshotsCount()); | 1178 CHECK_EQ(0, v8::HeapProfiler::GetSnapshotsCount()); |
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1650 const v8::HeapGraphNode* map = | 1650 const v8::HeapGraphNode* map = |
1651 GetProperty(global_object, v8::HeapGraphEdge::kInternal, "map"); | 1651 GetProperty(global_object, v8::HeapGraphEdge::kInternal, "map"); |
1652 CHECK_NE(NULL, map); | 1652 CHECK_NE(NULL, map); |
1653 const v8::HeapGraphNode* own_descriptors = GetProperty( | 1653 const v8::HeapGraphNode* own_descriptors = GetProperty( |
1654 map, v8::HeapGraphEdge::kInternal, "descriptors"); | 1654 map, v8::HeapGraphEdge::kInternal, "descriptors"); |
1655 CHECK_NE(NULL, own_descriptors); | 1655 CHECK_NE(NULL, own_descriptors); |
1656 const v8::HeapGraphNode* own_transitions = GetProperty( | 1656 const v8::HeapGraphNode* own_transitions = GetProperty( |
1657 map, v8::HeapGraphEdge::kInternal, "transitions"); | 1657 map, v8::HeapGraphEdge::kInternal, "transitions"); |
1658 CHECK_EQ(NULL, own_transitions); | 1658 CHECK_EQ(NULL, own_transitions); |
1659 } | 1659 } |
OLD | NEW |