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 <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 1020 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1031 " var z = 20;" | 1031 " var z = 20;" |
1032 " eval(\"function t() {"; | 1032 " eval(\"function t() {"; |
1033 const char* function_epilogue = " }; f = t; t();\");" | 1033 const char* function_epilogue = " }; f = t; t();\");" |
1034 "}" | 1034 "}" |
1035 "f1();"; | 1035 "f1();"; |
1036 | 1036 |
1037 ExpectedSnippet<0> snippets[] = { | 1037 ExpectedSnippet<0> snippets[] = { |
1038 {"return x;", {factory->NewNumber(12)}}, | 1038 {"return x;", {factory->NewNumber(12)}}, |
1039 {"return obj.val;", {factory->NewNumber(3.1414)}}, | 1039 {"return obj.val;", {factory->NewNumber(3.1414)}}, |
1040 {"return typeof x;", {factory->NewStringFromStaticChars("number")}}, | 1040 {"return typeof x;", {factory->NewStringFromStaticChars("number")}}, |
| 1041 {"return typeof dummy;", |
| 1042 {factory->NewStringFromStaticChars("undefined")}}, |
1041 {"x = 23; return x;", {factory->NewNumber(23)}}, | 1043 {"x = 23; return x;", {factory->NewNumber(23)}}, |
1042 {"'use strict'; obj.val = 23.456; return obj.val;", | 1044 {"'use strict'; obj.val = 23.456; return obj.val;", |
1043 {factory->NewNumber(23.456)}}}; | 1045 {factory->NewNumber(23.456)}}}; |
1044 | 1046 |
1045 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1047 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); |
1046 for (size_t i = 0; i < num_snippets; i++) { | 1048 for (size_t i = 0; i < num_snippets; i++) { |
1047 ScopedVector<char> script(1024); | 1049 ScopedVector<char> script(1024); |
1048 SNPrintF(script, "%s %s %s", function_prologue, snippets[i].code_snippet, | 1050 SNPrintF(script, "%s %s %s", function_prologue, snippets[i].code_snippet, |
1049 function_epilogue); | 1051 function_epilogue); |
1050 | 1052 |
1051 BytecodeGraphTester tester(isolate, zone, script.start(), "t"); | 1053 BytecodeGraphTester tester(isolate, zone, script.start(), "t"); |
1052 auto callable = tester.GetCallable<>(); | 1054 auto callable = tester.GetCallable<>(); |
1053 Handle<Object> return_value = callable().ToHandleChecked(); | 1055 Handle<Object> return_value = callable().ToHandleChecked(); |
1054 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1056 CHECK(return_value->SameValue(*snippets[i].return_value())); |
1055 } | 1057 } |
1056 } | 1058 } |
1057 | 1059 |
1058 | 1060 |
| 1061 TEST(BytecodeGraphBuilderLookupSlotWide) { |
| 1062 HandleAndZoneScope scope; |
| 1063 Isolate* isolate = scope.main_isolate(); |
| 1064 Zone* zone = scope.main_zone(); |
| 1065 Factory* factory = isolate->factory(); |
| 1066 |
| 1067 const char* function_prologue = |
| 1068 "var f;" |
| 1069 "var x = 12;" |
| 1070 "y = 10;" |
| 1071 "var obj = {val:3.1414};" |
| 1072 "var z = 30;" |
| 1073 "function f1() {" |
| 1074 " var z = 20;" |
| 1075 " eval(\"function t() {"; |
| 1076 const char* function_epilogue = |
| 1077 " }; f = t; t();\");" |
| 1078 "}" |
| 1079 "f1();"; |
| 1080 std::ostringstream str; |
| 1081 str << "var y = 2.3; "; |
| 1082 for (int i = 1; i < 256; i++) { |
| 1083 str << "y = " << 2.3 + i << "; "; |
| 1084 } |
| 1085 std::string init_function_body = str.str(); |
| 1086 |
| 1087 std::pair<std::string, Handle<Object>> snippets[] = { |
| 1088 {init_function_body + "return x;", factory->NewNumber(12)}, |
| 1089 {init_function_body + "return typeof x;", |
| 1090 factory->NewStringFromStaticChars("number")}, |
| 1091 {init_function_body + "return x = 23;", factory->NewNumber(23)}, |
| 1092 {"'use strict';" + init_function_body + "return obj.val = 23.456;", |
| 1093 factory->NewNumber(23.456)}}; |
| 1094 |
| 1095 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); |
| 1096 for (size_t i = 0; i < num_snippets; i++) { |
| 1097 ScopedVector<char> script(3072); |
| 1098 SNPrintF(script, "%s %s %s", function_prologue, snippets[i].first.c_str(), |
| 1099 function_epilogue); |
| 1100 |
| 1101 BytecodeGraphTester tester(isolate, zone, script.start(), "t"); |
| 1102 auto callable = tester.GetCallable<>(); |
| 1103 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1104 CHECK(return_value->SameValue(*snippets[i].second)); |
| 1105 } |
| 1106 } |
| 1107 |
| 1108 |
1059 bool get_compare_result(Token::Value opcode, Handle<Object> lhs_value, | 1109 bool get_compare_result(Token::Value opcode, Handle<Object> lhs_value, |
1060 Handle<Object> rhs_value) { | 1110 Handle<Object> rhs_value) { |
1061 switch (opcode) { | 1111 switch (opcode) { |
1062 case Token::Value::EQ: | 1112 case Token::Value::EQ: |
1063 return Object::Equals(lhs_value, rhs_value).FromJust(); | 1113 return Object::Equals(lhs_value, rhs_value).FromJust(); |
1064 case Token::Value::NE: | 1114 case Token::Value::NE: |
1065 return !Object::Equals(lhs_value, rhs_value).FromJust(); | 1115 return !Object::Equals(lhs_value, rhs_value).FromJust(); |
1066 case Token::Value::EQ_STRICT: | 1116 case Token::Value::EQ_STRICT: |
1067 return lhs_value->StrictEquals(*rhs_value); | 1117 return lhs_value->StrictEquals(*rhs_value); |
1068 case Token::Value::NE_STRICT: | 1118 case Token::Value::NE_STRICT: |
(...skipping 1033 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2102 auto callable = tester.GetCallable<>(); | 2152 auto callable = tester.GetCallable<>(); |
2103 Handle<Object> return_value = callable().ToHandleChecked(); | 2153 Handle<Object> return_value = callable().ToHandleChecked(); |
2104 CHECK(return_value->SameValue(*snippets[i].return_value())); | 2154 CHECK(return_value->SameValue(*snippets[i].return_value())); |
2105 } | 2155 } |
2106 } | 2156 } |
2107 | 2157 |
2108 | 2158 |
2109 } // namespace compiler | 2159 } // namespace compiler |
2110 } // namespace internal | 2160 } // namespace internal |
2111 } // namespace v8 | 2161 } // namespace v8 |
OLD | NEW |