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

Side by Side Diff: test/cctest/compiler/test-run-bytecode-graph-builder.cc

Issue 1509273005: Adds additional tests for bytecode graph builder (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Added tests for ToName to interpreter. Created 5 years 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 | « no previous file | test/cctest/interpreter/test-interpreter.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 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 <utility> 5 #include <utility>
6 6
7 #include "src/compiler/pipeline.h" 7 #include "src/compiler/pipeline.h"
8 #include "src/execution.h" 8 #include "src/execution.h"
9 #include "src/handles.h" 9 #include "src/handles.h"
10 #include "src/interpreter/bytecode-array-builder.h" 10 #include "src/interpreter/bytecode-array-builder.h"
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 {"return false;", {factory->false_value()}}, 193 {"return false;", {factory->false_value()}},
194 {"return 0;", {factory->NewNumberFromInt(0)}}, 194 {"return 0;", {factory->NewNumberFromInt(0)}},
195 {"return +1;", {factory->NewNumberFromInt(1)}}, 195 {"return +1;", {factory->NewNumberFromInt(1)}},
196 {"return -1;", {factory->NewNumberFromInt(-1)}}, 196 {"return -1;", {factory->NewNumberFromInt(-1)}},
197 {"return +127;", {factory->NewNumberFromInt(127)}}, 197 {"return +127;", {factory->NewNumberFromInt(127)}},
198 {"return -128;", {factory->NewNumberFromInt(-128)}}, 198 {"return -128;", {factory->NewNumberFromInt(-128)}},
199 {"return 0.001;", {factory->NewNumber(0.001)}}, 199 {"return 0.001;", {factory->NewNumber(0.001)}},
200 {"return 3.7e-60;", {factory->NewNumber(3.7e-60)}}, 200 {"return 3.7e-60;", {factory->NewNumber(3.7e-60)}},
201 {"return -3.7e60;", {factory->NewNumber(-3.7e60)}}, 201 {"return -3.7e60;", {factory->NewNumber(-3.7e60)}},
202 {"return '';", {factory->NewStringFromStaticChars("")}}, 202 {"return '';", {factory->NewStringFromStaticChars("")}},
203 {"return 'catfood';", {factory->NewStringFromStaticChars("catfood")}} 203 {"return 'catfood';", {factory->NewStringFromStaticChars("catfood")}},
204 // TODO(oth): {"return NaN;", {factory->NewNumber(NAN)}} 204 {"return NaN;", {factory->nan_value()}}};
205 };
206 205
207 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); 206 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]);
208 for (size_t i = 0; i < num_snippets; i++) { 207 for (size_t i = 0; i < num_snippets; i++) {
209 ScopedVector<char> script(1024); 208 ScopedVector<char> script(1024);
210 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, 209 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName,
211 snippets[i].code_snippet, kFunctionName); 210 snippets[i].code_snippet, kFunctionName);
212 211
213 BytecodeGraphTester tester(isolate, zone, script.start()); 212 BytecodeGraphTester tester(isolate, zone, script.start());
214 auto callable = tester.GetCallable<>(); 213 auto callable = tester.GetCallable<>();
215 Handle<Object> return_value = callable().ToHandleChecked(); 214 Handle<Object> return_value = callable().ToHandleChecked();
(...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after
685 {factory->NewStringFromStaticChars("xyz")}}, 684 {factory->NewStringFromStaticChars("xyz")}},
686 {"var global = 'abc'; var global_obj = {val:123};\n" 685 {"var global = 'abc'; var global_obj = {val:123};\n"
687 "function f() {\n" REPEAT_127( 686 "function f() {\n" REPEAT_127(
688 SPACE, " var b = global_obj.name;\n") "return global; };\n f();\n", 687 SPACE, " var b = global_obj.name;\n") "return global; };\n f();\n",
689 {factory->NewStringFromStaticChars("abc")}}, 688 {factory->NewStringFromStaticChars("abc")}},
690 {"var global = 'abc'; var global_obj = {val:123};\n" 689 {"var global = 'abc'; var global_obj = {val:123};\n"
691 "function f() { 'use strict';\n" REPEAT_127( 690 "function f() { 'use strict';\n" REPEAT_127(
692 SPACE, " var b = global_obj.name;\n") "global = 'xyz'; return " 691 SPACE, " var b = global_obj.name;\n") "global = 'xyz'; return "
693 "global };\n f();\n", 692 "global };\n f();\n",
694 {factory->NewStringFromStaticChars("xyz")}}, 693 {factory->NewStringFromStaticChars("xyz")}},
695 // TODO(rmcilroy): Add tests for typeof_mode once we have typeof support. 694 {"function f() { return typeof(undeclared_var); }\n; f();\n",
695 {factory->NewStringFromStaticChars("undefined")}},
696 {"var defined_var = 10; function f() { return typeof(defined_var); }\n; "
697 "f();\n",
698 {factory->NewStringFromStaticChars("number")}},
696 }; 699 };
697 700
698 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); 701 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]);
699 for (size_t i = 0; i < num_snippets; i++) { 702 for (size_t i = 0; i < num_snippets; i++) {
700 BytecodeGraphTester tester(isolate, zone, snippets[i].code_snippet); 703 BytecodeGraphTester tester(isolate, zone, snippets[i].code_snippet);
701 auto callable = tester.GetCallable<>(); 704 auto callable = tester.GetCallable<>();
702 Handle<Object> return_value = callable().ToHandleChecked(); 705 Handle<Object> return_value = callable().ToHandleChecked();
703 CHECK(return_value->SameValue(*snippets[i].return_value())); 706 CHECK(return_value->SameValue(*snippets[i].return_value()));
704 } 707 }
705 } 708 }
706 709
707 710
708 TEST(BytecodeGraphBuilderCast) { 711 TEST(BytecodeGraphBuilderToObject) {
709 // TODO(mythria): tests for ToBoolean, ToObject, ToName, ToNumber. 712 // TODO(mythria): tests for ToObject. Needs ForIn.
710 // They need other unimplemented features to test.
711 // ToBoolean -> If
712 // ToObject -> ForIn
713 // ToNumber -> Inc/Dec
714 // ToName -> CreateObjectLiteral
715 } 713 }
716 714
717 715
716 TEST(BytecodeGraphBuilderToName) {
717 HandleAndZoneScope scope;
718 Isolate* isolate = scope.main_isolate();
719 Zone* zone = scope.main_zone();
720 Factory* factory = isolate->factory();
721
722 ExpectedSnippet<0> snippets[] = {
723 {"var a = 'val'; var obj = {[a] : 10}; return obj.val;",
724 {factory->NewNumberFromInt(10)}},
725 {"var a = 20; var obj = {[a] : 10}; return obj['20'];",
726 {factory->NewNumberFromInt(10)}},
727 {"var a = 20; var obj = {[a] : 10}; return obj[20];",
728 {factory->NewNumberFromInt(10)}},
729 {"var a = {val:23}; var obj = {[a] : 10}; return obj[a];",
730 {factory->NewNumberFromInt(10)}},
731 {"var a = {val:23}; var obj = {[a] : 10}; return obj['[object Object]'];",
732 {factory->NewNumberFromInt(10)}},
733 {"var a = {toString : function() { return 'x'}};\n"
734 "var obj = {[a] : 10};\n"
735 "return obj.x;",
736 {factory->NewNumberFromInt(10)}},
737 {"var a = {valueOf : function() { return 'x'}};\n"
738 "var obj = {[a] : 10};\n"
739 "return obj.x;",
740 {factory->undefined_value()}},
741 {"var a = {[Symbol.toPrimitive] : function() { return 'x'}};\n"
742 "var obj = {[a] : 10};\n"
743 "return obj.x;",
744 {factory->NewNumberFromInt(10)}},
745 };
746
747 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]);
748 for (size_t i = 0; i < num_snippets; i++) {
749 ScopedVector<char> script(1024);
750 SNPrintF(script, "function %s() { %s }\n%s({});", kFunctionName,
751 snippets[i].code_snippet, kFunctionName);
752
753 BytecodeGraphTester tester(isolate, zone, script.start());
754 auto callable = tester.GetCallable<>();
755 Handle<Object> return_value = callable().ToHandleChecked();
756 CHECK(return_value->SameValue(*snippets[i].return_value()));
757 }
758 }
759
760
718 TEST(BytecodeGraphBuilderLogicalNot) { 761 TEST(BytecodeGraphBuilderLogicalNot) {
719 HandleAndZoneScope scope; 762 HandleAndZoneScope scope;
720 Isolate* isolate = scope.main_isolate(); 763 Isolate* isolate = scope.main_isolate();
721 Zone* zone = scope.main_zone(); 764 Zone* zone = scope.main_zone();
722 Factory* factory = isolate->factory(); 765 Factory* factory = isolate->factory();
723 766
724 ExpectedSnippet<1> snippets[] = { 767 ExpectedSnippet<1> snippets[] = {
725 {"return !p1;", 768 {"return !p1;",
726 {factory->false_value(), 769 {factory->false_value(),
727 BytecodeGraphTester::NewObject("({val : 10})")}}, 770 BytecodeGraphTester::NewObject("({val : 10})")}},
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
857 {factory->NewNumberFromInt(10), 900 {factory->NewNumberFromInt(10),
858 BytecodeGraphTester::NewObject("({val : 10, name:'abc'})")}}, 901 BytecodeGraphTester::NewObject("({val : 10, name:'abc'})")}},
859 {"'use strict'; return delete p1.val;", 902 {"'use strict'; return delete p1.val;",
860 {factory->true_value(), BytecodeGraphTester::NewObject("({val : 10})")}}, 903 {factory->true_value(), BytecodeGraphTester::NewObject("({val : 10})")}},
861 {"'use strict'; delete p1.val; return p1.val;", 904 {"'use strict'; delete p1.val; return p1.val;",
862 {factory->undefined_value(), 905 {factory->undefined_value(),
863 BytecodeGraphTester::NewObject("({val : 10})")}}, 906 BytecodeGraphTester::NewObject("({val : 10})")}},
864 {"'use strict'; delete p1.name; return p1.val;", 907 {"'use strict'; delete p1.name; return p1.val;",
865 {factory->NewNumberFromInt(10), 908 {factory->NewNumberFromInt(10),
866 BytecodeGraphTester::NewObject("({val : 10, name:'abc'})")}}, 909 BytecodeGraphTester::NewObject("({val : 10, name:'abc'})")}},
867 // TODO(mythria): Add tests for global and unallocated when we have
868 // support for LdaContextSlot
869 }; 910 };
870 911
871 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); 912 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]);
872 for (size_t i = 0; i < num_snippets; i++) { 913 for (size_t i = 0; i < num_snippets; i++) {
873 ScopedVector<char> script(1024); 914 ScopedVector<char> script(1024);
874 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName, 915 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName,
875 snippets[i].code_snippet, kFunctionName); 916 snippets[i].code_snippet, kFunctionName);
876 917
877 BytecodeGraphTester tester(isolate, zone, script.start()); 918 BytecodeGraphTester tester(isolate, zone, script.start());
878 auto callable = tester.GetCallable<Handle<Object>>(); 919 auto callable = tester.GetCallable<Handle<Object>>();
879 Handle<Object> return_value = 920 Handle<Object> return_value =
880 callable(snippets[i].parameter(0)).ToHandleChecked(); 921 callable(snippets[i].parameter(0)).ToHandleChecked();
881 CHECK(return_value->SameValue(*snippets[i].return_value())); 922 CHECK(return_value->SameValue(*snippets[i].return_value()));
882 } 923 }
883 } 924 }
884 925
885 926
927 TEST(BytecodeGraphBuilderDeleteGlobal) {
928 HandleAndZoneScope scope;
929 Isolate* isolate = scope.main_isolate();
930 Zone* zone = scope.main_zone();
931 Factory* factory = isolate->factory();
932
933 ExpectedSnippet<0> snippets[] = {
934 {"var obj = {val : 10, type : 'int'};"
935 "function f() {return delete obj;};",
936 {factory->false_value()}},
937 {"function f() {return delete this;};", {factory->true_value()}},
938 {"var obj = {val : 10, type : 'int'};"
939 "function f() {return delete obj.val;};",
940 {factory->true_value()}},
941 {"var obj = {val : 10, type : 'int'};"
942 "function f() {'use strict'; return delete obj.val;};",
943 {factory->true_value()}},
944 {"var obj = {val : 10, type : 'int'};"
945 "function f() {delete obj.val; return obj.val;};",
946 {factory->undefined_value()}},
947 {"var obj = {val : 10, type : 'int'};"
948 "function f() {'use strict'; delete obj.val; return obj.val;};",
949 {factory->undefined_value()}},
950 {"var obj = {1 : 10, 2 : 20};"
951 "function f() { return delete obj[1]; };",
952 {factory->true_value()}},
953 {"var obj = {1 : 10, 2 : 20};"
954 "function f() { 'use strict'; return delete obj[1];};",
955 {factory->true_value()}},
956 {"obj = {1 : 10, 2 : 20};"
957 "function f() { delete obj[1]; return obj[2];};",
958 {factory->NewNumberFromInt(20)}},
959 {"function f() {"
960 " var obj = {1 : 10, 2 : 20};"
961 " function inner() { return obj[1]; };"
962 " return delete obj[1];"
963 "}",
964 {factory->true_value()}},
965 };
966
967 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]);
968 for (size_t i = 0; i < num_snippets; i++) {
969 ScopedVector<char> script(1024);
970 SNPrintF(script, "%s %s({});", snippets[i].code_snippet, kFunctionName);
971
972 BytecodeGraphTester tester(isolate, zone, script.start());
973 auto callable = tester.GetCallable<>();
974 Handle<Object> return_value = callable().ToHandleChecked();
975 CHECK(return_value->SameValue(*snippets[i].return_value()));
976 }
977 }
978
979
886 bool get_compare_result(Token::Value opcode, Handle<Object> lhs_value, 980 bool get_compare_result(Token::Value opcode, Handle<Object> lhs_value,
887 Handle<Object> rhs_value) { 981 Handle<Object> rhs_value) {
888 switch (opcode) { 982 switch (opcode) {
889 case Token::Value::EQ: 983 case Token::Value::EQ:
890 return Object::Equals(lhs_value, rhs_value).FromJust(); 984 return Object::Equals(lhs_value, rhs_value).FromJust();
891 case Token::Value::NE: 985 case Token::Value::NE:
892 return !Object::Equals(lhs_value, rhs_value).FromJust(); 986 return !Object::Equals(lhs_value, rhs_value).FromJust();
893 case Token::Value::EQ_STRICT: 987 case Token::Value::EQ_STRICT:
894 return lhs_value->StrictEquals(*rhs_value); 988 return lhs_value->StrictEquals(*rhs_value);
895 case Token::Value::NE_STRICT: 989 case Token::Value::NE_STRICT:
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
1015 auto callable = tester.GetCallable<Handle<Object>, Handle<Object>>(); 1109 auto callable = tester.GetCallable<Handle<Object>, Handle<Object>>();
1016 Handle<Object> return_value = 1110 Handle<Object> return_value =
1017 callable(snippets[i].parameter(0), snippets[i].parameter(1)) 1111 callable(snippets[i].parameter(0), snippets[i].parameter(1))
1018 .ToHandleChecked(); 1112 .ToHandleChecked();
1019 CHECK(return_value->SameValue(*snippets[i].return_value())); 1113 CHECK(return_value->SameValue(*snippets[i].return_value()));
1020 } 1114 }
1021 } 1115 }
1022 1116
1023 1117
1024 TEST(BytecodeGraphBuilderTestInstanceOf) { 1118 TEST(BytecodeGraphBuilderTestInstanceOf) {
1025 // TODO(mythria): Add tests when CreateLiterals/CreateClousre are supported. 1119 HandleAndZoneScope scope;
1120 Isolate* isolate = scope.main_isolate();
1121 Zone* zone = scope.main_zone();
1122 Factory* factory = isolate->factory();
1123
1124 ExpectedSnippet<1> snippets[] = {
1125 {"return p1 instanceof Object;",
1126 {factory->true_value(), BytecodeGraphTester::NewObject("({val : 10})")}},
1127 {"return p1 instanceof String;",
1128 {factory->false_value(), factory->NewStringFromStaticChars("string")}},
1129 {"var cons = function() {};"
1130 "var obj = new cons();"
1131 "return obj instanceof cons;",
1132 {factory->true_value(), factory->undefined_value()}},
1133 };
1134
1135 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]);
1136 for (size_t i = 0; i < num_snippets; i++) {
1137 ScopedVector<char> script(1024);
1138 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName,
1139 snippets[i].code_snippet, kFunctionName);
1140
1141 BytecodeGraphTester tester(isolate, zone, script.start());
1142 auto callable = tester.GetCallable<Handle<Object>>();
1143 Handle<Object> return_value =
1144 callable(snippets[i].parameter(0)).ToHandleChecked();
1145 CHECK(return_value->SameValue(*snippets[i].return_value()));
1146 }
1026 } 1147 }
1027 1148
1028 1149
1029 TEST(BytecodeGraphBuilderThrow) { 1150 TEST(BytecodeGraphBuilderThrow) {
1030 HandleAndZoneScope scope; 1151 HandleAndZoneScope scope;
1031 Isolate* isolate = scope.main_isolate(); 1152 Isolate* isolate = scope.main_isolate();
1032 Zone* zone = scope.main_zone(); 1153 Zone* zone = scope.main_zone();
1033 1154
1034 // TODO(mythria): Add more tests when real try-catch and deoptimization 1155 // TODO(mythria): Add more tests when real try-catch and deoptimization
1035 // information are supported. 1156 // information are supported.
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
1323 BytecodeGraphTester tester(isolate, zone, script.start()); 1444 BytecodeGraphTester tester(isolate, zone, script.start());
1324 auto callable = tester.GetCallable<>(); 1445 auto callable = tester.GetCallable<>();
1325 Handle<Object> return_value = callable().ToHandleChecked(); 1446 Handle<Object> return_value = callable().ToHandleChecked();
1326 CHECK(return_value->SameValue(*snippets[i].return_value())); 1447 CHECK(return_value->SameValue(*snippets[i].return_value()));
1327 } 1448 }
1328 } 1449 }
1329 1450
1330 } // namespace compiler 1451 } // namespace compiler
1331 } // namespace internal 1452 } // namespace internal
1332 } // namespace v8 1453 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | test/cctest/interpreter/test-interpreter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698