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 1084 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1095 function_epilogue); | 1095 function_epilogue); |
1096 | 1096 |
1097 BytecodeGraphTester tester(isolate, zone, script.start(), "t"); | 1097 BytecodeGraphTester tester(isolate, zone, script.start(), "t"); |
1098 auto callable = tester.GetCallable<>(); | 1098 auto callable = tester.GetCallable<>(); |
1099 Handle<Object> return_value = callable().ToHandleChecked(); | 1099 Handle<Object> return_value = callable().ToHandleChecked(); |
1100 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1100 CHECK(return_value->SameValue(*snippets[i].return_value())); |
1101 } | 1101 } |
1102 } | 1102 } |
1103 | 1103 |
1104 | 1104 |
| 1105 TEST(BytecodeGraphBuilderEval) { |
| 1106 HandleAndZoneScope scope; |
| 1107 Isolate* isolate = scope.main_isolate(); |
| 1108 Zone* zone = scope.main_zone(); |
| 1109 Factory* factory = isolate->factory(); |
| 1110 |
| 1111 ExpectedSnippet<0> snippets[] = { |
| 1112 {"return eval('1;');", {handle(Smi::FromInt(1), isolate)}}, |
| 1113 {"return eval('100 * 20;');", {handle(Smi::FromInt(2000), isolate)}}, |
| 1114 {"var x = 10; return eval('x + 20;');", |
| 1115 {handle(Smi::FromInt(30), isolate)}}, |
| 1116 {"var x = 10; eval('x = 33;'); return x;", |
| 1117 {handle(Smi::FromInt(33), isolate)}}, |
| 1118 {"'use strict'; var x = 20; var z = 0;\n" |
| 1119 "eval('var x = 33; z = x;'); return x + z;", |
| 1120 {handle(Smi::FromInt(53), isolate)}}, |
| 1121 {"eval('var x = 33;'); eval('var y = x + 20'); return x + y;", |
| 1122 {handle(Smi::FromInt(86), isolate)}}, |
| 1123 {"var x = 1; eval('for(i = 0; i < 10; i++) x = x + 1;'); return x", |
| 1124 {handle(Smi::FromInt(11), isolate)}}, |
| 1125 {"var x = 10; eval('var x = 20;'); return x;", |
| 1126 {handle(Smi::FromInt(20), isolate)}}, |
| 1127 {"var x = 1; eval('\"use strict\"; var x = 2;'); return x;", |
| 1128 {handle(Smi::FromInt(1), isolate)}}, |
| 1129 {"'use strict'; var x = 1; eval('var x = 2;'); return x;", |
| 1130 {handle(Smi::FromInt(1), isolate)}}, |
| 1131 {"var x = 10; eval('x + 20;'); return typeof x;", |
| 1132 {factory->NewStringFromStaticChars("number")}}, |
| 1133 {"eval('var y = 10;'); return typeof unallocated;", |
| 1134 {factory->NewStringFromStaticChars("undefined")}}, |
| 1135 {"'use strict'; eval('var y = 10;'); return typeof unallocated;", |
| 1136 {factory->NewStringFromStaticChars("undefined")}}, |
| 1137 {"eval('var x = 10;'); return typeof x;", |
| 1138 {factory->NewStringFromStaticChars("number")}}, |
| 1139 {"var x = {}; eval('var x = 10;'); return typeof x;", |
| 1140 {factory->NewStringFromStaticChars("number")}}, |
| 1141 {"'use strict'; var x = {}; eval('var x = 10;'); return typeof x;", |
| 1142 {factory->NewStringFromStaticChars("object")}}, |
| 1143 }; |
| 1144 |
| 1145 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); |
| 1146 for (size_t i = 0; i < num_snippets; i++) { |
| 1147 ScopedVector<char> script(1024); |
| 1148 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
| 1149 snippets[i].code_snippet, kFunctionName); |
| 1150 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 1151 auto callable = tester.GetCallable<>(); |
| 1152 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1153 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 1154 } |
| 1155 } |
| 1156 |
| 1157 |
| 1158 TEST(BytecodeGraphBuilderEvalParams) { |
| 1159 HandleAndZoneScope scope; |
| 1160 Isolate* isolate = scope.main_isolate(); |
| 1161 Zone* zone = scope.main_zone(); |
| 1162 |
| 1163 ExpectedSnippet<1> snippets[] = { |
| 1164 {"var x = 10; return eval('x + p1;');", |
| 1165 {handle(Smi::FromInt(30), isolate), handle(Smi::FromInt(20), isolate)}}, |
| 1166 {"var x = 10; eval('p1 = x;'); return p1;", |
| 1167 {handle(Smi::FromInt(10), isolate), handle(Smi::FromInt(20), isolate)}}, |
| 1168 {"var a = 10;" |
| 1169 "function inner() { return eval('a + p1;');}" |
| 1170 "return inner();", |
| 1171 {handle(Smi::FromInt(30), isolate), handle(Smi::FromInt(20), isolate)}}, |
| 1172 }; |
| 1173 |
| 1174 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); |
| 1175 for (size_t i = 0; i < num_snippets; i++) { |
| 1176 ScopedVector<char> script(1024); |
| 1177 SNPrintF(script, "function %s(p1) { %s }\n%s(0);", kFunctionName, |
| 1178 snippets[i].code_snippet, kFunctionName); |
| 1179 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 1180 auto callable = tester.GetCallable<Handle<Object>>(); |
| 1181 Handle<Object> return_value = |
| 1182 callable(snippets[i].parameter(0)).ToHandleChecked(); |
| 1183 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 1184 } |
| 1185 } |
| 1186 |
| 1187 |
| 1188 TEST(BytecodeGraphBuilderEvalGlobal) { |
| 1189 HandleAndZoneScope scope; |
| 1190 Isolate* isolate = scope.main_isolate(); |
| 1191 Zone* zone = scope.main_zone(); |
| 1192 Factory* factory = isolate->factory(); |
| 1193 |
| 1194 ExpectedSnippet<0> snippets[] = { |
| 1195 {"function add_global() { eval('function f() { z = 33; }; f()'); };" |
| 1196 "function f() { add_global(); return z; }; f();", |
| 1197 {handle(Smi::FromInt(33), isolate)}}, |
| 1198 {"function add_global() {\n" |
| 1199 " eval('\"use strict\"; function f() { y = 33; };" |
| 1200 " try { f() } catch(e) {}');\n" |
| 1201 "}\n" |
| 1202 "function f() { add_global(); return typeof y; } f();", |
| 1203 {factory->NewStringFromStaticChars("undefined")}}, |
| 1204 }; |
| 1205 |
| 1206 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); |
| 1207 for (size_t i = 0; i < num_snippets; i++) { |
| 1208 BytecodeGraphTester tester(isolate, zone, snippets[i].code_snippet); |
| 1209 auto callable = tester.GetCallable<>(); |
| 1210 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1211 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 1212 } |
| 1213 } |
| 1214 |
| 1215 |
1105 bool get_compare_result(Token::Value opcode, Handle<Object> lhs_value, | 1216 bool get_compare_result(Token::Value opcode, Handle<Object> lhs_value, |
1106 Handle<Object> rhs_value) { | 1217 Handle<Object> rhs_value) { |
1107 switch (opcode) { | 1218 switch (opcode) { |
1108 case Token::Value::EQ: | 1219 case Token::Value::EQ: |
1109 return Object::Equals(lhs_value, rhs_value).FromJust(); | 1220 return Object::Equals(lhs_value, rhs_value).FromJust(); |
1110 case Token::Value::NE: | 1221 case Token::Value::NE: |
1111 return !Object::Equals(lhs_value, rhs_value).FromJust(); | 1222 return !Object::Equals(lhs_value, rhs_value).FromJust(); |
1112 case Token::Value::EQ_STRICT: | 1223 case Token::Value::EQ_STRICT: |
1113 return lhs_value->StrictEquals(*rhs_value); | 1224 return lhs_value->StrictEquals(*rhs_value); |
1114 case Token::Value::NE_STRICT: | 1225 case Token::Value::NE_STRICT: |
(...skipping 1073 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2188 callable(factory->NewNumberFromInt(a)).ToHandleChecked(); | 2299 callable(factory->NewNumberFromInt(a)).ToHandleChecked(); |
2189 static const int results[] = {11, 12, 2}; | 2300 static const int results[] = {11, 12, 2}; |
2190 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), results[a]); | 2301 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), results[a]); |
2191 } | 2302 } |
2192 } | 2303 } |
2193 } | 2304 } |
2194 | 2305 |
2195 } // namespace compiler | 2306 } // namespace compiler |
2196 } // namespace internal | 2307 } // namespace internal |
2197 } // namespace v8 | 2308 } // namespace v8 |
OLD | NEW |