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 548 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
559 } | 559 } |
560 | 560 |
561 | 561 |
562 TEST_CASE(Profiler_IntrinsicAllocation) { | 562 TEST_CASE(Profiler_IntrinsicAllocation) { |
563 DisableNativeProfileScope dnps; | 563 DisableNativeProfileScope dnps; |
564 const char* kScript = "double foo(double a, double b) => a + b;"; | 564 const char* kScript = "double foo(double a, double b) => a + b;"; |
565 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 565 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
566 EXPECT_VALID(lib); | 566 EXPECT_VALID(lib); |
567 Library& root_library = Library::Handle(); | 567 Library& root_library = Library::Handle(); |
568 root_library ^= Api::UnwrapHandle(lib); | 568 root_library ^= Api::UnwrapHandle(lib); |
569 Isolate* isolate = Isolate::Current(); | 569 Isolate* isolate = thread->isolate(); |
570 | 570 |
571 const Class& double_class = | 571 const Class& double_class = |
572 Class::Handle(isolate->object_store()->double_class()); | 572 Class::Handle(isolate->object_store()->double_class()); |
573 EXPECT(!double_class.IsNull()); | 573 EXPECT(!double_class.IsNull()); |
574 | 574 |
575 Dart_Handle args[2] = { Dart_NewDouble(1.0), Dart_NewDouble(2.0), }; | 575 Dart_Handle args[2] = { Dart_NewDouble(1.0), Dart_NewDouble(2.0), }; |
576 | 576 |
577 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 577 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
578 EXPECT_VALID(result); | 578 EXPECT_VALID(result); |
579 | 579 |
580 { | 580 { |
581 StackZone zone(isolate); | 581 StackZone zone(thread); |
582 HANDLESCOPE(isolate); | 582 HANDLESCOPE(thread); |
583 Profile profile(isolate); | 583 Profile profile(isolate); |
584 AllocationFilter filter(isolate, double_class.id()); | 584 AllocationFilter filter(isolate, double_class.id()); |
585 profile.Build(&filter, Profile::kNoTags); | 585 profile.Build(&filter, Profile::kNoTags); |
586 // We should have no allocation samples. | 586 // We should have no allocation samples. |
587 EXPECT_EQ(0, profile.sample_count()); | 587 EXPECT_EQ(0, profile.sample_count()); |
588 } | 588 } |
589 | 589 |
590 double_class.SetTraceAllocation(true); | 590 double_class.SetTraceAllocation(true); |
591 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 591 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
592 EXPECT_VALID(result); | 592 EXPECT_VALID(result); |
593 | 593 |
594 { | 594 { |
595 StackZone zone(isolate); | 595 StackZone zone(thread); |
596 HANDLESCOPE(isolate); | 596 HANDLESCOPE(thread); |
597 Profile profile(isolate); | 597 Profile profile(isolate); |
598 AllocationFilter filter(isolate, double_class.id()); | 598 AllocationFilter filter(isolate, double_class.id()); |
599 profile.Build(&filter, Profile::kNoTags); | 599 profile.Build(&filter, Profile::kNoTags); |
600 // We should have one allocation sample. | 600 // We should have one allocation sample. |
601 EXPECT_EQ(1, profile.sample_count()); | 601 EXPECT_EQ(1, profile.sample_count()); |
602 ProfileTrieWalker walker(&profile); | 602 ProfileTrieWalker walker(&profile); |
603 | 603 |
604 walker.Reset(Profile::kExclusiveCode); | 604 walker.Reset(Profile::kExclusiveCode); |
605 EXPECT(walker.Down()); | 605 EXPECT(walker.Down()); |
606 EXPECT_STREQ("_Double._add", walker.CurrentName()); | 606 EXPECT_STREQ("_Double._add", walker.CurrentName()); |
607 EXPECT(walker.Down()); | 607 EXPECT(walker.Down()); |
608 EXPECT_STREQ("_Double.+", walker.CurrentName()); | 608 EXPECT_STREQ("_Double.+", walker.CurrentName()); |
609 EXPECT(walker.Down()); | 609 EXPECT(walker.Down()); |
610 EXPECT_STREQ("foo", walker.CurrentName()); | 610 EXPECT_STREQ("foo", walker.CurrentName()); |
611 EXPECT(!walker.Down()); | 611 EXPECT(!walker.Down()); |
612 } | 612 } |
613 | 613 |
614 double_class.SetTraceAllocation(false); | 614 double_class.SetTraceAllocation(false); |
615 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 615 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
616 EXPECT_VALID(result); | 616 EXPECT_VALID(result); |
617 | 617 |
618 { | 618 { |
619 StackZone zone(isolate); | 619 StackZone zone(thread); |
620 HANDLESCOPE(isolate); | 620 HANDLESCOPE(thread); |
621 Profile profile(isolate); | 621 Profile profile(isolate); |
622 AllocationFilter filter(isolate, double_class.id()); | 622 AllocationFilter filter(isolate, double_class.id()); |
623 profile.Build(&filter, Profile::kNoTags); | 623 profile.Build(&filter, Profile::kNoTags); |
624 // We should still only have one allocation sample. | 624 // We should still only have one allocation sample. |
625 EXPECT_EQ(1, profile.sample_count()); | 625 EXPECT_EQ(1, profile.sample_count()); |
626 } | 626 } |
627 } | 627 } |
628 | 628 |
629 | 629 |
630 TEST_CASE(Profiler_ArrayAllocation) { | 630 TEST_CASE(Profiler_ArrayAllocation) { |
631 DisableNativeProfileScope dnps; | 631 DisableNativeProfileScope dnps; |
632 const char* kScript = | 632 const char* kScript = |
633 "List foo() => new List(4);\n" | 633 "List foo() => new List(4);\n" |
634 "List bar() => new List();\n"; | 634 "List bar() => new List();\n"; |
635 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 635 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
636 EXPECT_VALID(lib); | 636 EXPECT_VALID(lib); |
637 Library& root_library = Library::Handle(); | 637 Library& root_library = Library::Handle(); |
638 root_library ^= Api::UnwrapHandle(lib); | 638 root_library ^= Api::UnwrapHandle(lib); |
639 Isolate* isolate = Isolate::Current(); | 639 Isolate* isolate = thread->isolate(); |
640 | 640 |
641 const Class& array_class = | 641 const Class& array_class = |
642 Class::Handle(isolate->object_store()->array_class()); | 642 Class::Handle(isolate->object_store()->array_class()); |
643 EXPECT(!array_class.IsNull()); | 643 EXPECT(!array_class.IsNull()); |
644 | 644 |
645 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 645 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
646 EXPECT_VALID(result); | 646 EXPECT_VALID(result); |
647 | 647 |
648 { | 648 { |
649 StackZone zone(isolate); | 649 StackZone zone(thread); |
650 HANDLESCOPE(isolate); | 650 HANDLESCOPE(thread); |
651 Profile profile(isolate); | 651 Profile profile(isolate); |
652 AllocationFilter filter(isolate, array_class.id()); | 652 AllocationFilter filter(isolate, array_class.id()); |
653 profile.Build(&filter, Profile::kNoTags); | 653 profile.Build(&filter, Profile::kNoTags); |
654 // We should have no allocation samples. | 654 // We should have no allocation samples. |
655 EXPECT_EQ(0, profile.sample_count()); | 655 EXPECT_EQ(0, profile.sample_count()); |
656 } | 656 } |
657 | 657 |
658 array_class.SetTraceAllocation(true); | 658 array_class.SetTraceAllocation(true); |
659 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 659 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
660 EXPECT_VALID(result); | 660 EXPECT_VALID(result); |
661 | 661 |
662 { | 662 { |
663 StackZone zone(isolate); | 663 StackZone zone(thread); |
664 HANDLESCOPE(isolate); | 664 HANDLESCOPE(thread); |
665 Profile profile(isolate); | 665 Profile profile(isolate); |
666 AllocationFilter filter(isolate, array_class.id()); | 666 AllocationFilter filter(isolate, array_class.id()); |
667 profile.Build(&filter, Profile::kNoTags); | 667 profile.Build(&filter, Profile::kNoTags); |
668 // We should have one allocation sample. | 668 // We should have one allocation sample. |
669 EXPECT_EQ(1, profile.sample_count()); | 669 EXPECT_EQ(1, profile.sample_count()); |
670 ProfileTrieWalker walker(&profile); | 670 ProfileTrieWalker walker(&profile); |
671 | 671 |
672 walker.Reset(Profile::kExclusiveCode); | 672 walker.Reset(Profile::kExclusiveCode); |
673 EXPECT(walker.Down()); | 673 EXPECT(walker.Down()); |
674 EXPECT_STREQ("_List._List", walker.CurrentName()); | 674 EXPECT_STREQ("_List._List", walker.CurrentName()); |
675 EXPECT(walker.Down()); | 675 EXPECT(walker.Down()); |
676 EXPECT_STREQ("List.List", walker.CurrentName()); | 676 EXPECT_STREQ("List.List", walker.CurrentName()); |
677 EXPECT(walker.Down()); | 677 EXPECT(walker.Down()); |
678 EXPECT_STREQ("foo", walker.CurrentName()); | 678 EXPECT_STREQ("foo", walker.CurrentName()); |
679 EXPECT(!walker.Down()); | 679 EXPECT(!walker.Down()); |
680 } | 680 } |
681 | 681 |
682 array_class.SetTraceAllocation(false); | 682 array_class.SetTraceAllocation(false); |
683 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 683 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
684 EXPECT_VALID(result); | 684 EXPECT_VALID(result); |
685 | 685 |
686 { | 686 { |
687 StackZone zone(isolate); | 687 StackZone zone(thread); |
688 HANDLESCOPE(isolate); | 688 HANDLESCOPE(thread); |
689 Profile profile(isolate); | 689 Profile profile(isolate); |
690 AllocationFilter filter(isolate, array_class.id()); | 690 AllocationFilter filter(isolate, array_class.id()); |
691 profile.Build(&filter, Profile::kNoTags); | 691 profile.Build(&filter, Profile::kNoTags); |
692 // We should still only have one allocation sample. | 692 // We should still only have one allocation sample. |
693 EXPECT_EQ(1, profile.sample_count()); | 693 EXPECT_EQ(1, profile.sample_count()); |
694 } | 694 } |
695 | 695 |
696 // Clear the samples. | 696 // Clear the samples. |
697 ProfilerService::ClearSamples(); | 697 ProfilerService::ClearSamples(); |
698 | 698 |
699 // Compile bar (many List objects allocated). | 699 // Compile bar (many List objects allocated). |
700 result = Dart_Invoke(lib, NewString("bar"), 0, NULL); | 700 result = Dart_Invoke(lib, NewString("bar"), 0, NULL); |
701 EXPECT_VALID(result); | 701 EXPECT_VALID(result); |
702 | 702 |
703 // Enable again. | 703 // Enable again. |
704 array_class.SetTraceAllocation(true); | 704 array_class.SetTraceAllocation(true); |
705 | 705 |
706 // Run bar. | 706 // Run bar. |
707 result = Dart_Invoke(lib, NewString("bar"), 0, NULL); | 707 result = Dart_Invoke(lib, NewString("bar"), 0, NULL); |
708 EXPECT_VALID(result); | 708 EXPECT_VALID(result); |
709 | 709 |
710 { | 710 { |
711 StackZone zone(isolate); | 711 StackZone zone(thread); |
712 HANDLESCOPE(isolate); | 712 HANDLESCOPE(thread); |
713 Profile profile(isolate); | 713 Profile profile(isolate); |
714 AllocationFilter filter(isolate, array_class.id()); | 714 AllocationFilter filter(isolate, array_class.id()); |
715 profile.Build(&filter, Profile::kNoTags); | 715 profile.Build(&filter, Profile::kNoTags); |
716 // We should still only have one allocation sample. | 716 // We should still only have one allocation sample. |
717 EXPECT_EQ(1, profile.sample_count()); | 717 EXPECT_EQ(1, profile.sample_count()); |
718 ProfileTrieWalker walker(&profile); | 718 ProfileTrieWalker walker(&profile); |
719 | 719 |
720 walker.Reset(Profile::kExclusiveCode); | 720 walker.Reset(Profile::kExclusiveCode); |
721 EXPECT(walker.Down()); | 721 EXPECT(walker.Down()); |
722 EXPECT_STREQ("_List._List", walker.CurrentName()); | 722 EXPECT_STREQ("_List._List", walker.CurrentName()); |
(...skipping 13 matching lines...) Expand all Loading... |
736 const char* kScript = | 736 const char* kScript = |
737 "var msg1 = 'a';\n" | 737 "var msg1 = 'a';\n" |
738 "foo() {\n" | 738 "foo() {\n" |
739 " var msg = msg1 + msg1;\n" | 739 " var msg = msg1 + msg1;\n" |
740 " return (x) { return '$msg + $msg'; }(msg);\n" | 740 " return (x) { return '$msg + $msg'; }(msg);\n" |
741 "}\n"; | 741 "}\n"; |
742 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 742 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
743 EXPECT_VALID(lib); | 743 EXPECT_VALID(lib); |
744 Library& root_library = Library::Handle(); | 744 Library& root_library = Library::Handle(); |
745 root_library ^= Api::UnwrapHandle(lib); | 745 root_library ^= Api::UnwrapHandle(lib); |
746 Isolate* isolate = Isolate::Current(); | 746 Isolate* isolate = thread->isolate(); |
747 | 747 |
748 const Class& context_class = | 748 const Class& context_class = |
749 Class::Handle(Object::context_class()); | 749 Class::Handle(Object::context_class()); |
750 EXPECT(!context_class.IsNull()); | 750 EXPECT(!context_class.IsNull()); |
751 | 751 |
752 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 752 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
753 EXPECT_VALID(result); | 753 EXPECT_VALID(result); |
754 | 754 |
755 { | 755 { |
756 StackZone zone(isolate); | 756 StackZone zone(thread); |
757 HANDLESCOPE(isolate); | 757 HANDLESCOPE(thread); |
758 Profile profile(isolate); | 758 Profile profile(isolate); |
759 AllocationFilter filter(isolate, context_class.id()); | 759 AllocationFilter filter(isolate, context_class.id()); |
760 profile.Build(&filter, Profile::kNoTags); | 760 profile.Build(&filter, Profile::kNoTags); |
761 // We should have no allocation samples. | 761 // We should have no allocation samples. |
762 EXPECT_EQ(0, profile.sample_count()); | 762 EXPECT_EQ(0, profile.sample_count()); |
763 } | 763 } |
764 | 764 |
765 context_class.SetTraceAllocation(true); | 765 context_class.SetTraceAllocation(true); |
766 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 766 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
767 EXPECT_VALID(result); | 767 EXPECT_VALID(result); |
768 | 768 |
769 { | 769 { |
770 StackZone zone(isolate); | 770 StackZone zone(thread); |
771 HANDLESCOPE(isolate); | 771 HANDLESCOPE(thread); |
772 Profile profile(isolate); | 772 Profile profile(isolate); |
773 AllocationFilter filter(isolate, context_class.id()); | 773 AllocationFilter filter(isolate, context_class.id()); |
774 profile.Build(&filter, Profile::kNoTags); | 774 profile.Build(&filter, Profile::kNoTags); |
775 // We should have one allocation sample. | 775 // We should have one allocation sample. |
776 EXPECT_EQ(1, profile.sample_count()); | 776 EXPECT_EQ(1, profile.sample_count()); |
777 ProfileTrieWalker walker(&profile); | 777 ProfileTrieWalker walker(&profile); |
778 | 778 |
779 walker.Reset(Profile::kExclusiveCode); | 779 walker.Reset(Profile::kExclusiveCode); |
780 EXPECT(walker.Down()); | 780 EXPECT(walker.Down()); |
781 EXPECT_STREQ("foo", walker.CurrentName()); | 781 EXPECT_STREQ("foo", walker.CurrentName()); |
782 EXPECT(!walker.Down()); | 782 EXPECT(!walker.Down()); |
783 } | 783 } |
784 | 784 |
785 context_class.SetTraceAllocation(false); | 785 context_class.SetTraceAllocation(false); |
786 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 786 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
787 EXPECT_VALID(result); | 787 EXPECT_VALID(result); |
788 | 788 |
789 { | 789 { |
790 StackZone zone(isolate); | 790 StackZone zone(thread); |
791 HANDLESCOPE(isolate); | 791 HANDLESCOPE(thread); |
792 Profile profile(isolate); | 792 Profile profile(isolate); |
793 AllocationFilter filter(isolate, context_class.id()); | 793 AllocationFilter filter(isolate, context_class.id()); |
794 profile.Build(&filter, Profile::kNoTags); | 794 profile.Build(&filter, Profile::kNoTags); |
795 // We should still only have one allocation sample. | 795 // We should still only have one allocation sample. |
796 EXPECT_EQ(1, profile.sample_count()); | 796 EXPECT_EQ(1, profile.sample_count()); |
797 } | 797 } |
798 } | 798 } |
799 | 799 |
800 | 800 |
801 TEST_CASE(Profiler_ClassAllocation) { | 801 TEST_CASE(Profiler_ClassAllocation) { |
802 DisableNativeProfileScope dnps; | 802 DisableNativeProfileScope dnps; |
803 const char* kScript = | 803 const char* kScript = |
804 "var msg1 = 'a';\n" | 804 "var msg1 = 'a';\n" |
805 "\n" | 805 "\n" |
806 "foo() {\n" | 806 "foo() {\n" |
807 " var msg = msg1 + msg1;\n" | 807 " var msg = msg1 + msg1;\n" |
808 " var msg2 = msg + msg;\n" | 808 " var msg2 = msg + msg;\n" |
809 " return (x, y, z, w) { return '$x + $y + $z'; }(msg, msg2, msg, msg);\n" | 809 " return (x, y, z, w) { return '$x + $y + $z'; }(msg, msg2, msg, msg);\n" |
810 "}\n" | 810 "}\n" |
811 "bar() {\n" | 811 "bar() {\n" |
812 " var msg = msg1 + msg1;\n" | 812 " var msg = msg1 + msg1;\n" |
813 " var msg2 = msg + msg;\n" | 813 " var msg2 = msg + msg;\n" |
814 " return (x, y) { return '$x + $y'; }(msg, msg2);\n" | 814 " return (x, y) { return '$x + $y'; }(msg, msg2);\n" |
815 "}\n"; | 815 "}\n"; |
816 | 816 |
817 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 817 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
818 EXPECT_VALID(lib); | 818 EXPECT_VALID(lib); |
819 Library& root_library = Library::Handle(); | 819 Library& root_library = Library::Handle(); |
820 root_library ^= Api::UnwrapHandle(lib); | 820 root_library ^= Api::UnwrapHandle(lib); |
821 Isolate* isolate = Isolate::Current(); | 821 Isolate* isolate = thread->isolate(); |
822 | 822 |
823 const Class& class_class = | 823 const Class& class_class = |
824 Class::Handle(Object::class_class()); | 824 Class::Handle(Object::class_class()); |
825 EXPECT(!class_class.IsNull()); | 825 EXPECT(!class_class.IsNull()); |
826 class_class.SetTraceAllocation(true); | 826 class_class.SetTraceAllocation(true); |
827 | 827 |
828 // Invoke "foo" which during compilation, triggers a closure class allocation. | 828 // Invoke "foo" which during compilation, triggers a closure class allocation. |
829 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 829 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
830 EXPECT_VALID(result); | 830 EXPECT_VALID(result); |
831 | 831 |
832 { | 832 { |
833 StackZone zone(isolate); | 833 StackZone zone(thread); |
834 HANDLESCOPE(isolate); | 834 HANDLESCOPE(thread); |
835 Profile profile(isolate); | 835 Profile profile(isolate); |
836 AllocationFilter filter(isolate, class_class.id()); | 836 AllocationFilter filter(isolate, class_class.id()); |
837 filter.set_enable_embedder_ticks(true); | 837 filter.set_enable_embedder_ticks(true); |
838 profile.Build(&filter, Profile::kNoTags); | 838 profile.Build(&filter, Profile::kNoTags); |
839 // We should have one allocation sample. | 839 // We should have one allocation sample. |
840 EXPECT_EQ(1, profile.sample_count()); | 840 EXPECT_EQ(1, profile.sample_count()); |
841 ProfileTrieWalker walker(&profile); | 841 ProfileTrieWalker walker(&profile); |
842 | 842 |
843 walker.Reset(Profile::kExclusiveCode); | 843 walker.Reset(Profile::kExclusiveCode); |
844 EXPECT(walker.Down()); | 844 EXPECT(walker.Down()); |
845 #if defined(TARGET_OS_WINDOWS) | 845 #if defined(TARGET_OS_WINDOWS) |
846 // TODO(johnmccutchan): Hookup native symbol resolver on Windows. | 846 // TODO(johnmccutchan): Hookup native symbol resolver on Windows. |
847 EXPECT_SUBSTRING("[Native]", walker.CurrentName()); | 847 EXPECT_SUBSTRING("[Native]", walker.CurrentName()); |
848 #else | 848 #else |
849 EXPECT_SUBSTRING("dart::Profiler::RecordAllocation", walker.CurrentName()); | 849 EXPECT_SUBSTRING("dart::Profiler::RecordAllocation", walker.CurrentName()); |
850 #endif | 850 #endif |
851 EXPECT(!walker.Down()); | 851 EXPECT(!walker.Down()); |
852 } | 852 } |
853 | 853 |
854 // Disable allocation tracing for Class. | 854 // Disable allocation tracing for Class. |
855 class_class.SetTraceAllocation(false); | 855 class_class.SetTraceAllocation(false); |
856 | 856 |
857 // Invoke "bar" which during compilation, triggers a closure class allocation. | 857 // Invoke "bar" which during compilation, triggers a closure class allocation. |
858 result = Dart_Invoke(lib, NewString("bar"), 0, NULL); | 858 result = Dart_Invoke(lib, NewString("bar"), 0, NULL); |
859 EXPECT_VALID(result); | 859 EXPECT_VALID(result); |
860 | 860 |
861 { | 861 { |
862 StackZone zone(isolate); | 862 StackZone zone(thread); |
863 HANDLESCOPE(isolate); | 863 HANDLESCOPE(thread); |
864 Profile profile(isolate); | 864 Profile profile(isolate); |
865 AllocationFilter filter(isolate, class_class.id()); | 865 AllocationFilter filter(isolate, class_class.id()); |
866 filter.set_enable_embedder_ticks(true); | 866 filter.set_enable_embedder_ticks(true); |
867 profile.Build(&filter, Profile::kNoTags); | 867 profile.Build(&filter, Profile::kNoTags); |
868 // We should still only have one allocation sample. | 868 // We should still only have one allocation sample. |
869 EXPECT_EQ(1, profile.sample_count()); | 869 EXPECT_EQ(1, profile.sample_count()); |
870 } | 870 } |
871 } | 871 } |
872 | 872 |
873 | 873 |
874 TEST_CASE(Profiler_TypedArrayAllocation) { | 874 TEST_CASE(Profiler_TypedArrayAllocation) { |
875 DisableNativeProfileScope dnps; | 875 DisableNativeProfileScope dnps; |
876 const char* kScript = | 876 const char* kScript = |
877 "import 'dart:typed_data';\n" | 877 "import 'dart:typed_data';\n" |
878 "List foo() => new Float32List(4);\n"; | 878 "List foo() => new Float32List(4);\n"; |
879 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 879 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
880 EXPECT_VALID(lib); | 880 EXPECT_VALID(lib); |
881 Library& root_library = Library::Handle(); | 881 Library& root_library = Library::Handle(); |
882 root_library ^= Api::UnwrapHandle(lib); | 882 root_library ^= Api::UnwrapHandle(lib); |
883 Isolate* isolate = Isolate::Current(); | 883 Isolate* isolate = thread->isolate(); |
884 | 884 |
885 const Library& typed_data_library = | 885 const Library& typed_data_library = |
886 Library::Handle(isolate->object_store()->typed_data_library()); | 886 Library::Handle(isolate->object_store()->typed_data_library()); |
887 | 887 |
888 const Class& float32_list_class = | 888 const Class& float32_list_class = |
889 Class::Handle(GetClass(typed_data_library, "_Float32Array")); | 889 Class::Handle(GetClass(typed_data_library, "_Float32Array")); |
890 EXPECT(!float32_list_class.IsNull()); | 890 EXPECT(!float32_list_class.IsNull()); |
891 | 891 |
892 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 892 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
893 EXPECT_VALID(result); | 893 EXPECT_VALID(result); |
894 | 894 |
895 { | 895 { |
896 StackZone zone(isolate); | 896 StackZone zone(thread); |
897 HANDLESCOPE(isolate); | 897 HANDLESCOPE(thread); |
898 Profile profile(isolate); | 898 Profile profile(isolate); |
899 AllocationFilter filter(isolate, float32_list_class.id()); | 899 AllocationFilter filter(isolate, float32_list_class.id()); |
900 profile.Build(&filter, Profile::kNoTags); | 900 profile.Build(&filter, Profile::kNoTags); |
901 // We should have no allocation samples. | 901 // We should have no allocation samples. |
902 EXPECT_EQ(0, profile.sample_count()); | 902 EXPECT_EQ(0, profile.sample_count()); |
903 } | 903 } |
904 | 904 |
905 float32_list_class.SetTraceAllocation(true); | 905 float32_list_class.SetTraceAllocation(true); |
906 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 906 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
907 EXPECT_VALID(result); | 907 EXPECT_VALID(result); |
908 | 908 |
909 { | 909 { |
910 StackZone zone(isolate); | 910 StackZone zone(thread); |
911 HANDLESCOPE(isolate); | 911 HANDLESCOPE(thread); |
912 Profile profile(isolate); | 912 Profile profile(isolate); |
913 AllocationFilter filter(isolate, float32_list_class.id()); | 913 AllocationFilter filter(isolate, float32_list_class.id()); |
914 profile.Build(&filter, Profile::kNoTags); | 914 profile.Build(&filter, Profile::kNoTags); |
915 // We should have one allocation sample. | 915 // We should have one allocation sample. |
916 EXPECT_EQ(1, profile.sample_count()); | 916 EXPECT_EQ(1, profile.sample_count()); |
917 ProfileTrieWalker walker(&profile); | 917 ProfileTrieWalker walker(&profile); |
918 | 918 |
919 walker.Reset(Profile::kExclusiveCode); | 919 walker.Reset(Profile::kExclusiveCode); |
920 EXPECT(walker.Down()); | 920 EXPECT(walker.Down()); |
921 EXPECT_STREQ("_Float32Array._new", walker.CurrentName()); | 921 EXPECT_STREQ("_Float32Array._new", walker.CurrentName()); |
922 EXPECT(walker.Down()); | 922 EXPECT(walker.Down()); |
923 EXPECT_STREQ("_Float32Array._Float32Array", walker.CurrentName()); | 923 EXPECT_STREQ("_Float32Array._Float32Array", walker.CurrentName()); |
924 EXPECT(walker.Down()); | 924 EXPECT(walker.Down()); |
925 EXPECT_STREQ("Float32List.Float32List", walker.CurrentName()); | 925 EXPECT_STREQ("Float32List.Float32List", walker.CurrentName()); |
926 EXPECT(walker.Down()); | 926 EXPECT(walker.Down()); |
927 EXPECT_STREQ("foo", walker.CurrentName()); | 927 EXPECT_STREQ("foo", walker.CurrentName()); |
928 EXPECT(!walker.Down()); | 928 EXPECT(!walker.Down()); |
929 } | 929 } |
930 | 930 |
931 float32_list_class.SetTraceAllocation(false); | 931 float32_list_class.SetTraceAllocation(false); |
932 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 932 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
933 EXPECT_VALID(result); | 933 EXPECT_VALID(result); |
934 | 934 |
935 { | 935 { |
936 StackZone zone(isolate); | 936 StackZone zone(thread); |
937 HANDLESCOPE(isolate); | 937 HANDLESCOPE(thread); |
938 Profile profile(isolate); | 938 Profile profile(isolate); |
939 AllocationFilter filter(isolate, float32_list_class.id()); | 939 AllocationFilter filter(isolate, float32_list_class.id()); |
940 profile.Build(&filter, Profile::kNoTags); | 940 profile.Build(&filter, Profile::kNoTags); |
941 // We should still only have one allocation sample. | 941 // We should still only have one allocation sample. |
942 EXPECT_EQ(1, profile.sample_count()); | 942 EXPECT_EQ(1, profile.sample_count()); |
943 } | 943 } |
944 | 944 |
945 float32_list_class.SetTraceAllocation(true); | 945 float32_list_class.SetTraceAllocation(true); |
946 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 946 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
947 EXPECT_VALID(result); | 947 EXPECT_VALID(result); |
948 | 948 |
949 { | 949 { |
950 StackZone zone(isolate); | 950 StackZone zone(thread); |
951 HANDLESCOPE(isolate); | 951 HANDLESCOPE(thread); |
952 Profile profile(isolate); | 952 Profile profile(isolate); |
953 AllocationFilter filter(isolate, float32_list_class.id()); | 953 AllocationFilter filter(isolate, float32_list_class.id()); |
954 profile.Build(&filter, Profile::kNoTags); | 954 profile.Build(&filter, Profile::kNoTags); |
955 // We should now have two allocation samples. | 955 // We should now have two allocation samples. |
956 EXPECT_EQ(2, profile.sample_count()); | 956 EXPECT_EQ(2, profile.sample_count()); |
957 } | 957 } |
958 } | 958 } |
959 | 959 |
960 | 960 |
961 TEST_CASE(Profiler_StringAllocation) { | 961 TEST_CASE(Profiler_StringAllocation) { |
962 DisableNativeProfileScope dnps; | 962 DisableNativeProfileScope dnps; |
963 const char* kScript = "String foo(String a, String b) => a + b;"; | 963 const char* kScript = "String foo(String a, String b) => a + b;"; |
964 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 964 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
965 EXPECT_VALID(lib); | 965 EXPECT_VALID(lib); |
966 Library& root_library = Library::Handle(); | 966 Library& root_library = Library::Handle(); |
967 root_library ^= Api::UnwrapHandle(lib); | 967 root_library ^= Api::UnwrapHandle(lib); |
968 Isolate* isolate = Isolate::Current(); | 968 Isolate* isolate = thread->isolate(); |
969 | 969 |
970 const Class& one_byte_string_class = | 970 const Class& one_byte_string_class = |
971 Class::Handle(isolate->object_store()->one_byte_string_class()); | 971 Class::Handle(isolate->object_store()->one_byte_string_class()); |
972 EXPECT(!one_byte_string_class.IsNull()); | 972 EXPECT(!one_byte_string_class.IsNull()); |
973 | 973 |
974 Dart_Handle args[2] = { NewString("a"), NewString("b"), }; | 974 Dart_Handle args[2] = { NewString("a"), NewString("b"), }; |
975 | 975 |
976 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 976 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
977 EXPECT_VALID(result); | 977 EXPECT_VALID(result); |
978 | 978 |
979 { | 979 { |
980 StackZone zone(isolate); | 980 StackZone zone(thread); |
981 HANDLESCOPE(isolate); | 981 HANDLESCOPE(thread); |
982 Profile profile(isolate); | 982 Profile profile(isolate); |
983 AllocationFilter filter(isolate, one_byte_string_class.id()); | 983 AllocationFilter filter(isolate, one_byte_string_class.id()); |
984 profile.Build(&filter, Profile::kNoTags); | 984 profile.Build(&filter, Profile::kNoTags); |
985 // We should have no allocation samples. | 985 // We should have no allocation samples. |
986 EXPECT_EQ(0, profile.sample_count()); | 986 EXPECT_EQ(0, profile.sample_count()); |
987 } | 987 } |
988 | 988 |
989 one_byte_string_class.SetTraceAllocation(true); | 989 one_byte_string_class.SetTraceAllocation(true); |
990 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 990 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
991 EXPECT_VALID(result); | 991 EXPECT_VALID(result); |
992 | 992 |
993 { | 993 { |
994 StackZone zone(isolate); | 994 StackZone zone(thread); |
995 HANDLESCOPE(isolate); | 995 HANDLESCOPE(thread); |
996 Profile profile(isolate); | 996 Profile profile(isolate); |
997 AllocationFilter filter(isolate, one_byte_string_class.id()); | 997 AllocationFilter filter(isolate, one_byte_string_class.id()); |
998 profile.Build(&filter, Profile::kNoTags); | 998 profile.Build(&filter, Profile::kNoTags); |
999 // We should still only have one allocation sample. | 999 // We should still only have one allocation sample. |
1000 EXPECT_EQ(1, profile.sample_count()); | 1000 EXPECT_EQ(1, profile.sample_count()); |
1001 ProfileTrieWalker walker(&profile); | 1001 ProfileTrieWalker walker(&profile); |
1002 | 1002 |
1003 walker.Reset(Profile::kExclusiveCode); | 1003 walker.Reset(Profile::kExclusiveCode); |
1004 EXPECT(walker.Down()); | 1004 EXPECT(walker.Down()); |
1005 EXPECT_STREQ("_StringBase.+", walker.CurrentName()); | 1005 EXPECT_STREQ("_StringBase.+", walker.CurrentName()); |
1006 EXPECT(walker.Down()); | 1006 EXPECT(walker.Down()); |
1007 EXPECT_STREQ("foo", walker.CurrentName()); | 1007 EXPECT_STREQ("foo", walker.CurrentName()); |
1008 EXPECT(!walker.Down()); | 1008 EXPECT(!walker.Down()); |
1009 } | 1009 } |
1010 | 1010 |
1011 one_byte_string_class.SetTraceAllocation(false); | 1011 one_byte_string_class.SetTraceAllocation(false); |
1012 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 1012 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
1013 EXPECT_VALID(result); | 1013 EXPECT_VALID(result); |
1014 | 1014 |
1015 { | 1015 { |
1016 StackZone zone(isolate); | 1016 StackZone zone(thread); |
1017 HANDLESCOPE(isolate); | 1017 HANDLESCOPE(thread); |
1018 Profile profile(isolate); | 1018 Profile profile(isolate); |
1019 AllocationFilter filter(isolate, one_byte_string_class.id()); | 1019 AllocationFilter filter(isolate, one_byte_string_class.id()); |
1020 profile.Build(&filter, Profile::kNoTags); | 1020 profile.Build(&filter, Profile::kNoTags); |
1021 // We should still only have one allocation sample. | 1021 // We should still only have one allocation sample. |
1022 EXPECT_EQ(1, profile.sample_count()); | 1022 EXPECT_EQ(1, profile.sample_count()); |
1023 } | 1023 } |
1024 | 1024 |
1025 one_byte_string_class.SetTraceAllocation(true); | 1025 one_byte_string_class.SetTraceAllocation(true); |
1026 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 1026 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
1027 EXPECT_VALID(result); | 1027 EXPECT_VALID(result); |
1028 | 1028 |
1029 { | 1029 { |
1030 StackZone zone(isolate); | 1030 StackZone zone(thread); |
1031 HANDLESCOPE(isolate); | 1031 HANDLESCOPE(thread); |
1032 Profile profile(isolate); | 1032 Profile profile(isolate); |
1033 AllocationFilter filter(isolate, one_byte_string_class.id()); | 1033 AllocationFilter filter(isolate, one_byte_string_class.id()); |
1034 profile.Build(&filter, Profile::kNoTags); | 1034 profile.Build(&filter, Profile::kNoTags); |
1035 // We should now have two allocation samples. | 1035 // We should now have two allocation samples. |
1036 EXPECT_EQ(2, profile.sample_count()); | 1036 EXPECT_EQ(2, profile.sample_count()); |
1037 } | 1037 } |
1038 } | 1038 } |
1039 | 1039 |
1040 | 1040 |
1041 TEST_CASE(Profiler_StringInterpolation) { | 1041 TEST_CASE(Profiler_StringInterpolation) { |
1042 DisableNativeProfileScope dnps; | 1042 DisableNativeProfileScope dnps; |
1043 const char* kScript = "String foo(String a, String b) => '$a | $b';"; | 1043 const char* kScript = "String foo(String a, String b) => '$a | $b';"; |
1044 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 1044 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
1045 EXPECT_VALID(lib); | 1045 EXPECT_VALID(lib); |
1046 Library& root_library = Library::Handle(); | 1046 Library& root_library = Library::Handle(); |
1047 root_library ^= Api::UnwrapHandle(lib); | 1047 root_library ^= Api::UnwrapHandle(lib); |
1048 Isolate* isolate = Isolate::Current(); | 1048 Isolate* isolate = thread->isolate(); |
1049 | 1049 |
1050 const Class& one_byte_string_class = | 1050 const Class& one_byte_string_class = |
1051 Class::Handle(isolate->object_store()->one_byte_string_class()); | 1051 Class::Handle(isolate->object_store()->one_byte_string_class()); |
1052 EXPECT(!one_byte_string_class.IsNull()); | 1052 EXPECT(!one_byte_string_class.IsNull()); |
1053 | 1053 |
1054 Dart_Handle args[2] = { NewString("a"), NewString("b"), }; | 1054 Dart_Handle args[2] = { NewString("a"), NewString("b"), }; |
1055 | 1055 |
1056 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 1056 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
1057 EXPECT_VALID(result); | 1057 EXPECT_VALID(result); |
1058 | 1058 |
1059 { | 1059 { |
1060 StackZone zone(isolate); | 1060 StackZone zone(thread); |
1061 HANDLESCOPE(isolate); | 1061 HANDLESCOPE(thread); |
1062 Profile profile(isolate); | 1062 Profile profile(isolate); |
1063 AllocationFilter filter(isolate, one_byte_string_class.id()); | 1063 AllocationFilter filter(isolate, one_byte_string_class.id()); |
1064 profile.Build(&filter, Profile::kNoTags); | 1064 profile.Build(&filter, Profile::kNoTags); |
1065 // We should have no allocation samples. | 1065 // We should have no allocation samples. |
1066 EXPECT_EQ(0, profile.sample_count()); | 1066 EXPECT_EQ(0, profile.sample_count()); |
1067 } | 1067 } |
1068 | 1068 |
1069 one_byte_string_class.SetTraceAllocation(true); | 1069 one_byte_string_class.SetTraceAllocation(true); |
1070 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 1070 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
1071 EXPECT_VALID(result); | 1071 EXPECT_VALID(result); |
1072 | 1072 |
1073 { | 1073 { |
1074 StackZone zone(isolate); | 1074 StackZone zone(thread); |
1075 HANDLESCOPE(isolate); | 1075 HANDLESCOPE(thread); |
1076 Profile profile(isolate); | 1076 Profile profile(isolate); |
1077 AllocationFilter filter(isolate, one_byte_string_class.id()); | 1077 AllocationFilter filter(isolate, one_byte_string_class.id()); |
1078 profile.Build(&filter, Profile::kNoTags); | 1078 profile.Build(&filter, Profile::kNoTags); |
1079 // We should still only have one allocation sample. | 1079 // We should still only have one allocation sample. |
1080 EXPECT_EQ(1, profile.sample_count()); | 1080 EXPECT_EQ(1, profile.sample_count()); |
1081 ProfileTrieWalker walker(&profile); | 1081 ProfileTrieWalker walker(&profile); |
1082 | 1082 |
1083 walker.Reset(Profile::kExclusiveCode); | 1083 walker.Reset(Profile::kExclusiveCode); |
1084 EXPECT(walker.Down()); | 1084 EXPECT(walker.Down()); |
1085 EXPECT_STREQ("_OneByteString._allocate", walker.CurrentName()); | 1085 EXPECT_STREQ("_OneByteString._allocate", walker.CurrentName()); |
1086 EXPECT(walker.Down()); | 1086 EXPECT(walker.Down()); |
1087 EXPECT_STREQ("_OneByteString._concatAll", walker.CurrentName()); | 1087 EXPECT_STREQ("_OneByteString._concatAll", walker.CurrentName()); |
1088 EXPECT(walker.Down()); | 1088 EXPECT(walker.Down()); |
1089 EXPECT_STREQ("_StringBase._interpolate", walker.CurrentName()); | 1089 EXPECT_STREQ("_StringBase._interpolate", walker.CurrentName()); |
1090 EXPECT(walker.Down()); | 1090 EXPECT(walker.Down()); |
1091 EXPECT_STREQ("foo", walker.CurrentName()); | 1091 EXPECT_STREQ("foo", walker.CurrentName()); |
1092 EXPECT(!walker.Down()); | 1092 EXPECT(!walker.Down()); |
1093 } | 1093 } |
1094 | 1094 |
1095 one_byte_string_class.SetTraceAllocation(false); | 1095 one_byte_string_class.SetTraceAllocation(false); |
1096 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 1096 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
1097 EXPECT_VALID(result); | 1097 EXPECT_VALID(result); |
1098 | 1098 |
1099 { | 1099 { |
1100 StackZone zone(isolate); | 1100 StackZone zone(thread); |
1101 HANDLESCOPE(isolate); | 1101 HANDLESCOPE(thread); |
1102 Profile profile(isolate); | 1102 Profile profile(isolate); |
1103 AllocationFilter filter(isolate, one_byte_string_class.id()); | 1103 AllocationFilter filter(isolate, one_byte_string_class.id()); |
1104 profile.Build(&filter, Profile::kNoTags); | 1104 profile.Build(&filter, Profile::kNoTags); |
1105 // We should still only have one allocation sample. | 1105 // We should still only have one allocation sample. |
1106 EXPECT_EQ(1, profile.sample_count()); | 1106 EXPECT_EQ(1, profile.sample_count()); |
1107 } | 1107 } |
1108 | 1108 |
1109 one_byte_string_class.SetTraceAllocation(true); | 1109 one_byte_string_class.SetTraceAllocation(true); |
1110 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 1110 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
1111 EXPECT_VALID(result); | 1111 EXPECT_VALID(result); |
1112 | 1112 |
1113 { | 1113 { |
1114 StackZone zone(isolate); | 1114 StackZone zone(thread); |
1115 HANDLESCOPE(isolate); | 1115 HANDLESCOPE(thread); |
1116 Profile profile(isolate); | 1116 Profile profile(isolate); |
1117 AllocationFilter filter(isolate, one_byte_string_class.id()); | 1117 AllocationFilter filter(isolate, one_byte_string_class.id()); |
1118 profile.Build(&filter, Profile::kNoTags); | 1118 profile.Build(&filter, Profile::kNoTags); |
1119 // We should now have two allocation samples. | 1119 // We should now have two allocation samples. |
1120 EXPECT_EQ(2, profile.sample_count()); | 1120 EXPECT_EQ(2, profile.sample_count()); |
1121 } | 1121 } |
1122 } | 1122 } |
1123 | 1123 |
1124 | 1124 |
1125 TEST_CASE(Profiler_FunctionInline) { | 1125 TEST_CASE(Profiler_FunctionInline) { |
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1472 EXPECT(walker.Down()); | 1472 EXPECT(walker.Down()); |
1473 EXPECT_STREQ("go", walker.CurrentName()); | 1473 EXPECT_STREQ("go", walker.CurrentName()); |
1474 EXPECT(walker.Down()); | 1474 EXPECT(walker.Down()); |
1475 EXPECT_STREQ("main", walker.CurrentName()); | 1475 EXPECT_STREQ("main", walker.CurrentName()); |
1476 EXPECT(!walker.Down()); | 1476 EXPECT(!walker.Down()); |
1477 } | 1477 } |
1478 } | 1478 } |
1479 | 1479 |
1480 } // namespace dart | 1480 } // namespace dart |
1481 | 1481 |
OLD | NEW |