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/execution.h" | 7 #include "src/execution.h" |
8 #include "src/handles.h" | 8 #include "src/handles.h" |
9 #include "src/interpreter/bytecode-array-builder.h" | 9 #include "src/interpreter/bytecode-array-builder.h" |
10 #include "src/interpreter/interpreter.h" | 10 #include "src/interpreter/interpreter.h" |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 using v8::internal::Token; | 165 using v8::internal::Token; |
166 using namespace v8::internal::interpreter; | 166 using namespace v8::internal::interpreter; |
167 | 167 |
168 TEST(InterpreterReturn) { | 168 TEST(InterpreterReturn) { |
169 HandleAndZoneScope handles; | 169 HandleAndZoneScope handles; |
170 Handle<Object> undefined_value = | 170 Handle<Object> undefined_value = |
171 handles.main_isolate()->factory()->undefined_value(); | 171 handles.main_isolate()->factory()->undefined_value(); |
172 | 172 |
173 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 173 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
174 builder.set_locals_count(0); | 174 builder.set_locals_count(0); |
| 175 builder.set_context_count(0); |
175 builder.set_parameter_count(1); | 176 builder.set_parameter_count(1); |
176 builder.Return(); | 177 builder.Return(); |
177 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 178 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
178 | 179 |
179 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 180 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
180 auto callable = tester.GetCallable<>(); | 181 auto callable = tester.GetCallable<>(); |
181 Handle<Object> return_val = callable().ToHandleChecked(); | 182 Handle<Object> return_val = callable().ToHandleChecked(); |
182 CHECK(return_val.is_identical_to(undefined_value)); | 183 CHECK(return_val.is_identical_to(undefined_value)); |
183 } | 184 } |
184 | 185 |
185 | 186 |
186 TEST(InterpreterLoadUndefined) { | 187 TEST(InterpreterLoadUndefined) { |
187 HandleAndZoneScope handles; | 188 HandleAndZoneScope handles; |
188 Handle<Object> undefined_value = | 189 Handle<Object> undefined_value = |
189 handles.main_isolate()->factory()->undefined_value(); | 190 handles.main_isolate()->factory()->undefined_value(); |
190 | 191 |
191 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 192 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
192 builder.set_locals_count(0); | 193 builder.set_locals_count(0); |
| 194 builder.set_context_count(0); |
193 builder.set_parameter_count(1); | 195 builder.set_parameter_count(1); |
194 builder.LoadUndefined().Return(); | 196 builder.LoadUndefined().Return(); |
195 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 197 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
196 | 198 |
197 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 199 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
198 auto callable = tester.GetCallable<>(); | 200 auto callable = tester.GetCallable<>(); |
199 Handle<Object> return_val = callable().ToHandleChecked(); | 201 Handle<Object> return_val = callable().ToHandleChecked(); |
200 CHECK(return_val.is_identical_to(undefined_value)); | 202 CHECK(return_val.is_identical_to(undefined_value)); |
201 } | 203 } |
202 | 204 |
203 | 205 |
204 TEST(InterpreterLoadNull) { | 206 TEST(InterpreterLoadNull) { |
205 HandleAndZoneScope handles; | 207 HandleAndZoneScope handles; |
206 Handle<Object> null_value = handles.main_isolate()->factory()->null_value(); | 208 Handle<Object> null_value = handles.main_isolate()->factory()->null_value(); |
207 | 209 |
208 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 210 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
209 builder.set_locals_count(0); | 211 builder.set_locals_count(0); |
| 212 builder.set_context_count(0); |
210 builder.set_parameter_count(1); | 213 builder.set_parameter_count(1); |
211 builder.LoadNull().Return(); | 214 builder.LoadNull().Return(); |
212 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 215 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
213 | 216 |
214 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 217 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
215 auto callable = tester.GetCallable<>(); | 218 auto callable = tester.GetCallable<>(); |
216 Handle<Object> return_val = callable().ToHandleChecked(); | 219 Handle<Object> return_val = callable().ToHandleChecked(); |
217 CHECK(return_val.is_identical_to(null_value)); | 220 CHECK(return_val.is_identical_to(null_value)); |
218 } | 221 } |
219 | 222 |
220 | 223 |
221 TEST(InterpreterLoadTheHole) { | 224 TEST(InterpreterLoadTheHole) { |
222 HandleAndZoneScope handles; | 225 HandleAndZoneScope handles; |
223 Handle<Object> the_hole_value = | 226 Handle<Object> the_hole_value = |
224 handles.main_isolate()->factory()->the_hole_value(); | 227 handles.main_isolate()->factory()->the_hole_value(); |
225 | 228 |
226 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 229 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
227 builder.set_locals_count(0); | 230 builder.set_locals_count(0); |
| 231 builder.set_context_count(0); |
228 builder.set_parameter_count(1); | 232 builder.set_parameter_count(1); |
229 builder.LoadTheHole().Return(); | 233 builder.LoadTheHole().Return(); |
230 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 234 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
231 | 235 |
232 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 236 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
233 auto callable = tester.GetCallable<>(); | 237 auto callable = tester.GetCallable<>(); |
234 Handle<Object> return_val = callable().ToHandleChecked(); | 238 Handle<Object> return_val = callable().ToHandleChecked(); |
235 CHECK(return_val.is_identical_to(the_hole_value)); | 239 CHECK(return_val.is_identical_to(the_hole_value)); |
236 } | 240 } |
237 | 241 |
238 | 242 |
239 TEST(InterpreterLoadTrue) { | 243 TEST(InterpreterLoadTrue) { |
240 HandleAndZoneScope handles; | 244 HandleAndZoneScope handles; |
241 Handle<Object> true_value = handles.main_isolate()->factory()->true_value(); | 245 Handle<Object> true_value = handles.main_isolate()->factory()->true_value(); |
242 | 246 |
243 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 247 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
244 builder.set_locals_count(0); | 248 builder.set_locals_count(0); |
| 249 builder.set_context_count(0); |
245 builder.set_parameter_count(1); | 250 builder.set_parameter_count(1); |
246 builder.LoadTrue().Return(); | 251 builder.LoadTrue().Return(); |
247 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 252 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
248 | 253 |
249 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 254 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
250 auto callable = tester.GetCallable<>(); | 255 auto callable = tester.GetCallable<>(); |
251 Handle<Object> return_val = callable().ToHandleChecked(); | 256 Handle<Object> return_val = callable().ToHandleChecked(); |
252 CHECK(return_val.is_identical_to(true_value)); | 257 CHECK(return_val.is_identical_to(true_value)); |
253 } | 258 } |
254 | 259 |
255 | 260 |
256 TEST(InterpreterLoadFalse) { | 261 TEST(InterpreterLoadFalse) { |
257 HandleAndZoneScope handles; | 262 HandleAndZoneScope handles; |
258 Handle<Object> false_value = handles.main_isolate()->factory()->false_value(); | 263 Handle<Object> false_value = handles.main_isolate()->factory()->false_value(); |
259 | 264 |
260 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 265 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
261 builder.set_locals_count(0); | 266 builder.set_locals_count(0); |
| 267 builder.set_context_count(0); |
262 builder.set_parameter_count(1); | 268 builder.set_parameter_count(1); |
263 builder.LoadFalse().Return(); | 269 builder.LoadFalse().Return(); |
264 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 270 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
265 | 271 |
266 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 272 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
267 auto callable = tester.GetCallable<>(); | 273 auto callable = tester.GetCallable<>(); |
268 Handle<Object> return_val = callable().ToHandleChecked(); | 274 Handle<Object> return_val = callable().ToHandleChecked(); |
269 CHECK(return_val.is_identical_to(false_value)); | 275 CHECK(return_val.is_identical_to(false_value)); |
270 } | 276 } |
271 | 277 |
272 | 278 |
273 TEST(InterpreterLoadLiteral) { | 279 TEST(InterpreterLoadLiteral) { |
274 HandleAndZoneScope handles; | 280 HandleAndZoneScope handles; |
275 i::Factory* factory = handles.main_isolate()->factory(); | 281 i::Factory* factory = handles.main_isolate()->factory(); |
276 | 282 |
277 // Small Smis. | 283 // Small Smis. |
278 for (int i = -128; i < 128; i++) { | 284 for (int i = -128; i < 128; i++) { |
279 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 285 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
280 builder.set_locals_count(0); | 286 builder.set_locals_count(0); |
| 287 builder.set_context_count(0); |
281 builder.set_parameter_count(1); | 288 builder.set_parameter_count(1); |
282 builder.LoadLiteral(Smi::FromInt(i)).Return(); | 289 builder.LoadLiteral(Smi::FromInt(i)).Return(); |
283 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 290 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
284 | 291 |
285 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 292 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
286 auto callable = tester.GetCallable<>(); | 293 auto callable = tester.GetCallable<>(); |
287 Handle<Object> return_val = callable().ToHandleChecked(); | 294 Handle<Object> return_val = callable().ToHandleChecked(); |
288 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(i)); | 295 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(i)); |
289 } | 296 } |
290 | 297 |
291 // Large Smis. | 298 // Large Smis. |
292 { | 299 { |
293 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 300 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
294 builder.set_locals_count(0); | 301 builder.set_locals_count(0); |
| 302 builder.set_context_count(0); |
295 builder.set_parameter_count(1); | 303 builder.set_parameter_count(1); |
296 builder.LoadLiteral(Smi::FromInt(0x12345678)).Return(); | 304 builder.LoadLiteral(Smi::FromInt(0x12345678)).Return(); |
297 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 305 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
298 | 306 |
299 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 307 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
300 auto callable = tester.GetCallable<>(); | 308 auto callable = tester.GetCallable<>(); |
301 Handle<Object> return_val = callable().ToHandleChecked(); | 309 Handle<Object> return_val = callable().ToHandleChecked(); |
302 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x12345678)); | 310 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x12345678)); |
303 } | 311 } |
304 | 312 |
305 // Heap numbers. | 313 // Heap numbers. |
306 { | 314 { |
307 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 315 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
308 builder.set_locals_count(0); | 316 builder.set_locals_count(0); |
| 317 builder.set_context_count(0); |
309 builder.set_parameter_count(1); | 318 builder.set_parameter_count(1); |
310 builder.LoadLiteral(factory->NewHeapNumber(-2.1e19)).Return(); | 319 builder.LoadLiteral(factory->NewHeapNumber(-2.1e19)).Return(); |
311 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 320 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
312 | 321 |
313 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 322 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
314 auto callable = tester.GetCallable<>(); | 323 auto callable = tester.GetCallable<>(); |
315 Handle<Object> return_val = callable().ToHandleChecked(); | 324 Handle<Object> return_val = callable().ToHandleChecked(); |
316 CHECK_EQ(i::HeapNumber::cast(*return_val)->value(), -2.1e19); | 325 CHECK_EQ(i::HeapNumber::cast(*return_val)->value(), -2.1e19); |
317 } | 326 } |
318 | 327 |
319 // Strings. | 328 // Strings. |
320 { | 329 { |
321 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 330 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
322 builder.set_locals_count(0); | 331 builder.set_locals_count(0); |
| 332 builder.set_context_count(0); |
323 builder.set_parameter_count(1); | 333 builder.set_parameter_count(1); |
324 Handle<i::String> string = factory->NewStringFromAsciiChecked("String"); | 334 Handle<i::String> string = factory->NewStringFromAsciiChecked("String"); |
325 builder.LoadLiteral(string).Return(); | 335 builder.LoadLiteral(string).Return(); |
326 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 336 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
327 | 337 |
328 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 338 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
329 auto callable = tester.GetCallable<>(); | 339 auto callable = tester.GetCallable<>(); |
330 Handle<Object> return_val = callable().ToHandleChecked(); | 340 Handle<Object> return_val = callable().ToHandleChecked(); |
331 CHECK(i::String::cast(*return_val)->Equals(*string)); | 341 CHECK(i::String::cast(*return_val)->Equals(*string)); |
332 } | 342 } |
333 } | 343 } |
334 | 344 |
335 | 345 |
336 TEST(InterpreterLoadStoreRegisters) { | 346 TEST(InterpreterLoadStoreRegisters) { |
337 HandleAndZoneScope handles; | 347 HandleAndZoneScope handles; |
338 Handle<Object> true_value = handles.main_isolate()->factory()->true_value(); | 348 Handle<Object> true_value = handles.main_isolate()->factory()->true_value(); |
339 for (int i = 0; i <= Register::kMaxRegisterIndex; i++) { | 349 for (int i = 0; i <= Register::kMaxRegisterIndex; i++) { |
340 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 350 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
341 builder.set_locals_count(i + 1); | 351 builder.set_locals_count(i + 1); |
| 352 builder.set_context_count(0); |
342 builder.set_parameter_count(1); | 353 builder.set_parameter_count(1); |
343 Register reg(i); | 354 Register reg(i); |
344 builder.LoadTrue() | 355 builder.LoadTrue() |
345 .StoreAccumulatorInRegister(reg) | 356 .StoreAccumulatorInRegister(reg) |
346 .LoadFalse() | 357 .LoadFalse() |
347 .LoadAccumulatorWithRegister(reg) | 358 .LoadAccumulatorWithRegister(reg) |
348 .Return(); | 359 .Return(); |
349 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 360 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
350 | 361 |
351 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 362 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
417 int lhs_inputs[] = {0, -17, -182, 1073741823, -1}; | 428 int lhs_inputs[] = {0, -17, -182, 1073741823, -1}; |
418 int rhs_inputs[] = {5, 2, 1, -1, -2, 0, 31, 32, -32, 64, 37}; | 429 int rhs_inputs[] = {5, 2, 1, -1, -2, 0, 31, 32, -32, 64, 37}; |
419 for (size_t l = 0; l < arraysize(lhs_inputs); l++) { | 430 for (size_t l = 0; l < arraysize(lhs_inputs); l++) { |
420 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { | 431 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { |
421 for (size_t o = 0; o < arraysize(kShiftOperators); o++) { | 432 for (size_t o = 0; o < arraysize(kShiftOperators); o++) { |
422 HandleAndZoneScope handles; | 433 HandleAndZoneScope handles; |
423 i::Factory* factory = handles.main_isolate()->factory(); | 434 i::Factory* factory = handles.main_isolate()->factory(); |
424 BytecodeArrayBuilder builder(handles.main_isolate(), | 435 BytecodeArrayBuilder builder(handles.main_isolate(), |
425 handles.main_zone()); | 436 handles.main_zone()); |
426 builder.set_locals_count(1); | 437 builder.set_locals_count(1); |
| 438 builder.set_context_count(0); |
427 builder.set_parameter_count(1); | 439 builder.set_parameter_count(1); |
428 Register reg(0); | 440 Register reg(0); |
429 int lhs = lhs_inputs[l]; | 441 int lhs = lhs_inputs[l]; |
430 int rhs = rhs_inputs[r]; | 442 int rhs = rhs_inputs[r]; |
431 builder.LoadLiteral(Smi::FromInt(lhs)) | 443 builder.LoadLiteral(Smi::FromInt(lhs)) |
432 .StoreAccumulatorInRegister(reg) | 444 .StoreAccumulatorInRegister(reg) |
433 .LoadLiteral(Smi::FromInt(rhs)) | 445 .LoadLiteral(Smi::FromInt(rhs)) |
434 .BinaryOperation(kShiftOperators[o], reg, Strength::WEAK) | 446 .BinaryOperation(kShiftOperators[o], reg, Strength::WEAK) |
435 .Return(); | 447 .Return(); |
436 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 448 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
(...skipping 14 matching lines...) Expand all Loading... |
451 int lhs_inputs[] = {3266, 1024, 0, -17, -18000}; | 463 int lhs_inputs[] = {3266, 1024, 0, -17, -18000}; |
452 int rhs_inputs[] = {3266, 5, 4, 3, 2, 1, -1, -2}; | 464 int rhs_inputs[] = {3266, 5, 4, 3, 2, 1, -1, -2}; |
453 for (size_t l = 0; l < arraysize(lhs_inputs); l++) { | 465 for (size_t l = 0; l < arraysize(lhs_inputs); l++) { |
454 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { | 466 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { |
455 for (size_t o = 0; o < arraysize(kArithmeticOperators); o++) { | 467 for (size_t o = 0; o < arraysize(kArithmeticOperators); o++) { |
456 HandleAndZoneScope handles; | 468 HandleAndZoneScope handles; |
457 i::Factory* factory = handles.main_isolate()->factory(); | 469 i::Factory* factory = handles.main_isolate()->factory(); |
458 BytecodeArrayBuilder builder(handles.main_isolate(), | 470 BytecodeArrayBuilder builder(handles.main_isolate(), |
459 handles.main_zone()); | 471 handles.main_zone()); |
460 builder.set_locals_count(1); | 472 builder.set_locals_count(1); |
| 473 builder.set_context_count(0); |
461 builder.set_parameter_count(1); | 474 builder.set_parameter_count(1); |
462 Register reg(0); | 475 Register reg(0); |
463 int lhs = lhs_inputs[l]; | 476 int lhs = lhs_inputs[l]; |
464 int rhs = rhs_inputs[r]; | 477 int rhs = rhs_inputs[r]; |
465 builder.LoadLiteral(Smi::FromInt(lhs)) | 478 builder.LoadLiteral(Smi::FromInt(lhs)) |
466 .StoreAccumulatorInRegister(reg) | 479 .StoreAccumulatorInRegister(reg) |
467 .LoadLiteral(Smi::FromInt(rhs)) | 480 .LoadLiteral(Smi::FromInt(rhs)) |
468 .BinaryOperation(kArithmeticOperators[o], reg, Strength::WEAK) | 481 .BinaryOperation(kArithmeticOperators[o], reg, Strength::WEAK) |
469 .Return(); | 482 .Return(); |
470 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 483 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
(...skipping 15 matching lines...) Expand all Loading... |
486 double rhs_inputs[] = {3266.101, 5.999, 4.778, 3.331, 2.643, | 499 double rhs_inputs[] = {3266.101, 5.999, 4.778, 3.331, 2.643, |
487 1.1, -1.8, -2.9, 8.3e-27}; | 500 1.1, -1.8, -2.9, 8.3e-27}; |
488 for (size_t l = 0; l < arraysize(lhs_inputs); l++) { | 501 for (size_t l = 0; l < arraysize(lhs_inputs); l++) { |
489 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { | 502 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { |
490 for (size_t o = 0; o < arraysize(kArithmeticOperators); o++) { | 503 for (size_t o = 0; o < arraysize(kArithmeticOperators); o++) { |
491 HandleAndZoneScope handles; | 504 HandleAndZoneScope handles; |
492 i::Factory* factory = handles.main_isolate()->factory(); | 505 i::Factory* factory = handles.main_isolate()->factory(); |
493 BytecodeArrayBuilder builder(handles.main_isolate(), | 506 BytecodeArrayBuilder builder(handles.main_isolate(), |
494 handles.main_zone()); | 507 handles.main_zone()); |
495 builder.set_locals_count(1); | 508 builder.set_locals_count(1); |
| 509 builder.set_context_count(0); |
496 builder.set_parameter_count(1); | 510 builder.set_parameter_count(1); |
497 Register reg(0); | 511 Register reg(0); |
498 double lhs = lhs_inputs[l]; | 512 double lhs = lhs_inputs[l]; |
499 double rhs = rhs_inputs[r]; | 513 double rhs = rhs_inputs[r]; |
500 builder.LoadLiteral(factory->NewNumber(lhs)) | 514 builder.LoadLiteral(factory->NewNumber(lhs)) |
501 .StoreAccumulatorInRegister(reg) | 515 .StoreAccumulatorInRegister(reg) |
502 .LoadLiteral(factory->NewNumber(rhs)) | 516 .LoadLiteral(factory->NewNumber(rhs)) |
503 .BinaryOperation(kArithmeticOperators[o], reg, Strength::WEAK) | 517 .BinaryOperation(kArithmeticOperators[o], reg, Strength::WEAK) |
504 .Return(); | 518 .Return(); |
505 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 519 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
544 factory->NewStringFromStaticChars("1.112.5")}, | 558 factory->NewStringFromStaticChars("1.112.5")}, |
545 {factory->NewStringFromStaticChars("-1.11"), factory->NewHeapNumber(2.56), | 559 {factory->NewStringFromStaticChars("-1.11"), factory->NewHeapNumber(2.56), |
546 factory->NewStringFromStaticChars("-1.112.56")}, | 560 factory->NewStringFromStaticChars("-1.112.56")}, |
547 {factory->NewStringFromStaticChars(""), factory->NewHeapNumber(2.5), | 561 {factory->NewStringFromStaticChars(""), factory->NewHeapNumber(2.5), |
548 factory->NewStringFromStaticChars("2.5")}, | 562 factory->NewStringFromStaticChars("2.5")}, |
549 }; | 563 }; |
550 | 564 |
551 for (size_t i = 0; i < arraysize(test_cases); i++) { | 565 for (size_t i = 0; i < arraysize(test_cases); i++) { |
552 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 566 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
553 builder.set_locals_count(1); | 567 builder.set_locals_count(1); |
| 568 builder.set_context_count(0); |
554 builder.set_parameter_count(1); | 569 builder.set_parameter_count(1); |
555 Register reg(0); | 570 Register reg(0); |
556 builder.LoadLiteral(test_cases[i].lhs) | 571 builder.LoadLiteral(test_cases[i].lhs) |
557 .StoreAccumulatorInRegister(reg) | 572 .StoreAccumulatorInRegister(reg) |
558 .LoadLiteral(test_cases[i].rhs) | 573 .LoadLiteral(test_cases[i].rhs) |
559 .BinaryOperation(Token::Value::ADD, reg, Strength::WEAK) | 574 .BinaryOperation(Token::Value::ADD, reg, Strength::WEAK) |
560 .Return(); | 575 .Return(); |
561 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 576 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
562 | 577 |
563 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 578 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
564 auto callable = tester.GetCallable<>(); | 579 auto callable = tester.GetCallable<>(); |
565 Handle<Object> return_value = callable().ToHandleChecked(); | 580 Handle<Object> return_value = callable().ToHandleChecked(); |
566 CHECK(return_value->SameValue(*test_cases[i].expected_value)); | 581 CHECK(return_value->SameValue(*test_cases[i].expected_value)); |
567 } | 582 } |
568 } | 583 } |
569 | 584 |
570 | 585 |
571 TEST(InterpreterParameter1) { | 586 TEST(InterpreterParameter1) { |
572 HandleAndZoneScope handles; | 587 HandleAndZoneScope handles; |
573 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 588 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
574 builder.set_locals_count(0); | 589 builder.set_locals_count(0); |
| 590 builder.set_context_count(0); |
575 builder.set_parameter_count(1); | 591 builder.set_parameter_count(1); |
576 builder.LoadAccumulatorWithRegister(builder.Parameter(0)).Return(); | 592 builder.LoadAccumulatorWithRegister(builder.Parameter(0)).Return(); |
577 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 593 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
578 | 594 |
579 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 595 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
580 auto callable = tester.GetCallable<Handle<Object>>(); | 596 auto callable = tester.GetCallable<Handle<Object>>(); |
581 | 597 |
582 // Check for heap objects. | 598 // Check for heap objects. |
583 Handle<Object> true_value = handles.main_isolate()->factory()->true_value(); | 599 Handle<Object> true_value = handles.main_isolate()->factory()->true_value(); |
584 Handle<Object> return_val = callable(true_value).ToHandleChecked(); | 600 Handle<Object> return_val = callable(true_value).ToHandleChecked(); |
585 CHECK(return_val.is_identical_to(true_value)); | 601 CHECK(return_val.is_identical_to(true_value)); |
586 | 602 |
587 // Check for Smis. | 603 // Check for Smis. |
588 return_val = callable(Handle<Smi>(Smi::FromInt(3), handles.main_isolate())) | 604 return_val = callable(Handle<Smi>(Smi::FromInt(3), handles.main_isolate())) |
589 .ToHandleChecked(); | 605 .ToHandleChecked(); |
590 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(3)); | 606 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(3)); |
591 } | 607 } |
592 | 608 |
593 | 609 |
594 TEST(InterpreterParameter8) { | 610 TEST(InterpreterParameter8) { |
595 HandleAndZoneScope handles; | 611 HandleAndZoneScope handles; |
596 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 612 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
597 builder.set_locals_count(0); | 613 builder.set_locals_count(0); |
| 614 builder.set_context_count(0); |
598 builder.set_parameter_count(8); | 615 builder.set_parameter_count(8); |
599 builder.LoadAccumulatorWithRegister(builder.Parameter(0)) | 616 builder.LoadAccumulatorWithRegister(builder.Parameter(0)) |
600 .BinaryOperation(Token::Value::ADD, builder.Parameter(1), Strength::WEAK) | 617 .BinaryOperation(Token::Value::ADD, builder.Parameter(1), Strength::WEAK) |
601 .BinaryOperation(Token::Value::ADD, builder.Parameter(2), Strength::WEAK) | 618 .BinaryOperation(Token::Value::ADD, builder.Parameter(2), Strength::WEAK) |
602 .BinaryOperation(Token::Value::ADD, builder.Parameter(3), Strength::WEAK) | 619 .BinaryOperation(Token::Value::ADD, builder.Parameter(3), Strength::WEAK) |
603 .BinaryOperation(Token::Value::ADD, builder.Parameter(4), Strength::WEAK) | 620 .BinaryOperation(Token::Value::ADD, builder.Parameter(4), Strength::WEAK) |
604 .BinaryOperation(Token::Value::ADD, builder.Parameter(5), Strength::WEAK) | 621 .BinaryOperation(Token::Value::ADD, builder.Parameter(5), Strength::WEAK) |
605 .BinaryOperation(Token::Value::ADD, builder.Parameter(6), Strength::WEAK) | 622 .BinaryOperation(Token::Value::ADD, builder.Parameter(6), Strength::WEAK) |
606 .BinaryOperation(Token::Value::ADD, builder.Parameter(7), Strength::WEAK) | 623 .BinaryOperation(Token::Value::ADD, builder.Parameter(7), Strength::WEAK) |
607 .Return(); | 624 .Return(); |
(...skipping 16 matching lines...) Expand all Loading... |
624 callable(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) | 641 callable(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) |
625 .ToHandleChecked(); | 642 .ToHandleChecked(); |
626 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(36)); | 643 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(36)); |
627 } | 644 } |
628 | 645 |
629 | 646 |
630 TEST(InterpreterParameter1Assign) { | 647 TEST(InterpreterParameter1Assign) { |
631 HandleAndZoneScope handles; | 648 HandleAndZoneScope handles; |
632 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 649 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
633 builder.set_locals_count(0); | 650 builder.set_locals_count(0); |
| 651 builder.set_context_count(0); |
634 builder.set_parameter_count(1); | 652 builder.set_parameter_count(1); |
635 builder.LoadLiteral(Smi::FromInt(5)) | 653 builder.LoadLiteral(Smi::FromInt(5)) |
636 .StoreAccumulatorInRegister(builder.Parameter(0)) | 654 .StoreAccumulatorInRegister(builder.Parameter(0)) |
637 .LoadAccumulatorWithRegister(builder.Parameter(0)) | 655 .LoadAccumulatorWithRegister(builder.Parameter(0)) |
638 .Return(); | 656 .Return(); |
639 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 657 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
640 | 658 |
641 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 659 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
642 auto callable = tester.GetCallable<Handle<Object>>(); | 660 auto callable = tester.GetCallable<Handle<Object>>(); |
643 | 661 |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
753 i::FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot(); | 771 i::FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot(); |
754 | 772 |
755 Handle<i::TypeFeedbackVector> vector = | 773 Handle<i::TypeFeedbackVector> vector = |
756 i::NewTypeFeedbackVector(isolate, &feedback_spec); | 774 i::NewTypeFeedbackVector(isolate, &feedback_spec); |
757 | 775 |
758 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); | 776 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); |
759 name = factory->string_table()->LookupString(isolate, name); | 777 name = factory->string_table()->LookupString(isolate, name); |
760 | 778 |
761 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 779 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
762 builder.set_locals_count(0); | 780 builder.set_locals_count(0); |
| 781 builder.set_context_count(0); |
763 builder.set_parameter_count(1); | 782 builder.set_parameter_count(1); |
764 builder.LoadLiteral(name) | 783 builder.LoadLiteral(name) |
765 .LoadNamedProperty(builder.Parameter(0), vector->GetIndex(slot), | 784 .LoadNamedProperty(builder.Parameter(0), vector->GetIndex(slot), |
766 i::SLOPPY) | 785 i::SLOPPY) |
767 .Return(); | 786 .Return(); |
768 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 787 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
769 | 788 |
770 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 789 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
771 auto callable = tester.GetCallable<Handle<Object>>(); | 790 auto callable = tester.GetCallable<Handle<Object>>(); |
772 | 791 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
809 i::FeedbackVectorSlot slot = feedback_spec.AddKeyedLoadICSlot(); | 828 i::FeedbackVectorSlot slot = feedback_spec.AddKeyedLoadICSlot(); |
810 | 829 |
811 Handle<i::TypeFeedbackVector> vector = | 830 Handle<i::TypeFeedbackVector> vector = |
812 i::NewTypeFeedbackVector(isolate, &feedback_spec); | 831 i::NewTypeFeedbackVector(isolate, &feedback_spec); |
813 | 832 |
814 Handle<i::String> key = factory->NewStringFromAsciiChecked("key"); | 833 Handle<i::String> key = factory->NewStringFromAsciiChecked("key"); |
815 key = factory->string_table()->LookupString(isolate, key); | 834 key = factory->string_table()->LookupString(isolate, key); |
816 | 835 |
817 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 836 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
818 builder.set_locals_count(1); | 837 builder.set_locals_count(1); |
| 838 builder.set_context_count(0); |
819 builder.set_parameter_count(1); | 839 builder.set_parameter_count(1); |
820 builder.LoadLiteral(key) | 840 builder.LoadLiteral(key) |
821 .LoadKeyedProperty(builder.Parameter(0), vector->GetIndex(slot), | 841 .LoadKeyedProperty(builder.Parameter(0), vector->GetIndex(slot), |
822 i::STRICT) | 842 i::STRICT) |
823 .Return(); | 843 .Return(); |
824 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 844 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
825 | 845 |
826 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 846 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
827 auto callable = tester.GetCallable<Handle<Object>>(); | 847 auto callable = tester.GetCallable<Handle<Object>>(); |
828 | 848 |
(...skipping 24 matching lines...) Expand all Loading... |
853 i::FeedbackVectorSlot slot = feedback_spec.AddStoreICSlot(); | 873 i::FeedbackVectorSlot slot = feedback_spec.AddStoreICSlot(); |
854 | 874 |
855 Handle<i::TypeFeedbackVector> vector = | 875 Handle<i::TypeFeedbackVector> vector = |
856 i::NewTypeFeedbackVector(isolate, &feedback_spec); | 876 i::NewTypeFeedbackVector(isolate, &feedback_spec); |
857 | 877 |
858 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); | 878 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); |
859 name = factory->string_table()->LookupString(isolate, name); | 879 name = factory->string_table()->LookupString(isolate, name); |
860 | 880 |
861 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 881 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
862 builder.set_locals_count(1); | 882 builder.set_locals_count(1); |
| 883 builder.set_context_count(0); |
863 builder.set_parameter_count(1); | 884 builder.set_parameter_count(1); |
864 builder.LoadLiteral(name) | 885 builder.LoadLiteral(name) |
865 .StoreAccumulatorInRegister(Register(0)) | 886 .StoreAccumulatorInRegister(Register(0)) |
866 .LoadLiteral(Smi::FromInt(999)) | 887 .LoadLiteral(Smi::FromInt(999)) |
867 .StoreNamedProperty(builder.Parameter(0), Register(0), | 888 .StoreNamedProperty(builder.Parameter(0), Register(0), |
868 vector->GetIndex(slot), i::STRICT) | 889 vector->GetIndex(slot), i::STRICT) |
869 .Return(); | 890 .Return(); |
870 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 891 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
871 | 892 |
872 InterpreterTester tester(isolate, bytecode_array, vector); | 893 InterpreterTester tester(isolate, bytecode_array, vector); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
915 i::FeedbackVectorSlot slot = feedback_spec.AddKeyedStoreICSlot(); | 936 i::FeedbackVectorSlot slot = feedback_spec.AddKeyedStoreICSlot(); |
916 | 937 |
917 Handle<i::TypeFeedbackVector> vector = | 938 Handle<i::TypeFeedbackVector> vector = |
918 i::NewTypeFeedbackVector(isolate, &feedback_spec); | 939 i::NewTypeFeedbackVector(isolate, &feedback_spec); |
919 | 940 |
920 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); | 941 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); |
921 name = factory->string_table()->LookupString(isolate, name); | 942 name = factory->string_table()->LookupString(isolate, name); |
922 | 943 |
923 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 944 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
924 builder.set_locals_count(1); | 945 builder.set_locals_count(1); |
| 946 builder.set_context_count(0); |
925 builder.set_parameter_count(1); | 947 builder.set_parameter_count(1); |
926 builder.LoadLiteral(name) | 948 builder.LoadLiteral(name) |
927 .StoreAccumulatorInRegister(Register(0)) | 949 .StoreAccumulatorInRegister(Register(0)) |
928 .LoadLiteral(Smi::FromInt(999)) | 950 .LoadLiteral(Smi::FromInt(999)) |
929 .StoreKeyedProperty(builder.Parameter(0), Register(0), | 951 .StoreKeyedProperty(builder.Parameter(0), Register(0), |
930 vector->GetIndex(slot), i::SLOPPY) | 952 vector->GetIndex(slot), i::SLOPPY) |
931 .Return(); | 953 .Return(); |
932 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 954 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
933 | 955 |
934 InterpreterTester tester(isolate, bytecode_array, vector); | 956 InterpreterTester tester(isolate, bytecode_array, vector); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
967 i::NewTypeFeedbackVector(isolate, &feedback_spec); | 989 i::NewTypeFeedbackVector(isolate, &feedback_spec); |
968 int slot_index = vector->GetIndex(slot); | 990 int slot_index = vector->GetIndex(slot); |
969 | 991 |
970 Handle<i::String> name = factory->NewStringFromAsciiChecked("func"); | 992 Handle<i::String> name = factory->NewStringFromAsciiChecked("func"); |
971 name = factory->string_table()->LookupString(isolate, name); | 993 name = factory->string_table()->LookupString(isolate, name); |
972 | 994 |
973 // Check with no args. | 995 // Check with no args. |
974 { | 996 { |
975 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 997 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
976 builder.set_locals_count(1); | 998 builder.set_locals_count(1); |
| 999 builder.set_context_count(0); |
977 builder.set_parameter_count(1); | 1000 builder.set_parameter_count(1); |
978 builder.LoadLiteral(name) | 1001 builder.LoadLiteral(name) |
979 .LoadNamedProperty(builder.Parameter(0), slot_index, i::SLOPPY) | 1002 .LoadNamedProperty(builder.Parameter(0), slot_index, i::SLOPPY) |
980 .StoreAccumulatorInRegister(Register(0)) | 1003 .StoreAccumulatorInRegister(Register(0)) |
981 .Call(Register(0), builder.Parameter(0), 0) | 1004 .Call(Register(0), builder.Parameter(0), 0) |
982 .Return(); | 1005 .Return(); |
983 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1006 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
984 | 1007 |
985 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 1008 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
986 auto callable = tester.GetCallable<Handle<Object>>(); | 1009 auto callable = tester.GetCallable<Handle<Object>>(); |
987 | 1010 |
988 Handle<Object> object = InterpreterTester::NewObject( | 1011 Handle<Object> object = InterpreterTester::NewObject( |
989 "new (function Obj() { this.func = function() { return 0x265; }})()"); | 1012 "new (function Obj() { this.func = function() { return 0x265; }})()"); |
990 Handle<Object> return_val = callable(object).ToHandleChecked(); | 1013 Handle<Object> return_val = callable(object).ToHandleChecked(); |
991 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x265)); | 1014 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x265)); |
992 } | 1015 } |
993 | 1016 |
994 // Check that receiver is passed properly. | 1017 // Check that receiver is passed properly. |
995 { | 1018 { |
996 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 1019 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
997 builder.set_locals_count(1); | 1020 builder.set_locals_count(1); |
| 1021 builder.set_context_count(0); |
998 builder.set_parameter_count(1); | 1022 builder.set_parameter_count(1); |
999 builder.LoadLiteral(name) | 1023 builder.LoadLiteral(name) |
1000 .LoadNamedProperty(builder.Parameter(0), slot_index, i::SLOPPY) | 1024 .LoadNamedProperty(builder.Parameter(0), slot_index, i::SLOPPY) |
1001 .StoreAccumulatorInRegister(Register(0)) | 1025 .StoreAccumulatorInRegister(Register(0)) |
1002 .Call(Register(0), builder.Parameter(0), 0) | 1026 .Call(Register(0), builder.Parameter(0), 0) |
1003 .Return(); | 1027 .Return(); |
1004 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1028 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
1005 | 1029 |
1006 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 1030 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
1007 auto callable = tester.GetCallable<Handle<Object>>(); | 1031 auto callable = tester.GetCallable<Handle<Object>>(); |
1008 | 1032 |
1009 Handle<Object> object = InterpreterTester::NewObject( | 1033 Handle<Object> object = InterpreterTester::NewObject( |
1010 "new (function Obj() {" | 1034 "new (function Obj() {" |
1011 " this.val = 1234;" | 1035 " this.val = 1234;" |
1012 " this.func = function() { return this.val; };" | 1036 " this.func = function() { return this.val; };" |
1013 "})()"); | 1037 "})()"); |
1014 Handle<Object> return_val = callable(object).ToHandleChecked(); | 1038 Handle<Object> return_val = callable(object).ToHandleChecked(); |
1015 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(1234)); | 1039 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(1234)); |
1016 } | 1040 } |
1017 | 1041 |
1018 // Check with two parameters (+ receiver). | 1042 // Check with two parameters (+ receiver). |
1019 { | 1043 { |
1020 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 1044 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
1021 builder.set_locals_count(4); | 1045 builder.set_locals_count(4); |
| 1046 builder.set_context_count(0); |
1022 builder.set_parameter_count(1); | 1047 builder.set_parameter_count(1); |
1023 builder.LoadLiteral(name) | 1048 builder.LoadLiteral(name) |
1024 .LoadNamedProperty(builder.Parameter(0), slot_index, i::SLOPPY) | 1049 .LoadNamedProperty(builder.Parameter(0), slot_index, i::SLOPPY) |
1025 .StoreAccumulatorInRegister(Register(0)) | 1050 .StoreAccumulatorInRegister(Register(0)) |
1026 .LoadAccumulatorWithRegister(builder.Parameter(0)) | 1051 .LoadAccumulatorWithRegister(builder.Parameter(0)) |
1027 .StoreAccumulatorInRegister(Register(1)) | 1052 .StoreAccumulatorInRegister(Register(1)) |
1028 .LoadLiteral(Smi::FromInt(51)) | 1053 .LoadLiteral(Smi::FromInt(51)) |
1029 .StoreAccumulatorInRegister(Register(2)) | 1054 .StoreAccumulatorInRegister(Register(2)) |
1030 .LoadLiteral(Smi::FromInt(11)) | 1055 .LoadLiteral(Smi::FromInt(11)) |
1031 .StoreAccumulatorInRegister(Register(3)) | 1056 .StoreAccumulatorInRegister(Register(3)) |
1032 .Call(Register(0), Register(1), 2) | 1057 .Call(Register(0), Register(1), 2) |
1033 .Return(); | 1058 .Return(); |
1034 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1059 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
1035 | 1060 |
1036 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 1061 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
1037 auto callable = tester.GetCallable<Handle<Object>>(); | 1062 auto callable = tester.GetCallable<Handle<Object>>(); |
1038 | 1063 |
1039 Handle<Object> object = InterpreterTester::NewObject( | 1064 Handle<Object> object = InterpreterTester::NewObject( |
1040 "new (function Obj() { " | 1065 "new (function Obj() { " |
1041 " this.func = function(a, b) { return a - b; }" | 1066 " this.func = function(a, b) { return a - b; }" |
1042 "})()"); | 1067 "})()"); |
1043 Handle<Object> return_val = callable(object).ToHandleChecked(); | 1068 Handle<Object> return_val = callable(object).ToHandleChecked(); |
1044 CHECK(return_val->SameValue(Smi::FromInt(40))); | 1069 CHECK(return_val->SameValue(Smi::FromInt(40))); |
1045 } | 1070 } |
1046 | 1071 |
1047 // Check with 10 parameters (+ receiver). | 1072 // Check with 10 parameters (+ receiver). |
1048 { | 1073 { |
1049 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 1074 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
1050 builder.set_locals_count(12); | 1075 builder.set_locals_count(12); |
| 1076 builder.set_context_count(0); |
1051 builder.set_parameter_count(1); | 1077 builder.set_parameter_count(1); |
1052 builder.LoadLiteral(name) | 1078 builder.LoadLiteral(name) |
1053 .LoadNamedProperty(builder.Parameter(0), slot_index, i::SLOPPY) | 1079 .LoadNamedProperty(builder.Parameter(0), slot_index, i::SLOPPY) |
1054 .StoreAccumulatorInRegister(Register(0)) | 1080 .StoreAccumulatorInRegister(Register(0)) |
1055 .LoadAccumulatorWithRegister(builder.Parameter(0)) | 1081 .LoadAccumulatorWithRegister(builder.Parameter(0)) |
1056 .StoreAccumulatorInRegister(Register(1)) | 1082 .StoreAccumulatorInRegister(Register(1)) |
1057 .LoadLiteral(factory->NewStringFromAsciiChecked("a")) | 1083 .LoadLiteral(factory->NewStringFromAsciiChecked("a")) |
1058 .StoreAccumulatorInRegister(Register(2)) | 1084 .StoreAccumulatorInRegister(Register(2)) |
1059 .LoadLiteral(factory->NewStringFromAsciiChecked("b")) | 1085 .LoadLiteral(factory->NewStringFromAsciiChecked("b")) |
1060 .StoreAccumulatorInRegister(Register(3)) | 1086 .StoreAccumulatorInRegister(Register(3)) |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1114 .BinaryOperation(Token::Value::ADD, reg, Strength::WEAK) | 1140 .BinaryOperation(Token::Value::ADD, reg, Strength::WEAK) |
1115 .StoreAccumulatorInRegister(reg) | 1141 .StoreAccumulatorInRegister(reg) |
1116 .LoadAccumulatorWithRegister(scratch); | 1142 .LoadAccumulatorWithRegister(scratch); |
1117 } | 1143 } |
1118 | 1144 |
1119 | 1145 |
1120 TEST(InterpreterJumps) { | 1146 TEST(InterpreterJumps) { |
1121 HandleAndZoneScope handles; | 1147 HandleAndZoneScope handles; |
1122 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 1148 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
1123 builder.set_locals_count(2); | 1149 builder.set_locals_count(2); |
| 1150 builder.set_context_count(0); |
1124 builder.set_parameter_count(0); | 1151 builder.set_parameter_count(0); |
1125 Register reg(0), scratch(1); | 1152 Register reg(0), scratch(1); |
1126 BytecodeLabel label[3]; | 1153 BytecodeLabel label[3]; |
1127 | 1154 |
1128 builder.LoadLiteral(Smi::FromInt(0)) | 1155 builder.LoadLiteral(Smi::FromInt(0)) |
1129 .StoreAccumulatorInRegister(reg) | 1156 .StoreAccumulatorInRegister(reg) |
1130 .Jump(&label[1]); | 1157 .Jump(&label[1]); |
1131 SetRegister(builder, reg, 1024, scratch).Bind(&label[0]); | 1158 SetRegister(builder, reg, 1024, scratch).Bind(&label[0]); |
1132 IncrementRegister(builder, reg, 1, scratch).Jump(&label[2]); | 1159 IncrementRegister(builder, reg, 1, scratch).Jump(&label[2]); |
1133 SetRegister(builder, reg, 2048, scratch).Bind(&label[1]); | 1160 SetRegister(builder, reg, 2048, scratch).Bind(&label[1]); |
1134 IncrementRegister(builder, reg, 2, scratch).Jump(&label[0]); | 1161 IncrementRegister(builder, reg, 2, scratch).Jump(&label[0]); |
1135 SetRegister(builder, reg, 4096, scratch).Bind(&label[2]); | 1162 SetRegister(builder, reg, 4096, scratch).Bind(&label[2]); |
1136 IncrementRegister(builder, reg, 4, scratch) | 1163 IncrementRegister(builder, reg, 4, scratch) |
1137 .LoadAccumulatorWithRegister(reg) | 1164 .LoadAccumulatorWithRegister(reg) |
1138 .Return(); | 1165 .Return(); |
1139 | 1166 |
1140 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1167 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
1141 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 1168 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
1142 auto callable = tester.GetCallable<>(); | 1169 auto callable = tester.GetCallable<>(); |
1143 Handle<Object> return_value = callable().ToHandleChecked(); | 1170 Handle<Object> return_value = callable().ToHandleChecked(); |
1144 CHECK_EQ(Smi::cast(*return_value)->value(), 7); | 1171 CHECK_EQ(Smi::cast(*return_value)->value(), 7); |
1145 } | 1172 } |
1146 | 1173 |
1147 | 1174 |
1148 TEST(InterpreterConditionalJumps) { | 1175 TEST(InterpreterConditionalJumps) { |
1149 HandleAndZoneScope handles; | 1176 HandleAndZoneScope handles; |
1150 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 1177 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
1151 builder.set_locals_count(2); | 1178 builder.set_locals_count(2); |
| 1179 builder.set_context_count(0); |
1152 builder.set_parameter_count(0); | 1180 builder.set_parameter_count(0); |
1153 Register reg(0), scratch(1); | 1181 Register reg(0), scratch(1); |
1154 BytecodeLabel label[2]; | 1182 BytecodeLabel label[2]; |
1155 BytecodeLabel done, done1; | 1183 BytecodeLabel done, done1; |
1156 | 1184 |
1157 builder.LoadLiteral(Smi::FromInt(0)) | 1185 builder.LoadLiteral(Smi::FromInt(0)) |
1158 .StoreAccumulatorInRegister(reg) | 1186 .StoreAccumulatorInRegister(reg) |
1159 .LoadFalse() | 1187 .LoadFalse() |
1160 .JumpIfFalse(&label[0]); | 1188 .JumpIfFalse(&label[0]); |
1161 IncrementRegister(builder, reg, 1024, scratch) | 1189 IncrementRegister(builder, reg, 1024, scratch) |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1230 | 1258 |
1231 for (size_t c = 0; c < arraysize(kComparisonTypes); c++) { | 1259 for (size_t c = 0; c < arraysize(kComparisonTypes); c++) { |
1232 Token::Value comparison = kComparisonTypes[c]; | 1260 Token::Value comparison = kComparisonTypes[c]; |
1233 for (size_t i = 0; i < arraysize(inputs); i++) { | 1261 for (size_t i = 0; i < arraysize(inputs); i++) { |
1234 for (size_t j = 0; j < arraysize(inputs); j++) { | 1262 for (size_t j = 0; j < arraysize(inputs); j++) { |
1235 HandleAndZoneScope handles; | 1263 HandleAndZoneScope handles; |
1236 BytecodeArrayBuilder builder(handles.main_isolate(), | 1264 BytecodeArrayBuilder builder(handles.main_isolate(), |
1237 handles.main_zone()); | 1265 handles.main_zone()); |
1238 Register r0(0); | 1266 Register r0(0); |
1239 builder.set_locals_count(1); | 1267 builder.set_locals_count(1); |
| 1268 builder.set_context_count(0); |
1240 builder.set_parameter_count(0); | 1269 builder.set_parameter_count(0); |
1241 builder.LoadLiteral(Smi::FromInt(inputs[i])) | 1270 builder.LoadLiteral(Smi::FromInt(inputs[i])) |
1242 .StoreAccumulatorInRegister(r0) | 1271 .StoreAccumulatorInRegister(r0) |
1243 .LoadLiteral(Smi::FromInt(inputs[j])) | 1272 .LoadLiteral(Smi::FromInt(inputs[j])) |
1244 .CompareOperation(comparison, r0, Strength::WEAK) | 1273 .CompareOperation(comparison, r0, Strength::WEAK) |
1245 .Return(); | 1274 .Return(); |
1246 | 1275 |
1247 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1276 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
1248 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 1277 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
1249 auto callable = tester.GetCallable<>(); | 1278 auto callable = tester.GetCallable<>(); |
(...skipping 18 matching lines...) Expand all Loading... |
1268 for (size_t c = 0; c < arraysize(kComparisonTypes); c++) { | 1297 for (size_t c = 0; c < arraysize(kComparisonTypes); c++) { |
1269 Token::Value comparison = kComparisonTypes[c]; | 1298 Token::Value comparison = kComparisonTypes[c]; |
1270 for (size_t i = 0; i < arraysize(inputs); i++) { | 1299 for (size_t i = 0; i < arraysize(inputs); i++) { |
1271 for (size_t j = 0; j < arraysize(inputs); j++) { | 1300 for (size_t j = 0; j < arraysize(inputs); j++) { |
1272 HandleAndZoneScope handles; | 1301 HandleAndZoneScope handles; |
1273 i::Factory* factory = handles.main_isolate()->factory(); | 1302 i::Factory* factory = handles.main_isolate()->factory(); |
1274 BytecodeArrayBuilder builder(handles.main_isolate(), | 1303 BytecodeArrayBuilder builder(handles.main_isolate(), |
1275 handles.main_zone()); | 1304 handles.main_zone()); |
1276 Register r0(0); | 1305 Register r0(0); |
1277 builder.set_locals_count(1); | 1306 builder.set_locals_count(1); |
| 1307 builder.set_context_count(0); |
1278 builder.set_parameter_count(0); | 1308 builder.set_parameter_count(0); |
1279 builder.LoadLiteral(factory->NewHeapNumber(inputs[i])) | 1309 builder.LoadLiteral(factory->NewHeapNumber(inputs[i])) |
1280 .StoreAccumulatorInRegister(r0) | 1310 .StoreAccumulatorInRegister(r0) |
1281 .LoadLiteral(factory->NewHeapNumber(inputs[j])) | 1311 .LoadLiteral(factory->NewHeapNumber(inputs[j])) |
1282 .CompareOperation(comparison, r0, Strength::WEAK) | 1312 .CompareOperation(comparison, r0, Strength::WEAK) |
1283 .Return(); | 1313 .Return(); |
1284 | 1314 |
1285 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1315 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
1286 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 1316 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
1287 auto callable = tester.GetCallable<>(); | 1317 auto callable = tester.GetCallable<>(); |
(...skipping 15 matching lines...) Expand all Loading... |
1303 for (size_t i = 0; i < arraysize(inputs); i++) { | 1333 for (size_t i = 0; i < arraysize(inputs); i++) { |
1304 for (size_t j = 0; j < arraysize(inputs); j++) { | 1334 for (size_t j = 0; j < arraysize(inputs); j++) { |
1305 const char* lhs = inputs[i].c_str(); | 1335 const char* lhs = inputs[i].c_str(); |
1306 const char* rhs = inputs[j].c_str(); | 1336 const char* rhs = inputs[j].c_str(); |
1307 HandleAndZoneScope handles; | 1337 HandleAndZoneScope handles; |
1308 i::Factory* factory = handles.main_isolate()->factory(); | 1338 i::Factory* factory = handles.main_isolate()->factory(); |
1309 BytecodeArrayBuilder builder(handles.main_isolate(), | 1339 BytecodeArrayBuilder builder(handles.main_isolate(), |
1310 handles.main_zone()); | 1340 handles.main_zone()); |
1311 Register r0(0); | 1341 Register r0(0); |
1312 builder.set_locals_count(1); | 1342 builder.set_locals_count(1); |
| 1343 builder.set_context_count(0); |
1313 builder.set_parameter_count(0); | 1344 builder.set_parameter_count(0); |
1314 builder.LoadLiteral(factory->NewStringFromAsciiChecked(lhs)) | 1345 builder.LoadLiteral(factory->NewStringFromAsciiChecked(lhs)) |
1315 .StoreAccumulatorInRegister(r0) | 1346 .StoreAccumulatorInRegister(r0) |
1316 .LoadLiteral(factory->NewStringFromAsciiChecked(rhs)) | 1347 .LoadLiteral(factory->NewStringFromAsciiChecked(rhs)) |
1317 .CompareOperation(comparison, r0, Strength::WEAK) | 1348 .CompareOperation(comparison, r0, Strength::WEAK) |
1318 .Return(); | 1349 .Return(); |
1319 | 1350 |
1320 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1351 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
1321 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 1352 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
1322 auto callable = tester.GetCallable<>(); | 1353 auto callable = tester.GetCallable<>(); |
(...skipping 26 matching lines...) Expand all Loading... |
1349 double lhs = StringToDouble(&unicode_cache, lhs_cstr, | 1380 double lhs = StringToDouble(&unicode_cache, lhs_cstr, |
1350 i::ConversionFlags::NO_FLAGS); | 1381 i::ConversionFlags::NO_FLAGS); |
1351 double rhs = StringToDouble(&unicode_cache, rhs_cstr, | 1382 double rhs = StringToDouble(&unicode_cache, rhs_cstr, |
1352 i::ConversionFlags::NO_FLAGS); | 1383 i::ConversionFlags::NO_FLAGS); |
1353 HandleAndZoneScope handles; | 1384 HandleAndZoneScope handles; |
1354 i::Factory* factory = handles.main_isolate()->factory(); | 1385 i::Factory* factory = handles.main_isolate()->factory(); |
1355 BytecodeArrayBuilder builder(handles.main_isolate(), | 1386 BytecodeArrayBuilder builder(handles.main_isolate(), |
1356 handles.main_zone()); | 1387 handles.main_zone()); |
1357 Register r0(0); | 1388 Register r0(0); |
1358 builder.set_locals_count(1); | 1389 builder.set_locals_count(1); |
| 1390 builder.set_context_count(0); |
1359 builder.set_parameter_count(0); | 1391 builder.set_parameter_count(0); |
1360 if (pass == 0) { | 1392 if (pass == 0) { |
1361 // Comparison with HeapNumber on the lhs and String on the rhs | 1393 // Comparison with HeapNumber on the lhs and String on the rhs |
1362 builder.LoadLiteral(factory->NewNumber(lhs)) | 1394 builder.LoadLiteral(factory->NewNumber(lhs)) |
1363 .StoreAccumulatorInRegister(r0) | 1395 .StoreAccumulatorInRegister(r0) |
1364 .LoadLiteral(factory->NewStringFromAsciiChecked(rhs_cstr)) | 1396 .LoadLiteral(factory->NewStringFromAsciiChecked(rhs_cstr)) |
1365 .CompareOperation(comparison, r0, Strength::WEAK) | 1397 .CompareOperation(comparison, r0, Strength::WEAK) |
1366 .Return(); | 1398 .Return(); |
1367 } else { | 1399 } else { |
1368 // Comparison with HeapNumber on the rhs and String on the lhs | 1400 // Comparison with HeapNumber on the rhs and String on the lhs |
(...skipping 24 matching lines...) Expand all Loading... |
1393 Handle<i::String> name = factory->NewStringFromAsciiChecked("cons"); | 1425 Handle<i::String> name = factory->NewStringFromAsciiChecked("cons"); |
1394 Handle<i::JSFunction> func = factory->NewFunction(name); | 1426 Handle<i::JSFunction> func = factory->NewFunction(name); |
1395 Handle<i::JSObject> instance = factory->NewJSObject(func); | 1427 Handle<i::JSObject> instance = factory->NewJSObject(func); |
1396 Handle<i::Object> other = factory->NewNumber(3.3333); | 1428 Handle<i::Object> other = factory->NewNumber(3.3333); |
1397 Handle<i::Object> cases[] = {Handle<i::Object>::cast(instance), other}; | 1429 Handle<i::Object> cases[] = {Handle<i::Object>::cast(instance), other}; |
1398 for (size_t i = 0; i < arraysize(cases); i++) { | 1430 for (size_t i = 0; i < arraysize(cases); i++) { |
1399 bool expected_value = (i == 0); | 1431 bool expected_value = (i == 0); |
1400 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 1432 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
1401 Register r0(0); | 1433 Register r0(0); |
1402 builder.set_locals_count(1); | 1434 builder.set_locals_count(1); |
| 1435 builder.set_context_count(0); |
1403 builder.set_parameter_count(0); | 1436 builder.set_parameter_count(0); |
1404 builder.LoadLiteral(cases[i]); | 1437 builder.LoadLiteral(cases[i]); |
1405 builder.StoreAccumulatorInRegister(r0) | 1438 builder.StoreAccumulatorInRegister(r0) |
1406 .LoadLiteral(func) | 1439 .LoadLiteral(func) |
1407 .CompareOperation(Token::Value::INSTANCEOF, r0, Strength::WEAK) | 1440 .CompareOperation(Token::Value::INSTANCEOF, r0, Strength::WEAK) |
1408 .Return(); | 1441 .Return(); |
1409 | 1442 |
1410 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1443 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
1411 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 1444 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
1412 auto callable = tester.GetCallable<>(); | 1445 auto callable = tester.GetCallable<>(); |
(...skipping 10 matching lines...) Expand all Loading... |
1423 // Allocate an array | 1456 // Allocate an array |
1424 Handle<i::JSArray> array = | 1457 Handle<i::JSArray> array = |
1425 factory->NewJSArray(i::ElementsKind::FAST_SMI_ELEMENTS); | 1458 factory->NewJSArray(i::ElementsKind::FAST_SMI_ELEMENTS); |
1426 // Check for these properties on the array object | 1459 // Check for these properties on the array object |
1427 const char* properties[] = {"length", "fuzzle", "x", "0"}; | 1460 const char* properties[] = {"length", "fuzzle", "x", "0"}; |
1428 for (size_t i = 0; i < arraysize(properties); i++) { | 1461 for (size_t i = 0; i < arraysize(properties); i++) { |
1429 bool expected_value = (i == 0); | 1462 bool expected_value = (i == 0); |
1430 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 1463 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
1431 Register r0(0); | 1464 Register r0(0); |
1432 builder.set_locals_count(1); | 1465 builder.set_locals_count(1); |
| 1466 builder.set_context_count(0); |
1433 builder.set_parameter_count(0); | 1467 builder.set_parameter_count(0); |
1434 builder.LoadLiteral(factory->NewStringFromAsciiChecked(properties[i])) | 1468 builder.LoadLiteral(factory->NewStringFromAsciiChecked(properties[i])) |
1435 .StoreAccumulatorInRegister(r0) | 1469 .StoreAccumulatorInRegister(r0) |
1436 .LoadLiteral(Handle<Object>::cast(array)) | 1470 .LoadLiteral(Handle<Object>::cast(array)) |
1437 .CompareOperation(Token::Value::IN, r0, Strength::WEAK) | 1471 .CompareOperation(Token::Value::IN, r0, Strength::WEAK) |
1438 .Return(); | 1472 .Return(); |
1439 | 1473 |
1440 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1474 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
1441 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 1475 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
1442 auto callable = tester.GetCallable<>(); | 1476 auto callable = tester.GetCallable<>(); |
1443 Handle<Object> return_value = callable().ToHandleChecked(); | 1477 Handle<Object> return_value = callable().ToHandleChecked(); |
1444 CHECK(return_value->IsBoolean()); | 1478 CHECK(return_value->IsBoolean()); |
1445 CHECK_EQ(return_value->BooleanValue(), expected_value); | 1479 CHECK_EQ(return_value->BooleanValue(), expected_value); |
1446 } | 1480 } |
1447 } | 1481 } |
1448 | 1482 |
1449 | 1483 |
1450 TEST(InterpreterUnaryNot) { | 1484 TEST(InterpreterUnaryNot) { |
1451 HandleAndZoneScope handles; | 1485 HandleAndZoneScope handles; |
1452 for (size_t i = 1; i < 10; i++) { | 1486 for (size_t i = 1; i < 10; i++) { |
1453 bool expected_value = ((i & 1) == 1); | 1487 bool expected_value = ((i & 1) == 1); |
1454 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 1488 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
1455 Register r0(0); | 1489 Register r0(0); |
1456 builder.set_locals_count(0); | 1490 builder.set_locals_count(0); |
| 1491 builder.set_context_count(0); |
1457 builder.set_parameter_count(0); | 1492 builder.set_parameter_count(0); |
1458 builder.EnterBlock(); | 1493 builder.EnterBlock(); |
1459 builder.LoadFalse(); | 1494 builder.LoadFalse(); |
1460 for (size_t j = 0; j < i; j++) { | 1495 for (size_t j = 0; j < i; j++) { |
1461 builder.LogicalNot(); | 1496 builder.LogicalNot(); |
1462 } | 1497 } |
1463 builder.LeaveBlock().Return(); | 1498 builder.LeaveBlock().Return(); |
1464 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1499 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
1465 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 1500 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
1466 auto callable = tester.GetCallable<>(); | 1501 auto callable = tester.GetCallable<>(); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1510 Handle<Object>::cast(factory->NewStringFromStaticChars("hello")), | 1545 Handle<Object>::cast(factory->NewStringFromStaticChars("hello")), |
1511 true), | 1546 true), |
1512 std::make_pair( | 1547 std::make_pair( |
1513 Handle<Object>::cast(factory->NewStringFromStaticChars("")), false), | 1548 Handle<Object>::cast(factory->NewStringFromStaticChars("")), false), |
1514 }; | 1549 }; |
1515 | 1550 |
1516 for (size_t i = 0; i < arraysize(object_type_tuples); i++) { | 1551 for (size_t i = 0; i < arraysize(object_type_tuples); i++) { |
1517 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 1552 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
1518 Register r0(0); | 1553 Register r0(0); |
1519 builder.set_locals_count(0); | 1554 builder.set_locals_count(0); |
| 1555 builder.set_context_count(0); |
1520 builder.set_parameter_count(0); | 1556 builder.set_parameter_count(0); |
1521 builder.EnterBlock(); | 1557 builder.EnterBlock(); |
1522 LoadAny(&builder, factory, object_type_tuples[i].first); | 1558 LoadAny(&builder, factory, object_type_tuples[i].first); |
1523 builder.CastAccumulatorToBoolean(); | 1559 builder.CastAccumulatorToBoolean(); |
1524 builder.LeaveBlock().Return(); | 1560 builder.LeaveBlock().Return(); |
1525 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1561 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
1526 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 1562 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
1527 auto callable = tester.GetCallable<>(); | 1563 auto callable = tester.GetCallable<>(); |
1528 Handle<Object> return_value = callable().ToHandleChecked(); | 1564 Handle<Object> return_value = callable().ToHandleChecked(); |
1529 CHECK(return_value->IsBoolean()); | 1565 CHECK(return_value->IsBoolean()); |
(...skipping 17 matching lines...) Expand all Loading... |
1547 Handle<Object>::cast(factory->NewStringFromStaticChars("hello")), | 1583 Handle<Object>::cast(factory->NewStringFromStaticChars("hello")), |
1548 false), | 1584 false), |
1549 std::make_pair( | 1585 std::make_pair( |
1550 Handle<Object>::cast(factory->NewStringFromStaticChars("")), true), | 1586 Handle<Object>::cast(factory->NewStringFromStaticChars("")), true), |
1551 }; | 1587 }; |
1552 | 1588 |
1553 for (size_t i = 0; i < arraysize(object_type_tuples); i++) { | 1589 for (size_t i = 0; i < arraysize(object_type_tuples); i++) { |
1554 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 1590 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
1555 Register r0(0); | 1591 Register r0(0); |
1556 builder.set_locals_count(0); | 1592 builder.set_locals_count(0); |
| 1593 builder.set_context_count(0); |
1557 builder.set_parameter_count(0); | 1594 builder.set_parameter_count(0); |
1558 builder.EnterBlock(); | 1595 builder.EnterBlock(); |
1559 LoadAny(&builder, factory, object_type_tuples[i].first); | 1596 LoadAny(&builder, factory, object_type_tuples[i].first); |
1560 builder.LogicalNot(); | 1597 builder.LogicalNot(); |
1561 builder.LeaveBlock().Return(); | 1598 builder.LeaveBlock().Return(); |
1562 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1599 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
1563 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 1600 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
1564 auto callable = tester.GetCallable<>(); | 1601 auto callable = tester.GetCallable<>(); |
1565 Handle<Object> return_value = callable().ToHandleChecked(); | 1602 Handle<Object> return_value = callable().ToHandleChecked(); |
1566 CHECK(return_value->IsBoolean()); | 1603 CHECK(return_value->IsBoolean()); |
(...skipping 15 matching lines...) Expand all Loading... |
1582 std::make_pair(factory->NewNumberFromInt(7771), "number"), | 1619 std::make_pair(factory->NewNumberFromInt(7771), "number"), |
1583 std::make_pair( | 1620 std::make_pair( |
1584 Handle<Object>::cast(factory->NewStringFromStaticChars("hello")), | 1621 Handle<Object>::cast(factory->NewStringFromStaticChars("hello")), |
1585 "string"), | 1622 "string"), |
1586 }; | 1623 }; |
1587 | 1624 |
1588 for (size_t i = 0; i < arraysize(object_type_tuples); i++) { | 1625 for (size_t i = 0; i < arraysize(object_type_tuples); i++) { |
1589 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 1626 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
1590 Register r0(0); | 1627 Register r0(0); |
1591 builder.set_locals_count(0); | 1628 builder.set_locals_count(0); |
| 1629 builder.set_context_count(0); |
1592 builder.set_parameter_count(0); | 1630 builder.set_parameter_count(0); |
1593 builder.EnterBlock(); | 1631 builder.EnterBlock(); |
1594 LoadAny(&builder, factory, object_type_tuples[i].first); | 1632 LoadAny(&builder, factory, object_type_tuples[i].first); |
1595 builder.TypeOf(); | 1633 builder.TypeOf(); |
1596 builder.LeaveBlock().Return(); | 1634 builder.LeaveBlock().Return(); |
1597 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1635 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
1598 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 1636 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
1599 auto callable = tester.GetCallable<>(); | 1637 auto callable = tester.GetCallable<>(); |
1600 Handle<v8::internal::String> return_value = | 1638 Handle<v8::internal::String> return_value = |
1601 Handle<v8::internal::String>::cast(callable().ToHandleChecked()); | 1639 Handle<v8::internal::String>::cast(callable().ToHandleChecked()); |
1602 auto actual = return_value->ToCString(); | 1640 auto actual = return_value->ToCString(); |
1603 CHECK_EQ(strcmp(&actual[0], object_type_tuples[i].second), 0); | 1641 CHECK_EQ(strcmp(&actual[0], object_type_tuples[i].second), 0); |
1604 } | 1642 } |
1605 } | 1643 } |
1606 | 1644 |
1607 | 1645 |
1608 TEST(InterpreterCallRuntime) { | 1646 TEST(InterpreterCallRuntime) { |
1609 HandleAndZoneScope handles; | 1647 HandleAndZoneScope handles; |
1610 | 1648 |
1611 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 1649 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
1612 builder.set_locals_count(2); | 1650 builder.set_locals_count(2); |
| 1651 builder.set_context_count(0); |
1613 builder.set_parameter_count(1); | 1652 builder.set_parameter_count(1); |
1614 builder.LoadLiteral(Smi::FromInt(15)) | 1653 builder.LoadLiteral(Smi::FromInt(15)) |
1615 .StoreAccumulatorInRegister(Register(0)) | 1654 .StoreAccumulatorInRegister(Register(0)) |
1616 .LoadLiteral(Smi::FromInt(40)) | 1655 .LoadLiteral(Smi::FromInt(40)) |
1617 .StoreAccumulatorInRegister(Register(1)) | 1656 .StoreAccumulatorInRegister(Register(1)) |
1618 .CallRuntime(Runtime::kAdd, Register(0), 2) | 1657 .CallRuntime(Runtime::kAdd, Register(0), 2) |
1619 .Return(); | 1658 .Return(); |
1620 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1659 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
1621 | 1660 |
1622 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 1661 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1721 std::string source(InterpreterTester::SourceForBody(literals[i].first)); | 1760 std::string source(InterpreterTester::SourceForBody(literals[i].first)); |
1722 InterpreterTester tester(handles.main_isolate(), source.c_str()); | 1761 InterpreterTester tester(handles.main_isolate(), source.c_str()); |
1723 auto callable = tester.GetCallable<>(); | 1762 auto callable = tester.GetCallable<>(); |
1724 | 1763 |
1725 Handle<i::Object> return_value = callable().ToHandleChecked(); | 1764 Handle<i::Object> return_value = callable().ToHandleChecked(); |
1726 CHECK(return_value->SameValue(*literals[i].second)); | 1765 CHECK(return_value->SameValue(*literals[i].second)); |
1727 } | 1766 } |
1728 } | 1767 } |
1729 | 1768 |
1730 | 1769 |
| 1770 TEST(InterpreterContextVariables) { |
| 1771 HandleAndZoneScope handles; |
| 1772 i::Isolate* isolate = handles.main_isolate(); |
| 1773 |
| 1774 std::pair<const char*, Handle<Object>> context_vars[5] = { |
| 1775 std::make_pair("var a; (function() { a = 1; })(); return a;", |
| 1776 Handle<Object>(Smi::FromInt(1), isolate)), |
| 1777 std::make_pair("var a = 10; (function() { a; })(); return a;", |
| 1778 Handle<Object>(Smi::FromInt(10), isolate)), |
| 1779 std::make_pair("var a = 20; var b = 30;\n" |
| 1780 "return (function() { return a + b; })();", |
| 1781 Handle<Object>(Smi::FromInt(50), isolate)), |
| 1782 std::make_pair("'use strict'; let a = 1;\n" |
| 1783 "{ let b = 2; return (function() { return a + b; })(); }", |
| 1784 Handle<Object>(Smi::FromInt(3), isolate)), |
| 1785 std::make_pair("'use strict'; let a = 10;\n" |
| 1786 "{ let b = 20; var c = function() { [a, b] };\n" |
| 1787 " return a + b; }", |
| 1788 Handle<Object>(Smi::FromInt(30), isolate)), |
| 1789 }; |
| 1790 |
| 1791 for (size_t i = 0; i < arraysize(context_vars); i++) { |
| 1792 std::string source(InterpreterTester::SourceForBody(context_vars[i].first)); |
| 1793 InterpreterTester tester(handles.main_isolate(), source.c_str()); |
| 1794 auto callable = tester.GetCallable<>(); |
| 1795 |
| 1796 Handle<i::Object> return_value = callable().ToHandleChecked(); |
| 1797 CHECK(return_value->SameValue(*context_vars[i].second)); |
| 1798 } |
| 1799 } |
| 1800 |
| 1801 |
| 1802 TEST(InterpreterContextParameters) { |
| 1803 HandleAndZoneScope handles; |
| 1804 i::Isolate* isolate = handles.main_isolate(); |
| 1805 |
| 1806 std::pair<const char*, Handle<Object>> context_params[3] = { |
| 1807 std::make_pair("return (function() { return arg1; })();", |
| 1808 Handle<Object>(Smi::FromInt(1), isolate)), |
| 1809 std::make_pair("(function() { arg1 = 4; })(); return arg1;", |
| 1810 Handle<Object>(Smi::FromInt(4), isolate)), |
| 1811 std::make_pair("(function() { arg3 = arg2 - arg1; })(); return arg3;", |
| 1812 Handle<Object>(Smi::FromInt(1), isolate)), |
| 1813 }; |
| 1814 |
| 1815 for (size_t i = 0; i < arraysize(context_params); i++) { |
| 1816 std::string source = "function " + InterpreterTester::function_name() + |
| 1817 "(arg1, arg2, arg3) {" + context_params[i].first + "}"; |
| 1818 InterpreterTester tester(handles.main_isolate(), source.c_str()); |
| 1819 auto callable = |
| 1820 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); |
| 1821 |
| 1822 Handle<Object> a1 = Handle<Object>(Smi::FromInt(1), isolate); |
| 1823 Handle<Object> a2 = Handle<Object>(Smi::FromInt(2), isolate); |
| 1824 Handle<Object> a3 = Handle<Object>(Smi::FromInt(3), isolate); |
| 1825 Handle<i::Object> return_value = callable(a1, a2, a3).ToHandleChecked(); |
| 1826 CHECK(return_value->SameValue(*context_params[i].second)); |
| 1827 } |
| 1828 } |
| 1829 |
| 1830 |
1731 TEST(InterpreterComma) { | 1831 TEST(InterpreterComma) { |
1732 HandleAndZoneScope handles; | 1832 HandleAndZoneScope handles; |
1733 i::Isolate* isolate = handles.main_isolate(); | 1833 i::Isolate* isolate = handles.main_isolate(); |
1734 i::Factory* factory = isolate->factory(); | 1834 i::Factory* factory = isolate->factory(); |
1735 | 1835 |
1736 std::pair<const char*, Handle<Object>> literals[6] = { | 1836 std::pair<const char*, Handle<Object>> literals[6] = { |
1737 std::make_pair("var a; return 0, a;\n", factory->undefined_value()), | 1837 std::make_pair("var a; return 0, a;\n", factory->undefined_value()), |
1738 std::make_pair("return 'a', 2.2, 3;\n", | 1838 std::make_pair("return 'a', 2.2, 3;\n", |
1739 Handle<Object>(Smi::FromInt(3), isolate)), | 1839 Handle<Object>(Smi::FromInt(3), isolate)), |
1740 std::make_pair("return 'a', 'b', 'c';\n", | 1840 std::make_pair("return 'a', 'b', 'c';\n", |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1833 | 1933 |
1834 // TODO(rmcilroy): modify tests when we have real try finally support. | 1934 // TODO(rmcilroy): modify tests when we have real try finally support. |
1835 std::string source(InterpreterTester::SourceForBody( | 1935 std::string source(InterpreterTester::SourceForBody( |
1836 "var a = 1; try { a = a + 1; } finally { a = a + 2; }; return a;")); | 1936 "var a = 1; try { a = a + 1; } finally { a = a + 2; }; return a;")); |
1837 InterpreterTester tester(handles.main_isolate(), source.c_str()); | 1937 InterpreterTester tester(handles.main_isolate(), source.c_str()); |
1838 auto callable = tester.GetCallable<>(); | 1938 auto callable = tester.GetCallable<>(); |
1839 | 1939 |
1840 Handle<Object> return_val = callable().ToHandleChecked(); | 1940 Handle<Object> return_val = callable().ToHandleChecked(); |
1841 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(4)); | 1941 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(4)); |
1842 } | 1942 } |
OLD | NEW |