OLD | NEW |
1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 the V8 project authors. All rights reserved. |
2 // | 2 // |
3 // Tests for heap profiler | 3 // Tests for heap profiler |
4 | 4 |
5 #ifdef ENABLE_LOGGING_AND_PROFILING | 5 #ifdef ENABLE_LOGGING_AND_PROFILING |
6 | 6 |
7 #include "v8.h" | 7 #include "v8.h" |
8 #include "heap-profiler.h" | 8 #include "heap-profiler.h" |
9 #include "snapshot.h" | 9 #include "snapshot.h" |
10 #include "string-stream.h" | 10 #include "string-stream.h" |
(...skipping 769 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
780 } | 780 } |
781 | 781 |
782 | 782 |
783 TEST(HeapSnapshotsDiff) { | 783 TEST(HeapSnapshotsDiff) { |
784 v8::HandleScope scope; | 784 v8::HandleScope scope; |
785 LocalContext env; | 785 LocalContext env; |
786 | 786 |
787 CompileAndRunScript( | 787 CompileAndRunScript( |
788 "function A() {}\n" | 788 "function A() {}\n" |
789 "function B(x) { this.x = x; }\n" | 789 "function B(x) { this.x = x; }\n" |
| 790 "function A2(a) { for (var i = 0; i < a; ++i) this[i] = i; }\n" |
790 "var a = new A();\n" | 791 "var a = new A();\n" |
791 "var b = new B(a);"); | 792 "var b = new B(a);"); |
792 const v8::HeapSnapshot* snapshot1 = | 793 const v8::HeapSnapshot* snapshot1 = |
793 v8::HeapProfiler::TakeSnapshot(v8::String::New("s1")); | 794 v8::HeapProfiler::TakeSnapshot(v8::String::New("s1")); |
794 | 795 |
795 CompileAndRunScript( | 796 CompileAndRunScript( |
796 "delete a;\n" | 797 "delete a;\n" |
797 "b.x = null;\n" | 798 "b.x = null;\n" |
798 "var a = new A();\n" | 799 "var a = new A2(20);\n" |
799 "var b2 = new B(a);"); | 800 "var b2 = new B(a);"); |
800 const v8::HeapSnapshot* snapshot2 = | 801 const v8::HeapSnapshot* snapshot2 = |
801 v8::HeapProfiler::TakeSnapshot(v8::String::New("s2")); | 802 v8::HeapProfiler::TakeSnapshot(v8::String::New("s2")); |
802 | 803 |
803 const v8::HeapSnapshotsDiff* diff = snapshot1->CompareWith(snapshot2); | 804 const v8::HeapSnapshotsDiff* diff = snapshot1->CompareWith(snapshot2); |
804 | 805 |
805 // Verify additions: ensure that addition of A and B was detected. | 806 // Verify additions: ensure that addition of A and B was detected. |
806 const v8::HeapGraphNode* additions_root = diff->GetAdditionsRoot(); | 807 const v8::HeapGraphNode* additions_root = diff->GetAdditionsRoot(); |
807 bool found_A = false, found_B = false; | 808 bool found_A = false, found_B = false; |
808 uint64_t s1_A_id = 0; | 809 uint64_t s1_A_id = 0; |
809 for (int i = 0, count = additions_root->GetChildrenCount(); i < count; ++i) { | 810 for (int i = 0, count = additions_root->GetChildrenCount(); i < count; ++i) { |
810 const v8::HeapGraphEdge* prop = additions_root->GetChild(i); | 811 const v8::HeapGraphEdge* prop = additions_root->GetChild(i); |
811 const v8::HeapGraphNode* node = prop->GetToNode(); | 812 const v8::HeapGraphNode* node = prop->GetToNode(); |
812 if (node->GetType() == v8::HeapGraphNode::kObject) { | 813 if (node->GetType() == v8::HeapGraphNode::kObject) { |
813 v8::String::AsciiValue node_name(node->GetName()); | 814 v8::String::AsciiValue node_name(node->GetName()); |
814 if (strcmp(*node_name, "A") == 0) { | 815 if (strcmp(*node_name, "A2") == 0) { |
815 CHECK(IsNodeRetainedAs(node, v8::HeapGraphEdge::kProperty, "a")); | 816 CHECK(IsNodeRetainedAs(node, v8::HeapGraphEdge::kProperty, "a")); |
816 CHECK(!found_A); | 817 CHECK(!found_A); |
817 found_A = true; | 818 found_A = true; |
818 s1_A_id = node->GetId(); | 819 s1_A_id = node->GetId(); |
819 } else if (strcmp(*node_name, "B") == 0) { | 820 } else if (strcmp(*node_name, "B") == 0) { |
820 CHECK(IsNodeRetainedAs(node, v8::HeapGraphEdge::kProperty, "b2")); | 821 CHECK(IsNodeRetainedAs(node, v8::HeapGraphEdge::kProperty, "b2")); |
821 CHECK(!found_B); | 822 CHECK(!found_B); |
822 found_B = true; | 823 found_B = true; |
823 } | 824 } |
824 } | 825 } |
(...skipping 17 matching lines...) Expand all Loading... |
842 s2_A_id = node->GetId(); | 843 s2_A_id = node->GetId(); |
843 } | 844 } |
844 } | 845 } |
845 } | 846 } |
846 CHECK(found_A_del); | 847 CHECK(found_A_del); |
847 CHECK_NE_UINT64_T(0, s1_A_id); | 848 CHECK_NE_UINT64_T(0, s1_A_id); |
848 CHECK(s1_A_id != s2_A_id); | 849 CHECK(s1_A_id != s2_A_id); |
849 } | 850 } |
850 | 851 |
851 | 852 |
| 853 TEST(HeapSnapshotRootPreservedAfterSorting) { |
| 854 v8::HandleScope scope; |
| 855 LocalContext env; |
| 856 const v8::HeapSnapshot* snapshot = |
| 857 v8::HeapProfiler::TakeSnapshot(v8::String::New("s")); |
| 858 const v8::HeapGraphNode* root1 = snapshot->GetRoot(); |
| 859 const_cast<i::HeapSnapshot*>(reinterpret_cast<const i::HeapSnapshot*>( |
| 860 snapshot))->GetSortedEntriesList(); |
| 861 const v8::HeapGraphNode* root2 = snapshot->GetRoot(); |
| 862 CHECK_EQ(root1, root2); |
| 863 } |
| 864 |
| 865 |
852 namespace v8 { | 866 namespace v8 { |
853 namespace internal { | 867 namespace internal { |
854 | 868 |
855 class HeapSnapshotTester { | 869 class HeapSnapshotTester { |
856 public: | 870 public: |
857 static int CalculateNetworkSize(JSObject* obj) { | 871 static int CalculateNetworkSize(JSObject* obj) { |
858 return HeapSnapshot::CalculateNetworkSize(obj); | 872 return HeapSnapshot::CalculateNetworkSize(obj); |
859 } | 873 } |
860 }; | 874 }; |
861 | 875 |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1135 LocalContext env; | 1149 LocalContext env; |
1136 const v8::HeapSnapshot* snapshot = | 1150 const v8::HeapSnapshot* snapshot = |
1137 v8::HeapProfiler::TakeSnapshot(v8::String::New("abort")); | 1151 v8::HeapProfiler::TakeSnapshot(v8::String::New("abort")); |
1138 TestJSONStream stream(5); | 1152 TestJSONStream stream(5); |
1139 snapshot->Serialize(&stream, v8::HeapSnapshot::kJSON); | 1153 snapshot->Serialize(&stream, v8::HeapSnapshot::kJSON); |
1140 CHECK_GT(stream.size(), 0); | 1154 CHECK_GT(stream.size(), 0); |
1141 CHECK_EQ(0, stream.eos_signaled()); | 1155 CHECK_EQ(0, stream.eos_signaled()); |
1142 } | 1156 } |
1143 | 1157 |
1144 #endif // ENABLE_LOGGING_AND_PROFILING | 1158 #endif // ENABLE_LOGGING_AND_PROFILING |
OLD | NEW |