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 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 |
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) \ |
mnaganov (inactive)
2012/03/26 10:46:26
Have you considered simply using CHECK_EQ? I intro
| |
351 CHECK_EQ(static_cast<int64_t>(a), static_cast<int64_t>(b)) | 351 CHECK_EQ(static_cast<int64_t>(a), static_cast<int64_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 |