| 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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 TEST(ConstructorProfile) { | 52 TEST(ConstructorProfile) { |
| 53 v8::HandleScope scope; | 53 v8::HandleScope scope; |
| 54 LocalContext env; | 54 LocalContext env; |
| 55 | 55 |
| 56 CompileRun( | 56 CompileRun( |
| 57 "function F() {} // A constructor\n" | 57 "function F() {} // A constructor\n" |
| 58 "var f1 = new F();\n" | 58 "var f1 = new F();\n" |
| 59 "var f2 = new F();\n"); | 59 "var f2 = new F();\n"); |
| 60 | 60 |
| 61 ConstructorHeapProfileTestHelper cons_profile; | 61 ConstructorHeapProfileTestHelper cons_profile; |
| 62 i::HeapIterator iterator; |
| 62 i::AssertNoAllocation no_alloc; | 63 i::AssertNoAllocation no_alloc; |
| 63 i::HeapIterator iterator; | 64 for (i::HeapObject* obj = iterator.Next(); obj != NULL; obj = iterator.Next()) |
| 64 for (i::HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) | |
| 65 cons_profile.CollectStats(obj); | 65 cons_profile.CollectStats(obj); |
| 66 CHECK_EQ(0, cons_profile.f_count()); | 66 CHECK_EQ(0, cons_profile.f_count()); |
| 67 cons_profile.PrintStats(); | 67 cons_profile.PrintStats(); |
| 68 CHECK_EQ(2, cons_profile.f_count()); | 68 CHECK_EQ(2, cons_profile.f_count()); |
| 69 } | 69 } |
| 70 | 70 |
| 71 | 71 |
| 72 static JSObjectsCluster AddHeapObjectToTree(JSObjectsRetainerTree* tree, | 72 static JSObjectsCluster AddHeapObjectToTree(JSObjectsRetainerTree* tree, |
| 73 i::String* constructor, | 73 i::String* constructor, |
| 74 int instance, | 74 int instance, |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 | 356 |
| 357 CompileRun( | 357 CompileRun( |
| 358 "function A() {}\n" | 358 "function A() {}\n" |
| 359 "function B(x) { this.x = x; }\n" | 359 "function B(x) { this.x = x; }\n" |
| 360 "function C(x) { this.x1 = x; this.x2 = x; }\n" | 360 "function C(x) { this.x1 = x; this.x2 = x; }\n" |
| 361 "var a = new A();\n" | 361 "var a = new A();\n" |
| 362 "var b1 = new B(a), b2 = new B(a);\n" | 362 "var b1 = new B(a), b2 = new B(a);\n" |
| 363 "var c = new C(a);"); | 363 "var c = new C(a);"); |
| 364 | 364 |
| 365 RetainerHeapProfile ret_profile; | 365 RetainerHeapProfile ret_profile; |
| 366 i::HeapIterator iterator; |
| 366 i::AssertNoAllocation no_alloc; | 367 i::AssertNoAllocation no_alloc; |
| 367 i::HeapIterator iterator; | 368 for (i::HeapObject* obj = iterator.Next(); obj != NULL; obj = iterator.Next()) |
| 368 for (i::HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) | |
| 369 ret_profile.CollectStats(obj); | 369 ret_profile.CollectStats(obj); |
| 370 ret_profile.CoarseAndAggregate(); | 370 ret_profile.CoarseAndAggregate(); |
| 371 RetainerProfilePrinter printer; | 371 RetainerProfilePrinter printer; |
| 372 ret_profile.DebugPrintStats(&printer); | 372 ret_profile.DebugPrintStats(&printer); |
| 373 const char* retainers_of_a = printer.GetRetainers("A"); | 373 const char* retainers_of_a = printer.GetRetainers("A"); |
| 374 // The order of retainers is unspecified, so we check string length, and | 374 // The order of retainers is unspecified, so we check string length, and |
| 375 // verify each retainer separately. | 375 // verify each retainer separately. |
| 376 CHECK_EQ(i::StrLength("(global property);1,B;2,C;2"), | 376 CHECK_EQ(i::StrLength("(global property);1,B;2,C;2"), |
| 377 i::StrLength(retainers_of_a)); | 377 i::StrLength(retainers_of_a)); |
| 378 CHECK(strstr(retainers_of_a, "(global property);1") != NULL); | 378 CHECK(strstr(retainers_of_a, "(global property);1") != NULL); |
| (...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 723 LocalContext env; | 723 LocalContext env; |
| 724 | 724 |
| 725 CompileRun( | 725 CompileRun( |
| 726 "function A() {}\n" | 726 "function A() {}\n" |
| 727 "function B(x) { this.x = x; }\n" | 727 "function B(x) { this.x = x; }\n" |
| 728 "var a = new A();\n" | 728 "var a = new A();\n" |
| 729 "var b = new B(a);"); | 729 "var b = new B(a);"); |
| 730 const v8::HeapSnapshot* snapshot1 = | 730 const v8::HeapSnapshot* snapshot1 = |
| 731 v8::HeapProfiler::TakeSnapshot(v8::String::New("s1")); | 731 v8::HeapProfiler::TakeSnapshot(v8::String::New("s1")); |
| 732 | 732 |
| 733 i::Heap::CollectAllGarbage(true); // Enforce compaction. | 733 i::Heap::CollectAllGarbage(i::Heap::kForceCompactionMask); |
| 734 | 734 |
| 735 const v8::HeapSnapshot* snapshot2 = | 735 const v8::HeapSnapshot* snapshot2 = |
| 736 v8::HeapProfiler::TakeSnapshot(v8::String::New("s2")); | 736 v8::HeapProfiler::TakeSnapshot(v8::String::New("s2")); |
| 737 | 737 |
| 738 const v8::HeapGraphNode* global1 = GetGlobalObject(snapshot1); | 738 const v8::HeapGraphNode* global1 = GetGlobalObject(snapshot1); |
| 739 const v8::HeapGraphNode* global2 = GetGlobalObject(snapshot2); | 739 const v8::HeapGraphNode* global2 = GetGlobalObject(snapshot2); |
| 740 CHECK_NE_UINT64_T(0, global1->GetId()); | 740 CHECK_NE_UINT64_T(0, global1->GetId()); |
| 741 CHECK_EQ_UINT64_T(global1->GetId(), global2->GetId()); | 741 CHECK_EQ_UINT64_T(global1->GetId(), global2->GetId()); |
| 742 const v8::HeapGraphNode* A1 = | 742 const v8::HeapGraphNode* A1 = |
| 743 GetProperty(global1, v8::HeapGraphEdge::kProperty, "A"); | 743 GetProperty(global1, v8::HeapGraphEdge::kProperty, "A"); |
| (...skipping 645 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1389 const v8::HeapGraphNode* n_CCC = GetNode( | 1389 const v8::HeapGraphNode* n_CCC = GetNode( |
| 1390 ccc, v8::HeapGraphNode::kString, "CCC"); | 1390 ccc, v8::HeapGraphNode::kString, "CCC"); |
| 1391 CHECK_NE(NULL, n_CCC); | 1391 CHECK_NE(NULL, n_CCC); |
| 1392 | 1392 |
| 1393 CHECK_EQ(aaa, GetProperty(n_AAA, v8::HeapGraphEdge::kInternal, "Native")); | 1393 CHECK_EQ(aaa, GetProperty(n_AAA, v8::HeapGraphEdge::kInternal, "Native")); |
| 1394 CHECK_EQ(aaa, GetProperty(n_BBB, v8::HeapGraphEdge::kInternal, "Native")); | 1394 CHECK_EQ(aaa, GetProperty(n_BBB, v8::HeapGraphEdge::kInternal, "Native")); |
| 1395 CHECK_EQ(ccc, GetProperty(n_CCC, v8::HeapGraphEdge::kInternal, "Native")); | 1395 CHECK_EQ(ccc, GetProperty(n_CCC, v8::HeapGraphEdge::kInternal, "Native")); |
| 1396 } | 1396 } |
| 1397 | 1397 |
| 1398 #endif // ENABLE_LOGGING_AND_PROFILING | 1398 #endif // ENABLE_LOGGING_AND_PROFILING |
| OLD | NEW |