Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(378)

Side by Side Diff: runtime/vm/profiler_test.cc

Issue 1851293005: Improve CPU Profile View (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/profiler_service.cc ('k') | runtime/vm/service.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « runtime/vm/profiler_service.cc ('k') | runtime/vm/service.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698