Chromium Code Reviews| 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 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 337 const v8::HeapSnapshot* snapshot = | 337 const v8::HeapSnapshot* snapshot = |
| 338 v8::HeapProfiler::TakeSnapshot(v8_str("internals")); | 338 v8::HeapProfiler::TakeSnapshot(v8_str("internals")); |
| 339 const v8::HeapGraphNode* global_node = GetGlobalObject(snapshot); | 339 const v8::HeapGraphNode* global_node = GetGlobalObject(snapshot); |
| 340 // The first reference will not present, because it's a Smi. | 340 // The first reference will not present, because it's a Smi. |
| 341 CHECK_EQ(NULL, GetProperty(global_node, v8::HeapGraphEdge::kInternal, "0")); | 341 CHECK_EQ(NULL, GetProperty(global_node, v8::HeapGraphEdge::kInternal, "0")); |
| 342 // The second reference is to an object. | 342 // The second reference is to an object. |
| 343 CHECK_NE(NULL, GetProperty(global_node, v8::HeapGraphEdge::kInternal, "1")); | 343 CHECK_NE(NULL, GetProperty(global_node, v8::HeapGraphEdge::kInternal, "1")); |
| 344 } | 344 } |
| 345 | 345 |
| 346 | 346 |
| 347 // Trying to introduce a check helper for uint64_t causes many | 347 // Trying to introduce a check helper for uint64_t causes many |
|
mnaganov (inactive)
2012/03/26 12:37:53
Please update the comment.
| |
| 348 // overloading ambiguities, so it seems easier just to cast | 348 // overloading ambiguities, so it seems easier just to cast |
| 349 // them to a signed type. | 349 // them to a signed type. |
| 350 #define CHECK_EQ_UINT64_T(a, b) \ | 350 #define CHECK_EQ_SNAPSHOT_OBJECT_ID(a, b) \ |
| 351 CHECK_EQ(static_cast<int64_t>(a), static_cast<int64_t>(b)) | 351 CHECK_EQ(static_cast<int32_t>(a), static_cast<int32_t>(b)) |
| 352 #define CHECK_NE_UINT64_T(a, b) \ | 352 #define CHECK_NE_SNAPSHOT_OBJECT_ID(a, b) \ |
| 353 CHECK((a) != (b)) // NOLINT | 353 CHECK((a) != (b)) // NOLINT |
| 354 | 354 |
| 355 TEST(HeapEntryIdsAndArrayShift) { | 355 TEST(HeapEntryIdsAndArrayShift) { |
| 356 v8::HandleScope scope; | 356 v8::HandleScope scope; |
| 357 LocalContext env; | 357 LocalContext env; |
| 358 | 358 |
| 359 CompileRun( | 359 CompileRun( |
| 360 "function AnObject() {\n" | 360 "function AnObject() {\n" |
| 361 " this.first = 'first';\n" | 361 " this.first = 'first';\n" |
| 362 " this.second = 'second';\n" | 362 " this.second = 'second';\n" |
| 363 "}\n" | 363 "}\n" |
| 364 "var a = new Array();\n" | 364 "var a = new Array();\n" |
| 365 "for (var i = 0; i < 10; ++i)\n" | 365 "for (var i = 0; i < 10; ++i)\n" |
| 366 " a.push(new AnObject());\n"); | 366 " a.push(new AnObject());\n"); |
| 367 const v8::HeapSnapshot* snapshot1 = | 367 const v8::HeapSnapshot* snapshot1 = |
| 368 v8::HeapProfiler::TakeSnapshot(v8_str("s1")); | 368 v8::HeapProfiler::TakeSnapshot(v8_str("s1")); |
| 369 | 369 |
| 370 CompileRun( | 370 CompileRun( |
| 371 "for (var i = 0; i < 1; ++i)\n" | 371 "for (var i = 0; i < 1; ++i)\n" |
| 372 " a.shift();\n"); | 372 " a.shift();\n"); |
| 373 | 373 |
| 374 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); | 374 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); |
| 375 | 375 |
| 376 const v8::HeapSnapshot* snapshot2 = | 376 const v8::HeapSnapshot* snapshot2 = |
| 377 v8::HeapProfiler::TakeSnapshot(v8_str("s2")); | 377 v8::HeapProfiler::TakeSnapshot(v8_str("s2")); |
| 378 | 378 |
| 379 const v8::HeapGraphNode* global1 = GetGlobalObject(snapshot1); | 379 const v8::HeapGraphNode* global1 = GetGlobalObject(snapshot1); |
| 380 const v8::HeapGraphNode* global2 = GetGlobalObject(snapshot2); | 380 const v8::HeapGraphNode* global2 = GetGlobalObject(snapshot2); |
| 381 CHECK_NE_UINT64_T(0, global1->GetId()); | 381 CHECK_NE_SNAPSHOT_OBJECT_ID(0, global1->GetId()); |
| 382 CHECK_EQ_UINT64_T(global1->GetId(), global2->GetId()); | 382 CHECK_EQ_SNAPSHOT_OBJECT_ID(global1->GetId(), global2->GetId()); |
| 383 | 383 |
| 384 const v8::HeapGraphNode* a1 = | 384 const v8::HeapGraphNode* a1 = |
| 385 GetProperty(global1, v8::HeapGraphEdge::kProperty, "a"); | 385 GetProperty(global1, v8::HeapGraphEdge::kProperty, "a"); |
| 386 CHECK_NE(NULL, a1); | 386 CHECK_NE(NULL, a1); |
| 387 const v8::HeapGraphNode* e1 = | 387 const v8::HeapGraphNode* e1 = |
| 388 GetProperty(a1, v8::HeapGraphEdge::kHidden, "1"); | 388 GetProperty(a1, v8::HeapGraphEdge::kHidden, "1"); |
| 389 CHECK_NE(NULL, e1); | 389 CHECK_NE(NULL, e1); |
| 390 const v8::HeapGraphNode* k1 = | 390 const v8::HeapGraphNode* k1 = |
| 391 GetProperty(e1, v8::HeapGraphEdge::kInternal, "elements"); | 391 GetProperty(e1, v8::HeapGraphEdge::kInternal, "elements"); |
| 392 CHECK_NE(NULL, k1); | 392 CHECK_NE(NULL, k1); |
| 393 const v8::HeapGraphNode* a2 = | 393 const v8::HeapGraphNode* a2 = |
| 394 GetProperty(global2, v8::HeapGraphEdge::kProperty, "a"); | 394 GetProperty(global2, v8::HeapGraphEdge::kProperty, "a"); |
| 395 CHECK_NE(NULL, a2); | 395 CHECK_NE(NULL, a2); |
| 396 const v8::HeapGraphNode* e2 = | 396 const v8::HeapGraphNode* e2 = |
| 397 GetProperty(a2, v8::HeapGraphEdge::kHidden, "1"); | 397 GetProperty(a2, v8::HeapGraphEdge::kHidden, "1"); |
| 398 CHECK_NE(NULL, e2); | 398 CHECK_NE(NULL, e2); |
| 399 const v8::HeapGraphNode* k2 = | 399 const v8::HeapGraphNode* k2 = |
| 400 GetProperty(e2, v8::HeapGraphEdge::kInternal, "elements"); | 400 GetProperty(e2, v8::HeapGraphEdge::kInternal, "elements"); |
| 401 CHECK_NE(NULL, k2); | 401 CHECK_NE(NULL, k2); |
| 402 | 402 |
| 403 CHECK_EQ_UINT64_T(a1->GetId(), a2->GetId()); | 403 CHECK_EQ_SNAPSHOT_OBJECT_ID(a1->GetId(), a2->GetId()); |
| 404 CHECK_EQ_UINT64_T(e1->GetId(), e2->GetId()); | 404 CHECK_EQ_SNAPSHOT_OBJECT_ID(e1->GetId(), e2->GetId()); |
| 405 CHECK_EQ_UINT64_T(k1->GetId(), k2->GetId()); | 405 CHECK_EQ_SNAPSHOT_OBJECT_ID(k1->GetId(), k2->GetId()); |
| 406 } | 406 } |
| 407 | 407 |
| 408 TEST(HeapEntryIdsAndGC) { | 408 TEST(HeapEntryIdsAndGC) { |
| 409 v8::HandleScope scope; | 409 v8::HandleScope scope; |
| 410 LocalContext env; | 410 LocalContext env; |
| 411 | 411 |
| 412 CompileRun( | 412 CompileRun( |
| 413 "function A() {}\n" | 413 "function A() {}\n" |
| 414 "function B(x) { this.x = x; }\n" | 414 "function B(x) { this.x = x; }\n" |
| 415 "var a = new A();\n" | 415 "var a = new A();\n" |
| 416 "var b = new B(a);"); | 416 "var b = new B(a);"); |
| 417 const v8::HeapSnapshot* snapshot1 = | 417 const v8::HeapSnapshot* snapshot1 = |
| 418 v8::HeapProfiler::TakeSnapshot(v8_str("s1")); | 418 v8::HeapProfiler::TakeSnapshot(v8_str("s1")); |
| 419 | 419 |
| 420 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); | 420 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); |
| 421 | 421 |
| 422 const v8::HeapSnapshot* snapshot2 = | 422 const v8::HeapSnapshot* snapshot2 = |
| 423 v8::HeapProfiler::TakeSnapshot(v8_str("s2")); | 423 v8::HeapProfiler::TakeSnapshot(v8_str("s2")); |
| 424 | 424 |
| 425 const v8::HeapGraphNode* global1 = GetGlobalObject(snapshot1); | 425 const v8::HeapGraphNode* global1 = GetGlobalObject(snapshot1); |
| 426 const v8::HeapGraphNode* global2 = GetGlobalObject(snapshot2); | 426 const v8::HeapGraphNode* global2 = GetGlobalObject(snapshot2); |
| 427 CHECK_NE_UINT64_T(0, global1->GetId()); | 427 CHECK_NE_SNAPSHOT_OBJECT_ID(0, global1->GetId()); |
| 428 CHECK_EQ_UINT64_T(global1->GetId(), global2->GetId()); | 428 CHECK_EQ_SNAPSHOT_OBJECT_ID(global1->GetId(), global2->GetId()); |
| 429 const v8::HeapGraphNode* A1 = | 429 const v8::HeapGraphNode* A1 = |
| 430 GetProperty(global1, v8::HeapGraphEdge::kProperty, "A"); | 430 GetProperty(global1, v8::HeapGraphEdge::kProperty, "A"); |
| 431 CHECK_NE(NULL, A1); | 431 CHECK_NE(NULL, A1); |
| 432 const v8::HeapGraphNode* A2 = | 432 const v8::HeapGraphNode* A2 = |
| 433 GetProperty(global2, v8::HeapGraphEdge::kProperty, "A"); | 433 GetProperty(global2, v8::HeapGraphEdge::kProperty, "A"); |
| 434 CHECK_NE(NULL, A2); | 434 CHECK_NE(NULL, A2); |
| 435 CHECK_NE_UINT64_T(0, A1->GetId()); | 435 CHECK_NE_SNAPSHOT_OBJECT_ID(0, A1->GetId()); |
| 436 CHECK_EQ_UINT64_T(A1->GetId(), A2->GetId()); | 436 CHECK_EQ_SNAPSHOT_OBJECT_ID(A1->GetId(), A2->GetId()); |
| 437 const v8::HeapGraphNode* B1 = | 437 const v8::HeapGraphNode* B1 = |
| 438 GetProperty(global1, v8::HeapGraphEdge::kProperty, "B"); | 438 GetProperty(global1, v8::HeapGraphEdge::kProperty, "B"); |
| 439 CHECK_NE(NULL, B1); | 439 CHECK_NE(NULL, B1); |
| 440 const v8::HeapGraphNode* B2 = | 440 const v8::HeapGraphNode* B2 = |
| 441 GetProperty(global2, v8::HeapGraphEdge::kProperty, "B"); | 441 GetProperty(global2, v8::HeapGraphEdge::kProperty, "B"); |
| 442 CHECK_NE(NULL, B2); | 442 CHECK_NE(NULL, B2); |
| 443 CHECK_NE_UINT64_T(0, B1->GetId()); | 443 CHECK_NE_SNAPSHOT_OBJECT_ID(0, B1->GetId()); |
| 444 CHECK_EQ_UINT64_T(B1->GetId(), B2->GetId()); | 444 CHECK_EQ_SNAPSHOT_OBJECT_ID(B1->GetId(), B2->GetId()); |
| 445 const v8::HeapGraphNode* a1 = | 445 const v8::HeapGraphNode* a1 = |
| 446 GetProperty(global1, v8::HeapGraphEdge::kProperty, "a"); | 446 GetProperty(global1, v8::HeapGraphEdge::kProperty, "a"); |
| 447 CHECK_NE(NULL, a1); | 447 CHECK_NE(NULL, a1); |
| 448 const v8::HeapGraphNode* a2 = | 448 const v8::HeapGraphNode* a2 = |
| 449 GetProperty(global2, v8::HeapGraphEdge::kProperty, "a"); | 449 GetProperty(global2, v8::HeapGraphEdge::kProperty, "a"); |
| 450 CHECK_NE(NULL, a2); | 450 CHECK_NE(NULL, a2); |
| 451 CHECK_NE_UINT64_T(0, a1->GetId()); | 451 CHECK_NE_SNAPSHOT_OBJECT_ID(0, a1->GetId()); |
| 452 CHECK_EQ_UINT64_T(a1->GetId(), a2->GetId()); | 452 CHECK_EQ_SNAPSHOT_OBJECT_ID(a1->GetId(), a2->GetId()); |
| 453 const v8::HeapGraphNode* b1 = | 453 const v8::HeapGraphNode* b1 = |
| 454 GetProperty(global1, v8::HeapGraphEdge::kProperty, "b"); | 454 GetProperty(global1, v8::HeapGraphEdge::kProperty, "b"); |
| 455 CHECK_NE(NULL, b1); | 455 CHECK_NE(NULL, b1); |
| 456 const v8::HeapGraphNode* b2 = | 456 const v8::HeapGraphNode* b2 = |
| 457 GetProperty(global2, v8::HeapGraphEdge::kProperty, "b"); | 457 GetProperty(global2, v8::HeapGraphEdge::kProperty, "b"); |
| 458 CHECK_NE(NULL, b2); | 458 CHECK_NE(NULL, b2); |
| 459 CHECK_NE_UINT64_T(0, b1->GetId()); | 459 CHECK_NE_SNAPSHOT_OBJECT_ID(0, b1->GetId()); |
| 460 CHECK_EQ_UINT64_T(b1->GetId(), b2->GetId()); | 460 CHECK_EQ_SNAPSHOT_OBJECT_ID(b1->GetId(), b2->GetId()); |
| 461 } | 461 } |
| 462 | 462 |
| 463 | 463 |
| 464 TEST(HeapSnapshotRootPreservedAfterSorting) { | 464 TEST(HeapSnapshotRootPreservedAfterSorting) { |
| 465 v8::HandleScope scope; | 465 v8::HandleScope scope; |
| 466 LocalContext env; | 466 LocalContext env; |
| 467 const v8::HeapSnapshot* snapshot = | 467 const v8::HeapSnapshot* snapshot = |
| 468 v8::HeapProfiler::TakeSnapshot(v8_str("s")); | 468 v8::HeapProfiler::TakeSnapshot(v8_str("s")); |
| 469 const v8::HeapGraphNode* root1 = snapshot->GetRoot(); | 469 const v8::HeapGraphNode* root1 = snapshot->GetRoot(); |
| 470 const_cast<i::HeapSnapshot*>(reinterpret_cast<const i::HeapSnapshot*>( | 470 const_cast<i::HeapSnapshot*>(reinterpret_cast<const i::HeapSnapshot*>( |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 688 | 688 |
| 689 static void CheckChildrenIds(const v8::HeapSnapshot* snapshot, | 689 static void CheckChildrenIds(const v8::HeapSnapshot* snapshot, |
| 690 const v8::HeapGraphNode* node, | 690 const v8::HeapGraphNode* node, |
| 691 int level, int max_level) { | 691 int level, int max_level) { |
| 692 if (level > max_level) return; | 692 if (level > max_level) return; |
| 693 CHECK_EQ(node, snapshot->GetNodeById(node->GetId())); | 693 CHECK_EQ(node, snapshot->GetNodeById(node->GetId())); |
| 694 for (int i = 0, count = node->GetChildrenCount(); i < count; ++i) { | 694 for (int i = 0, count = node->GetChildrenCount(); i < count; ++i) { |
| 695 const v8::HeapGraphEdge* prop = node->GetChild(i); | 695 const v8::HeapGraphEdge* prop = node->GetChild(i); |
| 696 const v8::HeapGraphNode* child = | 696 const v8::HeapGraphNode* child = |
| 697 snapshot->GetNodeById(prop->GetToNode()->GetId()); | 697 snapshot->GetNodeById(prop->GetToNode()->GetId()); |
| 698 CHECK_EQ_UINT64_T(prop->GetToNode()->GetId(), child->GetId()); | 698 CHECK_EQ_SNAPSHOT_OBJECT_ID(prop->GetToNode()->GetId(), child->GetId()); |
| 699 CHECK_EQ(prop->GetToNode(), child); | 699 CHECK_EQ(prop->GetToNode(), child); |
| 700 CheckChildrenIds(snapshot, child, level + 1, max_level); | 700 CheckChildrenIds(snapshot, child, level + 1, max_level); |
| 701 } | 701 } |
| 702 } | 702 } |
| 703 | 703 |
| 704 | 704 |
| 705 TEST(HeapSnapshotGetNodeById) { | 705 TEST(HeapSnapshotGetNodeById) { |
| 706 v8::HandleScope scope; | 706 v8::HandleScope scope; |
| 707 LocalContext env; | 707 LocalContext env; |
| 708 | 708 |
| (...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1359 // Dipose the persistent handles in a different order. | 1359 // Dipose the persistent handles in a different order. |
| 1360 p_AAA.Dispose(); | 1360 p_AAA.Dispose(); |
| 1361 CHECK_EQ(global_handle_count + 2, | 1361 CHECK_EQ(global_handle_count + 2, |
| 1362 v8::HeapProfiler::GetPersistentHandleCount()); | 1362 v8::HeapProfiler::GetPersistentHandleCount()); |
| 1363 p_CCC.Dispose(); | 1363 p_CCC.Dispose(); |
| 1364 CHECK_EQ(global_handle_count + 1, | 1364 CHECK_EQ(global_handle_count + 1, |
| 1365 v8::HeapProfiler::GetPersistentHandleCount()); | 1365 v8::HeapProfiler::GetPersistentHandleCount()); |
| 1366 p_BBB.Dispose(); | 1366 p_BBB.Dispose(); |
| 1367 CHECK_EQ(global_handle_count, v8::HeapProfiler::GetPersistentHandleCount()); | 1367 CHECK_EQ(global_handle_count, v8::HeapProfiler::GetPersistentHandleCount()); |
| 1368 } | 1368 } |
| OLD | NEW |