Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(225)

Side by Side Diff: test/cctest/test-heap-profiler.cc

Issue 9316092: Heap profiler should report implicit references (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/profile-generator.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "v8.h" 5 #include "v8.h"
6 6
7 #include "cctest.h" 7 #include "cctest.h"
8 #include "heap-profiler.h" 8 #include "heap-profiler.h"
9 #include "snapshot.h" 9 #include "snapshot.h"
10 #include "utils-inl.h" 10 #include "utils-inl.h"
(...skipping 787 matching lines...) Expand 10 before | Expand all | Expand 10 after
798 const v8::HeapGraphNode* n_CCC = GetNode( 798 const v8::HeapGraphNode* n_CCC = GetNode(
799 ccc, v8::HeapGraphNode::kString, "CCC"); 799 ccc, v8::HeapGraphNode::kString, "CCC");
800 CHECK_NE(NULL, n_CCC); 800 CHECK_NE(NULL, n_CCC);
801 801
802 CHECK_EQ(aaa, GetProperty(n_AAA, v8::HeapGraphEdge::kInternal, "native")); 802 CHECK_EQ(aaa, GetProperty(n_AAA, v8::HeapGraphEdge::kInternal, "native"));
803 CHECK_EQ(aaa, GetProperty(n_BBB, v8::HeapGraphEdge::kInternal, "native")); 803 CHECK_EQ(aaa, GetProperty(n_BBB, v8::HeapGraphEdge::kInternal, "native"));
804 CHECK_EQ(ccc, GetProperty(n_CCC, v8::HeapGraphEdge::kInternal, "native")); 804 CHECK_EQ(ccc, GetProperty(n_CCC, v8::HeapGraphEdge::kInternal, "native"));
805 } 805 }
806 806
807 807
808 class GraphWithImplicitRefs {
809 public:
810 explicit GraphWithImplicitRefs(LocalContext* env) {
811 CHECK_EQ(NULL, instance_);
812 instance_ = this;
813 for (int i = 0; i < 4; i++) {
814 objects_[i] = v8::Persistent<v8::Object>::New(v8::Object::New());
815 }
816 (*env)->Global()->Set(v8_str("root_object"), objects_[0]);
817 }
818 ~GraphWithImplicitRefs() {
819 instance_ = NULL;
820 }
821
822 static void gcPrologue() {
823 instance_->AddImplicitReferences();
824 }
825
826 private:
827 void AddImplicitReferences() {
828 // 0 -> 1
829 v8::V8::AddImplicitReferences(
830 v8::Persistent<v8::Object>::Cast(objects_[0]), &objects_[1], 1);
831 // 1 -> 2, 1 -> 3
mnaganov (inactive) 2012/02/03 14:23:41 Then please add "(note length = 2)" for clarity.
yurys 2012/02/03 14:50:57 Done.
832 v8::V8::AddImplicitReferences(
833 v8::Persistent<v8::Object>::Cast(objects_[1]), &objects_[2], 2);
834 }
835
836 v8::Persistent<v8::Value> objects_[4];
mnaganov (inactive) 2012/02/03 14:23:41 OK, at least, please introduce a constant for the
yurys 2012/02/03 14:50:57 Done.
837 static GraphWithImplicitRefs* instance_;
838 };
839
840 GraphWithImplicitRefs* GraphWithImplicitRefs::instance_ = NULL;
841
842
843 TEST(HeapSnapshotImplicitReferences) {
844 v8::HandleScope scope;
845 LocalContext env;
846
847 GraphWithImplicitRefs graph(&env);
848 v8::V8::SetGlobalGCPrologueCallback(&GraphWithImplicitRefs::gcPrologue);
849
850 const v8::HeapSnapshot* snapshot =
851 v8::HeapProfiler::TakeSnapshot(v8_str("implicit_refs"));
852
853 const v8::HeapGraphNode* global_object = GetGlobalObject(snapshot);
854 // Use kShortcut type to skip intermediate JSGlobalPropertyCell
855 const v8::HeapGraphNode* obj0 = GetProperty(
856 global_object, v8::HeapGraphEdge::kShortcut, "root_object");
857 CHECK(obj0);
858 CHECK_EQ(v8::HeapGraphNode::kObject, obj0->GetType());
859 const v8::HeapGraphNode* obj1 = GetProperty(
860 obj0, v8::HeapGraphEdge::kInternal, "native");
861 CHECK(obj1);
862 int implicit_targets_count = 0;
863 for (int i = 0, count = obj1->GetChildrenCount(); i < count; ++i) {
864 const v8::HeapGraphEdge* prop = obj1->GetChild(i);
865 v8::String::AsciiValue prop_name(prop->GetName());
866 if (prop->GetType() == v8::HeapGraphEdge::kInternal &&
867 strcmp("native", *prop_name) == 0) {
868 ++implicit_targets_count;
869 }
870 }
871 CHECK_EQ(2, implicit_targets_count);
872 v8::V8::SetGlobalGCPrologueCallback(NULL);
873 }
874
875
808 TEST(DeleteAllHeapSnapshots) { 876 TEST(DeleteAllHeapSnapshots) {
809 v8::HandleScope scope; 877 v8::HandleScope scope;
810 LocalContext env; 878 LocalContext env;
811 879
812 CHECK_EQ(0, v8::HeapProfiler::GetSnapshotsCount()); 880 CHECK_EQ(0, v8::HeapProfiler::GetSnapshotsCount());
813 v8::HeapProfiler::DeleteAllSnapshots(); 881 v8::HeapProfiler::DeleteAllSnapshots();
814 CHECK_EQ(0, v8::HeapProfiler::GetSnapshotsCount()); 882 CHECK_EQ(0, v8::HeapProfiler::GetSnapshotsCount());
815 CHECK_NE(NULL, v8::HeapProfiler::TakeSnapshot(v8_str("1"))); 883 CHECK_NE(NULL, v8::HeapProfiler::TakeSnapshot(v8_str("1")));
816 CHECK_EQ(1, v8::HeapProfiler::GetSnapshotsCount()); 884 CHECK_EQ(1, v8::HeapProfiler::GetSnapshotsCount());
817 v8::HeapProfiler::DeleteAllSnapshots(); 885 v8::HeapProfiler::DeleteAllSnapshots();
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after
1155 v8::HeapProfiler::TakeSnapshot(v8_str("fun")); 1223 v8::HeapProfiler::TakeSnapshot(v8_str("fun"));
1156 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); 1224 const v8::HeapGraphNode* global = GetGlobalObject(snapshot);
1157 CHECK_NE(NULL, global); 1225 CHECK_NE(NULL, global);
1158 const v8::HeapGraphNode* fun = 1226 const v8::HeapGraphNode* fun =
1159 GetProperty(global, v8::HeapGraphEdge::kShortcut, "fun"); 1227 GetProperty(global, v8::HeapGraphEdge::kShortcut, "fun");
1160 CHECK(HasWeakEdge(fun)); 1228 CHECK(HasWeakEdge(fun));
1161 const v8::HeapGraphNode* shared = 1229 const v8::HeapGraphNode* shared =
1162 GetProperty(fun, v8::HeapGraphEdge::kInternal, "shared"); 1230 GetProperty(fun, v8::HeapGraphEdge::kInternal, "shared");
1163 CHECK(HasWeakEdge(shared)); 1231 CHECK(HasWeakEdge(shared));
1164 } 1232 }
OLDNEW
« no previous file with comments | « src/profile-generator.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698