| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/assert.h" | 5 #include "platform/assert.h" |
| 6 | 6 |
| 7 #include "vm/dart_api_impl.h" | 7 #include "vm/dart_api_impl.h" |
| 8 #include "vm/dart_api_state.h" | 8 #include "vm/dart_api_state.h" |
| 9 #include "vm/globals.h" | 9 #include "vm/globals.h" |
| 10 #include "vm/profiler.h" | 10 #include "vm/profiler.h" |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 allocation_extent_micros); | 274 allocation_extent_micros); |
| 275 profile.Build(thread, &filter, Profile::kNoTags); | 275 profile.Build(thread, &filter, Profile::kNoTags); |
| 276 // We should have 1 allocation sample. | 276 // We should have 1 allocation sample. |
| 277 EXPECT_EQ(1, profile.sample_count()); | 277 EXPECT_EQ(1, profile.sample_count()); |
| 278 ProfileTrieWalker walker(&profile); | 278 ProfileTrieWalker walker(&profile); |
| 279 | 279 |
| 280 // Exclusive code: B.boo -> main. | 280 // Exclusive code: B.boo -> main. |
| 281 walker.Reset(Profile::kExclusiveCode); | 281 walker.Reset(Profile::kExclusiveCode); |
| 282 // Move down from the root. | 282 // Move down from the root. |
| 283 EXPECT(walker.Down()); | 283 EXPECT(walker.Down()); |
| 284 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 285 EXPECT(walker.Down()); |
| 284 EXPECT_STREQ("B.boo", walker.CurrentName()); | 286 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 285 EXPECT(walker.Down()); | 287 EXPECT(walker.Down()); |
| 286 EXPECT_STREQ("main", walker.CurrentName()); | 288 EXPECT_STREQ("main", walker.CurrentName()); |
| 287 EXPECT(!walker.Down()); | 289 EXPECT(!walker.Down()); |
| 288 | 290 |
| 289 // Inclusive code: main -> B.boo. | 291 // Inclusive code: main -> B.boo. |
| 290 walker.Reset(Profile::kInclusiveCode); | 292 walker.Reset(Profile::kInclusiveCode); |
| 291 // Move down from the root. | 293 // Move down from the root. |
| 292 EXPECT(walker.Down()); | 294 EXPECT(walker.Down()); |
| 293 EXPECT_STREQ("main", walker.CurrentName()); | 295 EXPECT_STREQ("main", walker.CurrentName()); |
| 294 EXPECT(walker.Down()); | 296 EXPECT(walker.Down()); |
| 295 EXPECT_STREQ("B.boo", walker.CurrentName()); | 297 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 298 EXPECT(walker.Down()); |
| 299 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 296 EXPECT(!walker.Down()); | 300 EXPECT(!walker.Down()); |
| 297 | 301 |
| 298 // Exclusive function: B.boo -> main. | 302 // Exclusive function: B.boo -> main. |
| 299 walker.Reset(Profile::kExclusiveFunction); | 303 walker.Reset(Profile::kExclusiveFunction); |
| 300 // Move down from the root. | 304 // Move down from the root. |
| 301 EXPECT(walker.Down()); | 305 EXPECT(walker.Down()); |
| 306 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 307 EXPECT(walker.Down()); |
| 302 EXPECT_STREQ("B.boo", walker.CurrentName()); | 308 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 303 EXPECT(walker.Down()); | 309 EXPECT(walker.Down()); |
| 304 EXPECT_STREQ("main", walker.CurrentName()); | 310 EXPECT_STREQ("main", walker.CurrentName()); |
| 305 EXPECT(!walker.Down()); | 311 EXPECT(!walker.Down()); |
| 306 | 312 |
| 307 // Inclusive function: main -> B.boo. | 313 // Inclusive function: main -> B.boo. |
| 308 walker.Reset(Profile::kInclusiveFunction); | 314 walker.Reset(Profile::kInclusiveFunction); |
| 309 // Move down from the root. | 315 // Move down from the root. |
| 310 EXPECT(walker.Down()); | 316 EXPECT(walker.Down()); |
| 311 EXPECT_STREQ("main", walker.CurrentName()); | 317 EXPECT_STREQ("main", walker.CurrentName()); |
| 312 EXPECT(walker.Down()); | 318 EXPECT(walker.Down()); |
| 313 EXPECT_STREQ("B.boo", walker.CurrentName()); | 319 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 320 EXPECT(walker.Down()); |
| 321 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 314 EXPECT(!walker.Down()); | 322 EXPECT(!walker.Down()); |
| 315 } | 323 } |
| 316 | 324 |
| 317 // Query with a time filter where no allocations occurred. | 325 // Query with a time filter where no allocations occurred. |
| 318 { | 326 { |
| 319 Thread* thread = Thread::Current(); | 327 Thread* thread = Thread::Current(); |
| 320 Isolate* isolate = thread->isolate(); | 328 Isolate* isolate = thread->isolate(); |
| 321 StackZone zone(thread); | 329 StackZone zone(thread); |
| 322 HANDLESCOPE(thread); | 330 HANDLESCOPE(thread); |
| 323 Profile profile(isolate); | 331 Profile profile(isolate); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 388 AllocationFilter filter(isolate, class_a.id()); | 396 AllocationFilter filter(isolate, class_a.id()); |
| 389 profile.Build(thread, &filter, Profile::kNoTags); | 397 profile.Build(thread, &filter, Profile::kNoTags); |
| 390 // We should have one allocation sample. | 398 // We should have one allocation sample. |
| 391 EXPECT_EQ(1, profile.sample_count()); | 399 EXPECT_EQ(1, profile.sample_count()); |
| 392 ProfileTrieWalker walker(&profile); | 400 ProfileTrieWalker walker(&profile); |
| 393 | 401 |
| 394 // Exclusive code: B.boo -> main. | 402 // Exclusive code: B.boo -> main. |
| 395 walker.Reset(Profile::kExclusiveCode); | 403 walker.Reset(Profile::kExclusiveCode); |
| 396 // Move down from the root. | 404 // Move down from the root. |
| 397 EXPECT(walker.Down()); | 405 EXPECT(walker.Down()); |
| 406 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 407 EXPECT(walker.Down()); |
| 398 EXPECT_STREQ("B.boo", walker.CurrentName()); | 408 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 399 EXPECT(walker.Down()); | 409 EXPECT(walker.Down()); |
| 400 EXPECT_STREQ("main", walker.CurrentName()); | 410 EXPECT_STREQ("main", walker.CurrentName()); |
| 401 EXPECT(!walker.Down()); | 411 EXPECT(!walker.Down()); |
| 402 | 412 |
| 403 // Inclusive code: main -> B.boo. | 413 // Inclusive code: main -> B.boo. |
| 404 walker.Reset(Profile::kInclusiveCode); | 414 walker.Reset(Profile::kInclusiveCode); |
| 405 // Move down from the root. | 415 // Move down from the root. |
| 406 EXPECT(walker.Down()); | 416 EXPECT(walker.Down()); |
| 407 EXPECT_STREQ("main", walker.CurrentName()); | 417 EXPECT_STREQ("main", walker.CurrentName()); |
| 408 EXPECT(walker.Down()); | 418 EXPECT(walker.Down()); |
| 409 EXPECT_STREQ("B.boo", walker.CurrentName()); | 419 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 420 EXPECT(walker.Down()); |
| 421 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 410 EXPECT(!walker.Down()); | 422 EXPECT(!walker.Down()); |
| 411 | 423 |
| 412 // Exclusive function: boo -> main. | 424 // Exclusive function: boo -> main. |
| 413 walker.Reset(Profile::kExclusiveFunction); | 425 walker.Reset(Profile::kExclusiveFunction); |
| 414 // Move down from the root. | 426 // Move down from the root. |
| 415 EXPECT(walker.Down()); | 427 EXPECT(walker.Down()); |
| 428 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 429 EXPECT(walker.Down()); |
| 416 EXPECT_STREQ("B.boo", walker.CurrentName()); | 430 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 417 EXPECT(walker.Down()); | 431 EXPECT(walker.Down()); |
| 418 EXPECT_STREQ("main", walker.CurrentName()); | 432 EXPECT_STREQ("main", walker.CurrentName()); |
| 419 EXPECT(!walker.Down()); | 433 EXPECT(!walker.Down()); |
| 420 | 434 |
| 421 // Inclusive function: main -> boo. | 435 // Inclusive function: main -> boo. |
| 422 walker.Reset(Profile::kInclusiveFunction); | 436 walker.Reset(Profile::kInclusiveFunction); |
| 423 // Move down from the root. | 437 // Move down from the root. |
| 424 EXPECT(walker.Down()); | 438 EXPECT(walker.Down()); |
| 425 EXPECT_STREQ("main", walker.CurrentName()); | 439 EXPECT_STREQ("main", walker.CurrentName()); |
| 426 EXPECT(walker.Down()); | 440 EXPECT(walker.Down()); |
| 427 EXPECT_STREQ("B.boo", walker.CurrentName()); | 441 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 442 EXPECT(walker.Down()); |
| 443 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 428 EXPECT(!walker.Down()); | 444 EXPECT(!walker.Down()); |
| 429 } | 445 } |
| 430 | 446 |
| 431 // Turn off allocation tracing for A. | 447 // Turn off allocation tracing for A. |
| 432 class_a.SetTraceAllocation(false); | 448 class_a.SetTraceAllocation(false); |
| 433 | 449 |
| 434 result = Dart_Invoke(lib, NewString("main"), 0, NULL); | 450 result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
| 435 EXPECT_VALID(result); | 451 EXPECT_VALID(result); |
| 436 | 452 |
| 437 { | 453 { |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 507 AllocationFilter filter(isolate, class_a.id()); | 523 AllocationFilter filter(isolate, class_a.id()); |
| 508 profile.Build(thread, &filter, Profile::kNoTags); | 524 profile.Build(thread, &filter, Profile::kNoTags); |
| 509 // We should have three allocation samples. | 525 // We should have three allocation samples. |
| 510 EXPECT_EQ(3, profile.sample_count()); | 526 EXPECT_EQ(3, profile.sample_count()); |
| 511 ProfileTrieWalker walker(&profile); | 527 ProfileTrieWalker walker(&profile); |
| 512 | 528 |
| 513 // Exclusive code: B.boo -> main. | 529 // Exclusive code: B.boo -> main. |
| 514 walker.Reset(Profile::kExclusiveCode); | 530 walker.Reset(Profile::kExclusiveCode); |
| 515 // Move down from the root. | 531 // Move down from the root. |
| 516 EXPECT(walker.Down()); | 532 EXPECT(walker.Down()); |
| 533 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 534 EXPECT(walker.Down()); |
| 517 EXPECT_STREQ("B.boo", walker.CurrentName()); | 535 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 518 EXPECT_EQ(3, walker.CurrentNodeTickCount()); | 536 EXPECT_EQ(3, walker.CurrentNodeTickCount()); |
| 519 EXPECT_EQ(3, walker.CurrentInclusiveTicks()); | 537 EXPECT_EQ(3, walker.CurrentInclusiveTicks()); |
| 520 EXPECT_EQ(3, walker.CurrentExclusiveTicks()); | 538 EXPECT_EQ(3, walker.CurrentExclusiveTicks()); |
| 521 EXPECT(walker.Down()); | 539 EXPECT(walker.Down()); |
| 522 EXPECT_STREQ("main", walker.CurrentName()); | 540 EXPECT_STREQ("main", walker.CurrentName()); |
| 523 EXPECT_EQ(3, walker.CurrentNodeTickCount()); | 541 EXPECT_EQ(3, walker.CurrentNodeTickCount()); |
| 524 EXPECT_EQ(3, walker.CurrentInclusiveTicks()); | 542 EXPECT_EQ(3, walker.CurrentInclusiveTicks()); |
| 525 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); | 543 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); |
| 526 EXPECT(!walker.Down()); | 544 EXPECT(!walker.Down()); |
| 527 | 545 |
| 528 // Inclusive code: main -> B.boo. | 546 // Inclusive code: main -> B.boo. |
| 529 walker.Reset(Profile::kInclusiveCode); | 547 walker.Reset(Profile::kInclusiveCode); |
| 530 // Move down from the root. | 548 // Move down from the root. |
| 531 EXPECT(walker.Down()); | 549 EXPECT(walker.Down()); |
| 532 EXPECT_STREQ("main", walker.CurrentName()); | 550 EXPECT_STREQ("main", walker.CurrentName()); |
| 533 EXPECT_EQ(3, walker.CurrentNodeTickCount()); | 551 EXPECT_EQ(3, walker.CurrentNodeTickCount()); |
| 534 EXPECT_EQ(3, walker.CurrentInclusiveTicks()); | 552 EXPECT_EQ(3, walker.CurrentInclusiveTicks()); |
| 535 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); | 553 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); |
| 536 EXPECT(walker.Down()); | 554 EXPECT(walker.Down()); |
| 537 EXPECT_STREQ("B.boo", walker.CurrentName()); | 555 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 538 EXPECT_EQ(3, walker.CurrentNodeTickCount()); | 556 EXPECT_EQ(3, walker.CurrentNodeTickCount()); |
| 539 EXPECT_EQ(3, walker.CurrentInclusiveTicks()); | 557 EXPECT_EQ(3, walker.CurrentInclusiveTicks()); |
| 540 EXPECT_EQ(3, walker.CurrentExclusiveTicks()); | 558 EXPECT_EQ(3, walker.CurrentExclusiveTicks()); |
| 559 EXPECT(walker.Down()); |
| 560 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 541 EXPECT(!walker.Down()); | 561 EXPECT(!walker.Down()); |
| 542 } | 562 } |
| 543 } | 563 } |
| 544 | 564 |
| 545 | 565 |
| 546 TEST_CASE(Profiler_FunctionTicks) { | 566 TEST_CASE(Profiler_FunctionTicks) { |
| 547 DisableNativeProfileScope dnps; | 567 DisableNativeProfileScope dnps; |
| 548 const char* kScript = | 568 const char* kScript = |
| 549 "class A {\n" | 569 "class A {\n" |
| 550 " var a;\n" | 570 " var a;\n" |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 602 AllocationFilter filter(isolate, class_a.id()); | 622 AllocationFilter filter(isolate, class_a.id()); |
| 603 profile.Build(thread, &filter, Profile::kNoTags); | 623 profile.Build(thread, &filter, Profile::kNoTags); |
| 604 // We should have three allocation samples. | 624 // We should have three allocation samples. |
| 605 EXPECT_EQ(3, profile.sample_count()); | 625 EXPECT_EQ(3, profile.sample_count()); |
| 606 ProfileTrieWalker walker(&profile); | 626 ProfileTrieWalker walker(&profile); |
| 607 | 627 |
| 608 // Exclusive function: B.boo -> main. | 628 // Exclusive function: B.boo -> main. |
| 609 walker.Reset(Profile::kExclusiveFunction); | 629 walker.Reset(Profile::kExclusiveFunction); |
| 610 // Move down from the root. | 630 // Move down from the root. |
| 611 EXPECT(walker.Down()); | 631 EXPECT(walker.Down()); |
| 632 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 633 EXPECT(walker.Down()); |
| 612 EXPECT_STREQ("B.boo", walker.CurrentName()); | 634 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 613 EXPECT_EQ(3, walker.CurrentNodeTickCount()); | 635 EXPECT_EQ(3, walker.CurrentNodeTickCount()); |
| 614 EXPECT_EQ(3, walker.CurrentInclusiveTicks()); | 636 EXPECT_EQ(3, walker.CurrentInclusiveTicks()); |
| 615 EXPECT_EQ(3, walker.CurrentExclusiveTicks()); | 637 EXPECT_EQ(3, walker.CurrentExclusiveTicks()); |
| 616 EXPECT(walker.Down()); | 638 EXPECT(walker.Down()); |
| 617 EXPECT_STREQ("main", walker.CurrentName()); | 639 EXPECT_STREQ("main", walker.CurrentName()); |
| 618 EXPECT_EQ(3, walker.CurrentNodeTickCount()); | 640 EXPECT_EQ(3, walker.CurrentNodeTickCount()); |
| 619 EXPECT_EQ(3, walker.CurrentInclusiveTicks()); | 641 EXPECT_EQ(3, walker.CurrentInclusiveTicks()); |
| 620 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); | 642 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); |
| 621 EXPECT(!walker.Down()); | 643 EXPECT(!walker.Down()); |
| 622 | 644 |
| 623 // Inclusive function: main -> B.boo. | 645 // Inclusive function: main -> B.boo. |
| 624 walker.Reset(Profile::kInclusiveFunction); | 646 walker.Reset(Profile::kInclusiveFunction); |
| 625 // Move down from the root. | 647 // Move down from the root. |
| 626 EXPECT(walker.Down()); | 648 EXPECT(walker.Down()); |
| 627 EXPECT_STREQ("main", walker.CurrentName()); | 649 EXPECT_STREQ("main", walker.CurrentName()); |
| 628 EXPECT_EQ(3, walker.CurrentNodeTickCount()); | 650 EXPECT_EQ(3, walker.CurrentNodeTickCount()); |
| 629 EXPECT_EQ(3, walker.CurrentInclusiveTicks()); | 651 EXPECT_EQ(3, walker.CurrentInclusiveTicks()); |
| 630 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); | 652 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); |
| 631 EXPECT(walker.Down()); | 653 EXPECT(walker.Down()); |
| 632 EXPECT_STREQ("B.boo", walker.CurrentName()); | 654 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 633 EXPECT_EQ(3, walker.CurrentNodeTickCount()); | 655 EXPECT_EQ(3, walker.CurrentNodeTickCount()); |
| 634 EXPECT_EQ(3, walker.CurrentInclusiveTicks()); | 656 EXPECT_EQ(3, walker.CurrentInclusiveTicks()); |
| 635 EXPECT_EQ(3, walker.CurrentExclusiveTicks()); | 657 EXPECT_EQ(3, walker.CurrentExclusiveTicks()); |
| 658 EXPECT(walker.Down()); |
| 659 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 636 EXPECT(!walker.Down()); | 660 EXPECT(!walker.Down()); |
| 637 } | 661 } |
| 638 } | 662 } |
| 639 | 663 |
| 640 | 664 |
| 641 TEST_CASE(Profiler_IntrinsicAllocation) { | 665 TEST_CASE(Profiler_IntrinsicAllocation) { |
| 642 DisableNativeProfileScope dnps; | 666 DisableNativeProfileScope dnps; |
| 643 const char* kScript = "double foo(double a, double b) => a + b;"; | 667 const char* kScript = "double foo(double a, double b) => a + b;"; |
| 644 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 668 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
| 645 EXPECT_VALID(lib); | 669 EXPECT_VALID(lib); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 675 HANDLESCOPE(thread); | 699 HANDLESCOPE(thread); |
| 676 Profile profile(isolate); | 700 Profile profile(isolate); |
| 677 AllocationFilter filter(isolate, double_class.id()); | 701 AllocationFilter filter(isolate, double_class.id()); |
| 678 profile.Build(thread, &filter, Profile::kNoTags); | 702 profile.Build(thread, &filter, Profile::kNoTags); |
| 679 // We should have one allocation sample. | 703 // We should have one allocation sample. |
| 680 EXPECT_EQ(1, profile.sample_count()); | 704 EXPECT_EQ(1, profile.sample_count()); |
| 681 ProfileTrieWalker walker(&profile); | 705 ProfileTrieWalker walker(&profile); |
| 682 | 706 |
| 683 walker.Reset(Profile::kExclusiveCode); | 707 walker.Reset(Profile::kExclusiveCode); |
| 684 EXPECT(walker.Down()); | 708 EXPECT(walker.Down()); |
| 709 EXPECT_STREQ("Double_add", walker.CurrentName()); |
| 710 EXPECT(walker.Down()); |
| 685 EXPECT_STREQ("_Double._add", walker.CurrentName()); | 711 EXPECT_STREQ("_Double._add", walker.CurrentName()); |
| 686 EXPECT(walker.Down()); | 712 EXPECT(walker.Down()); |
| 687 EXPECT_STREQ("_Double.+", walker.CurrentName()); | 713 EXPECT_STREQ("_Double.+", walker.CurrentName()); |
| 688 EXPECT(walker.Down()); | 714 EXPECT(walker.Down()); |
| 689 EXPECT_STREQ("foo", walker.CurrentName()); | 715 EXPECT_STREQ("foo", walker.CurrentName()); |
| 690 EXPECT(!walker.Down()); | 716 EXPECT(!walker.Down()); |
| 691 } | 717 } |
| 692 | 718 |
| 693 double_class.SetTraceAllocation(false); | 719 double_class.SetTraceAllocation(false); |
| 694 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 720 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 743 HANDLESCOPE(thread); | 769 HANDLESCOPE(thread); |
| 744 Profile profile(isolate); | 770 Profile profile(isolate); |
| 745 AllocationFilter filter(isolate, array_class.id()); | 771 AllocationFilter filter(isolate, array_class.id()); |
| 746 profile.Build(thread, &filter, Profile::kNoTags); | 772 profile.Build(thread, &filter, Profile::kNoTags); |
| 747 // We should have one allocation sample. | 773 // We should have one allocation sample. |
| 748 EXPECT_EQ(1, profile.sample_count()); | 774 EXPECT_EQ(1, profile.sample_count()); |
| 749 ProfileTrieWalker walker(&profile); | 775 ProfileTrieWalker walker(&profile); |
| 750 | 776 |
| 751 walker.Reset(Profile::kExclusiveCode); | 777 walker.Reset(Profile::kExclusiveCode); |
| 752 EXPECT(walker.Down()); | 778 EXPECT(walker.Down()); |
| 779 EXPECT_STREQ("DRT_AllocateArray", walker.CurrentName()); |
| 780 EXPECT(walker.Down()); |
| 753 EXPECT_STREQ("_List._List", walker.CurrentName()); | 781 EXPECT_STREQ("_List._List", walker.CurrentName()); |
| 754 EXPECT(walker.Down()); | 782 EXPECT(walker.Down()); |
| 755 EXPECT_STREQ("List.List", walker.CurrentName()); | 783 EXPECT_STREQ("List.List", walker.CurrentName()); |
| 756 EXPECT(walker.Down()); | 784 EXPECT(walker.Down()); |
| 757 EXPECT_STREQ("foo", walker.CurrentName()); | 785 EXPECT_STREQ("foo", walker.CurrentName()); |
| 758 EXPECT(!walker.Down()); | 786 EXPECT(!walker.Down()); |
| 759 } | 787 } |
| 760 | 788 |
| 761 array_class.SetTraceAllocation(false); | 789 array_class.SetTraceAllocation(false); |
| 762 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 790 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 791 HANDLESCOPE(thread); | 819 HANDLESCOPE(thread); |
| 792 Profile profile(isolate); | 820 Profile profile(isolate); |
| 793 AllocationFilter filter(isolate, array_class.id()); | 821 AllocationFilter filter(isolate, array_class.id()); |
| 794 profile.Build(thread, &filter, Profile::kNoTags); | 822 profile.Build(thread, &filter, Profile::kNoTags); |
| 795 // We should still only have one allocation sample. | 823 // We should still only have one allocation sample. |
| 796 EXPECT_EQ(1, profile.sample_count()); | 824 EXPECT_EQ(1, profile.sample_count()); |
| 797 ProfileTrieWalker walker(&profile); | 825 ProfileTrieWalker walker(&profile); |
| 798 | 826 |
| 799 walker.Reset(Profile::kExclusiveCode); | 827 walker.Reset(Profile::kExclusiveCode); |
| 800 EXPECT(walker.Down()); | 828 EXPECT(walker.Down()); |
| 829 EXPECT_STREQ("DRT_AllocateArray", walker.CurrentName()); |
| 830 EXPECT(walker.Down()); |
| 801 EXPECT_STREQ("_List._List", walker.CurrentName()); | 831 EXPECT_STREQ("_List._List", walker.CurrentName()); |
| 802 EXPECT(walker.Down()); | 832 EXPECT(walker.Down()); |
| 803 EXPECT_STREQ("_GrowableList._GrowableList", walker.CurrentName()); | 833 EXPECT_STREQ("_GrowableList._GrowableList", walker.CurrentName()); |
| 804 EXPECT(walker.Down()); | 834 EXPECT(walker.Down()); |
| 805 EXPECT_STREQ("List.List", walker.CurrentName()); | 835 EXPECT_STREQ("List.List", walker.CurrentName()); |
| 806 EXPECT(walker.Down()); | 836 EXPECT(walker.Down()); |
| 807 EXPECT_STREQ("bar", walker.CurrentName()); | 837 EXPECT_STREQ("bar", walker.CurrentName()); |
| 808 EXPECT(!walker.Down()); | 838 EXPECT(!walker.Down()); |
| 809 } | 839 } |
| 810 } | 840 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 850 HANDLESCOPE(thread); | 880 HANDLESCOPE(thread); |
| 851 Profile profile(isolate); | 881 Profile profile(isolate); |
| 852 AllocationFilter filter(isolate, context_class.id()); | 882 AllocationFilter filter(isolate, context_class.id()); |
| 853 profile.Build(thread, &filter, Profile::kNoTags); | 883 profile.Build(thread, &filter, Profile::kNoTags); |
| 854 // We should have one allocation sample. | 884 // We should have one allocation sample. |
| 855 EXPECT_EQ(1, profile.sample_count()); | 885 EXPECT_EQ(1, profile.sample_count()); |
| 856 ProfileTrieWalker walker(&profile); | 886 ProfileTrieWalker walker(&profile); |
| 857 | 887 |
| 858 walker.Reset(Profile::kExclusiveCode); | 888 walker.Reset(Profile::kExclusiveCode); |
| 859 EXPECT(walker.Down()); | 889 EXPECT(walker.Down()); |
| 890 EXPECT_STREQ("DRT_AllocateContext", walker.CurrentName()); |
| 891 EXPECT(walker.Down()); |
| 860 EXPECT_STREQ("foo", walker.CurrentName()); | 892 EXPECT_STREQ("foo", walker.CurrentName()); |
| 861 EXPECT(!walker.Down()); | 893 EXPECT(!walker.Down()); |
| 862 } | 894 } |
| 863 | 895 |
| 864 context_class.SetTraceAllocation(false); | 896 context_class.SetTraceAllocation(false); |
| 865 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 897 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
| 866 EXPECT_VALID(result); | 898 EXPECT_VALID(result); |
| 867 | 899 |
| 868 { | 900 { |
| 869 StackZone zone(thread); | 901 StackZone zone(thread); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 914 Profile profile(isolate); | 946 Profile profile(isolate); |
| 915 AllocationFilter filter(isolate, closure_class.id()); | 947 AllocationFilter filter(isolate, closure_class.id()); |
| 916 filter.set_enable_vm_ticks(true); | 948 filter.set_enable_vm_ticks(true); |
| 917 profile.Build(thread, &filter, Profile::kNoTags); | 949 profile.Build(thread, &filter, Profile::kNoTags); |
| 918 // We should have one allocation sample. | 950 // We should have one allocation sample. |
| 919 EXPECT_EQ(1, profile.sample_count()); | 951 EXPECT_EQ(1, profile.sample_count()); |
| 920 ProfileTrieWalker walker(&profile); | 952 ProfileTrieWalker walker(&profile); |
| 921 | 953 |
| 922 walker.Reset(Profile::kExclusiveCode); | 954 walker.Reset(Profile::kExclusiveCode); |
| 923 EXPECT(walker.Down()); | 955 EXPECT(walker.Down()); |
| 956 EXPECT_SUBSTRING("DRT_AllocateObject", walker.CurrentName()); |
| 957 EXPECT(walker.Down()); |
| 924 EXPECT_SUBSTRING("foo", walker.CurrentName()); | 958 EXPECT_SUBSTRING("foo", walker.CurrentName()); |
| 925 EXPECT(!walker.Down()); | 959 EXPECT(!walker.Down()); |
| 926 } | 960 } |
| 927 | 961 |
| 928 // Disable allocation tracing for Closure. | 962 // Disable allocation tracing for Closure. |
| 929 closure_class.SetTraceAllocation(false); | 963 closure_class.SetTraceAllocation(false); |
| 930 | 964 |
| 931 // Invoke "bar" which during compilation, triggers a closure allocation. | 965 // Invoke "bar" which during compilation, triggers a closure allocation. |
| 932 result = Dart_Invoke(lib, NewString("bar"), 0, NULL); | 966 result = Dart_Invoke(lib, NewString("bar"), 0, NULL); |
| 933 EXPECT_VALID(result); | 967 EXPECT_VALID(result); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 985 HANDLESCOPE(thread); | 1019 HANDLESCOPE(thread); |
| 986 Profile profile(isolate); | 1020 Profile profile(isolate); |
| 987 AllocationFilter filter(isolate, float32_list_class.id()); | 1021 AllocationFilter filter(isolate, float32_list_class.id()); |
| 988 profile.Build(thread, &filter, Profile::kNoTags); | 1022 profile.Build(thread, &filter, Profile::kNoTags); |
| 989 // We should have one allocation sample. | 1023 // We should have one allocation sample. |
| 990 EXPECT_EQ(1, profile.sample_count()); | 1024 EXPECT_EQ(1, profile.sample_count()); |
| 991 ProfileTrieWalker walker(&profile); | 1025 ProfileTrieWalker walker(&profile); |
| 992 | 1026 |
| 993 walker.Reset(Profile::kExclusiveCode); | 1027 walker.Reset(Profile::kExclusiveCode); |
| 994 EXPECT(walker.Down()); | 1028 EXPECT(walker.Down()); |
| 1029 EXPECT_STREQ("TypedData_Float32Array_new", walker.CurrentName()); |
| 1030 EXPECT(walker.Down()); |
| 995 EXPECT_STREQ("Float32List.Float32List", walker.CurrentName()); | 1031 EXPECT_STREQ("Float32List.Float32List", walker.CurrentName()); |
| 996 EXPECT(walker.Down()); | 1032 EXPECT(walker.Down()); |
| 997 EXPECT_STREQ("foo", walker.CurrentName()); | 1033 EXPECT_STREQ("foo", walker.CurrentName()); |
| 998 EXPECT(!walker.Down()); | 1034 EXPECT(!walker.Down()); |
| 999 } | 1035 } |
| 1000 | 1036 |
| 1001 float32_list_class.SetTraceAllocation(false); | 1037 float32_list_class.SetTraceAllocation(false); |
| 1002 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 1038 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
| 1003 EXPECT_VALID(result); | 1039 EXPECT_VALID(result); |
| 1004 | 1040 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1065 HANDLESCOPE(thread); | 1101 HANDLESCOPE(thread); |
| 1066 Profile profile(isolate); | 1102 Profile profile(isolate); |
| 1067 AllocationFilter filter(isolate, one_byte_string_class.id()); | 1103 AllocationFilter filter(isolate, one_byte_string_class.id()); |
| 1068 profile.Build(thread, &filter, Profile::kNoTags); | 1104 profile.Build(thread, &filter, Profile::kNoTags); |
| 1069 // We should still only have one allocation sample. | 1105 // We should still only have one allocation sample. |
| 1070 EXPECT_EQ(1, profile.sample_count()); | 1106 EXPECT_EQ(1, profile.sample_count()); |
| 1071 ProfileTrieWalker walker(&profile); | 1107 ProfileTrieWalker walker(&profile); |
| 1072 | 1108 |
| 1073 walker.Reset(Profile::kExclusiveCode); | 1109 walker.Reset(Profile::kExclusiveCode); |
| 1074 EXPECT(walker.Down()); | 1110 EXPECT(walker.Down()); |
| 1111 EXPECT_STREQ("String_concat", walker.CurrentName()); |
| 1112 EXPECT(walker.Down()); |
| 1075 EXPECT_STREQ("_StringBase.+", walker.CurrentName()); | 1113 EXPECT_STREQ("_StringBase.+", walker.CurrentName()); |
| 1076 EXPECT(walker.Down()); | 1114 EXPECT(walker.Down()); |
| 1077 EXPECT_STREQ("foo", walker.CurrentName()); | 1115 EXPECT_STREQ("foo", walker.CurrentName()); |
| 1078 EXPECT(!walker.Down()); | 1116 EXPECT(!walker.Down()); |
| 1079 } | 1117 } |
| 1080 | 1118 |
| 1081 one_byte_string_class.SetTraceAllocation(false); | 1119 one_byte_string_class.SetTraceAllocation(false); |
| 1082 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 1120 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
| 1083 EXPECT_VALID(result); | 1121 EXPECT_VALID(result); |
| 1084 | 1122 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1146 HANDLESCOPE(thread); | 1184 HANDLESCOPE(thread); |
| 1147 Profile profile(isolate); | 1185 Profile profile(isolate); |
| 1148 AllocationFilter filter(isolate, one_byte_string_class.id()); | 1186 AllocationFilter filter(isolate, one_byte_string_class.id()); |
| 1149 profile.Build(thread, &filter, Profile::kNoTags); | 1187 profile.Build(thread, &filter, Profile::kNoTags); |
| 1150 // We should still only have one allocation sample. | 1188 // We should still only have one allocation sample. |
| 1151 EXPECT_EQ(1, profile.sample_count()); | 1189 EXPECT_EQ(1, profile.sample_count()); |
| 1152 ProfileTrieWalker walker(&profile); | 1190 ProfileTrieWalker walker(&profile); |
| 1153 | 1191 |
| 1154 walker.Reset(Profile::kExclusiveCode); | 1192 walker.Reset(Profile::kExclusiveCode); |
| 1155 EXPECT(walker.Down()); | 1193 EXPECT(walker.Down()); |
| 1194 EXPECT_STREQ("OneByteString_allocate", walker.CurrentName()); |
| 1195 EXPECT(walker.Down()); |
| 1156 EXPECT_STREQ("_OneByteString._allocate", walker.CurrentName()); | 1196 EXPECT_STREQ("_OneByteString._allocate", walker.CurrentName()); |
| 1157 EXPECT(walker.Down()); | 1197 EXPECT(walker.Down()); |
| 1158 EXPECT_STREQ("_OneByteString._concatAll", walker.CurrentName()); | 1198 EXPECT_STREQ("_OneByteString._concatAll", walker.CurrentName()); |
| 1159 EXPECT(walker.Down()); | 1199 EXPECT(walker.Down()); |
| 1160 EXPECT_STREQ("_StringBase._interpolate", walker.CurrentName()); | 1200 EXPECT_STREQ("_StringBase._interpolate", walker.CurrentName()); |
| 1161 EXPECT(walker.Down()); | 1201 EXPECT(walker.Down()); |
| 1162 EXPECT_STREQ("foo", walker.CurrentName()); | 1202 EXPECT_STREQ("foo", walker.CurrentName()); |
| 1163 EXPECT(!walker.Down()); | 1203 EXPECT(!walker.Down()); |
| 1164 } | 1204 } |
| 1165 | 1205 |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1265 HANDLESCOPE(thread); | 1305 HANDLESCOPE(thread); |
| 1266 Profile profile(isolate); | 1306 Profile profile(isolate); |
| 1267 AllocationFilter filter(isolate, class_a.id()); | 1307 AllocationFilter filter(isolate, class_a.id()); |
| 1268 profile.Build(thread, &filter, Profile::kNoTags); | 1308 profile.Build(thread, &filter, Profile::kNoTags); |
| 1269 // We should have 50,000 allocation samples. | 1309 // We should have 50,000 allocation samples. |
| 1270 EXPECT_EQ(50000, profile.sample_count()); | 1310 EXPECT_EQ(50000, profile.sample_count()); |
| 1271 ProfileTrieWalker walker(&profile); | 1311 ProfileTrieWalker walker(&profile); |
| 1272 // We have two code objects: mainA and B.boo. | 1312 // We have two code objects: mainA and B.boo. |
| 1273 walker.Reset(Profile::kExclusiveCode); | 1313 walker.Reset(Profile::kExclusiveCode); |
| 1274 EXPECT(walker.Down()); | 1314 EXPECT(walker.Down()); |
| 1315 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 1316 EXPECT(walker.Down()); |
| 1275 EXPECT_STREQ("B.boo", walker.CurrentName()); | 1317 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 1276 EXPECT_EQ(1, walker.SiblingCount()); | 1318 EXPECT_EQ(1, walker.SiblingCount()); |
| 1277 EXPECT_EQ(50000, walker.CurrentNodeTickCount()); | 1319 EXPECT_EQ(50000, walker.CurrentNodeTickCount()); |
| 1278 EXPECT_EQ(50000, walker.CurrentInclusiveTicks()); | 1320 EXPECT_EQ(50000, walker.CurrentInclusiveTicks()); |
| 1279 EXPECT_EQ(50000, walker.CurrentExclusiveTicks()); | 1321 EXPECT_EQ(50000, walker.CurrentExclusiveTicks()); |
| 1280 EXPECT(walker.Down()); | 1322 EXPECT(walker.Down()); |
| 1281 EXPECT_STREQ("mainA", walker.CurrentName()); | 1323 EXPECT_STREQ("mainA", walker.CurrentName()); |
| 1282 EXPECT_EQ(1, walker.SiblingCount()); | 1324 EXPECT_EQ(1, walker.SiblingCount()); |
| 1283 EXPECT_EQ(50000, walker.CurrentNodeTickCount()); | 1325 EXPECT_EQ(50000, walker.CurrentNodeTickCount()); |
| 1284 EXPECT_EQ(50000, walker.CurrentInclusiveTicks()); | 1326 EXPECT_EQ(50000, walker.CurrentInclusiveTicks()); |
| 1285 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); | 1327 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); |
| 1286 EXPECT(!walker.Down()); | 1328 EXPECT(!walker.Down()); |
| 1287 // We have two code objects: mainA and B.boo. | 1329 // We have two code objects: mainA and B.boo. |
| 1288 walker.Reset(Profile::kInclusiveCode); | 1330 walker.Reset(Profile::kInclusiveCode); |
| 1289 EXPECT(walker.Down()); | 1331 EXPECT(walker.Down()); |
| 1290 EXPECT_STREQ("mainA", walker.CurrentName()); | 1332 EXPECT_STREQ("mainA", walker.CurrentName()); |
| 1291 EXPECT_EQ(1, walker.SiblingCount()); | 1333 EXPECT_EQ(1, walker.SiblingCount()); |
| 1292 EXPECT_EQ(50000, walker.CurrentNodeTickCount()); | 1334 EXPECT_EQ(50000, walker.CurrentNodeTickCount()); |
| 1293 EXPECT_EQ(50000, walker.CurrentInclusiveTicks()); | 1335 EXPECT_EQ(50000, walker.CurrentInclusiveTicks()); |
| 1294 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); | 1336 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); |
| 1295 EXPECT(walker.Down()); | 1337 EXPECT(walker.Down()); |
| 1296 EXPECT_STREQ("B.boo", walker.CurrentName()); | 1338 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 1297 EXPECT_EQ(1, walker.SiblingCount()); | 1339 EXPECT_EQ(1, walker.SiblingCount()); |
| 1298 EXPECT_EQ(50000, walker.CurrentNodeTickCount()); | 1340 EXPECT_EQ(50000, walker.CurrentNodeTickCount()); |
| 1299 EXPECT_EQ(50000, walker.CurrentInclusiveTicks()); | 1341 EXPECT_EQ(50000, walker.CurrentInclusiveTicks()); |
| 1300 EXPECT_EQ(50000, walker.CurrentExclusiveTicks()); | 1342 EXPECT_EQ(50000, walker.CurrentExclusiveTicks()); |
| 1343 EXPECT(walker.Down()); |
| 1344 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 1301 EXPECT(!walker.Down()); | 1345 EXPECT(!walker.Down()); |
| 1302 | 1346 |
| 1303 // Inline expansion should show us the complete call chain: | 1347 // Inline expansion should show us the complete call chain: |
| 1304 // mainA -> B.boo -> B.foo -> B.choo. | 1348 // mainA -> B.boo -> B.foo -> B.choo. |
| 1305 walker.Reset(Profile::kExclusiveFunction); | 1349 walker.Reset(Profile::kExclusiveFunction); |
| 1306 EXPECT(walker.Down()); | 1350 EXPECT(walker.Down()); |
| 1351 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 1352 EXPECT(walker.Down()); |
| 1307 EXPECT_STREQ("B.choo", walker.CurrentName()); | 1353 EXPECT_STREQ("B.choo", walker.CurrentName()); |
| 1308 EXPECT_EQ(1, walker.SiblingCount()); | 1354 EXPECT_EQ(1, walker.SiblingCount()); |
| 1309 EXPECT_EQ(50000, walker.CurrentNodeTickCount()); | 1355 EXPECT_EQ(50000, walker.CurrentNodeTickCount()); |
| 1310 EXPECT_EQ(50000, walker.CurrentInclusiveTicks()); | 1356 EXPECT_EQ(50000, walker.CurrentInclusiveTicks()); |
| 1311 EXPECT_EQ(50000, walker.CurrentExclusiveTicks()); | 1357 EXPECT_EQ(50000, walker.CurrentExclusiveTicks()); |
| 1312 EXPECT(walker.Down()); | 1358 EXPECT(walker.Down()); |
| 1313 EXPECT_STREQ("B.foo", walker.CurrentName()); | 1359 EXPECT_STREQ("B.foo", walker.CurrentName()); |
| 1314 EXPECT_EQ(1, walker.SiblingCount()); | 1360 EXPECT_EQ(1, walker.SiblingCount()); |
| 1315 EXPECT_EQ(50000, walker.CurrentNodeTickCount()); | 1361 EXPECT_EQ(50000, walker.CurrentNodeTickCount()); |
| 1316 EXPECT_EQ(50000, walker.CurrentInclusiveTicks()); | 1362 EXPECT_EQ(50000, walker.CurrentInclusiveTicks()); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1349 EXPECT_EQ(1, walker.SiblingCount()); | 1395 EXPECT_EQ(1, walker.SiblingCount()); |
| 1350 EXPECT_EQ(50000, walker.CurrentNodeTickCount()); | 1396 EXPECT_EQ(50000, walker.CurrentNodeTickCount()); |
| 1351 EXPECT_EQ(50000, walker.CurrentInclusiveTicks()); | 1397 EXPECT_EQ(50000, walker.CurrentInclusiveTicks()); |
| 1352 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); | 1398 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); |
| 1353 EXPECT(walker.Down()); | 1399 EXPECT(walker.Down()); |
| 1354 EXPECT_STREQ("B.choo", walker.CurrentName()); | 1400 EXPECT_STREQ("B.choo", walker.CurrentName()); |
| 1355 EXPECT_EQ(1, walker.SiblingCount()); | 1401 EXPECT_EQ(1, walker.SiblingCount()); |
| 1356 EXPECT_EQ(50000, walker.CurrentNodeTickCount()); | 1402 EXPECT_EQ(50000, walker.CurrentNodeTickCount()); |
| 1357 EXPECT_EQ(50000, walker.CurrentInclusiveTicks()); | 1403 EXPECT_EQ(50000, walker.CurrentInclusiveTicks()); |
| 1358 EXPECT_EQ(50000, walker.CurrentExclusiveTicks()); | 1404 EXPECT_EQ(50000, walker.CurrentExclusiveTicks()); |
| 1405 EXPECT(walker.Down()); |
| 1406 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 1359 EXPECT(!walker.Down()); | 1407 EXPECT(!walker.Down()); |
| 1360 } | 1408 } |
| 1361 | 1409 |
| 1362 // Test code transition tags. | 1410 // Test code transition tags. |
| 1363 { | 1411 { |
| 1364 Thread* thread = Thread::Current(); | 1412 Thread* thread = Thread::Current(); |
| 1365 Isolate* isolate = thread->isolate(); | 1413 Isolate* isolate = thread->isolate(); |
| 1366 StackZone zone(thread); | 1414 StackZone zone(thread); |
| 1367 HANDLESCOPE(thread); | 1415 HANDLESCOPE(thread); |
| 1368 Profile profile(isolate); | 1416 Profile profile(isolate); |
| 1369 AllocationFilter filter(isolate, class_a.id()); | 1417 AllocationFilter filter(isolate, class_a.id()); |
| 1370 profile.Build(thread, | 1418 profile.Build(thread, |
| 1371 &filter, | 1419 &filter, |
| 1372 Profile::kNoTags, | 1420 Profile::kNoTags, |
| 1373 ProfilerService::kCodeTransitionTagsBit); | 1421 ProfilerService::kCodeTransitionTagsBit); |
| 1374 // We should have 50,000 allocation samples. | 1422 // We should have 50,000 allocation samples. |
| 1375 EXPECT_EQ(50000, profile.sample_count()); | 1423 EXPECT_EQ(50000, profile.sample_count()); |
| 1376 ProfileTrieWalker walker(&profile); | 1424 ProfileTrieWalker walker(&profile); |
| 1377 // We have two code objects: mainA and B.boo. | 1425 // We have two code objects: mainA and B.boo. |
| 1378 walker.Reset(Profile::kExclusiveCode); | 1426 walker.Reset(Profile::kExclusiveCode); |
| 1379 EXPECT(walker.Down()); | 1427 EXPECT(walker.Down()); |
| 1428 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 1429 EXPECT(walker.Down()); |
| 1380 EXPECT_STREQ("B.boo", walker.CurrentName()); | 1430 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 1381 EXPECT(walker.Down()); | 1431 EXPECT(walker.Down()); |
| 1382 EXPECT_STREQ("[Optimized Code]", walker.CurrentName()); | 1432 EXPECT_STREQ("[Optimized Code]", walker.CurrentName()); |
| 1383 EXPECT(walker.Down()); | 1433 EXPECT(walker.Down()); |
| 1384 EXPECT_STREQ("mainA", walker.CurrentName()); | 1434 EXPECT_STREQ("mainA", walker.CurrentName()); |
| 1385 EXPECT(walker.Down()); | 1435 EXPECT(walker.Down()); |
| 1386 EXPECT_STREQ("[Unoptimized Code]", walker.CurrentName()); | 1436 EXPECT_STREQ("[Unoptimized Code]", walker.CurrentName()); |
| 1387 EXPECT(!walker.Down()); | 1437 EXPECT(!walker.Down()); |
| 1388 // We have two code objects: mainA and B.boo. | 1438 // We have two code objects: mainA and B.boo. |
| 1389 walker.Reset(Profile::kInclusiveCode); | 1439 walker.Reset(Profile::kInclusiveCode); |
| 1390 EXPECT(walker.Down()); | 1440 EXPECT(walker.Down()); |
| 1391 EXPECT_STREQ("[Unoptimized Code]", walker.CurrentName()); | 1441 EXPECT_STREQ("[Unoptimized Code]", walker.CurrentName()); |
| 1392 EXPECT(walker.Down()); | 1442 EXPECT(walker.Down()); |
| 1393 EXPECT_STREQ("mainA", walker.CurrentName()); | 1443 EXPECT_STREQ("mainA", walker.CurrentName()); |
| 1394 EXPECT(walker.Down()); | 1444 EXPECT(walker.Down()); |
| 1395 EXPECT_STREQ("[Optimized Code]", walker.CurrentName()); | 1445 EXPECT_STREQ("[Optimized Code]", walker.CurrentName()); |
| 1396 EXPECT(walker.Down()); | 1446 EXPECT(walker.Down()); |
| 1397 EXPECT_STREQ("B.boo", walker.CurrentName()); | 1447 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 1448 EXPECT(walker.Down()); |
| 1449 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 1398 EXPECT(!walker.Down()); | 1450 EXPECT(!walker.Down()); |
| 1399 | 1451 |
| 1400 // Inline expansion should show us the complete call chain: | 1452 // Inline expansion should show us the complete call chain: |
| 1401 // mainA -> B.boo -> B.foo -> B.choo. | 1453 // mainA -> B.boo -> B.foo -> B.choo. |
| 1402 walker.Reset(Profile::kExclusiveFunction); | 1454 walker.Reset(Profile::kExclusiveFunction); |
| 1403 EXPECT(walker.Down()); | 1455 EXPECT(walker.Down()); |
| 1456 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 1457 EXPECT(walker.Down()); |
| 1404 EXPECT_STREQ("[Inline End]", walker.CurrentName()); | 1458 EXPECT_STREQ("[Inline End]", walker.CurrentName()); |
| 1405 EXPECT(walker.Down()); | 1459 EXPECT(walker.Down()); |
| 1406 EXPECT_STREQ("B.choo", walker.CurrentName()); | 1460 EXPECT_STREQ("B.choo", walker.CurrentName()); |
| 1407 EXPECT(walker.Down()); | 1461 EXPECT(walker.Down()); |
| 1408 EXPECT_STREQ("B.foo", walker.CurrentName()); | 1462 EXPECT_STREQ("B.foo", walker.CurrentName()); |
| 1409 EXPECT(walker.Down()); | 1463 EXPECT(walker.Down()); |
| 1410 EXPECT_STREQ("[Inline Start]", walker.CurrentName()); | 1464 EXPECT_STREQ("[Inline Start]", walker.CurrentName()); |
| 1411 EXPECT(walker.Down()); | 1465 EXPECT(walker.Down()); |
| 1412 EXPECT_STREQ("B.boo", walker.CurrentName()); | 1466 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 1413 EXPECT(walker.Down()); | 1467 EXPECT(walker.Down()); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1430 EXPECT(walker.Down()); | 1484 EXPECT(walker.Down()); |
| 1431 EXPECT_STREQ("B.boo", walker.CurrentName()); | 1485 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 1432 EXPECT(walker.Down()); | 1486 EXPECT(walker.Down()); |
| 1433 EXPECT_STREQ("[Inline Start]", walker.CurrentName()); | 1487 EXPECT_STREQ("[Inline Start]", walker.CurrentName()); |
| 1434 EXPECT(walker.Down()); | 1488 EXPECT(walker.Down()); |
| 1435 EXPECT_STREQ("B.foo", walker.CurrentName()); | 1489 EXPECT_STREQ("B.foo", walker.CurrentName()); |
| 1436 EXPECT(walker.Down()); | 1490 EXPECT(walker.Down()); |
| 1437 EXPECT_STREQ("B.choo", walker.CurrentName()); | 1491 EXPECT_STREQ("B.choo", walker.CurrentName()); |
| 1438 EXPECT(walker.Down()); | 1492 EXPECT(walker.Down()); |
| 1439 EXPECT_STREQ("[Inline End]", walker.CurrentName()); | 1493 EXPECT_STREQ("[Inline End]", walker.CurrentName()); |
| 1494 EXPECT(walker.Down()); |
| 1495 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 1440 EXPECT(!walker.Down()); | 1496 EXPECT(!walker.Down()); |
| 1441 } | 1497 } |
| 1442 } | 1498 } |
| 1443 | 1499 |
| 1444 | 1500 |
| 1445 TEST_CASE(Profiler_InliningIntervalBoundry) { | 1501 TEST_CASE(Profiler_InliningIntervalBoundry) { |
| 1446 // The PC of frames below the top frame is a call's return address, | 1502 // The PC of frames below the top frame is a call's return address, |
| 1447 // which can belong to a different inlining interval than the call. | 1503 // which can belong to a different inlining interval than the call. |
| 1448 // This test checks the profiler service takes this into account; see | 1504 // This test checks the profiler service takes this into account; see |
| 1449 // ProfileBuilder::ProcessFrame. | 1505 // ProfileBuilder::ProcessFrame. |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1538 HANDLESCOPE(thread); | 1594 HANDLESCOPE(thread); |
| 1539 Profile profile(isolate); | 1595 Profile profile(isolate); |
| 1540 AllocationFilter filter(isolate, class_a.id()); | 1596 AllocationFilter filter(isolate, class_a.id()); |
| 1541 profile.Build(thread, &filter, Profile::kNoTags); | 1597 profile.Build(thread, &filter, Profile::kNoTags); |
| 1542 EXPECT_EQ(1, profile.sample_count()); | 1598 EXPECT_EQ(1, profile.sample_count()); |
| 1543 ProfileTrieWalker walker(&profile); | 1599 ProfileTrieWalker walker(&profile); |
| 1544 | 1600 |
| 1545 // Inline expansion should show us the complete call chain: | 1601 // Inline expansion should show us the complete call chain: |
| 1546 walker.Reset(Profile::kExclusiveFunction); | 1602 walker.Reset(Profile::kExclusiveFunction); |
| 1547 EXPECT(walker.Down()); | 1603 EXPECT(walker.Down()); |
| 1604 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 1605 EXPECT(walker.Down()); |
| 1548 EXPECT_STREQ("maybeAlloc", walker.CurrentName()); | 1606 EXPECT_STREQ("maybeAlloc", walker.CurrentName()); |
| 1549 EXPECT(walker.Down()); | 1607 EXPECT(walker.Down()); |
| 1550 EXPECT_STREQ("right", walker.CurrentName()); | 1608 EXPECT_STREQ("right", walker.CurrentName()); |
| 1551 EXPECT(walker.Down()); | 1609 EXPECT(walker.Down()); |
| 1552 EXPECT_STREQ("a", walker.CurrentName()); | 1610 EXPECT_STREQ("a", walker.CurrentName()); |
| 1553 EXPECT(walker.Down()); | 1611 EXPECT(walker.Down()); |
| 1554 EXPECT_STREQ("mainAlloc", walker.CurrentName()); | 1612 EXPECT_STREQ("mainAlloc", walker.CurrentName()); |
| 1555 EXPECT(!walker.Down()); | 1613 EXPECT(!walker.Down()); |
| 1556 | 1614 |
| 1557 // Inline expansion should show us the complete call chain: | 1615 // Inline expansion should show us the complete call chain: |
| 1558 walker.Reset(Profile::kInclusiveFunction); | 1616 walker.Reset(Profile::kInclusiveFunction); |
| 1559 EXPECT(walker.Down()); | 1617 EXPECT(walker.Down()); |
| 1560 EXPECT_STREQ("mainAlloc", walker.CurrentName()); | 1618 EXPECT_STREQ("mainAlloc", walker.CurrentName()); |
| 1561 EXPECT(walker.Down()); | 1619 EXPECT(walker.Down()); |
| 1562 EXPECT_STREQ("a", walker.CurrentName()); | 1620 EXPECT_STREQ("a", walker.CurrentName()); |
| 1563 EXPECT(walker.Down()); | 1621 EXPECT(walker.Down()); |
| 1564 EXPECT_STREQ("right", walker.CurrentName()); | 1622 EXPECT_STREQ("right", walker.CurrentName()); |
| 1565 EXPECT(walker.Down()); | 1623 EXPECT(walker.Down()); |
| 1566 EXPECT_STREQ("maybeAlloc", walker.CurrentName()); | 1624 EXPECT_STREQ("maybeAlloc", walker.CurrentName()); |
| 1625 EXPECT(walker.Down()); |
| 1626 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 1567 EXPECT(!walker.Down()); | 1627 EXPECT(!walker.Down()); |
| 1568 } | 1628 } |
| 1569 } | 1629 } |
| 1570 | 1630 |
| 1571 | 1631 |
| 1572 TEST_CASE(Profiler_ChainedSamples) { | 1632 TEST_CASE(Profiler_ChainedSamples) { |
| 1573 MaxProfileDepthScope mpds(32); | 1633 MaxProfileDepthScope mpds(32); |
| 1574 DisableNativeProfileScope dnps; | 1634 DisableNativeProfileScope dnps; |
| 1575 | 1635 |
| 1576 // Each sample holds 8 stack frames. | 1636 // Each sample holds 8 stack frames. |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1628 Profile profile(isolate); | 1688 Profile profile(isolate); |
| 1629 AllocationFilter filter(isolate, class_a.id()); | 1689 AllocationFilter filter(isolate, class_a.id()); |
| 1630 profile.Build(thread, &filter, Profile::kNoTags); | 1690 profile.Build(thread, &filter, Profile::kNoTags); |
| 1631 // We should have 1 allocation sample. | 1691 // We should have 1 allocation sample. |
| 1632 EXPECT_EQ(1, profile.sample_count()); | 1692 EXPECT_EQ(1, profile.sample_count()); |
| 1633 ProfileTrieWalker walker(&profile); | 1693 ProfileTrieWalker walker(&profile); |
| 1634 | 1694 |
| 1635 walker.Reset(Profile::kExclusiveCode); | 1695 walker.Reset(Profile::kExclusiveCode); |
| 1636 // Move down from the root. | 1696 // Move down from the root. |
| 1637 EXPECT(walker.Down()); | 1697 EXPECT(walker.Down()); |
| 1698 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 1699 EXPECT(walker.Down()); |
| 1638 EXPECT_STREQ("B.boo", walker.CurrentName()); | 1700 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 1639 EXPECT(walker.Down()); | 1701 EXPECT(walker.Down()); |
| 1640 EXPECT_STREQ("orange", walker.CurrentName()); | 1702 EXPECT_STREQ("orange", walker.CurrentName()); |
| 1641 EXPECT(walker.Down()); | 1703 EXPECT(walker.Down()); |
| 1642 EXPECT_STREQ("napkin", walker.CurrentName()); | 1704 EXPECT_STREQ("napkin", walker.CurrentName()); |
| 1643 EXPECT(walker.Down()); | 1705 EXPECT(walker.Down()); |
| 1644 EXPECT_STREQ("mayo", walker.CurrentName()); | 1706 EXPECT_STREQ("mayo", walker.CurrentName()); |
| 1645 EXPECT(walker.Down()); | 1707 EXPECT(walker.Down()); |
| 1646 EXPECT_STREQ("lemon", walker.CurrentName()); | 1708 EXPECT_STREQ("lemon", walker.CurrentName()); |
| 1647 EXPECT(walker.Down()); | 1709 EXPECT(walker.Down()); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1727 AllocationFilter filter(isolate, class_a.id()); | 1789 AllocationFilter filter(isolate, class_a.id()); |
| 1728 profile.Build(thread, &filter, Profile::kNoTags); | 1790 profile.Build(thread, &filter, Profile::kNoTags); |
| 1729 // We should have one allocation samples. | 1791 // We should have one allocation samples. |
| 1730 EXPECT_EQ(1, profile.sample_count()); | 1792 EXPECT_EQ(1, profile.sample_count()); |
| 1731 ProfileTrieWalker walker(&profile); | 1793 ProfileTrieWalker walker(&profile); |
| 1732 | 1794 |
| 1733 // Exclusive function: B.boo -> main. | 1795 // Exclusive function: B.boo -> main. |
| 1734 walker.Reset(Profile::kExclusiveFunction); | 1796 walker.Reset(Profile::kExclusiveFunction); |
| 1735 // Move down from the root. | 1797 // Move down from the root. |
| 1736 EXPECT(walker.Down()); | 1798 EXPECT(walker.Down()); |
| 1799 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 1800 EXPECT(walker.Down()); |
| 1737 EXPECT_STREQ("B.boo", walker.CurrentName()); | 1801 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 1738 EXPECT_EQ(1, walker.CurrentNodeTickCount()); | 1802 EXPECT_EQ(1, walker.CurrentNodeTickCount()); |
| 1739 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); | 1803 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); |
| 1740 EXPECT_EQ(1, walker.CurrentExclusiveTicks()); | 1804 EXPECT_EQ(1, walker.CurrentExclusiveTicks()); |
| 1741 EXPECT_STREQ("A", walker.CurrentToken()); | 1805 EXPECT_STREQ("A", walker.CurrentToken()); |
| 1742 EXPECT(walker.Down()); | 1806 EXPECT(walker.Down()); |
| 1743 EXPECT_STREQ("main", walker.CurrentName()); | 1807 EXPECT_STREQ("main", walker.CurrentName()); |
| 1744 EXPECT_EQ(1, walker.CurrentNodeTickCount()); | 1808 EXPECT_EQ(1, walker.CurrentNodeTickCount()); |
| 1745 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); | 1809 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); |
| 1746 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); | 1810 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1817 AllocationFilter filter(isolate, class_a.id()); | 1881 AllocationFilter filter(isolate, class_a.id()); |
| 1818 profile.Build(thread, &filter, Profile::kNoTags); | 1882 profile.Build(thread, &filter, Profile::kNoTags); |
| 1819 // We should have one allocation samples. | 1883 // We should have one allocation samples. |
| 1820 EXPECT_EQ(1, profile.sample_count()); | 1884 EXPECT_EQ(1, profile.sample_count()); |
| 1821 ProfileTrieWalker walker(&profile); | 1885 ProfileTrieWalker walker(&profile); |
| 1822 | 1886 |
| 1823 // Exclusive function: B.boo -> main. | 1887 // Exclusive function: B.boo -> main. |
| 1824 walker.Reset(Profile::kExclusiveFunction); | 1888 walker.Reset(Profile::kExclusiveFunction); |
| 1825 // Move down from the root. | 1889 // Move down from the root. |
| 1826 EXPECT(walker.Down()); | 1890 EXPECT(walker.Down()); |
| 1891 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 1892 EXPECT(walker.Down()); |
| 1827 EXPECT_STREQ("B.boo", walker.CurrentName()); | 1893 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 1828 EXPECT_EQ(1, walker.CurrentNodeTickCount()); | 1894 EXPECT_EQ(1, walker.CurrentNodeTickCount()); |
| 1829 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); | 1895 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); |
| 1830 EXPECT_EQ(1, walker.CurrentExclusiveTicks()); | 1896 EXPECT_EQ(1, walker.CurrentExclusiveTicks()); |
| 1831 EXPECT_STREQ("A", walker.CurrentToken()); | 1897 EXPECT_STREQ("A", walker.CurrentToken()); |
| 1832 EXPECT(walker.Down()); | 1898 EXPECT(walker.Down()); |
| 1833 EXPECT_STREQ("main", walker.CurrentName()); | 1899 EXPECT_STREQ("main", walker.CurrentName()); |
| 1834 EXPECT_EQ(1, walker.CurrentNodeTickCount()); | 1900 EXPECT_EQ(1, walker.CurrentNodeTickCount()); |
| 1835 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); | 1901 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); |
| 1836 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); | 1902 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1900 AllocationFilter filter(isolate, class_a.id()); | 1966 AllocationFilter filter(isolate, class_a.id()); |
| 1901 profile.Build(thread, &filter, Profile::kNoTags); | 1967 profile.Build(thread, &filter, Profile::kNoTags); |
| 1902 // We should have one allocation samples. | 1968 // We should have one allocation samples. |
| 1903 EXPECT_EQ(1, profile.sample_count()); | 1969 EXPECT_EQ(1, profile.sample_count()); |
| 1904 ProfileTrieWalker walker(&profile); | 1970 ProfileTrieWalker walker(&profile); |
| 1905 | 1971 |
| 1906 // Exclusive function: B.boo -> main. | 1972 // Exclusive function: B.boo -> main. |
| 1907 walker.Reset(Profile::kExclusiveFunction); | 1973 walker.Reset(Profile::kExclusiveFunction); |
| 1908 // Move down from the root. | 1974 // Move down from the root. |
| 1909 EXPECT(walker.Down()); | 1975 EXPECT(walker.Down()); |
| 1976 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 1977 EXPECT(walker.Down()); |
| 1910 EXPECT_STREQ("B.boo", walker.CurrentName()); | 1978 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 1911 EXPECT_EQ(1, walker.CurrentNodeTickCount()); | 1979 EXPECT_EQ(1, walker.CurrentNodeTickCount()); |
| 1912 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); | 1980 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); |
| 1913 EXPECT_EQ(1, walker.CurrentExclusiveTicks()); | 1981 EXPECT_EQ(1, walker.CurrentExclusiveTicks()); |
| 1914 EXPECT_STREQ("A", walker.CurrentToken()); | 1982 EXPECT_STREQ("A", walker.CurrentToken()); |
| 1915 EXPECT(walker.Down()); | 1983 EXPECT(walker.Down()); |
| 1916 EXPECT_STREQ("B.oats", walker.CurrentName()); | 1984 EXPECT_STREQ("B.oats", walker.CurrentName()); |
| 1917 EXPECT_EQ(1, walker.CurrentNodeTickCount()); | 1985 EXPECT_EQ(1, walker.CurrentNodeTickCount()); |
| 1918 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); | 1986 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); |
| 1919 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); | 1987 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2021 AllocationFilter filter(isolate, class_a.id()); | 2089 AllocationFilter filter(isolate, class_a.id()); |
| 2022 profile.Build(thread, &filter, Profile::kNoTags); | 2090 profile.Build(thread, &filter, Profile::kNoTags); |
| 2023 // We should have one allocation samples. | 2091 // We should have one allocation samples. |
| 2024 EXPECT_EQ(1, profile.sample_count()); | 2092 EXPECT_EQ(1, profile.sample_count()); |
| 2025 ProfileTrieWalker walker(&profile); | 2093 ProfileTrieWalker walker(&profile); |
| 2026 | 2094 |
| 2027 // Exclusive function: B.boo -> main. | 2095 // Exclusive function: B.boo -> main. |
| 2028 walker.Reset(Profile::kExclusiveFunction); | 2096 walker.Reset(Profile::kExclusiveFunction); |
| 2029 // Move down from the root. | 2097 // Move down from the root. |
| 2030 EXPECT(walker.Down()); | 2098 EXPECT(walker.Down()); |
| 2099 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 2100 EXPECT(walker.Down()); |
| 2031 EXPECT_STREQ("B.boo", walker.CurrentName()); | 2101 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 2032 EXPECT_EQ(1, walker.CurrentNodeTickCount()); | 2102 EXPECT_EQ(1, walker.CurrentNodeTickCount()); |
| 2033 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); | 2103 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); |
| 2034 EXPECT_EQ(1, walker.CurrentExclusiveTicks()); | 2104 EXPECT_EQ(1, walker.CurrentExclusiveTicks()); |
| 2035 EXPECT_STREQ("A", walker.CurrentToken()); | 2105 EXPECT_STREQ("A", walker.CurrentToken()); |
| 2036 EXPECT(walker.Down()); | 2106 EXPECT(walker.Down()); |
| 2037 EXPECT_STREQ("B.oats", walker.CurrentName()); | 2107 EXPECT_STREQ("B.oats", walker.CurrentName()); |
| 2038 EXPECT_EQ(1, walker.CurrentNodeTickCount()); | 2108 EXPECT_EQ(1, walker.CurrentNodeTickCount()); |
| 2039 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); | 2109 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); |
| 2040 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); | 2110 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2125 AllocationFilter filter(isolate, class_a.id()); | 2195 AllocationFilter filter(isolate, class_a.id()); |
| 2126 profile.Build(thread, &filter, Profile::kNoTags); | 2196 profile.Build(thread, &filter, Profile::kNoTags); |
| 2127 // We should have one allocation samples. | 2197 // We should have one allocation samples. |
| 2128 EXPECT_EQ(1, profile.sample_count()); | 2198 EXPECT_EQ(1, profile.sample_count()); |
| 2129 ProfileTrieWalker walker(&profile); | 2199 ProfileTrieWalker walker(&profile); |
| 2130 | 2200 |
| 2131 // Exclusive function: B.boo -> main. | 2201 // Exclusive function: B.boo -> main. |
| 2132 walker.Reset(Profile::kExclusiveFunction); | 2202 walker.Reset(Profile::kExclusiveFunction); |
| 2133 // Move down from the root. | 2203 // Move down from the root. |
| 2134 EXPECT(walker.Down()); | 2204 EXPECT(walker.Down()); |
| 2205 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 2206 EXPECT(walker.Down()); |
| 2135 EXPECT_STREQ("B.boo", walker.CurrentName()); | 2207 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 2136 EXPECT_EQ(1, walker.CurrentNodeTickCount()); | 2208 EXPECT_EQ(1, walker.CurrentNodeTickCount()); |
| 2137 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); | 2209 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); |
| 2138 EXPECT_EQ(1, walker.CurrentExclusiveTicks()); | 2210 EXPECT_EQ(1, walker.CurrentExclusiveTicks()); |
| 2139 EXPECT_STREQ("A", walker.CurrentToken()); | 2211 EXPECT_STREQ("A", walker.CurrentToken()); |
| 2140 EXPECT(walker.Down()); | 2212 EXPECT(walker.Down()); |
| 2141 EXPECT_STREQ("B.oats", walker.CurrentName()); | 2213 EXPECT_STREQ("B.oats", walker.CurrentName()); |
| 2142 EXPECT_EQ(1, walker.CurrentNodeTickCount()); | 2214 EXPECT_EQ(1, walker.CurrentNodeTickCount()); |
| 2143 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); | 2215 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); |
| 2144 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); | 2216 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2255 AllocationFilter filter(isolate, class_a.id()); | 2327 AllocationFilter filter(isolate, class_a.id()); |
| 2256 profile.Build(thread, &filter, Profile::kNoTags); | 2328 profile.Build(thread, &filter, Profile::kNoTags); |
| 2257 // We should have one allocation samples. | 2329 // We should have one allocation samples. |
| 2258 EXPECT_EQ(1, profile.sample_count()); | 2330 EXPECT_EQ(1, profile.sample_count()); |
| 2259 ProfileTrieWalker walker(&profile); | 2331 ProfileTrieWalker walker(&profile); |
| 2260 | 2332 |
| 2261 // Exclusive function: B.boo -> main. | 2333 // Exclusive function: B.boo -> main. |
| 2262 walker.Reset(Profile::kExclusiveFunction); | 2334 walker.Reset(Profile::kExclusiveFunction); |
| 2263 // Move down from the root. | 2335 // Move down from the root. |
| 2264 EXPECT(walker.Down()); | 2336 EXPECT(walker.Down()); |
| 2337 EXPECT_STREQ("DRT_AllocateObject", walker.CurrentName()); |
| 2338 EXPECT(walker.Down()); |
| 2265 EXPECT_STREQ("B.boo", walker.CurrentName()); | 2339 EXPECT_STREQ("B.boo", walker.CurrentName()); |
| 2266 EXPECT_EQ(1, walker.CurrentNodeTickCount()); | 2340 EXPECT_EQ(1, walker.CurrentNodeTickCount()); |
| 2267 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); | 2341 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); |
| 2268 EXPECT_EQ(1, walker.CurrentExclusiveTicks()); | 2342 EXPECT_EQ(1, walker.CurrentExclusiveTicks()); |
| 2269 EXPECT_STREQ("A", walker.CurrentToken()); | 2343 EXPECT_STREQ("A", walker.CurrentToken()); |
| 2270 EXPECT(walker.Down()); | 2344 EXPECT(walker.Down()); |
| 2271 EXPECT_STREQ("B.oats", walker.CurrentName()); | 2345 EXPECT_STREQ("B.oats", walker.CurrentName()); |
| 2272 EXPECT_EQ(1, walker.CurrentNodeTickCount()); | 2346 EXPECT_EQ(1, walker.CurrentNodeTickCount()); |
| 2273 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); | 2347 EXPECT_EQ(1, walker.CurrentInclusiveTicks()); |
| 2274 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); | 2348 EXPECT_EQ(0, walker.CurrentExclusiveTicks()); |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2498 EXPECT_SUBSTRING("\"positions\":[\"TempMove\",39]", js.ToCString()); | 2572 EXPECT_SUBSTRING("\"positions\":[\"TempMove\",39]", js.ToCString()); |
| 2499 // Verify exclusive ticks in main. | 2573 // Verify exclusive ticks in main. |
| 2500 EXPECT_SUBSTRING("\"exclusiveTicks\":[1,0]", js.ToCString()); | 2574 EXPECT_SUBSTRING("\"exclusiveTicks\":[1,0]", js.ToCString()); |
| 2501 // Verify inclusive ticks in main. | 2575 // Verify inclusive ticks in main. |
| 2502 EXPECT_SUBSTRING("\"inclusiveTicks\":[1,2]", js.ToCString()); | 2576 EXPECT_SUBSTRING("\"inclusiveTicks\":[1,2]", js.ToCString()); |
| 2503 } | 2577 } |
| 2504 | 2578 |
| 2505 #endif // !PRODUCT | 2579 #endif // !PRODUCT |
| 2506 | 2580 |
| 2507 } // namespace dart | 2581 } // namespace dart |
| OLD | NEW |