OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
8 #include "src/interpreter/bytecode-array-iterator.h" | 8 #include "src/interpreter/bytecode-array-iterator.h" |
9 #include "src/interpreter/bytecode-generator.h" | 9 #include "src/interpreter/bytecode-generator.h" |
10 #include "src/interpreter/interpreter.h" | 10 #include "src/interpreter/interpreter.h" |
(...skipping 712 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
723 FeedbackVectorSlot slot1 = feedback_spec.AddLoadICSlot(); | 723 FeedbackVectorSlot slot1 = feedback_spec.AddLoadICSlot(); |
724 FeedbackVectorSlot slot2 = feedback_spec.AddLoadICSlot(); | 724 FeedbackVectorSlot slot2 = feedback_spec.AddLoadICSlot(); |
725 | 725 |
726 Handle<i::TypeFeedbackVector> vector = | 726 Handle<i::TypeFeedbackVector> vector = |
727 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); | 727 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); |
728 | 728 |
729 ExpectedSnippet<const char*> snippets[] = { | 729 ExpectedSnippet<const char*> snippets[] = { |
730 {"function f(a) { return a.name; }\nf({name : \"test\"})", | 730 {"function f(a) { return a.name; }\nf({name : \"test\"})", |
731 0, | 731 0, |
732 2, | 732 2, |
733 6, | 733 5, |
734 { | 734 { |
735 B(LdaConstant), U8(0), // | 735 B(LoadICSloppy), A(1, 2), U8(0), U8(vector->GetIndex(slot1)), // |
736 B(LoadICSloppy), A(1, 2), U8(vector->GetIndex(slot1)), // | 736 B(Return), // |
737 B(Return), // | |
738 }, | 737 }, |
739 1, | 738 1, |
740 {"name"}}, | 739 {"name"}}, |
741 {"function f(a) { return a[\"key\"]; }\nf({key : \"test\"})", | 740 {"function f(a) { return a[\"key\"]; }\nf({key : \"test\"})", |
742 0, | 741 0, |
743 2, | 742 2, |
744 6, | 743 5, |
745 { | 744 { |
746 B(LdaConstant), U8(0), // | 745 B(LoadICSloppy), A(1, 2), U8(0), U8(vector->GetIndex(slot1)), // |
747 B(LoadICSloppy), A(1, 2), U8(vector->GetIndex(slot1)), // | 746 B(Return) // |
748 B(Return) // | |
749 }, | 747 }, |
750 1, | 748 1, |
751 {"key"}}, | 749 {"key"}}, |
752 {"function f(a) { return a[100]; }\nf({100 : \"test\"})", | 750 {"function f(a) { return a[100]; }\nf({100 : \"test\"})", |
753 0, | 751 0, |
754 2, | 752 2, |
755 6, | 753 6, |
756 { | 754 { |
757 B(LdaSmi8), U8(100), // | 755 B(LdaSmi8), U8(100), // |
758 B(KeyedLoadICSloppy), A(1, 2), U8(vector->GetIndex(slot1)), // | 756 B(KeyedLoadICSloppy), A(1, 2), U8(vector->GetIndex(slot1)), // |
759 B(Return) // | 757 B(Return) // |
760 }, | 758 }, |
761 0}, | 759 0}, |
762 {"function f(a, b) { return a[b]; }\nf({arg : \"test\"}, \"arg\")", | 760 {"function f(a, b) { return a[b]; }\nf({arg : \"test\"}, \"arg\")", |
763 0, | 761 0, |
764 3, | 762 3, |
765 6, | 763 6, |
766 { | 764 { |
767 B(Ldar), A(1, 2), // | 765 B(Ldar), A(1, 2), // |
768 B(KeyedLoadICSloppy), A(1, 3), U8(vector->GetIndex(slot1)), // | 766 B(KeyedLoadICSloppy), A(1, 3), U8(vector->GetIndex(slot1)), // |
769 B(Return) // | 767 B(Return) // |
770 }, | 768 }, |
771 0}, | 769 0}, |
772 {"function f(a) { var b = a.name; return a[-124]; }\n" | 770 {"function f(a) { var b = a.name; return a[-124]; }\n" |
773 "f({\"-124\" : \"test\", name : 123 })", | 771 "f({\"-124\" : \"test\", name : 123 })", |
774 kPointerSize, | 772 kPointerSize, |
775 2, | 773 2, |
776 13, | 774 12, |
777 { | 775 { |
778 B(LdaConstant), U8(0), // | 776 B(LoadICSloppy), A(1, 2), U8(0), U8(vector->GetIndex(slot1)), // |
779 B(LoadICSloppy), A(1, 2), U8(vector->GetIndex(slot1)), // | 777 B(Star), R(0), // |
780 B(Star), R(0), // | 778 B(LdaSmi8), U8(-124), // |
781 B(LdaSmi8), U8(-124), // | 779 B(KeyedLoadICSloppy), A(1, 2), U8(vector->GetIndex(slot2)), // |
782 B(KeyedLoadICSloppy), A(1, 2), U8(vector->GetIndex(slot2)), // | 780 B(Return), // |
783 B(Return), // | |
784 }, | 781 }, |
785 1, | 782 1, |
786 {"name"}}, | 783 {"name"}}, |
787 {"function f(a) { \"use strict\"; return a.name; }\nf({name : \"test\"})", | 784 {"function f(a) { \"use strict\"; return a.name; }\nf({name : \"test\"})", |
788 0, | 785 0, |
789 2, | 786 2, |
790 6, | 787 5, |
791 { | 788 { |
792 B(LdaConstant), U8(0), // | 789 B(LoadICStrict), A(1, 2), U8(0), U8(vector->GetIndex(slot1)), // |
793 B(LoadICStrict), A(1, 2), U8(vector->GetIndex(slot1)), // | 790 B(Return), // |
794 B(Return), // | |
795 }, | 791 }, |
796 1, | 792 1, |
797 {"name"}}, | 793 {"name"}}, |
798 {"function f(a, b) { \"use strict\"; return a[b]; }\n" | 794 { |
799 "f({arg : \"test\"}, \"arg\")", | 795 "function f(a, b) { \"use strict\"; return a[b]; }\n" |
800 0, | 796 "f({arg : \"test\"}, \"arg\")", |
801 3, | 797 0, |
802 6, | 798 3, |
803 { | 799 6, |
804 B(Ldar), A(2, 3), // | 800 { |
805 B(KeyedLoadICStrict), A(1, 3), U8(vector->GetIndex(slot1)), // | 801 B(Ldar), A(2, 3), // |
806 B(Return), // | 802 B(KeyedLoadICStrict), A(1, 3), U8(vector->GetIndex(slot1)), // |
807 }, | 803 B(Return), // |
808 0, | 804 }, |
809 }}; | 805 0, |
| 806 }}; |
810 for (size_t i = 0; i < arraysize(snippets); i++) { | 807 for (size_t i = 0; i < arraysize(snippets); i++) { |
811 Handle<BytecodeArray> bytecode_array = | 808 Handle<BytecodeArray> bytecode_array = |
812 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); | 809 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); |
813 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 810 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
814 } | 811 } |
815 } | 812 } |
816 | 813 |
817 | 814 |
818 TEST(PropertyStores) { | 815 TEST(PropertyStores) { |
819 InitializedHandleScope handle_scope; | 816 InitializedHandleScope handle_scope; |
820 BytecodeGeneratorHelper helper; | 817 BytecodeGeneratorHelper helper; |
821 Zone zone; | 818 Zone zone; |
822 | 819 |
823 FeedbackVectorSpec feedback_spec(&zone); | 820 FeedbackVectorSpec feedback_spec(&zone); |
824 FeedbackVectorSlot slot1 = feedback_spec.AddStoreICSlot(); | 821 FeedbackVectorSlot slot1 = feedback_spec.AddStoreICSlot(); |
825 FeedbackVectorSlot slot2 = feedback_spec.AddStoreICSlot(); | 822 FeedbackVectorSlot slot2 = feedback_spec.AddStoreICSlot(); |
826 | 823 |
827 Handle<i::TypeFeedbackVector> vector = | 824 Handle<i::TypeFeedbackVector> vector = |
828 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); | 825 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); |
829 | 826 |
830 ExpectedSnippet<const char*> snippets[] = { | 827 ExpectedSnippet<const char*> snippets[] = { |
831 {"function f(a) { a.name = \"val\"; }\nf({name : \"test\"})", | 828 {"function f(a) { a.name = \"val\"; }\nf({name : \"test\"})", |
832 kPointerSize, | 829 0, |
833 2, | 830 2, |
834 12, | 831 8, |
835 { | 832 { |
836 B(LdaConstant), U8(0), // | 833 B(LdaConstant), U8(1), // |
837 B(Star), R(0), // | 834 B(StoreICSloppy), A(1, 2), U8(0), U8(vector->GetIndex(slot1)), // |
838 B(LdaConstant), U8(1), // | 835 B(LdaUndefined), // |
839 B(StoreICSloppy), A(1, 2), R(0), U8(vector->GetIndex(slot1)), // | 836 B(Return), // |
840 B(LdaUndefined), // | |
841 B(Return), // | |
842 }, | 837 }, |
843 2, | 838 2, |
844 {"name", "val"}}, | 839 {"name", "val"}}, |
845 {"function f(a) { a[\"key\"] = \"val\"; }\nf({key : \"test\"})", | 840 {"function f(a) { a[\"key\"] = \"val\"; }\nf({key : \"test\"})", |
846 kPointerSize, | 841 0, |
847 2, | 842 2, |
848 12, | 843 8, |
849 { | 844 { |
850 B(LdaConstant), U8(0), // | 845 B(LdaConstant), U8(1), // |
851 B(Star), R(0), // | 846 B(StoreICSloppy), A(1, 2), U8(0), U8(vector->GetIndex(slot1)), // |
852 B(LdaConstant), U8(1), // | 847 B(LdaUndefined), // |
853 B(StoreICSloppy), A(1, 2), R(0), U8(vector->GetIndex(slot1)), // | 848 B(Return), // |
854 B(LdaUndefined), // | |
855 B(Return), // | |
856 }, | 849 }, |
857 2, | 850 2, |
858 {"key", "val"}}, | 851 {"key", "val"}}, |
859 {"function f(a) { a[100] = \"val\"; }\nf({100 : \"test\"})", | 852 {"function f(a) { a[100] = \"val\"; }\nf({100 : \"test\"})", |
860 kPointerSize, | 853 kPointerSize, |
861 2, | 854 2, |
862 12, | 855 12, |
863 { | 856 { |
864 B(LdaSmi8), U8(100), // | 857 B(LdaSmi8), U8(100), // |
865 B(Star), R(0), // | 858 B(Star), R(0), // |
866 B(LdaConstant), U8(0), // | 859 B(LdaConstant), U8(0), // |
867 B(KeyedStoreICSloppy), // | 860 B(KeyedStoreICSloppy), A(1, 2), R(0), // |
868 A(1, 2), R(0), U8(vector->GetIndex(slot1)), // | 861 U8(vector->GetIndex(slot1)), // |
869 B(LdaUndefined), // | 862 B(LdaUndefined), // |
870 B(Return), // | 863 B(Return), // |
871 }, | 864 }, |
872 1, | 865 1, |
873 {"val"}}, | 866 {"val"}}, |
874 {"function f(a, b) { a[b] = \"val\"; }\nf({arg : \"test\"}, \"arg\")", | 867 {"function f(a, b) { a[b] = \"val\"; }\nf({arg : \"test\"}, \"arg\")", |
875 0, | 868 0, |
876 3, | 869 3, |
877 8, | 870 8, |
878 { | 871 { |
879 B(LdaConstant), U8(0), // | 872 B(LdaConstant), U8(0), // |
880 B(KeyedStoreICSloppy), // | 873 B(KeyedStoreICSloppy), A(1, 3), A(2, 3), // |
881 A(1, 3), A(2, 3), U8(vector->GetIndex(slot1)), // | 874 U8(vector->GetIndex(slot1)), // |
882 B(LdaUndefined), // | 875 B(LdaUndefined), // |
883 B(Return), // | 876 B(Return), // |
884 }, | 877 }, |
885 1, | 878 1, |
886 {"val"}}, | 879 {"val"}}, |
887 {"function f(a) { a.name = a[-124]; }\n" | 880 {"function f(a) { a.name = a[-124]; }\n" |
888 "f({\"-124\" : \"test\", name : 123 })", | 881 "f({\"-124\" : \"test\", name : 123 })", |
889 kPointerSize, | 882 0, |
890 2, | 883 2, |
891 15, | 884 11, |
892 { | 885 { |
893 B(LdaConstant), U8(0), // | 886 B(LdaSmi8), U8(-124), // |
894 B(Star), R(0), // | 887 B(KeyedLoadICSloppy), A(1, 2), U8(vector->GetIndex(slot1)), // |
895 B(LdaSmi8), U8(-124), // | 888 B(StoreICSloppy), A(1, 2), U8(0), U8(vector->GetIndex(slot2)), // |
896 B(KeyedLoadICSloppy), A(1, 2), U8(vector->GetIndex(slot1)), // | 889 B(LdaUndefined), // |
897 B(StoreICSloppy), A(1, 2), R(0), U8(vector->GetIndex(slot2)), // | 890 B(Return), // |
898 B(LdaUndefined), // | |
899 B(Return), // | |
900 }, | 891 }, |
901 1, | 892 1, |
902 {"name"}}, | 893 {"name"}}, |
903 {"function f(a) { \"use strict\"; a.name = \"val\"; }\n" | 894 {"function f(a) { \"use strict\"; a.name = \"val\"; }\n" |
904 "f({name : \"test\"})", | 895 "f({name : \"test\"})", |
905 kPointerSize, | 896 0, |
906 2, | 897 2, |
907 12, | 898 8, |
908 { | 899 { |
909 B(LdaConstant), U8(0), // | 900 B(LdaConstant), U8(1), // |
910 B(Star), R(0), // | 901 B(StoreICStrict), A(1, 2), U8(0), U8(vector->GetIndex(slot1)), // |
911 B(LdaConstant), U8(1), // | 902 B(LdaUndefined), // |
912 B(StoreICStrict), A(1, 2), R(0), U8(vector->GetIndex(slot1)), // | 903 B(Return), // |
913 B(LdaUndefined), // | |
914 B(Return), // | |
915 }, | 904 }, |
916 2, | 905 2, |
917 {"name", "val"}}, | 906 {"name", "val"}}, |
918 {"function f(a, b) { \"use strict\"; a[b] = \"val\"; }\n" | 907 {"function f(a, b) { \"use strict\"; a[b] = \"val\"; }\n" |
919 "f({arg : \"test\"}, \"arg\")", | 908 "f({arg : \"test\"}, \"arg\")", |
920 0, | 909 0, |
921 3, | 910 3, |
922 8, | 911 8, |
923 { | 912 { |
924 B(LdaConstant), U8(0), // | 913 B(LdaConstant), U8(0), // |
(...skipping 25 matching lines...) Expand all Loading... |
950 FeedbackVectorSlot slot2 = feedback_spec.AddLoadICSlot(); | 939 FeedbackVectorSlot slot2 = feedback_spec.AddLoadICSlot(); |
951 USE(slot1); | 940 USE(slot1); |
952 | 941 |
953 Handle<i::TypeFeedbackVector> vector = | 942 Handle<i::TypeFeedbackVector> vector = |
954 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); | 943 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); |
955 | 944 |
956 ExpectedSnippet<const char*> snippets[] = { | 945 ExpectedSnippet<const char*> snippets[] = { |
957 {"function f(a) { return a.func(); }\nf(" FUNC_ARG ")", | 946 {"function f(a) { return a.func(); }\nf(" FUNC_ARG ")", |
958 2 * kPointerSize, | 947 2 * kPointerSize, |
959 2, | 948 2, |
960 16, | 949 15, |
961 { | 950 { |
962 B(Ldar), A(1, 2), // | 951 B(Ldar), A(1, 2), // |
963 B(Star), R(1), // | 952 B(Star), R(1), // |
964 B(LdaConstant), U8(0), // | 953 B(LoadICSloppy), R(1), U8(0), U8(vector->GetIndex(slot2)), // |
965 B(LoadICSloppy), R(1), U8(vector->GetIndex(slot2)), // | 954 B(Star), R(0), // |
966 B(Star), R(0), // | 955 B(Call), R(0), R(1), U8(0), // |
967 B(Call), R(0), R(1), U8(0), // | 956 B(Return), // |
968 B(Return), // | |
969 }, | 957 }, |
970 1, | 958 1, |
971 {"func"}}, | 959 {"func"}}, |
972 {"function f(a, b, c) { return a.func(b, c); }\nf(" FUNC_ARG ", 1, 2)", | 960 {"function f(a, b, c) { return a.func(b, c); }\nf(" FUNC_ARG ", 1, 2)", |
973 4 * kPointerSize, | 961 4 * kPointerSize, |
974 4, | 962 4, |
975 24, | 963 23, |
976 { | 964 { |
977 B(Ldar), A(1, 4), // | 965 B(Ldar), A(1, 4), // |
978 B(Star), R(1), // | 966 B(Star), R(1), // |
979 B(LdaConstant), U8(0), // | 967 B(LoadICSloppy), R(1), U8(0), U8(vector->GetIndex(slot2)), // |
980 B(LoadICSloppy), R(1), U8(vector->GetIndex(slot2)), // | 968 B(Star), R(0), // |
981 B(Star), R(0), // | 969 B(Ldar), A(2, 4), // |
982 B(Ldar), A(2, 4), // | 970 B(Star), R(2), // |
983 B(Star), R(2), // | 971 B(Ldar), A(3, 4), // |
984 B(Ldar), A(3, 4), // | 972 B(Star), R(3), // |
985 B(Star), R(3), // | 973 B(Call), R(0), R(1), U8(2), // |
986 B(Call), R(0), R(1), U8(2), // | 974 B(Return) // |
987 B(Return) // | |
988 }, | 975 }, |
989 1, | 976 1, |
990 {"func"}}, | 977 {"func"}}, |
991 {"function f(a, b) { return a.func(b + b, b); }\nf(" FUNC_ARG ", 1)", | 978 {"function f(a, b) { return a.func(b + b, b); }\nf(" FUNC_ARG ", 1)", |
992 4 * kPointerSize, | 979 4 * kPointerSize, |
993 3, | 980 3, |
994 26, | 981 25, |
995 { | 982 { |
996 B(Ldar), A(1, 3), // | 983 B(Ldar), A(1, 3), // |
997 B(Star), R(1), // | 984 B(Star), R(1), // |
998 B(LdaConstant), U8(0), // | 985 B(LoadICSloppy), R(1), U8(0), U8(vector->GetIndex(slot2)), // |
999 B(LoadICSloppy), R(1), U8(vector->GetIndex(slot2)), // | 986 B(Star), R(0), // |
1000 B(Star), R(0), // | 987 B(Ldar), A(2, 3), // |
1001 B(Ldar), A(2, 3), // | 988 B(Add), A(2, 3), // |
1002 B(Add), A(2, 3), // | 989 B(Star), R(2), // |
1003 B(Star), R(2), // | 990 B(Ldar), A(2, 3), // |
1004 B(Ldar), A(2, 3), // | 991 B(Star), R(3), // |
1005 B(Star), R(3), // | 992 B(Call), R(0), R(1), U8(2), // |
1006 B(Call), R(0), R(1), U8(2), // | 993 B(Return), // |
1007 B(Return), // | |
1008 }, | 994 }, |
1009 1, | 995 1, |
1010 {"func"}}}; | 996 {"func"}}}; |
1011 for (size_t i = 0; i < arraysize(snippets); i++) { | 997 for (size_t i = 0; i < arraysize(snippets); i++) { |
1012 Handle<BytecodeArray> bytecode_array = | 998 Handle<BytecodeArray> bytecode_array = |
1013 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); | 999 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); |
1014 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 1000 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
1015 } | 1001 } |
1016 } | 1002 } |
1017 | 1003 |
1018 | 1004 |
1019 TEST(LoadGlobal) { | 1005 TEST(LoadGlobal) { |
1020 InitializedHandleScope handle_scope; | 1006 InitializedHandleScope handle_scope; |
1021 BytecodeGeneratorHelper helper; | 1007 BytecodeGeneratorHelper helper; |
1022 Zone zone; | 1008 Zone zone; |
1023 | 1009 |
1024 int context_reg = Register::function_context().index(); | |
1025 int global_index = Context::GLOBAL_OBJECT_INDEX; | |
1026 | |
1027 FeedbackVectorSpec feedback_spec(&zone); | 1010 FeedbackVectorSpec feedback_spec(&zone); |
1028 FeedbackVectorSlot slot1 = feedback_spec.AddLoadICSlot(); | 1011 FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot(); |
1029 | 1012 |
1030 Handle<i::TypeFeedbackVector> vector = | 1013 Handle<i::TypeFeedbackVector> vector = |
1031 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); | 1014 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); |
1032 | 1015 |
1033 ExpectedSnippet<InstanceType> snippets[] = { | 1016 ExpectedSnippet<const char*> snippets[] = { |
1034 { | 1017 {"var a = 1;\nfunction f() { return a; }\nf()", |
1035 "var a = 1;\nfunction f() { return a; }\nf()", | 1018 0, |
1036 kPointerSize, | 1019 1, |
1037 1, | 1020 4, |
1038 11, | 1021 { |
1039 { | 1022 B(LdaGlobalSloppy), U8(0), U8(vector->GetIndex(slot)), // |
1040 B(LdaContextSlot), R(context_reg), U8(global_index), // | 1023 B(Return) // |
1041 B(Star), R(0), // | 1024 }, |
1042 B(LdaConstant), U8(0), // | 1025 1, |
1043 B(LoadICSloppy), R(0), U8(vector->GetIndex(slot1)), // | 1026 {"a"}}, |
1044 B(Return) // | 1027 {"function t() { }\nfunction f() { return t; }\nf()", |
1045 }, | 1028 0, |
1046 1, | 1029 1, |
1047 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}, | 1030 4, |
1048 }, | 1031 { |
1049 { | 1032 B(LdaGlobalSloppy), U8(0), U8(vector->GetIndex(slot)), // |
1050 "function t() { }\nfunction f() { return t; }\nf()", | 1033 B(Return) // |
1051 kPointerSize, | 1034 }, |
1052 1, | 1035 1, |
1053 11, | 1036 {"t"}}, |
1054 { | 1037 {"'use strict'; var a = 1;\nfunction f() { return a; }\nf()", |
1055 B(LdaContextSlot), R(context_reg), U8(global_index), // | 1038 0, |
1056 B(Star), R(0), // | 1039 1, |
1057 B(LdaConstant), U8(0), // | 1040 4, |
1058 B(LoadICSloppy), R(0), U8(vector->GetIndex(slot1)), // | 1041 { |
1059 B(Return) // | 1042 B(LdaGlobalStrict), U8(0), U8(vector->GetIndex(slot)), // |
1060 }, | 1043 B(Return) // |
1061 1, | 1044 }, |
1062 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}, | 1045 1, |
1063 }, | 1046 {"a"}}, |
| 1047 {"a = 1;\nfunction f() { return a; }\nf()", |
| 1048 0, |
| 1049 1, |
| 1050 4, |
| 1051 { |
| 1052 B(LdaGlobalSloppy), U8(0), U8(vector->GetIndex(slot)), // |
| 1053 B(Return) // |
| 1054 }, |
| 1055 1, |
| 1056 {"a"}}, |
1064 }; | 1057 }; |
1065 | 1058 |
1066 for (size_t i = 0; i < arraysize(snippets); i++) { | 1059 for (size_t i = 0; i < arraysize(snippets); i++) { |
1067 Handle<BytecodeArray> bytecode_array = | 1060 Handle<BytecodeArray> bytecode_array = |
1068 helper.MakeBytecode(snippets[i].code_snippet, "f"); | 1061 helper.MakeBytecode(snippets[i].code_snippet, "f"); |
1069 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true); | 1062 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
1070 } | 1063 } |
1071 } | 1064 } |
1072 | 1065 |
1073 | 1066 |
1074 TEST(StoreGlobal) { | 1067 TEST(StoreGlobal) { |
1075 InitializedHandleScope handle_scope; | 1068 InitializedHandleScope handle_scope; |
1076 BytecodeGeneratorHelper helper; | 1069 BytecodeGeneratorHelper helper; |
1077 Zone zone; | 1070 Zone zone; |
1078 | 1071 |
1079 int context_reg = Register::function_context().index(); | |
1080 int global_index = Context::GLOBAL_OBJECT_INDEX; | |
1081 | |
1082 FeedbackVectorSpec feedback_spec(&zone); | 1072 FeedbackVectorSpec feedback_spec(&zone); |
1083 FeedbackVectorSlot slot1 = feedback_spec.AddStoreICSlot(); | 1073 FeedbackVectorSlot slot = feedback_spec.AddStoreICSlot(); |
1084 | |
1085 Handle<i::TypeFeedbackVector> vector = | |
1086 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); | |
1087 | |
1088 ExpectedSnippet<InstanceType> snippets[] = { | |
1089 { | |
1090 "var a = 1;\nfunction f() { a = 2; }\nf()", | |
1091 3 * kPointerSize, | |
1092 1, | |
1093 21, | |
1094 { | |
1095 B(LdaSmi8), U8(2), // | |
1096 B(Star), R(0), // | |
1097 B(LdaContextSlot), R(context_reg), U8(global_index), // | |
1098 B(Star), R(1), // | |
1099 B(LdaConstant), U8(0), // | |
1100 B(Star), R(2), // | |
1101 B(Ldar), R(0), // | |
1102 B(StoreICSloppy), R(1), R(2), U8(vector->GetIndex(slot1)), // | |
1103 B(LdaUndefined), // | |
1104 B(Return) // | |
1105 }, | |
1106 1, | |
1107 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}, | |
1108 }, | |
1109 { | |
1110 "var a = \"test\"; function f(b) { a = b; }\nf(\"global\")", | |
1111 3 * kPointerSize, | |
1112 2, | |
1113 21, | |
1114 { | |
1115 B(Ldar), R(helper.kLastParamIndex), // | |
1116 B(Star), R(0), // | |
1117 B(LdaContextSlot), R(context_reg), U8(global_index), // | |
1118 B(Star), R(1), // | |
1119 B(LdaConstant), U8(0), // | |
1120 B(Star), R(2), // | |
1121 B(Ldar), R(0), // | |
1122 B(StoreICSloppy), R(1), R(2), U8(vector->GetIndex(slot1)), // | |
1123 B(LdaUndefined), // | |
1124 B(Return) // | |
1125 }, | |
1126 1, | |
1127 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}, | |
1128 }, | |
1129 { | |
1130 "'use strict'; var a = 1;\nfunction f() { a = 2; }\nf()", | |
1131 3 * kPointerSize, | |
1132 1, | |
1133 21, | |
1134 { | |
1135 B(LdaSmi8), U8(2), // | |
1136 B(Star), R(0), // | |
1137 B(LdaContextSlot), R(context_reg), U8(global_index), // | |
1138 B(Star), R(1), // | |
1139 B(LdaConstant), U8(0), // | |
1140 B(Star), R(2), // | |
1141 B(Ldar), R(0), // | |
1142 B(StoreICStrict), R(1), R(2), U8(vector->GetIndex(slot1)), // | |
1143 B(LdaUndefined), // | |
1144 B(Return) // | |
1145 }, | |
1146 1, | |
1147 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}, | |
1148 }, | |
1149 }; | |
1150 | |
1151 for (size_t i = 0; i < arraysize(snippets); i++) { | |
1152 Handle<BytecodeArray> bytecode_array = | |
1153 helper.MakeBytecode(snippets[i].code_snippet, "f"); | |
1154 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true); | |
1155 } | |
1156 } | |
1157 | |
1158 | |
1159 TEST(CallGlobal) { | |
1160 InitializedHandleScope handle_scope; | |
1161 BytecodeGeneratorHelper helper; | |
1162 Zone zone; | |
1163 | |
1164 int context_reg = Register::function_context().index(); | |
1165 int global_index = Context::GLOBAL_OBJECT_INDEX; | |
1166 | |
1167 FeedbackVectorSpec feedback_spec(&zone); | |
1168 FeedbackVectorSlot slot1 = feedback_spec.AddCallICSlot(); | |
1169 FeedbackVectorSlot slot2 = feedback_spec.AddLoadICSlot(); | |
1170 USE(slot1); | |
1171 | |
1172 Handle<i::TypeFeedbackVector> vector = | |
1173 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); | |
1174 | |
1175 ExpectedSnippet<InstanceType> snippets[] = { | |
1176 { | |
1177 "function t() { }\nfunction f() { return t(); }\nf()", | |
1178 3 * kPointerSize, | |
1179 1, | |
1180 20, | |
1181 { | |
1182 B(LdaUndefined), // | |
1183 B(Star), R(1), // | |
1184 B(LdaContextSlot), R(context_reg), U8(global_index), // | |
1185 B(Star), R(2), // | |
1186 B(LdaConstant), U8(0), // | |
1187 B(LoadICSloppy), R(2), U8(vector->GetIndex(slot2)), // | |
1188 B(Star), R(0), // | |
1189 B(Call), R(0), R(1), U8(0), // | |
1190 B(Return) // | |
1191 }, | |
1192 1, | |
1193 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}, | |
1194 }, | |
1195 { | |
1196 "function t(a, b, c) { }\nfunction f() { return t(1, 2, 3); }\nf()", | |
1197 5 * kPointerSize, | |
1198 1, | |
1199 32, | |
1200 { | |
1201 B(LdaUndefined), // | |
1202 B(Star), R(1), // | |
1203 B(LdaContextSlot), R(context_reg), U8(global_index), // | |
1204 B(Star), R(2), // | |
1205 B(LdaConstant), U8(0), // | |
1206 B(LoadICSloppy), R(2), U8(vector->GetIndex(slot2)), // | |
1207 B(Star), R(0), // | |
1208 B(LdaSmi8), U8(1), // | |
1209 B(Star), R(2), // | |
1210 B(LdaSmi8), U8(2), // | |
1211 B(Star), R(3), // | |
1212 B(LdaSmi8), U8(3), // | |
1213 B(Star), R(4), // | |
1214 B(Call), R(0), R(1), U8(3), // | |
1215 B(Return) // | |
1216 }, | |
1217 1, | |
1218 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}, | |
1219 }, | |
1220 }; | |
1221 | |
1222 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | |
1223 for (size_t i = 0; i < num_snippets; i++) { | |
1224 Handle<BytecodeArray> bytecode_array = | |
1225 helper.MakeBytecode(snippets[i].code_snippet, "f"); | |
1226 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true); | |
1227 } | |
1228 } | |
1229 | |
1230 | |
1231 TEST(LoadUnallocated) { | |
1232 InitializedHandleScope handle_scope; | |
1233 BytecodeGeneratorHelper helper; | |
1234 Zone zone; | |
1235 | |
1236 int context_reg = Register::function_context().index(); | |
1237 int global_index = Context::GLOBAL_OBJECT_INDEX; | |
1238 | |
1239 FeedbackVectorSpec feedback_spec(&zone); | |
1240 FeedbackVectorSlot slot1 = feedback_spec.AddLoadICSlot(); | |
1241 | 1074 |
1242 Handle<i::TypeFeedbackVector> vector = | 1075 Handle<i::TypeFeedbackVector> vector = |
1243 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); | 1076 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); |
1244 | 1077 |
1245 ExpectedSnippet<const char*> snippets[] = { | 1078 ExpectedSnippet<const char*> snippets[] = { |
1246 {"a = 1;\nfunction f() { return a; }\nf()", | 1079 {"var a = 1;\nfunction f() { a = 2; }\nf()", |
1247 1 * kPointerSize, | 1080 0, |
1248 1, | 1081 1, |
1249 11, | 1082 7, |
1250 {B(LdaContextSlot), R(context_reg), U8(global_index), // | 1083 { |
1251 B(Star), R(0), // | 1084 B(LdaSmi8), U8(2), // |
1252 B(LdaConstant), U8(0), // | 1085 B(StaGlobalSloppy), U8(0), U8(vector->GetIndex(slot)), // |
1253 B(LoadICSloppy), R(0), U8(vector->GetIndex(slot1)), // | 1086 B(LdaUndefined), // |
1254 B(Return)}, | 1087 B(Return) // |
| 1088 }, |
1255 1, | 1089 1, |
1256 {"a"}}, | 1090 {"a"}}, |
1257 {"function f() { return t; }\nt = 1;\nf()", | 1091 {"var a = \"test\"; function f(b) { a = b; }\nf(\"global\")", |
1258 1 * kPointerSize, | 1092 0, |
| 1093 2, |
| 1094 7, |
| 1095 { |
| 1096 B(Ldar), R(helper.kLastParamIndex), // |
| 1097 B(StaGlobalSloppy), U8(0), U8(vector->GetIndex(slot)), // |
| 1098 B(LdaUndefined), // |
| 1099 B(Return) // |
| 1100 }, |
1259 1, | 1101 1, |
1260 11, | 1102 {"a"}}, |
1261 {B(LdaContextSlot), R(context_reg), U8(global_index), // | 1103 {"'use strict'; var a = 1;\nfunction f() { a = 2; }\nf()", |
1262 B(Star), R(0), // | 1104 0, |
1263 B(LdaConstant), U8(0), // | |
1264 B(LoadICSloppy), R(0), U8(vector->GetIndex(slot1)), // | |
1265 B(Return)}, | |
1266 1, | 1105 1, |
1267 {"t"}}, | 1106 7, |
| 1107 { |
| 1108 B(LdaSmi8), U8(2), // |
| 1109 B(StaGlobalStrict), U8(0), U8(vector->GetIndex(slot)), // |
| 1110 B(LdaUndefined), // |
| 1111 B(Return) // |
| 1112 }, |
| 1113 1, |
| 1114 {"a"}}, |
| 1115 {"a = 1;\nfunction f() { a = 2; }\nf()", |
| 1116 0, |
| 1117 1, |
| 1118 7, |
| 1119 { |
| 1120 B(LdaSmi8), U8(2), // |
| 1121 B(StaGlobalSloppy), U8(0), U8(vector->GetIndex(slot)), // |
| 1122 B(LdaUndefined), // |
| 1123 B(Return) // |
| 1124 }, |
| 1125 1, |
| 1126 {"a"}}, |
1268 }; | 1127 }; |
1269 | 1128 |
1270 for (size_t i = 0; i < arraysize(snippets); i++) { | 1129 for (size_t i = 0; i < arraysize(snippets); i++) { |
1271 Handle<BytecodeArray> bytecode_array = | 1130 Handle<BytecodeArray> bytecode_array = |
1272 helper.MakeBytecode(snippets[i].code_snippet, "f"); | 1131 helper.MakeBytecode(snippets[i].code_snippet, "f"); |
1273 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 1132 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
1274 } | 1133 } |
1275 } | 1134 } |
1276 | 1135 |
1277 | 1136 |
1278 TEST(StoreUnallocated) { | 1137 TEST(CallGlobal) { |
1279 InitializedHandleScope handle_scope; | 1138 InitializedHandleScope handle_scope; |
1280 BytecodeGeneratorHelper helper; | 1139 BytecodeGeneratorHelper helper; |
1281 Zone zone; | 1140 Zone zone; |
1282 | 1141 |
1283 int context_reg = Register::function_context().index(); | |
1284 int global_index = Context::GLOBAL_OBJECT_INDEX; | |
1285 | |
1286 FeedbackVectorSpec feedback_spec(&zone); | 1142 FeedbackVectorSpec feedback_spec(&zone); |
1287 FeedbackVectorSlot slot1 = feedback_spec.AddStoreICSlot(); | 1143 FeedbackVectorSlot slot1 = feedback_spec.AddLoadICSlot(); |
| 1144 FeedbackVectorSlot slot2 = feedback_spec.AddLoadICSlot(); |
| 1145 USE(slot1); |
1288 | 1146 |
1289 Handle<i::TypeFeedbackVector> vector = | 1147 Handle<i::TypeFeedbackVector> vector = |
1290 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); | 1148 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); |
1291 | 1149 |
1292 ExpectedSnippet<const char*> snippets[] = { | 1150 ExpectedSnippet<const char*> snippets[] = { |
1293 {"a = 1;\nfunction f() { a = 2; }\nf()", | 1151 {"function t() { }\nfunction f() { return t(); }\nf()", |
1294 3 * kPointerSize, | 1152 2 * kPointerSize, |
1295 1, | 1153 1, |
1296 21, | 1154 13, |
1297 {B(LdaSmi8), U8(2), // | 1155 { |
1298 B(Star), R(0), // | 1156 B(LdaUndefined), // |
1299 B(LdaContextSlot), R(context_reg), U8(global_index), // | 1157 B(Star), R(1), // |
1300 B(Star), R(1), // | 1158 B(LdaGlobalSloppy), U8(0), U8(vector->GetIndex(slot2)), // |
1301 B(LdaConstant), U8(0), // | 1159 B(Star), R(0), // |
1302 B(Star), R(2), // | 1160 B(Call), R(0), R(1), U8(0), // |
1303 B(Ldar), R(0), // | 1161 B(Return) // |
1304 B(StoreICSloppy), R(1), R(2), U8(vector->GetIndex(slot1)), // | 1162 }, |
1305 B(LdaUndefined), // | |
1306 B(Return)}, | |
1307 1, | 1163 1, |
1308 {"a"}}, | 1164 {"t"}}, |
1309 {"function f() { t = 4; }\nf()\nt = 1;", | 1165 {"function t(a, b, c) { }\nfunction f() { return t(1, 2, 3); }\nf()", |
1310 3 * kPointerSize, | 1166 5 * kPointerSize, |
1311 1, | 1167 1, |
1312 21, | 1168 25, |
1313 {B(LdaSmi8), U8(4), // | 1169 { |
1314 B(Star), R(0), // | 1170 B(LdaUndefined), // |
1315 B(LdaContextSlot), R(context_reg), U8(global_index), // | 1171 B(Star), R(1), // |
1316 B(Star), R(1), // | 1172 B(LdaGlobalSloppy), U8(0), U8(vector->GetIndex(slot2)), // |
1317 B(LdaConstant), U8(0), // | 1173 B(Star), R(0), // |
1318 B(Star), R(2), // | 1174 B(LdaSmi8), U8(1), // |
1319 B(Ldar), R(0), // | 1175 B(Star), R(2), // |
1320 B(StoreICSloppy), R(1), R(2), U8(vector->GetIndex(slot1)), // | 1176 B(LdaSmi8), U8(2), // |
1321 B(LdaUndefined), // | 1177 B(Star), R(3), // |
1322 B(Return)}, | 1178 B(LdaSmi8), U8(3), // |
| 1179 B(Star), R(4), // |
| 1180 B(Call), R(0), R(1), U8(3), // |
| 1181 B(Return) // |
| 1182 }, |
1323 1, | 1183 1, |
1324 {"t"}}, | 1184 {"t"}}, |
1325 }; | 1185 }; |
1326 | 1186 |
1327 for (size_t i = 0; i < arraysize(snippets); i++) { | 1187 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); |
| 1188 for (size_t i = 0; i < num_snippets; i++) { |
1328 Handle<BytecodeArray> bytecode_array = | 1189 Handle<BytecodeArray> bytecode_array = |
1329 helper.MakeBytecode(snippets[i].code_snippet, "f"); | 1190 helper.MakeBytecode(snippets[i].code_snippet, "f"); |
1330 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 1191 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
1331 } | 1192 } |
1332 } | 1193 } |
1333 | 1194 |
1334 | 1195 |
1335 TEST(CallRuntime) { | 1196 TEST(CallRuntime) { |
1336 InitializedHandleScope handle_scope; | 1197 InitializedHandleScope handle_scope; |
1337 BytecodeGeneratorHelper helper; | 1198 BytecodeGeneratorHelper helper; |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1548 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 1409 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
1549 } | 1410 } |
1550 } | 1411 } |
1551 | 1412 |
1552 | 1413 |
1553 TEST(DeclareGlobals) { | 1414 TEST(DeclareGlobals) { |
1554 InitializedHandleScope handle_scope; | 1415 InitializedHandleScope handle_scope; |
1555 BytecodeGeneratorHelper helper; | 1416 BytecodeGeneratorHelper helper; |
1556 Zone zone; | 1417 Zone zone; |
1557 | 1418 |
1558 int context_reg = Register::function_context().index(); | 1419 // Create different feedback vector specs to be precise on slot numbering. |
1559 int global_index = Context::GLOBAL_OBJECT_INDEX; | 1420 FeedbackVectorSpec feedback_spec_stores(&zone); |
| 1421 FeedbackVectorSlot store_slot_1 = feedback_spec_stores.AddStoreICSlot(); |
| 1422 FeedbackVectorSlot store_slot_2 = feedback_spec_stores.AddStoreICSlot(); |
| 1423 USE(store_slot_1); |
1560 | 1424 |
1561 // Create different feedback vector specs to be precise on slot numbering. | 1425 Handle<i::TypeFeedbackVector> store_vector = |
1562 FeedbackVectorSpec feedback_spec_ss(&zone); | 1426 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec_stores); |
1563 FeedbackVectorSlot slot_ss_1 = feedback_spec_ss.AddStoreICSlot(); | |
1564 FeedbackVectorSlot slot_ss_2 = feedback_spec_ss.AddStoreICSlot(); | |
1565 USE(slot_ss_1); | |
1566 | 1427 |
1567 Handle<i::TypeFeedbackVector> vector_ss = | 1428 FeedbackVectorSpec feedback_spec_loads(&zone); |
1568 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec_ss); | 1429 FeedbackVectorSlot load_slot_1 = feedback_spec_loads.AddLoadICSlot(); |
1569 | 1430 |
1570 FeedbackVectorSpec feedback_spec_l(&zone); | 1431 Handle<i::TypeFeedbackVector> load_vector = |
1571 FeedbackVectorSlot slot_l_1 = feedback_spec_l.AddLoadICSlot(); | 1432 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec_loads); |
1572 | |
1573 Handle<i::TypeFeedbackVector> vector_l = | |
1574 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec_l); | |
1575 | |
1576 | 1433 |
1577 ExpectedSnippet<InstanceType> snippets[] = { | 1434 ExpectedSnippet<InstanceType> snippets[] = { |
1578 {"var a = 1;", | 1435 {"var a = 1;", |
1579 4 * kPointerSize, | 1436 4 * kPointerSize, |
1580 1, | 1437 1, |
1581 30, | 1438 30, |
1582 { | 1439 { |
1583 B(LdaConstant), U8(0), // | 1440 B(LdaConstant), U8(0), // |
1584 B(Star), R(1), // | 1441 B(Star), R(1), // |
1585 B(LdaZero), // | 1442 B(LdaZero), // |
1586 B(Star), R(2), // | 1443 B(Star), R(2), // |
1587 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(1), U8(2), // | 1444 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(1), U8(2), // |
1588 B(LdaConstant), U8(1), // | 1445 B(LdaConstant), U8(1), // |
1589 B(Star), R(1), // | 1446 B(Star), R(1), // |
1590 B(LdaZero), // | 1447 B(LdaZero), // |
1591 B(Star), R(2), // | 1448 B(Star), R(2), // |
1592 B(LdaSmi8), U8(1), // | 1449 B(LdaSmi8), U8(1), // |
1593 B(Star), R(3), // | 1450 B(Star), R(3), // |
1594 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(1), // | 1451 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(1), U8(3), // |
1595 U8(3), // | 1452 B(LdaUndefined), // |
1596 B(LdaUndefined), // | 1453 B(Return) // |
1597 B(Return) // | |
1598 }, | 1454 }, |
1599 2, | 1455 2, |
1600 {InstanceType::FIXED_ARRAY_TYPE, | 1456 {InstanceType::FIXED_ARRAY_TYPE, |
1601 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | 1457 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
1602 {"function f() {}", | 1458 {"function f() {}", |
1603 2 * kPointerSize, | 1459 2 * kPointerSize, |
1604 1, | 1460 1, |
1605 14, | 1461 14, |
1606 { | 1462 { |
1607 B(LdaConstant), U8(0), // | 1463 B(LdaConstant), U8(0), // |
1608 B(Star), R(0), // | 1464 B(Star), R(0), // |
1609 B(LdaZero), // | 1465 B(LdaZero), // |
1610 B(Star), R(1), // | 1466 B(Star), R(1), // |
1611 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(0), U8(2), // | 1467 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(0), U8(2), // |
1612 B(LdaUndefined), // | 1468 B(LdaUndefined), // |
1613 B(Return) // | 1469 B(Return) // |
1614 }, | 1470 }, |
1615 1, | 1471 1, |
1616 {InstanceType::FIXED_ARRAY_TYPE}}, | 1472 {InstanceType::FIXED_ARRAY_TYPE}}, |
1617 {"var a = 1;\na=2;", | 1473 {"var a = 1;\na=2;", |
1618 4 * kPointerSize, | 1474 4 * kPointerSize, |
1619 1, | 1475 1, |
1620 52, | 1476 38, |
1621 { | 1477 { |
1622 B(LdaConstant), U8(0), // | 1478 B(LdaConstant), U8(0), // |
1623 B(Star), R(1), // | 1479 B(Star), R(1), // |
1624 B(LdaZero), // | 1480 B(LdaZero), // |
1625 B(Star), R(2), // | 1481 B(Star), R(2), // |
1626 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(1), U8(2), // | 1482 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(1), U8(2), // |
1627 B(LdaConstant), U8(1), // | 1483 B(LdaConstant), U8(1), // |
1628 B(Star), R(1), // | 1484 B(Star), R(1), // |
1629 B(LdaZero), // | 1485 B(LdaZero), // |
1630 B(Star), R(2), // | 1486 B(Star), R(2), // |
1631 B(LdaSmi8), U8(1), // | 1487 B(LdaSmi8), U8(1), // |
1632 B(Star), R(3), // | 1488 B(Star), R(3), // |
1633 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(1), // | 1489 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(1), U8(3), // |
1634 U8(3), // | 1490 B(LdaSmi8), U8(2), // |
1635 B(LdaSmi8), U8(2), // | 1491 B(StaGlobalSloppy), U8(1), // |
1636 B(Star), R(1), // | 1492 U8(store_vector->GetIndex(store_slot_2)), // |
1637 B(LdaContextSlot), R(context_reg), U8(global_index), // | 1493 B(Star), R(0), // |
1638 B(Star), R(2), // | 1494 B(Ldar), R(0), // |
1639 B(LdaConstant), U8(1), // | 1495 B(Return) // |
1640 B(Star), R(3), // | |
1641 B(Ldar), R(1), // | |
1642 B(StoreICSloppy), R(2), R(3), U8(vector_ss->GetIndex(slot_ss_2)), // | |
1643 B(Star), R(0), // | |
1644 B(Ldar), R(0), // | |
1645 B(Return) // | |
1646 }, | 1496 }, |
1647 2, | 1497 2, |
1648 {InstanceType::FIXED_ARRAY_TYPE, | 1498 {InstanceType::FIXED_ARRAY_TYPE, |
1649 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | 1499 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
1650 {"function f() {}\nf();", | 1500 {"function f() {}\nf();", |
1651 4 * kPointerSize, | 1501 3 * kPointerSize, |
1652 1, | 1502 1, |
1653 36, | 1503 29, |
1654 { | 1504 { |
1655 B(LdaConstant), U8(0), // | 1505 B(LdaConstant), U8(0), // |
1656 B(Star), R(1), // | 1506 B(Star), R(1), // |
1657 B(LdaZero), // | 1507 B(LdaZero), // |
1658 B(Star), R(2), // | 1508 B(Star), R(2), // |
1659 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(1), U8(2), // | 1509 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(1), U8(2), // |
1660 B(LdaUndefined), // | 1510 B(LdaUndefined), // |
1661 B(Star), R(2), // | 1511 B(Star), R(2), // |
1662 B(LdaContextSlot), R(context_reg), U8(global_index), // | 1512 B(LdaGlobalSloppy), U8(1), // |
1663 B(Star), R(3), // | 1513 U8(load_vector->GetIndex(load_slot_1)), // |
1664 B(LdaConstant), U8(1), // | |
1665 B(LoadICSloppy), R(3), U8(vector_l->GetIndex(slot_l_1)), // | |
1666 B(Star), R(1), // | 1514 B(Star), R(1), // |
1667 B(Call), R(1), R(2), U8(0), // | 1515 B(Call), R(1), R(2), U8(0), // |
1668 B(Star), R(0), // | 1516 B(Star), R(0), // |
1669 B(Ldar), R(0), // | 1517 B(Ldar), R(0), // |
1670 B(Return) // | 1518 B(Return) // |
1671 }, | 1519 }, |
1672 2, | 1520 2, |
1673 {InstanceType::FIXED_ARRAY_TYPE, | 1521 {InstanceType::FIXED_ARRAY_TYPE, |
1674 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | 1522 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
1675 }; | 1523 }; |
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2098 B(Star), R(0), // | 1946 B(Star), R(0), // |
2099 B(LdaConstant), U8(1), // | 1947 B(LdaConstant), U8(1), // |
2100 B(CreateRegExpLiteral), U8(0), R(0), // | 1948 B(CreateRegExpLiteral), U8(0), R(0), // |
2101 B(Return), // | 1949 B(Return), // |
2102 }, | 1950 }, |
2103 2, | 1951 2, |
2104 {"i", "(\\w+)\\s(\\w+)"}}, | 1952 {"i", "(\\w+)\\s(\\w+)"}}, |
2105 {"return /ab+d/.exec('abdd');", | 1953 {"return /ab+d/.exec('abdd');", |
2106 3 * kPointerSize, | 1954 3 * kPointerSize, |
2107 1, | 1955 1, |
2108 27, | 1956 26, |
2109 { | 1957 { |
2110 B(LdaConstant), U8(0), // | 1958 B(LdaConstant), U8(0), // |
2111 B(Star), R(2), // | 1959 B(Star), R(2), // |
2112 B(LdaConstant), U8(1), // | 1960 B(LdaConstant), U8(1), // |
2113 B(CreateRegExpLiteral), U8(0), R(2), // | 1961 B(CreateRegExpLiteral), U8(0), R(2), // |
2114 B(Star), R(1), // | 1962 B(Star), R(1), // |
2115 B(LdaConstant), U8(2), // | 1963 B(LoadICSloppy), R(1), U8(2), U8(vector->GetIndex(slot2)), // |
2116 B(LoadICSloppy), R(1), U8(vector->GetIndex(slot2)), // | 1964 B(Star), R(0), // |
2117 B(Star), R(0), // | 1965 B(LdaConstant), U8(3), // |
2118 B(LdaConstant), U8(3), // | 1966 B(Star), R(2), // |
2119 B(Star), R(2), // | 1967 B(Call), R(0), R(1), U8(1), // |
2120 B(Call), R(0), R(1), U8(1), // | 1968 B(Return), // |
2121 B(Return), // | |
2122 }, | 1969 }, |
2123 4, | 1970 4, |
2124 {"", "ab+d", "exec", "abdd"}}, | 1971 {"", "ab+d", "exec", "abdd"}}, |
2125 }; | 1972 }; |
2126 | 1973 |
2127 for (size_t i = 0; i < arraysize(snippets); i++) { | 1974 for (size_t i = 0; i < arraysize(snippets); i++) { |
2128 Handle<BytecodeArray> bytecode_array = | 1975 Handle<BytecodeArray> bytecode_array = |
2129 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 1976 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
2130 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 1977 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
2131 } | 1978 } |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2240 Handle<BytecodeArray> bytecode_array = | 2087 Handle<BytecodeArray> bytecode_array = |
2241 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 2088 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
2242 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 2089 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
2243 } | 2090 } |
2244 } | 2091 } |
2245 | 2092 |
2246 | 2093 |
2247 TEST(ObjectLiterals) { | 2094 TEST(ObjectLiterals) { |
2248 InitializedHandleScope handle_scope; | 2095 InitializedHandleScope handle_scope; |
2249 BytecodeGeneratorHelper helper; | 2096 BytecodeGeneratorHelper helper; |
| 2097 Zone zone; |
| 2098 |
| 2099 FeedbackVectorSpec feedback_spec(&zone); |
| 2100 FeedbackVectorSlot slot1 = feedback_spec.AddStoreICSlot(); |
| 2101 |
| 2102 Handle<i::TypeFeedbackVector> vector = |
| 2103 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); |
2250 | 2104 |
2251 int simple_flags = ObjectLiteral::kFastElements | | 2105 int simple_flags = ObjectLiteral::kFastElements | |
2252 ObjectLiteral::kShallowProperties | | 2106 ObjectLiteral::kShallowProperties | |
2253 ObjectLiteral::kDisableMementos; | 2107 ObjectLiteral::kDisableMementos; |
2254 int deep_elements_flags = | 2108 int deep_elements_flags = |
2255 ObjectLiteral::kFastElements | ObjectLiteral::kDisableMementos; | 2109 ObjectLiteral::kFastElements | ObjectLiteral::kDisableMementos; |
2256 ExpectedSnippet<InstanceType> snippets[] = { | 2110 ExpectedSnippet<InstanceType> snippets[] = { |
2257 {"return { };", | 2111 {"return { };", |
2258 0, | 2112 0, |
2259 1, | 2113 1, |
(...skipping 10 matching lines...) Expand all Loading... |
2270 1, | 2124 1, |
2271 6, | 2125 6, |
2272 { | 2126 { |
2273 B(LdaConstant), U8(0), // | 2127 B(LdaConstant), U8(0), // |
2274 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // | 2128 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
2275 B(Return) // | 2129 B(Return) // |
2276 }, | 2130 }, |
2277 1, | 2131 1, |
2278 {InstanceType::FIXED_ARRAY_TYPE}}, | 2132 {InstanceType::FIXED_ARRAY_TYPE}}, |
2279 {"var a = 1; return { name: 'string', val: a };", | 2133 {"var a = 1; return { name: 'string', val: a };", |
2280 3 * kPointerSize, | 2134 2 * kPointerSize, |
2281 1, | 2135 1, |
2282 24, | 2136 20, |
2283 { | 2137 { |
2284 B(LdaSmi8), U8(1), // | 2138 B(LdaSmi8), U8(1), // |
2285 B(Star), R(0), // | 2139 B(Star), R(0), // |
2286 B(LdaConstant), U8(0), // | 2140 B(LdaConstant), U8(0), // |
2287 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // | 2141 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
2288 B(Star), R(1), // | 2142 B(Star), R(1), // |
2289 B(LdaConstant), U8(1), // | 2143 B(Ldar), R(0), // |
2290 B(Star), R(2), // | 2144 B(StoreICSloppy), R(1), U8(1), U8(vector->GetIndex(slot1)), // |
2291 B(Ldar), R(0), // | 2145 B(Ldar), R(1), // |
2292 B(StoreICSloppy), R(1), R(2), U8(3), // | 2146 B(Return), // |
2293 B(Ldar), R(1), // | |
2294 B(Return), // | |
2295 }, | 2147 }, |
2296 2, | 2148 2, |
2297 {InstanceType::FIXED_ARRAY_TYPE, | 2149 {InstanceType::FIXED_ARRAY_TYPE, |
2298 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | 2150 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
2299 {"var a = 1; return { val: a, val: a + 1 };", | 2151 {"var a = 1; return { val: a, val: a + 1 };", |
2300 3 * kPointerSize, | 2152 2 * kPointerSize, |
2301 1, | 2153 1, |
2302 26, | 2154 22, |
2303 { | 2155 { |
2304 B(LdaSmi8), U8(1), // | 2156 B(LdaSmi8), U8(1), // |
2305 B(Star), R(0), // | 2157 B(Star), R(0), // |
2306 B(LdaConstant), U8(0), // | 2158 B(LdaConstant), U8(0), // |
2307 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // | 2159 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
2308 B(Star), R(1), // | 2160 B(Star), R(1), // |
2309 B(LdaConstant), U8(1), // | 2161 B(LdaSmi8), U8(1), // |
2310 B(Star), R(2), // | 2162 B(Add), R(0), // |
2311 B(LdaSmi8), U8(1), // | 2163 B(StoreICSloppy), R(1), U8(1), U8(vector->GetIndex(slot1)), // |
2312 B(Add), R(0), // | 2164 B(Ldar), R(1), // |
2313 B(StoreICSloppy), R(1), R(2), U8(3), // | 2165 B(Return), // |
2314 B(Ldar), R(1), // | |
2315 B(Return), // | |
2316 }, | 2166 }, |
2317 2, | 2167 2, |
2318 {InstanceType::FIXED_ARRAY_TYPE, | 2168 {InstanceType::FIXED_ARRAY_TYPE, |
2319 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | 2169 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
2320 {"return { func: function() { } };", | 2170 {"return { func: function() { } };", |
2321 2 * kPointerSize, | 2171 1 * kPointerSize, |
2322 1, | 2172 1, |
2323 22, | 2173 18, |
2324 { | 2174 { |
2325 B(LdaConstant), U8(0), // | 2175 B(LdaConstant), U8(0), // |
2326 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // | 2176 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
2327 B(Star), R(0), // | 2177 B(Star), R(0), // |
2328 B(LdaConstant), U8(1), // | 2178 B(LdaConstant), U8(2), // |
2329 B(Star), R(1), // | 2179 B(CreateClosure), U8(0), // |
2330 B(LdaConstant), U8(2), // | 2180 B(StoreICSloppy), R(0), U8(1), U8(vector->GetIndex(slot1)), // |
2331 B(CreateClosure), U8(0), // | 2181 B(Ldar), R(0), // |
2332 B(StoreICSloppy), R(0), R(1), U8(3), // | 2182 B(Return), // |
2333 B(Ldar), R(0), // | |
2334 B(Return), // | |
2335 }, | 2183 }, |
2336 3, | 2184 3, |
2337 {InstanceType::FIXED_ARRAY_TYPE, | 2185 {InstanceType::FIXED_ARRAY_TYPE, |
2338 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | 2186 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
2339 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 2187 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
2340 {"return { func(a) { return a; } };", | 2188 {"return { func(a) { return a; } };", |
2341 2 * kPointerSize, | 2189 1 * kPointerSize, |
2342 1, | 2190 1, |
2343 22, | 2191 18, |
2344 { | 2192 { |
2345 B(LdaConstant), U8(0), // | 2193 B(LdaConstant), U8(0), // |
2346 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // | 2194 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
2347 B(Star), R(0), // | 2195 B(Star), R(0), // |
2348 B(LdaConstant), U8(1), // | 2196 B(LdaConstant), U8(2), // |
2349 B(Star), R(1), // | 2197 B(CreateClosure), U8(0), // |
2350 B(LdaConstant), U8(2), // | 2198 B(StoreICSloppy), R(0), U8(1), U8(vector->GetIndex(slot1)), // |
2351 B(CreateClosure), U8(0), // | 2199 B(Ldar), R(0), // |
2352 B(StoreICSloppy), R(0), R(1), U8(3), // | 2200 B(Return), // |
2353 B(Ldar), R(0), // | |
2354 B(Return), // | |
2355 }, | 2201 }, |
2356 3, | 2202 3, |
2357 {InstanceType::FIXED_ARRAY_TYPE, | 2203 {InstanceType::FIXED_ARRAY_TYPE, |
2358 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | 2204 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
2359 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 2205 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
2360 {"return { get a() { return 2; } };", | 2206 {"return { get a() { return 2; } };", |
2361 5 * kPointerSize, | 2207 5 * kPointerSize, |
2362 1, | 2208 1, |
2363 31, | 2209 31, |
2364 { | 2210 { |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2495 U8(4), // | 2341 U8(4), // |
2496 B(Ldar), R(1), // | 2342 B(Ldar), R(1), // |
2497 B(Return), // | 2343 B(Return), // |
2498 }, | 2344 }, |
2499 2, | 2345 2, |
2500 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | 2346 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
2501 InstanceType::FIXED_ARRAY_TYPE}}, | 2347 InstanceType::FIXED_ARRAY_TYPE}}, |
2502 {"var a = 'test'; return { val: a, [a]: 1 }", | 2348 {"var a = 'test'; return { val: a, [a]: 1 }", |
2503 5 * kPointerSize, | 2349 5 * kPointerSize, |
2504 1, | 2350 1, |
2505 41, | 2351 37, |
2506 { | 2352 { |
2507 B(LdaConstant), U8(0), // | 2353 B(LdaConstant), U8(0), // |
2508 B(Star), R(0), // | 2354 B(Star), R(0), // |
2509 B(LdaConstant), U8(1), // | 2355 B(LdaConstant), U8(1), // |
2510 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // | 2356 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
2511 B(Star), R(1), // | 2357 B(Star), R(1), // |
2512 B(LdaConstant), U8(2), // | |
2513 B(Star), R(2), // | |
2514 B(Ldar), R(0), // | 2358 B(Ldar), R(0), // |
2515 B(StoreICSloppy), R(1), R(2), U8(3), // | 2359 B(StoreICSloppy), R(1), U8(2), U8(vector->GetIndex(slot1)), // |
2516 B(Ldar), R(0), // | 2360 B(Ldar), R(0), // |
2517 B(ToName), // | 2361 B(ToName), // |
2518 B(Star), R(2), // | 2362 B(Star), R(2), // |
2519 B(LdaSmi8), U8(1), // | 2363 B(LdaSmi8), U8(1), // |
2520 B(Star), R(3), // | 2364 B(Star), R(3), // |
2521 B(LdaZero), // | 2365 B(LdaZero), // |
2522 B(Star), R(4), // | 2366 B(Star), R(4), // |
2523 B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), // | 2367 B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), // |
2524 U8(4), // | 2368 U8(4), // |
2525 B(Ldar), R(1), // | 2369 B(Ldar), R(1), // |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2579 U8(4), // | 2423 U8(4), // |
2580 B(LdaConstant), U8(3), // | 2424 B(LdaConstant), U8(3), // |
2581 B(ToName), // | 2425 B(ToName), // |
2582 B(Star), R(2), // | 2426 B(Star), R(2), // |
2583 B(LdaConstant), U8(4), // | 2427 B(LdaConstant), U8(4), // |
2584 B(CreateClosure), U8(0), // | 2428 B(CreateClosure), U8(0), // |
2585 B(Star), R(3), // | 2429 B(Star), R(3), // |
2586 B(LdaZero), // | 2430 B(LdaZero), // |
2587 B(Star), R(4), // | 2431 B(Star), R(4), // |
2588 B(CallRuntime), U16(Runtime::kDefineGetterPropertyUnchecked), // | 2432 B(CallRuntime), U16(Runtime::kDefineGetterPropertyUnchecked), // |
2589 R(1), U8(4), // | 2433 R(1), U8(4), // |
2590 B(LdaConstant), U8(3), // | 2434 B(LdaConstant), U8(3), // |
2591 B(ToName), // | 2435 B(ToName), // |
2592 B(Star), R(2), // | 2436 B(Star), R(2), // |
2593 B(LdaConstant), U8(5), // | 2437 B(LdaConstant), U8(5), // |
2594 B(CreateClosure), U8(0), // | 2438 B(CreateClosure), U8(0), // |
2595 B(Star), R(3), // | 2439 B(Star), R(3), // |
2596 B(LdaZero), // | 2440 B(LdaZero), // |
2597 B(Star), R(4), // | 2441 B(Star), R(4), // |
2598 B(CallRuntime), U16(Runtime::kDefineSetterPropertyUnchecked), // | 2442 B(CallRuntime), U16(Runtime::kDefineSetterPropertyUnchecked), // |
2599 R(1), U8(4), // | 2443 R(1), U8(4), // |
2600 B(Ldar), R(1), // | 2444 B(Ldar), R(1), // |
2601 B(Return), // | 2445 B(Return), // |
2602 }, | 2446 }, |
2603 6, | 2447 6, |
2604 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | 2448 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
2605 InstanceType::FIXED_ARRAY_TYPE, | 2449 InstanceType::FIXED_ARRAY_TYPE, |
2606 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | 2450 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
2607 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | 2451 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
2608 InstanceType::SHARED_FUNCTION_INFO_TYPE, | 2452 InstanceType::SHARED_FUNCTION_INFO_TYPE, |
2609 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 2453 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
2610 }; | 2454 }; |
2611 | 2455 |
2612 for (size_t i = 0; i < arraysize(snippets); i++) { | 2456 for (size_t i = 0; i < arraysize(snippets); i++) { |
2613 Handle<BytecodeArray> bytecode_array = | 2457 Handle<BytecodeArray> bytecode_array = |
2614 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 2458 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
2615 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 2459 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
2616 } | 2460 } |
2617 } | 2461 } |
2618 | 2462 |
2619 | 2463 |
2620 TEST(TopLevelObjectLiterals) { | 2464 TEST(TopLevelObjectLiterals) { |
2621 InitializedHandleScope handle_scope; | 2465 InitializedHandleScope handle_scope; |
2622 BytecodeGeneratorHelper helper; | 2466 BytecodeGeneratorHelper helper; |
2623 | 2467 |
2624 int has_function_flags = ObjectLiteral::kFastElements | | 2468 int has_function_flags = ObjectLiteral::kFastElements | |
2625 ObjectLiteral::kHasFunction | | 2469 ObjectLiteral::kHasFunction | |
2626 ObjectLiteral::kDisableMementos; | 2470 ObjectLiteral::kDisableMementos; |
2627 ExpectedSnippet<InstanceType> snippets[] = { | 2471 ExpectedSnippet<InstanceType> snippets[] = { |
2628 {"var a = { func: function() { } };", | 2472 {"var a = { func: function() { } };", |
2629 6 * kPointerSize, | 2473 5 * kPointerSize, |
2630 1, | 2474 1, |
2631 54, | 2475 50, |
2632 { | 2476 { |
2633 B(LdaConstant), U8(0), // | 2477 B(LdaConstant), U8(0), // |
2634 B(Star), R(1), // | 2478 B(Star), R(1), // |
2635 B(LdaZero), // | 2479 B(LdaZero), // |
2636 B(Star), R(2), // | 2480 B(Star), R(2), // |
2637 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(1), U8(2), // | 2481 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(1), U8(2), // |
2638 B(LdaConstant), U8(1), // | 2482 B(LdaConstant), U8(1), // |
2639 B(Star), R(1), // | 2483 B(Star), R(1), // |
2640 B(LdaZero), // | 2484 B(LdaZero), // |
2641 B(Star), R(2), // | 2485 B(Star), R(2), // |
2642 B(LdaConstant), U8(2), // | 2486 B(LdaConstant), U8(2), // |
2643 B(CreateObjectLiteral), U8(0), U8(has_function_flags), // | 2487 B(CreateObjectLiteral), U8(0), U8(has_function_flags), // |
2644 B(Star), R(4), // | 2488 B(Star), R(4), // |
2645 B(LdaConstant), U8(3), // | |
2646 B(Star), R(5), // | |
2647 B(LdaConstant), U8(4), // | 2489 B(LdaConstant), U8(4), // |
2648 B(CreateClosure), U8(1), // | 2490 B(CreateClosure), U8(1), // |
2649 B(StoreICSloppy), R(4), R(5), U8(5), // | 2491 B(StoreICSloppy), R(4), U8(3), U8(5), // |
2650 B(CallRuntime), U16(Runtime::kToFastProperties), R(4), U8(1), // | 2492 B(CallRuntime), U16(Runtime::kToFastProperties), R(4), U8(1), // |
2651 B(Ldar), R(4), // | 2493 B(Ldar), R(4), // |
2652 B(Star), R(3), // | 2494 B(Star), R(3), // |
2653 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(1), U8(3), // | 2495 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(1), U8(3), // |
2654 B(LdaUndefined), // | 2496 B(LdaUndefined), // |
2655 B(Return), // | 2497 B(Return), // |
2656 }, | 2498 }, |
2657 5, | 2499 5, |
2658 {InstanceType::FIXED_ARRAY_TYPE, | 2500 {InstanceType::FIXED_ARRAY_TYPE, |
2659 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | 2501 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2791 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 2633 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
2792 } | 2634 } |
2793 } | 2635 } |
2794 | 2636 |
2795 | 2637 |
2796 TEST(CallNew) { | 2638 TEST(CallNew) { |
2797 InitializedHandleScope handle_scope; | 2639 InitializedHandleScope handle_scope; |
2798 BytecodeGeneratorHelper helper; | 2640 BytecodeGeneratorHelper helper; |
2799 Zone zone; | 2641 Zone zone; |
2800 | 2642 |
2801 int context_reg = Register::function_context().index(); | |
2802 int global_index = Context::GLOBAL_OBJECT_INDEX; | |
2803 | |
2804 FeedbackVectorSpec feedback_spec(&zone); | 2643 FeedbackVectorSpec feedback_spec(&zone); |
2805 FeedbackVectorSlot slot1 = feedback_spec.AddGeneralSlot(); | 2644 FeedbackVectorSlot slot1 = feedback_spec.AddGeneralSlot(); |
2806 FeedbackVectorSlot slot2 = feedback_spec.AddLoadICSlot(); | 2645 FeedbackVectorSlot slot2 = feedback_spec.AddLoadICSlot(); |
2807 USE(slot1); | 2646 USE(slot1); |
2808 | 2647 |
2809 Handle<i::TypeFeedbackVector> vector = | 2648 Handle<i::TypeFeedbackVector> vector = |
2810 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); | 2649 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); |
2811 | 2650 |
2812 ExpectedSnippet<InstanceType> snippets[] = { | 2651 ExpectedSnippet<InstanceType> snippets[] = { |
2813 {"function bar() { this.value = 0; }\n" | 2652 {"function bar() { this.value = 0; }\n" |
2814 "function f() { return new bar(); }\n" | 2653 "function f() { return new bar(); }\n" |
2815 "f()", | 2654 "f()", |
2816 2 * kPointerSize, | 2655 1 * kPointerSize, |
2817 1, | 2656 1, |
2818 17, | 2657 10, |
2819 { | 2658 { |
2820 B(LdaContextSlot), R(context_reg), U8(global_index), // | 2659 B(LdaGlobalSloppy), U8(0), U8(vector->GetIndex(slot2)), // |
2821 B(Star), R(1), // | 2660 B(Star), R(0), // |
2822 B(LdaConstant), U8(0), // | 2661 B(New), R(0), R(0), U8(0), // |
2823 B(LoadICSloppy), R(1), U8(vector->GetIndex(slot2)), // | 2662 B(Return), // |
2824 B(Star), R(0), // | |
2825 B(New), R(0), R(0), U8(0), // | |
2826 B(Return), // | |
2827 }, | 2663 }, |
2828 1, | 2664 1, |
2829 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | 2665 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
2830 {"function bar(x) { this.value = 18; this.x = x;}\n" | 2666 {"function bar(x) { this.value = 18; this.x = x;}\n" |
2831 "function f() { return new bar(3); }\n" | 2667 "function f() { return new bar(3); }\n" |
2832 "f()", | 2668 "f()", |
2833 2 * kPointerSize, | 2669 2 * kPointerSize, |
2834 1, | 2670 1, |
2835 21, | 2671 14, |
2836 { | 2672 { |
2837 B(LdaContextSlot), R(context_reg), U8(global_index), // | 2673 B(LdaGlobalSloppy), U8(0), U8(vector->GetIndex(slot2)), // |
2838 B(Star), R(1), // | 2674 B(Star), R(0), // |
2839 B(LdaConstant), U8(0), // | 2675 B(LdaSmi8), U8(3), // |
2840 B(LoadICSloppy), R(1), U8(vector->GetIndex(slot2)), // | 2676 B(Star), R(1), // |
2841 B(Star), R(0), // | 2677 B(New), R(0), R(1), U8(1), // |
2842 B(LdaSmi8), U8(3), // | 2678 B(Return), // |
2843 B(Star), R(1), // | |
2844 B(New), R(0), R(1), U8(1), // | |
2845 B(Return), // | |
2846 }, | 2679 }, |
2847 1, | 2680 1, |
2848 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | 2681 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
2849 {"function bar(w, x, y, z) {\n" | 2682 {"function bar(w, x, y, z) {\n" |
2850 " this.value = 18;\n" | 2683 " this.value = 18;\n" |
2851 " this.x = x;\n" | 2684 " this.x = x;\n" |
2852 " this.y = y;\n" | 2685 " this.y = y;\n" |
2853 " this.z = z;\n" | 2686 " this.z = z;\n" |
2854 "}\n" | 2687 "}\n" |
2855 "function f() { return new bar(3, 4, 5); }\n" | 2688 "function f() { return new bar(3, 4, 5); }\n" |
2856 "f()", | 2689 "f()", |
2857 4 * kPointerSize, | 2690 4 * kPointerSize, |
2858 1, | 2691 1, |
2859 29, | 2692 22, |
2860 { | 2693 { |
2861 B(LdaContextSlot), R(context_reg), U8(global_index), // | 2694 B(LdaGlobalSloppy), U8(0), U8(vector->GetIndex(slot2)), // |
2862 B(Star), R(1), // | 2695 B(Star), R(0), // |
2863 B(LdaConstant), U8(0), // | 2696 B(LdaSmi8), U8(3), // |
2864 B(LoadICSloppy), R(1), U8(vector->GetIndex(slot2)), // | 2697 B(Star), R(1), // |
2865 B(Star), R(0), // | 2698 B(LdaSmi8), U8(4), // |
2866 B(LdaSmi8), U8(3), // | 2699 B(Star), R(2), // |
2867 B(Star), R(1), // | 2700 B(LdaSmi8), U8(5), // |
2868 B(LdaSmi8), U8(4), // | 2701 B(Star), R(3), // |
2869 B(Star), R(2), // | 2702 B(New), R(0), R(1), U8(3), // |
2870 B(LdaSmi8), U8(5), // | 2703 B(Return), // |
2871 B(Star), R(3), // | |
2872 B(New), R(0), R(1), U8(3), // | |
2873 B(Return), // | |
2874 }, | 2704 }, |
2875 1, | 2705 1, |
2876 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | 2706 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
2877 }; | 2707 }; |
2878 | 2708 |
2879 for (size_t i = 0; i < arraysize(snippets); i++) { | 2709 for (size_t i = 0; i < arraysize(snippets); i++) { |
2880 Handle<BytecodeArray> bytecode_array = | 2710 Handle<BytecodeArray> bytecode_array = |
2881 helper.MakeBytecode(snippets[i].code_snippet, "f"); | 2711 helper.MakeBytecode(snippets[i].code_snippet, "f"); |
2882 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true); | 2712 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true); |
2883 } | 2713 } |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3082 for (size_t i = 0; i < arraysize(snippets); i++) { | 2912 for (size_t i = 0; i < arraysize(snippets); i++) { |
3083 Handle<BytecodeArray> bytecode_array = | 2913 Handle<BytecodeArray> bytecode_array = |
3084 helper.MakeBytecodeForFunction(snippets[i].code_snippet); | 2914 helper.MakeBytecodeForFunction(snippets[i].code_snippet); |
3085 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 2915 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
3086 } | 2916 } |
3087 } | 2917 } |
3088 | 2918 |
3089 } // namespace interpreter | 2919 } // namespace interpreter |
3090 } // namespace internal | 2920 } // namespace internal |
3091 } // namespace v8 | 2921 } // namespace v8 |
OLD | NEW |