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 "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 Loading... | |
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++) | |
mnaganov (inactive)
2012/02/03 13:57:19
nit: brackets
yurys
2012/02/03 14:09:26
Done. Are they required by V8 coding style?
mnaganov (inactive)
2012/02/03 14:23:41
Google C++ coding style says "conditional or loop
| |
814 objects_[i] = v8::Persistent<v8::Object>::New(v8::Object::New()); | |
815 (*env)->Global()->Set(v8_str("root_object"), objects_[0]); | |
816 } | |
817 ~GraphWithImplicitRefs() { | |
818 instance_ = NULL; | |
819 } | |
820 | |
821 static void gcPrologue() { | |
822 instance_->AddImplicitReferences(); | |
823 } | |
824 | |
825 private: | |
826 void AddImplicitReferences() { | |
827 // 0 -> 1 | |
828 v8::V8::AddImplicitReferences( | |
829 v8::Persistent<v8::Object>::Cast(objects_[0]), &objects_[1], 1); | |
830 // 1 -> 2, 1 -> 3 | |
831 v8::V8::AddImplicitReferences( | |
832 v8::Persistent<v8::Object>::Cast(objects_[1]), &objects_[2], 2); | |
mnaganov (inactive)
2012/02/03 13:57:19
Have you forgot to add 1->3 reference, or what doe
yurys
2012/02/03 14:09:26
No, the comment is perfectly fine, although Ilya a
| |
833 } | |
834 | |
835 v8::Persistent<v8::Value> objects_[4]; | |
mnaganov (inactive)
2012/02/03 13:57:19
I think, using an enum for test objects and their
yurys
2012/02/03 14:09:26
Well, I started with storing each object in its ow
| |
836 static GraphWithImplicitRefs* instance_; | |
837 }; | |
838 | |
839 GraphWithImplicitRefs* GraphWithImplicitRefs::instance_ = NULL; | |
840 | |
841 | |
842 TEST(HeapSnapshotImplicitReferences) { | |
843 v8::HandleScope scope; | |
844 LocalContext env; | |
845 | |
846 GraphWithImplicitRefs graph(&env); | |
847 v8::V8::SetGlobalGCPrologueCallback(&GraphWithImplicitRefs::gcPrologue); | |
848 | |
849 const v8::HeapSnapshot* snapshot = | |
850 v8::HeapProfiler::TakeSnapshot(v8_str("implicit_refs")); | |
851 | |
852 const v8::HeapGraphNode* global_object = GetGlobalObject(snapshot); | |
853 // Use kShortcut type to skip intermediate JSGlobalPropertyCell | |
854 const v8::HeapGraphNode* o0 = GetProperty( | |
mnaganov (inactive)
2012/02/03 13:57:19
This name looks weird. In other tests names like "
yurys
2012/02/03 14:09:26
Done.
| |
855 global_object, v8::HeapGraphEdge::kShortcut, "root_object"); | |
856 CHECK(o0); | |
857 CHECK_EQ(v8::HeapGraphNode::kObject, o0->GetType()); | |
858 const v8::HeapGraphNode* o1 = GetProperty( | |
859 o0, v8::HeapGraphEdge::kInternal, "native"); | |
860 CHECK(o1); | |
861 int implicit_targets_count = 0; | |
862 for (int i = 0, count = o1->GetChildrenCount(); i < count; ++i) { | |
863 const v8::HeapGraphEdge* prop = o1->GetChild(i); | |
864 v8::String::AsciiValue prop_name(prop->GetName()); | |
865 if (prop->GetType() == v8::HeapGraphEdge::kInternal && | |
866 strcmp("native", *prop_name) == 0) { | |
867 ++implicit_targets_count; | |
868 } | |
869 } | |
870 CHECK_EQ(2, implicit_targets_count); | |
871 v8::V8::SetGlobalGCPrologueCallback(NULL); | |
872 } | |
873 | |
874 | |
808 TEST(DeleteAllHeapSnapshots) { | 875 TEST(DeleteAllHeapSnapshots) { |
809 v8::HandleScope scope; | 876 v8::HandleScope scope; |
810 LocalContext env; | 877 LocalContext env; |
811 | 878 |
812 CHECK_EQ(0, v8::HeapProfiler::GetSnapshotsCount()); | 879 CHECK_EQ(0, v8::HeapProfiler::GetSnapshotsCount()); |
813 v8::HeapProfiler::DeleteAllSnapshots(); | 880 v8::HeapProfiler::DeleteAllSnapshots(); |
814 CHECK_EQ(0, v8::HeapProfiler::GetSnapshotsCount()); | 881 CHECK_EQ(0, v8::HeapProfiler::GetSnapshotsCount()); |
815 CHECK_NE(NULL, v8::HeapProfiler::TakeSnapshot(v8_str("1"))); | 882 CHECK_NE(NULL, v8::HeapProfiler::TakeSnapshot(v8_str("1"))); |
816 CHECK_EQ(1, v8::HeapProfiler::GetSnapshotsCount()); | 883 CHECK_EQ(1, v8::HeapProfiler::GetSnapshotsCount()); |
817 v8::HeapProfiler::DeleteAllSnapshots(); | 884 v8::HeapProfiler::DeleteAllSnapshots(); |
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1155 v8::HeapProfiler::TakeSnapshot(v8_str("fun")); | 1222 v8::HeapProfiler::TakeSnapshot(v8_str("fun")); |
1156 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); | 1223 const v8::HeapGraphNode* global = GetGlobalObject(snapshot); |
1157 CHECK_NE(NULL, global); | 1224 CHECK_NE(NULL, global); |
1158 const v8::HeapGraphNode* fun = | 1225 const v8::HeapGraphNode* fun = |
1159 GetProperty(global, v8::HeapGraphEdge::kShortcut, "fun"); | 1226 GetProperty(global, v8::HeapGraphEdge::kShortcut, "fun"); |
1160 CHECK(HasWeakEdge(fun)); | 1227 CHECK(HasWeakEdge(fun)); |
1161 const v8::HeapGraphNode* shared = | 1228 const v8::HeapGraphNode* shared = |
1162 GetProperty(fun, v8::HeapGraphEdge::kInternal, "shared"); | 1229 GetProperty(fun, v8::HeapGraphEdge::kInternal, "shared"); |
1163 CHECK(HasWeakEdge(shared)); | 1230 CHECK(HasWeakEdge(shared)); |
1164 } | 1231 } |
OLD | NEW |