| 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 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 BytecodeArrayBuilder builder(handles.main_isolate(), | 384 BytecodeArrayBuilder builder(handles.main_isolate(), |
| 385 handles.main_zone()); | 385 handles.main_zone()); |
| 386 builder.set_locals_count(1); | 386 builder.set_locals_count(1); |
| 387 builder.set_parameter_count(1); | 387 builder.set_parameter_count(1); |
| 388 Register reg(0); | 388 Register reg(0); |
| 389 int lhs = lhs_inputs[l]; | 389 int lhs = lhs_inputs[l]; |
| 390 int rhs = rhs_inputs[l]; | 390 int rhs = rhs_inputs[l]; |
| 391 builder.LoadLiteral(Smi::FromInt(lhs)) | 391 builder.LoadLiteral(Smi::FromInt(lhs)) |
| 392 .StoreAccumulatorInRegister(reg) | 392 .StoreAccumulatorInRegister(reg) |
| 393 .LoadLiteral(Smi::FromInt(rhs)) | 393 .LoadLiteral(Smi::FromInt(rhs)) |
| 394 .BinaryOperation(kArithmeticOperators[o], reg) | 394 .BinaryOperation(kArithmeticOperators[o], reg, i::SLOPPY) |
| 395 .Return(); | 395 .Return(); |
| 396 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 396 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 397 | 397 |
| 398 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 398 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| 399 auto callable = tester.GetCallable<>(); | 399 auto callable = tester.GetCallable<>(); |
| 400 Handle<Object> return_value = callable().ToHandleChecked(); | 400 Handle<Object> return_value = callable().ToHandleChecked(); |
| 401 Handle<Object> expected_value = | 401 Handle<Object> expected_value = |
| 402 factory->NewNumber(BinaryOpC(kArithmeticOperators[o], lhs, rhs)); | 402 factory->NewNumber(BinaryOpC(kArithmeticOperators[o], lhs, rhs)); |
| 403 CHECK(return_value->SameValue(*expected_value)); | 403 CHECK(return_value->SameValue(*expected_value)); |
| 404 } | 404 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 419 BytecodeArrayBuilder builder(handles.main_isolate(), | 419 BytecodeArrayBuilder builder(handles.main_isolate(), |
| 420 handles.main_zone()); | 420 handles.main_zone()); |
| 421 builder.set_locals_count(1); | 421 builder.set_locals_count(1); |
| 422 builder.set_parameter_count(1); | 422 builder.set_parameter_count(1); |
| 423 Register reg(0); | 423 Register reg(0); |
| 424 double lhs = lhs_inputs[l]; | 424 double lhs = lhs_inputs[l]; |
| 425 double rhs = rhs_inputs[l]; | 425 double rhs = rhs_inputs[l]; |
| 426 builder.LoadLiteral(factory->NewNumber(lhs)) | 426 builder.LoadLiteral(factory->NewNumber(lhs)) |
| 427 .StoreAccumulatorInRegister(reg) | 427 .StoreAccumulatorInRegister(reg) |
| 428 .LoadLiteral(factory->NewNumber(rhs)) | 428 .LoadLiteral(factory->NewNumber(rhs)) |
| 429 .BinaryOperation(kArithmeticOperators[o], reg) | 429 .BinaryOperation(kArithmeticOperators[o], reg, i::SLOPPY) |
| 430 .Return(); | 430 .Return(); |
| 431 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 431 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 432 | 432 |
| 433 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 433 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| 434 auto callable = tester.GetCallable<>(); | 434 auto callable = tester.GetCallable<>(); |
| 435 Handle<Object> return_value = callable().ToHandleChecked(); | 435 Handle<Object> return_value = callable().ToHandleChecked(); |
| 436 Handle<Object> expected_value = | 436 Handle<Object> expected_value = |
| 437 factory->NewNumber(BinaryOpC(kArithmeticOperators[o], lhs, rhs)); | 437 factory->NewNumber(BinaryOpC(kArithmeticOperators[o], lhs, rhs)); |
| 438 CHECK(return_value->SameValue(*expected_value)); | 438 CHECK(return_value->SameValue(*expected_value)); |
| 439 } | 439 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 475 }; | 475 }; |
| 476 | 476 |
| 477 for (size_t i = 0; i < arraysize(test_cases); i++) { | 477 for (size_t i = 0; i < arraysize(test_cases); i++) { |
| 478 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 478 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
| 479 builder.set_locals_count(1); | 479 builder.set_locals_count(1); |
| 480 builder.set_parameter_count(1); | 480 builder.set_parameter_count(1); |
| 481 Register reg(0); | 481 Register reg(0); |
| 482 builder.LoadLiteral(test_cases[i].lhs) | 482 builder.LoadLiteral(test_cases[i].lhs) |
| 483 .StoreAccumulatorInRegister(reg) | 483 .StoreAccumulatorInRegister(reg) |
| 484 .LoadLiteral(test_cases[i].rhs) | 484 .LoadLiteral(test_cases[i].rhs) |
| 485 .BinaryOperation(Token::Value::ADD, reg) | 485 .BinaryOperation(Token::Value::ADD, reg, i::SLOPPY) |
| 486 .Return(); | 486 .Return(); |
| 487 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 487 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 488 | 488 |
| 489 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 489 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| 490 auto callable = tester.GetCallable<>(); | 490 auto callable = tester.GetCallable<>(); |
| 491 Handle<Object> return_value = callable().ToHandleChecked(); | 491 Handle<Object> return_value = callable().ToHandleChecked(); |
| 492 CHECK(return_value->SameValue(*test_cases[i].expected_value)); | 492 CHECK(return_value->SameValue(*test_cases[i].expected_value)); |
| 493 } | 493 } |
| 494 } | 494 } |
| 495 | 495 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 516 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(3)); | 516 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(3)); |
| 517 } | 517 } |
| 518 | 518 |
| 519 | 519 |
| 520 TEST(InterpreterParameter8) { | 520 TEST(InterpreterParameter8) { |
| 521 HandleAndZoneScope handles; | 521 HandleAndZoneScope handles; |
| 522 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 522 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
| 523 builder.set_locals_count(0); | 523 builder.set_locals_count(0); |
| 524 builder.set_parameter_count(8); | 524 builder.set_parameter_count(8); |
| 525 builder.LoadAccumulatorWithRegister(builder.Parameter(0)) | 525 builder.LoadAccumulatorWithRegister(builder.Parameter(0)) |
| 526 .BinaryOperation(Token::Value::ADD, builder.Parameter(1)) | 526 .BinaryOperation(Token::Value::ADD, builder.Parameter(1), i::SLOPPY) |
| 527 .BinaryOperation(Token::Value::ADD, builder.Parameter(2)) | 527 .BinaryOperation(Token::Value::ADD, builder.Parameter(2), i::SLOPPY) |
| 528 .BinaryOperation(Token::Value::ADD, builder.Parameter(3)) | 528 .BinaryOperation(Token::Value::ADD, builder.Parameter(3), i::SLOPPY) |
| 529 .BinaryOperation(Token::Value::ADD, builder.Parameter(4)) | 529 .BinaryOperation(Token::Value::ADD, builder.Parameter(4), i::SLOPPY) |
| 530 .BinaryOperation(Token::Value::ADD, builder.Parameter(5)) | 530 .BinaryOperation(Token::Value::ADD, builder.Parameter(5), i::SLOPPY) |
| 531 .BinaryOperation(Token::Value::ADD, builder.Parameter(6)) | 531 .BinaryOperation(Token::Value::ADD, builder.Parameter(6), i::SLOPPY) |
| 532 .BinaryOperation(Token::Value::ADD, builder.Parameter(7)) | 532 .BinaryOperation(Token::Value::ADD, builder.Parameter(7), i::SLOPPY) |
| 533 .Return(); | 533 .Return(); |
| 534 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 534 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 535 | 535 |
| 536 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 536 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| 537 typedef Handle<Object> H; | 537 typedef Handle<Object> H; |
| 538 auto callable = tester.GetCallable<H, H, H, H, H, H, H, H>(); | 538 auto callable = tester.GetCallable<H, H, H, H, H, H, H, H>(); |
| 539 | 539 |
| 540 Handle<Smi> arg1 = Handle<Smi>(Smi::FromInt(1), handles.main_isolate()); | 540 Handle<Smi> arg1 = Handle<Smi>(Smi::FromInt(1), handles.main_isolate()); |
| 541 Handle<Smi> arg2 = Handle<Smi>(Smi::FromInt(2), handles.main_isolate()); | 541 Handle<Smi> arg2 = Handle<Smi>(Smi::FromInt(2), handles.main_isolate()); |
| 542 Handle<Smi> arg3 = Handle<Smi>(Smi::FromInt(3), handles.main_isolate()); | 542 Handle<Smi> arg3 = Handle<Smi>(Smi::FromInt(3), handles.main_isolate()); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 656 i::TypeFeedbackVector::New(isolate, &feedback_spec); | 656 i::TypeFeedbackVector::New(isolate, &feedback_spec); |
| 657 | 657 |
| 658 Handle<i::String> key = factory->NewStringFromAsciiChecked("key"); | 658 Handle<i::String> key = factory->NewStringFromAsciiChecked("key"); |
| 659 key = factory->string_table()->LookupString(isolate, key); | 659 key = factory->string_table()->LookupString(isolate, key); |
| 660 | 660 |
| 661 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 661 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
| 662 builder.set_locals_count(1); | 662 builder.set_locals_count(1); |
| 663 builder.set_parameter_count(1); | 663 builder.set_parameter_count(1); |
| 664 builder.LoadLiteral(key) | 664 builder.LoadLiteral(key) |
| 665 .LoadKeyedProperty(builder.Parameter(0), vector->GetIndex(slot), | 665 .LoadKeyedProperty(builder.Parameter(0), vector->GetIndex(slot), |
| 666 i::SLOPPY) | 666 i::STRICT) |
| 667 .Return(); | 667 .Return(); |
| 668 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 668 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 669 | 669 |
| 670 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 670 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
| 671 auto callable = tester.GetCallable<Handle<Object>>(); | 671 auto callable = tester.GetCallable<Handle<Object>>(); |
| 672 | 672 |
| 673 Handle<Object> object = InterpreterTester::NewObject("({ key : 123 })"); | 673 Handle<Object> object = InterpreterTester::NewObject("({ key : 123 })"); |
| 674 // Test IC miss. | 674 // Test IC miss. |
| 675 Handle<Object> return_val = callable(object).ToHandleChecked(); | 675 Handle<Object> return_val = callable(object).ToHandleChecked(); |
| 676 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(123)); | 676 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(123)); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 702 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); | 702 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); |
| 703 name = factory->string_table()->LookupString(isolate, name); | 703 name = factory->string_table()->LookupString(isolate, name); |
| 704 | 704 |
| 705 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 705 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
| 706 builder.set_locals_count(1); | 706 builder.set_locals_count(1); |
| 707 builder.set_parameter_count(1); | 707 builder.set_parameter_count(1); |
| 708 builder.LoadLiteral(name) | 708 builder.LoadLiteral(name) |
| 709 .StoreAccumulatorInRegister(Register(0)) | 709 .StoreAccumulatorInRegister(Register(0)) |
| 710 .LoadLiteral(Smi::FromInt(999)) | 710 .LoadLiteral(Smi::FromInt(999)) |
| 711 .StoreNamedProperty(builder.Parameter(0), Register(0), | 711 .StoreNamedProperty(builder.Parameter(0), Register(0), |
| 712 vector->GetIndex(slot), i::SLOPPY) | 712 vector->GetIndex(slot), i::STRICT) |
| 713 .Return(); | 713 .Return(); |
| 714 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 714 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 715 | 715 |
| 716 InterpreterTester tester(isolate, bytecode_array, vector); | 716 InterpreterTester tester(isolate, bytecode_array, vector); |
| 717 auto callable = tester.GetCallable<Handle<Object>>(); | 717 auto callable = tester.GetCallable<Handle<Object>>(); |
| 718 Handle<Object> object = InterpreterTester::NewObject("({ val : 123 })"); | 718 Handle<Object> object = InterpreterTester::NewObject("({ val : 123 })"); |
| 719 // Test IC miss. | 719 // Test IC miss. |
| 720 Handle<Object> result; | 720 Handle<Object> result; |
| 721 callable(object).ToHandleChecked(); | 721 callable(object).ToHandleChecked(); |
| 722 CHECK(Runtime::GetObjectProperty(isolate, object, name).ToHandle(&result)); | 722 CHECK(Runtime::GetObjectProperty(isolate, object, name).ToHandle(&result)); |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 948 .StoreAccumulatorInRegister(reg) | 948 .StoreAccumulatorInRegister(reg) |
| 949 .LoadAccumulatorWithRegister(scratch); | 949 .LoadAccumulatorWithRegister(scratch); |
| 950 } | 950 } |
| 951 | 951 |
| 952 | 952 |
| 953 static BytecodeArrayBuilder& IncrementRegister(BytecodeArrayBuilder& builder, | 953 static BytecodeArrayBuilder& IncrementRegister(BytecodeArrayBuilder& builder, |
| 954 Register reg, int value, | 954 Register reg, int value, |
| 955 Register scratch) { | 955 Register scratch) { |
| 956 return builder.StoreAccumulatorInRegister(scratch) | 956 return builder.StoreAccumulatorInRegister(scratch) |
| 957 .LoadLiteral(Smi::FromInt(value)) | 957 .LoadLiteral(Smi::FromInt(value)) |
| 958 .BinaryOperation(Token::Value::ADD, reg) | 958 .BinaryOperation(Token::Value::ADD, reg, i::SLOPPY) |
| 959 .StoreAccumulatorInRegister(reg) | 959 .StoreAccumulatorInRegister(reg) |
| 960 .LoadAccumulatorWithRegister(scratch); | 960 .LoadAccumulatorWithRegister(scratch); |
| 961 } | 961 } |
| 962 | 962 |
| 963 | 963 |
| 964 TEST(InterpreterJumps) { | 964 TEST(InterpreterJumps) { |
| 965 HandleAndZoneScope handles; | 965 HandleAndZoneScope handles; |
| 966 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 966 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
| 967 builder.set_locals_count(2); | 967 builder.set_locals_count(2); |
| 968 builder.set_parameter_count(0); | 968 builder.set_parameter_count(0); |
| (...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1282 .Return(); | 1282 .Return(); |
| 1283 | 1283 |
| 1284 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1284 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 1285 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 1285 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| 1286 auto callable = tester.GetCallable<>(); | 1286 auto callable = tester.GetCallable<>(); |
| 1287 Handle<Object> return_value = callable().ToHandleChecked(); | 1287 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1288 CHECK(return_value->IsBoolean()); | 1288 CHECK(return_value->IsBoolean()); |
| 1289 CHECK_EQ(return_value->BooleanValue(), expected_value); | 1289 CHECK_EQ(return_value->BooleanValue(), expected_value); |
| 1290 } | 1290 } |
| 1291 } | 1291 } |
| OLD | NEW |