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

Side by Side Diff: test/cctest/interpreter/test-bytecode-generator.cc

Issue 1373903005: [Interpreter] Add for/while/do support to the bytecode generator. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase. Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/objects.cc ('k') | tools/gyp/v8.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 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 727 matching lines...) Expand 10 before | Expand all | Expand 10 after
738 ExpectedSnippet<Handle<Object>> snippets[] = { 738 ExpectedSnippet<Handle<Object>> snippets[] = {
739 {"function f() { if (0) { return 1; } else { return -1; } } f()", 739 {"function f() { if (0) { return 1; } else { return -1; } } f()",
740 0, 740 0,
741 1, 741 1,
742 14, 742 14,
743 {B(LdaZero), // 743 {B(LdaZero), //
744 B(ToBoolean), // 744 B(ToBoolean), //
745 B(JumpIfFalse), U8(7), // 745 B(JumpIfFalse), U8(7), //
746 B(LdaSmi8), U8(1), // 746 B(LdaSmi8), U8(1), //
747 B(Return), // 747 B(Return), //
748 B(Jump), U8(5), // TODO(oth): Unreachable jump after return 748 B(Jump), U8(5), //
749 B(LdaSmi8), U8(-1), // 749 B(LdaSmi8), U8(-1), //
750 B(Return), // 750 B(Return), //
751 B(LdaUndefined), // 751 B(LdaUndefined), //
752 B(Return)}, // 752 B(Return)}, //
753 0, 753 0,
754 {unused, unused, unused, unused}}, 754 {unused, unused, unused, unused}},
755 {"function f() { if ('lucky') { return 1; } else { return -1; } } f();", 755 {"function f() { if ('lucky') { return 1; } else { return -1; } } f();",
756 0, 756 0,
757 1, 757 1,
758 15, 758 15,
759 {B(LdaConstant), U8(0), // 759 {B(LdaConstant), U8(0), //
760 B(ToBoolean), // 760 B(ToBoolean), //
761 B(JumpIfFalse), U8(7), // 761 B(JumpIfFalse), U8(7), //
762 B(LdaSmi8), U8(1), // 762 B(LdaSmi8), U8(1), //
763 B(Return), // 763 B(Return), //
764 B(Jump), U8(5), // TODO(oth): Unreachable jump after return 764 B(Jump), U8(5), //
765 B(LdaSmi8), U8(-1), // 765 B(LdaSmi8), U8(-1), //
766 B(Return), // 766 B(Return), //
767 B(LdaUndefined), // 767 B(LdaUndefined), //
768 B(Return)}, // 768 B(Return)}, //
769 1, 769 1,
770 {helper.factory()->NewStringFromStaticChars("lucky"), unused, unused, 770 {helper.factory()->NewStringFromStaticChars("lucky"), unused, unused,
771 unused}}, 771 unused}},
772 {"function f() { if (false) { return 1; } else { return -1; } } f();", 772 {"function f() { if (false) { return 1; } else { return -1; } } f();",
773 0, 773 0,
774 1, 774 1,
775 13, 775 13,
776 {B(LdaFalse), // 776 {B(LdaFalse), //
777 B(JumpIfFalse), U8(7), // 777 B(JumpIfFalse), U8(7), //
778 B(LdaSmi8), U8(1), // 778 B(LdaSmi8), U8(1), //
779 B(Return), // 779 B(Return), //
780 B(Jump), U8(5), // TODO(oth): Unreachable jump after return 780 B(Jump), U8(5), //
781 B(LdaSmi8), U8(-1), // 781 B(LdaSmi8), U8(-1), //
782 B(Return), // 782 B(Return), //
783 B(LdaUndefined), // 783 B(LdaUndefined), //
784 B(Return)}, // 784 B(Return)}, //
785 0, 785 0,
786 {unused, unused, unused, unused}}, 786 {unused, unused, unused, unused}},
787 {"function f(a) { if (a <= 0) { return 200; } else { return -200; } }" 787 {"function f(a) { if (a <= 0) { return 200; } else { return -200; } }"
788 "f(99);", 788 "f(99);",
789 kPointerSize, 789 kPointerSize,
790 2, 790 2,
791 19, 791 19,
792 {B(Ldar), R(helper.kLastParamIndex), // 792 {B(Ldar), R(helper.kLastParamIndex), //
793 B(Star), R(0), // 793 B(Star), R(0), //
794 B(LdaZero), // 794 B(LdaZero), //
795 B(TestLessThanOrEqual), R(0), // 795 B(TestLessThanOrEqual), R(0), //
796 B(JumpIfFalse), U8(7), // 796 B(JumpIfFalse), U8(7), //
797 B(LdaConstant), U8(0), // 797 B(LdaConstant), U8(0), //
798 B(Return), // 798 B(Return), //
799 B(Jump), U8(5), // TODO(oth): Unreachable jump after return 799 B(Jump), U8(5), //
800 B(LdaConstant), U8(1), // 800 B(LdaConstant), U8(1), //
801 B(Return), // 801 B(Return), //
802 B(LdaUndefined), // 802 B(LdaUndefined), //
803 B(Return)}, // 803 B(Return)}, //
804 2, 804 2,
805 {helper.factory()->NewNumberFromInt(200), 805 {helper.factory()->NewNumberFromInt(200),
806 helper.factory()->NewNumberFromInt(-200), unused, unused}}, 806 helper.factory()->NewNumberFromInt(-200), unused, unused}},
807 {"function f(a, b) { if (a in b) { return 200; } }" 807 {"function f(a, b) { if (a in b) { return 200; } }"
808 "f('prop', { prop: 'yes'});", 808 "f('prop', { prop: 'yes'});",
809 kPointerSize, 809 kPointerSize,
810 3, 810 3,
811 17, 811 15,
812 {B(Ldar), R(helper.kLastParamIndex - 1), // 812 {B(Ldar), R(helper.kLastParamIndex - 1), //
813 B(Star), R(0), // 813 B(Star), R(0), //
814 B(Ldar), R(helper.kLastParamIndex), // 814 B(Ldar), R(helper.kLastParamIndex), //
815 B(TestIn), R(0), // 815 B(TestIn), R(0), //
816 B(JumpIfFalse), U8(7), // 816 B(JumpIfFalse), U8(5), //
817 B(LdaConstant), U8(0), // 817 B(LdaConstant), U8(0), //
818 B(Return), // 818 B(Return), //
819 B(Jump), U8(2), // TODO(oth): Unreachable jump after return 819 B(LdaUndefined), //
820 B(LdaUndefined), // 820 B(Return)}, //
821 B(Return)}, //
822 1, 821 1,
823 {helper.factory()->NewNumberFromInt(200), unused, unused, unused}}, 822 {helper.factory()->NewNumberFromInt(200), unused, unused, unused}},
824 {"function f(z) { var a = 0; var b = 0; if (a === 0.01) { " 823 {"function f(z) { var a = 0; var b = 0; if (a === 0.01) { "
825 #define X "b = a; a = b; " 824 #define X "b = a; a = b; "
826 X X X X X X X X X X X X X X X X X X X X X X X X 825 X X X X X X X X X X X X X X X X X X X X X X X X
827 #undef X 826 #undef X
828 " return 200; } else { return -200; } } f(0.001)", 827 " return 200; } else { return -200; } } f(0.001)",
829 3 * kPointerSize, 828 3 * kPointerSize,
830 2, 829 2,
831 218, 830 218,
832 {B(LdaZero), // 831 {B(LdaZero), //
833 B(Star), R(0), // 832 B(Star), R(0), //
834 B(LdaZero), // 833 B(LdaZero), //
835 B(Star), R(1), // 834 B(Star), R(1), //
836 B(Ldar), R(0), // 835 B(Ldar), R(0), //
837 B(Star), R(2), // 836 B(Star), R(2), //
838 B(LdaConstant), U8(0), // 837 B(LdaConstant), U8(0), //
839 B(TestEqualStrict), R(2), // 838 B(TestEqualStrict), R(2), //
840 B(JumpIfFalseConstant), U8(2), // 839 B(JumpIfFalseConstant), U8(2), //
841 #define X B(Ldar), R(0), B(Star), R(1), B(Ldar), R(1), B(Star), R(0), 840 #define X B(Ldar), R(0), B(Star), R(1), B(Ldar), R(1), B(Star), R(0),
842 X X X X X X X X X X X X X X X X X X X X X X X X 841 X X X X X X X X X X X X X X X X X X X X X X X X
843 #undef X 842 #undef X
844 B(LdaConstant), 843 B(LdaConstant), U8(1), //
845 U8(1), //
846 B(Return), // 844 B(Return), //
847 B(Jump), U8(5), // TODO(oth): Unreachable jump after return 845 B(Jump), U8(5), //
848 B(LdaConstant), U8(3), // 846 B(LdaConstant), U8(3), //
849 B(Return), // 847 B(Return), //
850 B(LdaUndefined), // 848 B(LdaUndefined), //
851 B(Return)}, // 849 B(Return)}, //
852 4, 850 4,
853 {helper.factory()->NewHeapNumber(0.01), 851 {helper.factory()->NewHeapNumber(0.01),
854 helper.factory()->NewNumberFromInt(200), 852 helper.factory()->NewNumberFromInt(200),
855 helper.factory()->NewNumberFromInt(199), 853 helper.factory()->NewNumberFromInt(199),
856 helper.factory()->NewNumberFromInt(-200)}}, 854 helper.factory()->NewNumberFromInt(-200)}},
857 {"function f(a, b) {\n" 855 {"function f(a, b) {\n"
858 " if (a == b) { return 1; }\n" 856 " if (a == b) { return 1; }\n"
859 " if (a === b) { return 1; }\n" 857 " if (a === b) { return 1; }\n"
860 " if (a < b) { return 1; }\n" 858 " if (a < b) { return 1; }\n"
861 " if (a > b) { return 1; }\n" 859 " if (a > b) { return 1; }\n"
862 " if (a <= b) { return 1; }\n" 860 " if (a <= b) { return 1; }\n"
863 " if (a >= b) { return 1; }\n" 861 " if (a >= b) { return 1; }\n"
864 " if (a in b) { return 1; }\n" 862 " if (a in b) { return 1; }\n"
865 " if (a instanceof b) { return 1; }\n" 863 " if (a instanceof b) { return 1; }\n"
866 " /* if (a != b) { return 1; } */" // TODO(oth) Ast visitor yields 864 " /* if (a != b) { return 1; } */" // TODO(oth) Ast visitor yields
867 " /* if (a !== b) { return 1; } */" // UNARY NOT, rather than !=/!==. 865 " /* if (a !== b) { return 1; } */" // UNARY NOT, rather than !=/!==.
868 " return 0;\n" 866 " return 0;\n"
869 "} f(1, 1);", 867 "} f(1, 1);",
870 kPointerSize, 868 kPointerSize,
871 3, 869 3,
872 122, 870 106,
873 { 871 {
874 #define IF_CONDITION_RETURN(condition) \ 872 #define IF_CONDITION_RETURN(condition) \
875 B(Ldar), R(helper.kLastParamIndex - 1), \ 873 B(Ldar), R(helper.kLastParamIndex - 1), \
876 B(Star), R(0), \ 874 B(Star), R(0), \
877 B(Ldar), R(helper.kLastParamIndex), \ 875 B(Ldar), R(helper.kLastParamIndex), \
878 B(condition), R(0), \ 876 B(condition), R(0), \
879 B(JumpIfFalse), U8(7), \ 877 B(JumpIfFalse), U8(5), \
880 B(LdaSmi8), U8(1), \ 878 B(LdaSmi8), U8(1), \
881 B(Return), \ 879 B(Return),
882 B(Jump), U8(2),
883 IF_CONDITION_RETURN(TestEqual) // 880 IF_CONDITION_RETURN(TestEqual) //
884 IF_CONDITION_RETURN(TestEqualStrict) // 881 IF_CONDITION_RETURN(TestEqualStrict) //
885 IF_CONDITION_RETURN(TestLessThan) // 882 IF_CONDITION_RETURN(TestLessThan) //
886 IF_CONDITION_RETURN(TestGreaterThan) // 883 IF_CONDITION_RETURN(TestGreaterThan) //
887 IF_CONDITION_RETURN(TestLessThanOrEqual) // 884 IF_CONDITION_RETURN(TestLessThanOrEqual) //
888 IF_CONDITION_RETURN(TestGreaterThanOrEqual) // 885 IF_CONDITION_RETURN(TestGreaterThanOrEqual) //
889 IF_CONDITION_RETURN(TestIn) // 886 IF_CONDITION_RETURN(TestIn) //
890 IF_CONDITION_RETURN(TestInstanceOf) // 887 IF_CONDITION_RETURN(TestInstanceOf) //
891 #undef IF_CONDITION_RETURN 888 #undef IF_CONDITION_RETURN
892 B(LdaZero), // 889 B(LdaZero), //
893 B(Return)}, // 890 B(Return)}, //
894 0, 891 0,
895 {unused, unused, unused, unused}}, 892 {unused, unused, unused, unused}},
896 }; 893 };
897 894
898 for (size_t i = 0; i < arraysize(snippets); i++) { 895 for (size_t i = 0; i < arraysize(snippets); i++) {
899 Handle<BytecodeArray> bytecode_array = 896 Handle<BytecodeArray> bytecode_array =
900 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); 897 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName);
901 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 898 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
902 } 899 }
903 } 900 }
904 901
905 902
903 TEST(BasicLoops) {
904 InitializedHandleScope handle_scope;
905 BytecodeGeneratorHelper helper;
906
907 ExpectedSnippet<int> snippets[] = {
908 {"var x = 0;"
909 "var y = 1;"
910 "while (x < 10) {"
911 " y = y * 10;"
912 " x = x + 1;"
913 "}"
914 "return y;",
915 3 * kPointerSize,
916 1,
917 42,
918 {
919 B(LdaZero), //
920 B(Star), R(0), //
921 B(LdaSmi8), U8(1), //
922 B(Star), R(1), //
923 B(Jump), U8(22), //
924 B(Ldar), R(1), //
925 B(Star), R(2), //
926 B(LdaSmi8), U8(10), //
927 B(Mul), R(2), //
928 B(Star), R(1), //
929 B(Ldar), R(0), //
930 B(Star), R(2), //
931 B(LdaSmi8), U8(1), //
932 B(Add), R(2), //
933 B(Star), R(0), //
934 B(Ldar), R(0), //
935 B(Star), R(2), //
936 B(LdaSmi8), U8(10), //
937 B(TestLessThan), R(2), //
938 B(JumpIfTrue), U8(-28), //
939 B(Ldar), R(1), //
940 B(Return), //
941 },
942 0},
943 {"var i = 0;"
944 "while(true) {"
945 " if (i < 0) continue;"
946 " if (i == 3) break;"
947 " if (i == 4) break;"
948 " if (i == 10) continue;"
949 " if (i == 5) break;"
950 " i = i + 1;"
951 "}"
952 "return i;",
953 2 * kPointerSize,
954 1,
955 80,
956 {
957 B(LdaZero), //
958 B(Star), R(0), //
959 B(Jump), U8(71), //
960 B(Ldar), R(0), //
961 B(Star), R(1), //
962 B(LdaZero), //
963 B(TestLessThan), R(1), //
964 B(JumpIfFalse), U8(4), //
965 B(Jump), U8(60), //
966 B(Ldar), R(0), //
967 B(Star), R(1), //
968 B(LdaSmi8), U8(3), //
969 B(TestEqual), R(1), //
970 B(JumpIfFalse), U8(4), //
971 B(Jump), U8(51), //
972 B(Ldar), R(0), //
973 B(Star), R(1), //
974 B(LdaSmi8), U8(4), //
975 B(TestEqual), R(1), //
976 B(JumpIfFalse), U8(4), //
977 B(Jump), U8(39), //
978 B(Ldar), R(0), //
979 B(Star), R(1), //
980 B(LdaSmi8), U8(10), //
981 B(TestEqual), R(1), //
982 B(JumpIfFalse), U8(4), //
983 B(Jump), U8(24), //
984 B(Ldar), R(0), //
985 B(Star), R(1), //
986 B(LdaSmi8), U8(5), //
987 B(TestEqual), R(1), //
988 B(JumpIfFalse), U8(4), //
989 B(Jump), U8(15), //
990 B(Ldar), R(0), //
991 B(Star), R(1), //
992 B(LdaSmi8), U8(1), //
993 B(Add), R(1), //
994 B(Star), R(0), //
995 B(LdaTrue), //
996 B(JumpIfTrue), U8(-70), //
997 B(Ldar), R(0), //
998 B(Return) //
999 },
1000 0},
1001 {"var x = 0; var y = 1;"
1002 "do {"
1003 " y = y * 10;"
1004 " if (x == 5) break;"
1005 " if (x == 6) continue;"
1006 " x = x + 1;"
1007 "} while (x < 10);"
1008 "return y;",
1009 3 * kPointerSize,
1010 1,
1011 64,
1012 {
1013 B(LdaZero), //
1014 B(Star), R(0), //
1015 B(LdaSmi8), U8(1), //
1016 B(Star), R(1), //
1017 B(Ldar), R(1), //
1018 B(Star), R(2), //
1019 B(LdaSmi8), U8(10), //
1020 B(Mul), R(2), //
1021 B(Star), R(1), //
1022 B(Ldar), R(0), //
1023 B(Star), R(2), //
1024 B(LdaSmi8), U8(5), //
1025 B(TestEqual), R(2), //
1026 B(JumpIfFalse), U8(4), //
1027 B(Jump), U8(34), //
1028 B(Ldar), R(0), //
1029 B(Star), R(2), //
1030 B(LdaSmi8), U8(6), //
1031 B(TestEqual), R(2), //
1032 B(JumpIfFalse), U8(4), //
1033 B(Jump), U8(12), //
1034 B(Ldar), R(0), //
1035 B(Star), R(2), //
1036 B(LdaSmi8), U8(1), //
1037 B(Add), R(2), //
1038 B(Star), R(0), //
1039 B(Ldar), R(0), //
1040 B(Star), R(2), //
1041 B(LdaSmi8), U8(10), //
1042 B(TestLessThan), R(2), //
1043 B(JumpIfTrue), U8(-52), //
1044 B(Ldar), R(1), //
1045 B(Return) //
1046 },
1047 0},
1048 {"var x = 0; "
1049 "for(;;) {"
1050 " if (x == 1) break;"
1051 " x = x + 1;"
1052 "}",
1053 2 * kPointerSize,
1054 1,
1055 29,
1056 {
1057 B(LdaZero), //
1058 B(Star), R(0), //
1059 B(Ldar), R(0), //
1060 B(Star), R(1), //
1061 B(LdaSmi8), //
1062 U8(1), //
1063 B(TestEqual), R(1), //
1064 B(JumpIfFalse), U8(4), //
1065 B(Jump), U8(14), //
1066 B(Ldar), R(0), //
1067 B(Star), R(1), //
1068 B(LdaSmi8), U8(1), //
1069 B(Add), R(1), //
1070 B(Star), R(0), //
1071 B(Jump), U8(-22), //
1072 B(LdaUndefined), //
1073 B(Return), //
1074 },
1075 0},
1076 {"var u = 0;"
1077 "for(var i = 0; i < 100; i = i + 1) {"
1078 " u = u + 1;"
1079 " continue;"
1080 "}",
1081 3 * kPointerSize,
1082 1,
1083 42,
1084 {
1085 B(LdaZero), //
1086 B(Star), R(0), //
1087 B(LdaZero), //
1088 B(Star), R(1), //
1089 B(Jump), U8(24), //
1090 B(Ldar), R(0), //
1091 B(Star), R(2), //
1092 B(LdaSmi8), U8(1), //
1093 B(Add), R(2), //
1094 B(Star), R(0), //
1095 B(Jump), U8(2), //
1096 B(Ldar), R(1), //
1097 B(Star), R(2), //
1098 B(LdaSmi8), U8(1), //
1099 B(Add), R(2), //
1100 B(Star), R(1), //
1101 B(Ldar), R(1), //
1102 B(Star), R(2), //
1103 B(LdaSmi8), U8(100), //
1104 B(TestLessThan), R(2), //
1105 B(JumpIfTrue), U8(-30), //
1106 B(LdaUndefined), //
1107 B(Return), //
1108 },
1109 0},
1110 {"var i = 0;"
1111 "while(true) {"
1112 " while (i < 3) {"
1113 " if (i == 2) break;"
1114 " i = i + 1;"
1115 " }"
1116 " i = i + 1;"
1117 " break;"
1118 "}"
1119 "return i;",
1120 2 * kPointerSize,
1121 1,
1122 57,
1123 {
1124 B(LdaZero), //
1125 B(Star), R(0), //
1126 B(Jump), U8(48), //
1127 B(Jump), U8(24), //
1128 B(Ldar), R(0), //
1129 B(Star), R(1), //
1130 B(LdaSmi8), U8(2), //
1131 B(TestEqual), R(1), //
1132 B(JumpIfFalse), U8(4), //
1133 B(Jump), U8(22), //
1134 B(Ldar), R(0), //
1135 B(Star), R(1), //
1136 B(LdaSmi8), U8(1), //
1137 B(Add), R(1), //
1138 B(Star), R(0), //
1139 B(Ldar), R(0), //
1140 B(Star), R(1), //
1141 B(LdaSmi8), U8(3), //
1142 B(TestLessThan), R(1), //
1143 B(JumpIfTrue), U8(-30), //
1144 B(Ldar), R(0), //
1145 B(Star), R(1), //
1146 B(LdaSmi8), U8(1), //
1147 B(Add), R(1), //
1148 B(Star), R(0), //
1149 B(Jump), U8(5), //
1150 B(LdaTrue), //
1151 B(JumpIfTrue), U8(-47), //
1152 B(Ldar), R(0), //
1153 B(Return), //
1154 },
1155 0},
1156 };
1157
1158 for (size_t i = 0; i < arraysize(snippets); i++) {
1159 Handle<BytecodeArray> bytecode_array =
1160 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
1161 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
1162 }
1163 }
1164
906 } // namespace interpreter 1165 } // namespace interpreter
907 } // namespace internal 1166 } // namespace internal
908 } // namespace v8 1167 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.cc ('k') | tools/gyp/v8.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698