| 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 <tuple> | 5 #include <tuple> |
| 6 | 6 |
| 7 #include "src/v8.h" | 7 #include "src/v8.h" |
| 8 | 8 |
| 9 #include "src/execution.h" | 9 #include "src/execution.h" |
| 10 #include "src/handles.h" | 10 #include "src/handles.h" |
| (...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 {Token::Value::SUB, Handle<Smi>(Smi::FromInt(2), isolate), 42, | 701 {Token::Value::SUB, Handle<Smi>(Smi::FromInt(2), isolate), 42, |
| 702 Handle<Smi>(Smi::FromInt(-40), isolate), | 702 Handle<Smi>(Smi::FromInt(-40), isolate), |
| 703 BinaryOperationFeedback::kSignedSmall}, | 703 BinaryOperationFeedback::kSignedSmall}, |
| 704 {Token::Value::SUB, Handle<Smi>(Smi::FromInt(Smi::kMinValue), isolate), 1, | 704 {Token::Value::SUB, Handle<Smi>(Smi::FromInt(Smi::kMinValue), isolate), 1, |
| 705 isolate->factory()->NewHeapNumber(Smi::kMinValue - 1.0), | 705 isolate->factory()->NewHeapNumber(Smi::kMinValue - 1.0), |
| 706 BinaryOperationFeedback::kNumber}, | 706 BinaryOperationFeedback::kNumber}, |
| 707 {Token::Value::SUB, isolate->factory()->NewHeapNumber(3.1415), 2, | 707 {Token::Value::SUB, isolate->factory()->NewHeapNumber(3.1415), 2, |
| 708 isolate->factory()->NewHeapNumber(3.1415 - 2.0), | 708 isolate->factory()->NewHeapNumber(3.1415 - 2.0), |
| 709 BinaryOperationFeedback::kNumber}, | 709 BinaryOperationFeedback::kNumber}, |
| 710 {Token::Value::SUB, isolate->factory()->NewStringFromAsciiChecked("2"), 2, | 710 {Token::Value::SUB, isolate->factory()->NewStringFromAsciiChecked("2"), 2, |
| 711 Handle<Smi>(Smi::kZero, isolate), BinaryOperationFeedback::kAny}, | 711 Handle<Smi>(Smi::FromInt(0), isolate), BinaryOperationFeedback::kAny}, |
| 712 // BIT_OR | 712 // BIT_OR |
| 713 {Token::Value::BIT_OR, Handle<Smi>(Smi::FromInt(4), isolate), 1, | 713 {Token::Value::BIT_OR, Handle<Smi>(Smi::FromInt(4), isolate), 1, |
| 714 Handle<Smi>(Smi::FromInt(5), isolate), | 714 Handle<Smi>(Smi::FromInt(5), isolate), |
| 715 BinaryOperationFeedback::kSignedSmall}, | 715 BinaryOperationFeedback::kSignedSmall}, |
| 716 {Token::Value::BIT_OR, isolate->factory()->NewHeapNumber(3.1415), 8, | 716 {Token::Value::BIT_OR, isolate->factory()->NewHeapNumber(3.1415), 8, |
| 717 Handle<Smi>(Smi::FromInt(11), isolate), | 717 Handle<Smi>(Smi::FromInt(11), isolate), |
| 718 BinaryOperationFeedback::kNumber}, | 718 BinaryOperationFeedback::kNumber}, |
| 719 {Token::Value::BIT_OR, isolate->factory()->NewStringFromAsciiChecked("2"), | 719 {Token::Value::BIT_OR, isolate->factory()->NewStringFromAsciiChecked("2"), |
| 720 1, Handle<Smi>(Smi::FromInt(3), isolate), BinaryOperationFeedback::kAny}, | 720 1, Handle<Smi>(Smi::FromInt(3), isolate), BinaryOperationFeedback::kAny}, |
| 721 // BIT_AND | 721 // BIT_AND |
| 722 {Token::Value::BIT_AND, Handle<Smi>(Smi::FromInt(3), isolate), 1, | 722 {Token::Value::BIT_AND, Handle<Smi>(Smi::FromInt(3), isolate), 1, |
| 723 Handle<Smi>(Smi::FromInt(1), isolate), | 723 Handle<Smi>(Smi::FromInt(1), isolate), |
| 724 BinaryOperationFeedback::kSignedSmall}, | 724 BinaryOperationFeedback::kSignedSmall}, |
| 725 {Token::Value::BIT_AND, isolate->factory()->NewHeapNumber(3.1415), 2, | 725 {Token::Value::BIT_AND, isolate->factory()->NewHeapNumber(3.1415), 2, |
| 726 Handle<Smi>(Smi::FromInt(2), isolate), BinaryOperationFeedback::kNumber}, | 726 Handle<Smi>(Smi::FromInt(2), isolate), BinaryOperationFeedback::kNumber}, |
| 727 {Token::Value::BIT_AND, | 727 {Token::Value::BIT_AND, |
| 728 isolate->factory()->NewStringFromAsciiChecked("2"), 1, | 728 isolate->factory()->NewStringFromAsciiChecked("2"), 1, |
| 729 Handle<Smi>(Smi::kZero, isolate), BinaryOperationFeedback::kAny}, | 729 Handle<Smi>(Smi::FromInt(0), isolate), BinaryOperationFeedback::kAny}, |
| 730 // SHL | 730 // SHL |
| 731 {Token::Value::SHL, Handle<Smi>(Smi::FromInt(3), isolate), 1, | 731 {Token::Value::SHL, Handle<Smi>(Smi::FromInt(3), isolate), 1, |
| 732 Handle<Smi>(Smi::FromInt(6), isolate), | 732 Handle<Smi>(Smi::FromInt(6), isolate), |
| 733 BinaryOperationFeedback::kSignedSmall}, | 733 BinaryOperationFeedback::kSignedSmall}, |
| 734 {Token::Value::SHL, isolate->factory()->NewHeapNumber(3.1415), 2, | 734 {Token::Value::SHL, isolate->factory()->NewHeapNumber(3.1415), 2, |
| 735 Handle<Smi>(Smi::FromInt(12), isolate), | 735 Handle<Smi>(Smi::FromInt(12), isolate), |
| 736 BinaryOperationFeedback::kNumber}, | 736 BinaryOperationFeedback::kNumber}, |
| 737 {Token::Value::SHL, isolate->factory()->NewStringFromAsciiChecked("2"), 1, | 737 {Token::Value::SHL, isolate->factory()->NewStringFromAsciiChecked("2"), 1, |
| 738 Handle<Smi>(Smi::FromInt(4), isolate), BinaryOperationFeedback::kAny}, | 738 Handle<Smi>(Smi::FromInt(4), isolate), BinaryOperationFeedback::kAny}, |
| 739 // SAR | 739 // SAR |
| 740 {Token::Value::SAR, Handle<Smi>(Smi::FromInt(3), isolate), 1, | 740 {Token::Value::SAR, Handle<Smi>(Smi::FromInt(3), isolate), 1, |
| 741 Handle<Smi>(Smi::FromInt(1), isolate), | 741 Handle<Smi>(Smi::FromInt(1), isolate), |
| 742 BinaryOperationFeedback::kSignedSmall}, | 742 BinaryOperationFeedback::kSignedSmall}, |
| 743 {Token::Value::SAR, isolate->factory()->NewHeapNumber(3.1415), 2, | 743 {Token::Value::SAR, isolate->factory()->NewHeapNumber(3.1415), 2, |
| 744 Handle<Smi>(Smi::kZero, isolate), BinaryOperationFeedback::kNumber}, | 744 Handle<Smi>(Smi::FromInt(0), isolate), BinaryOperationFeedback::kNumber}, |
| 745 {Token::Value::SAR, isolate->factory()->NewStringFromAsciiChecked("2"), 1, | 745 {Token::Value::SAR, isolate->factory()->NewStringFromAsciiChecked("2"), 1, |
| 746 Handle<Smi>(Smi::FromInt(1), isolate), BinaryOperationFeedback::kAny}}; | 746 Handle<Smi>(Smi::FromInt(1), isolate), BinaryOperationFeedback::kAny}}; |
| 747 | 747 |
| 748 for (const BinaryOpExpectation& test_case : kTestCases) { | 748 for (const BinaryOpExpectation& test_case : kTestCases) { |
| 749 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1); | 749 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1); |
| 750 | 750 |
| 751 i::FeedbackVectorSpec feedback_spec(&zone); | 751 i::FeedbackVectorSpec feedback_spec(&zone); |
| 752 i::FeedbackVectorSlot slot0 = feedback_spec.AddInterpreterBinaryOpICSlot(); | 752 i::FeedbackVectorSlot slot0 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
| 753 | 753 |
| 754 Handle<i::TypeFeedbackVector> vector = | 754 Handle<i::TypeFeedbackVector> vector = |
| (...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1414 FeedbackVectorSlot slot = feedback_spec.AddInterpreterBinaryOpICSlot(); | 1414 FeedbackVectorSlot slot = feedback_spec.AddInterpreterBinaryOpICSlot(); |
| 1415 FeedbackVectorSlot slot1 = feedback_spec.AddInterpreterBinaryOpICSlot(); | 1415 FeedbackVectorSlot slot1 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
| 1416 FeedbackVectorSlot slot2 = feedback_spec.AddInterpreterBinaryOpICSlot(); | 1416 FeedbackVectorSlot slot2 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
| 1417 | 1417 |
| 1418 Handle<i::TypeFeedbackVector> vector = | 1418 Handle<i::TypeFeedbackVector> vector = |
| 1419 NewTypeFeedbackVector(isolate, &feedback_spec); | 1419 NewTypeFeedbackVector(isolate, &feedback_spec); |
| 1420 | 1420 |
| 1421 Register reg(0), scratch(1); | 1421 Register reg(0), scratch(1); |
| 1422 BytecodeLabel label[3]; | 1422 BytecodeLabel label[3]; |
| 1423 | 1423 |
| 1424 builder.LoadLiteral(Smi::kZero) | 1424 builder.LoadLiteral(Smi::FromInt(0)) |
| 1425 .StoreAccumulatorInRegister(reg) | 1425 .StoreAccumulatorInRegister(reg) |
| 1426 .Jump(&label[1]); | 1426 .Jump(&label[1]); |
| 1427 SetRegister(builder, reg, 1024, scratch).Bind(&label[0]); | 1427 SetRegister(builder, reg, 1024, scratch).Bind(&label[0]); |
| 1428 IncrementRegister(builder, reg, 1, scratch, vector->GetIndex(slot)) | 1428 IncrementRegister(builder, reg, 1, scratch, vector->GetIndex(slot)) |
| 1429 .Jump(&label[2]); | 1429 .Jump(&label[2]); |
| 1430 SetRegister(builder, reg, 2048, scratch).Bind(&label[1]); | 1430 SetRegister(builder, reg, 2048, scratch).Bind(&label[1]); |
| 1431 IncrementRegister(builder, reg, 2, scratch, vector->GetIndex(slot1)) | 1431 IncrementRegister(builder, reg, 2, scratch, vector->GetIndex(slot1)) |
| 1432 .JumpLoop(&label[0], 0); | 1432 .JumpLoop(&label[0], 0); |
| 1433 SetRegister(builder, reg, 4096, scratch).Bind(&label[2]); | 1433 SetRegister(builder, reg, 4096, scratch).Bind(&label[2]); |
| 1434 IncrementRegister(builder, reg, 4, scratch, vector->GetIndex(slot2)) | 1434 IncrementRegister(builder, reg, 4, scratch, vector->GetIndex(slot2)) |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1456 FeedbackVectorSlot slot3 = feedback_spec.AddInterpreterBinaryOpICSlot(); | 1456 FeedbackVectorSlot slot3 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
| 1457 FeedbackVectorSlot slot4 = feedback_spec.AddInterpreterBinaryOpICSlot(); | 1457 FeedbackVectorSlot slot4 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
| 1458 | 1458 |
| 1459 Handle<i::TypeFeedbackVector> vector = | 1459 Handle<i::TypeFeedbackVector> vector = |
| 1460 NewTypeFeedbackVector(isolate, &feedback_spec); | 1460 NewTypeFeedbackVector(isolate, &feedback_spec); |
| 1461 | 1461 |
| 1462 Register reg(0), scratch(1); | 1462 Register reg(0), scratch(1); |
| 1463 BytecodeLabel label[2]; | 1463 BytecodeLabel label[2]; |
| 1464 BytecodeLabel done, done1; | 1464 BytecodeLabel done, done1; |
| 1465 | 1465 |
| 1466 builder.LoadLiteral(Smi::kZero) | 1466 builder.LoadLiteral(Smi::FromInt(0)) |
| 1467 .StoreAccumulatorInRegister(reg) | 1467 .StoreAccumulatorInRegister(reg) |
| 1468 .LoadFalse() | 1468 .LoadFalse() |
| 1469 .JumpIfFalse(&label[0]); | 1469 .JumpIfFalse(&label[0]); |
| 1470 IncrementRegister(builder, reg, 1024, scratch, vector->GetIndex(slot)) | 1470 IncrementRegister(builder, reg, 1024, scratch, vector->GetIndex(slot)) |
| 1471 .Bind(&label[0]) | 1471 .Bind(&label[0]) |
| 1472 .LoadTrue() | 1472 .LoadTrue() |
| 1473 .JumpIfFalse(&done); | 1473 .JumpIfFalse(&done); |
| 1474 IncrementRegister(builder, reg, 1, scratch, vector->GetIndex(slot1)) | 1474 IncrementRegister(builder, reg, 1, scratch, vector->GetIndex(slot1)) |
| 1475 .LoadTrue() | 1475 .LoadTrue() |
| 1476 .JumpIfTrue(&label[1]); | 1476 .JumpIfTrue(&label[1]); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1506 FeedbackVectorSlot slot3 = feedback_spec.AddInterpreterBinaryOpICSlot(); | 1506 FeedbackVectorSlot slot3 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
| 1507 FeedbackVectorSlot slot4 = feedback_spec.AddInterpreterBinaryOpICSlot(); | 1507 FeedbackVectorSlot slot4 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
| 1508 | 1508 |
| 1509 Handle<i::TypeFeedbackVector> vector = | 1509 Handle<i::TypeFeedbackVector> vector = |
| 1510 NewTypeFeedbackVector(isolate, &feedback_spec); | 1510 NewTypeFeedbackVector(isolate, &feedback_spec); |
| 1511 | 1511 |
| 1512 Register reg(0), scratch(1); | 1512 Register reg(0), scratch(1); |
| 1513 BytecodeLabel label[2]; | 1513 BytecodeLabel label[2]; |
| 1514 BytecodeLabel done, done1; | 1514 BytecodeLabel done, done1; |
| 1515 | 1515 |
| 1516 builder.LoadLiteral(Smi::kZero) | 1516 builder.LoadLiteral(Smi::FromInt(0)) |
| 1517 .StoreAccumulatorInRegister(reg) | 1517 .StoreAccumulatorInRegister(reg) |
| 1518 .LoadFalse() | 1518 .LoadFalse() |
| 1519 .JumpIfFalse(&label[0]); | 1519 .JumpIfFalse(&label[0]); |
| 1520 IncrementRegister(builder, reg, 1024, scratch, vector->GetIndex(slot)) | 1520 IncrementRegister(builder, reg, 1024, scratch, vector->GetIndex(slot)) |
| 1521 .Bind(&label[0]) | 1521 .Bind(&label[0]) |
| 1522 .LoadTrue() | 1522 .LoadTrue() |
| 1523 .JumpIfFalse(&done); | 1523 .JumpIfFalse(&done); |
| 1524 IncrementRegister(builder, reg, 1, scratch, vector->GetIndex(slot1)) | 1524 IncrementRegister(builder, reg, 1, scratch, vector->GetIndex(slot1)) |
| 1525 .LoadTrue() | 1525 .LoadTrue() |
| 1526 .JumpIfTrue(&label[1]); | 1526 .JumpIfTrue(&label[1]); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1550 Zone zone(isolate->allocator()); | 1550 Zone zone(isolate->allocator()); |
| 1551 | 1551 |
| 1552 FeedbackVectorSpec feedback_spec(&zone); | 1552 FeedbackVectorSpec feedback_spec(&zone); |
| 1553 FeedbackVectorSlot slot = feedback_spec.AddInterpreterBinaryOpICSlot(); | 1553 FeedbackVectorSlot slot = feedback_spec.AddInterpreterBinaryOpICSlot(); |
| 1554 Handle<i::TypeFeedbackVector> vector = | 1554 Handle<i::TypeFeedbackVector> vector = |
| 1555 NewTypeFeedbackVector(isolate, &feedback_spec); | 1555 NewTypeFeedbackVector(isolate, &feedback_spec); |
| 1556 | 1556 |
| 1557 Register reg(0), scratch(256); | 1557 Register reg(0), scratch(256); |
| 1558 BytecodeLabel done, fake; | 1558 BytecodeLabel done, fake; |
| 1559 | 1559 |
| 1560 builder.LoadLiteral(Smi::kZero); | 1560 builder.LoadLiteral(Smi::FromInt(0)); |
| 1561 builder.StoreAccumulatorInRegister(reg); | 1561 builder.StoreAccumulatorInRegister(reg); |
| 1562 // Consume all 8-bit operands | 1562 // Consume all 8-bit operands |
| 1563 for (int i = 1; i <= 256; i++) { | 1563 for (int i = 1; i <= 256; i++) { |
| 1564 builder.LoadLiteral(isolate->factory()->NewNumber(i)); | 1564 builder.LoadLiteral(isolate->factory()->NewNumber(i)); |
| 1565 builder.BinaryOperation(Token::Value::ADD, reg, vector->GetIndex(slot)); | 1565 builder.BinaryOperation(Token::Value::ADD, reg, vector->GetIndex(slot)); |
| 1566 builder.StoreAccumulatorInRegister(reg); | 1566 builder.StoreAccumulatorInRegister(reg); |
| 1567 } | 1567 } |
| 1568 builder.Jump(&done); | 1568 builder.Jump(&done); |
| 1569 | 1569 |
| 1570 // Emit more than 16-bit immediate operands worth of code to jump over. | 1570 // Emit more than 16-bit immediate operands worth of code to jump over. |
| 1571 builder.Bind(&fake); | 1571 builder.Bind(&fake); |
| 1572 for (int i = 0; i < 6600; i++) { | 1572 for (int i = 0; i < 6600; i++) { |
| 1573 builder.LoadLiteral(Smi::kZero); // 1-byte | 1573 builder.LoadLiteral(Smi::FromInt(0)); // 1-byte |
| 1574 builder.BinaryOperation(Token::Value::ADD, scratch, | 1574 builder.BinaryOperation(Token::Value::ADD, scratch, |
| 1575 vector->GetIndex(slot)); // 6-bytes | 1575 vector->GetIndex(slot)); // 6-bytes |
| 1576 builder.StoreAccumulatorInRegister(scratch); // 4-bytes | 1576 builder.StoreAccumulatorInRegister(scratch); // 4-bytes |
| 1577 builder.MoveRegister(scratch, reg); // 6-bytes | 1577 builder.MoveRegister(scratch, reg); // 6-bytes |
| 1578 } | 1578 } |
| 1579 builder.Bind(&done); | 1579 builder.Bind(&done); |
| 1580 builder.LoadAccumulatorWithRegister(reg); | 1580 builder.LoadAccumulatorWithRegister(reg); |
| 1581 builder.Return(); | 1581 builder.Return(); |
| 1582 | 1582 |
| 1583 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); | 1583 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1600 CHECK_EQ(Smi::cast(*return_value)->value(), 256.0 / 2 * (1 + 256)); | 1600 CHECK_EQ(Smi::cast(*return_value)->value(), 256.0 / 2 * (1 + 256)); |
| 1601 } | 1601 } |
| 1602 | 1602 |
| 1603 TEST(InterpreterJumpWith32BitOperand) { | 1603 TEST(InterpreterJumpWith32BitOperand) { |
| 1604 HandleAndZoneScope handles; | 1604 HandleAndZoneScope handles; |
| 1605 Isolate* isolate = handles.main_isolate(); | 1605 Isolate* isolate = handles.main_isolate(); |
| 1606 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1); | 1606 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1); |
| 1607 Register reg(0); | 1607 Register reg(0); |
| 1608 BytecodeLabel done; | 1608 BytecodeLabel done; |
| 1609 | 1609 |
| 1610 builder.LoadLiteral(Smi::kZero); | 1610 builder.LoadLiteral(Smi::FromInt(0)); |
| 1611 builder.StoreAccumulatorInRegister(reg); | 1611 builder.StoreAccumulatorInRegister(reg); |
| 1612 // Consume all 16-bit constant pool entries | 1612 // Consume all 16-bit constant pool entries |
| 1613 for (int i = 1; i <= 65536; i++) { | 1613 for (int i = 1; i <= 65536; i++) { |
| 1614 builder.LoadLiteral(isolate->factory()->NewNumber(i)); | 1614 builder.LoadLiteral(isolate->factory()->NewNumber(i)); |
| 1615 } | 1615 } |
| 1616 builder.Jump(&done); | 1616 builder.Jump(&done); |
| 1617 builder.LoadLiteral(Smi::kZero); | 1617 builder.LoadLiteral(Smi::FromInt(0)); |
| 1618 builder.Bind(&done); | 1618 builder.Bind(&done); |
| 1619 builder.Return(); | 1619 builder.Return(); |
| 1620 | 1620 |
| 1621 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); | 1621 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); |
| 1622 BytecodeArrayIterator iterator(bytecode_array); | 1622 BytecodeArrayIterator iterator(bytecode_array); |
| 1623 | 1623 |
| 1624 bool found_32bit_jump = false; | 1624 bool found_32bit_jump = false; |
| 1625 while (!iterator.done()) { | 1625 while (!iterator.done()) { |
| 1626 if (iterator.current_bytecode() == Bytecode::kJump && | 1626 if (iterator.current_bytecode() == Bytecode::kJump && |
| 1627 iterator.current_operand_scale() == OperandScale::kQuadruple) { | 1627 iterator.current_operand_scale() == OperandScale::kQuadruple) { |
| (...skipping 680 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2308 "function " + | 2308 "function " + |
| 2309 InterpreterTester::function_name() + | 2309 InterpreterTester::function_name() + |
| 2310 "() {\n" | 2310 "() {\n" |
| 2311 " var c = new counter();\n" | 2311 " var c = new counter();\n" |
| 2312 " return c.count;\n" | 2312 " return c.count;\n" |
| 2313 "}"); | 2313 "}"); |
| 2314 InterpreterTester tester(isolate, source.c_str()); | 2314 InterpreterTester tester(isolate, source.c_str()); |
| 2315 auto callable = tester.GetCallable<>(); | 2315 auto callable = tester.GetCallable<>(); |
| 2316 | 2316 |
| 2317 Handle<Object> return_val = callable().ToHandleChecked(); | 2317 Handle<Object> return_val = callable().ToHandleChecked(); |
| 2318 CHECK_EQ(Smi::cast(*return_val), Smi::kZero); | 2318 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0)); |
| 2319 } | 2319 } |
| 2320 | 2320 |
| 2321 | 2321 |
| 2322 TEST(InterpreterConstructWithArgument) { | 2322 TEST(InterpreterConstructWithArgument) { |
| 2323 HandleAndZoneScope handles; | 2323 HandleAndZoneScope handles; |
| 2324 Isolate* isolate = handles.main_isolate(); | 2324 Isolate* isolate = handles.main_isolate(); |
| 2325 | 2325 |
| 2326 std::string source( | 2326 std::string source( |
| 2327 "function counter(arg0) { this.count = 17; this.x = arg0; }\n" | 2327 "function counter(arg0) { this.count = 17; this.x = arg0; }\n" |
| 2328 "function " + | 2328 "function " + |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2521 | 2521 |
| 2522 TEST(InterpreterLogicalAnd) { | 2522 TEST(InterpreterLogicalAnd) { |
| 2523 HandleAndZoneScope handles; | 2523 HandleAndZoneScope handles; |
| 2524 Isolate* isolate = handles.main_isolate(); | 2524 Isolate* isolate = handles.main_isolate(); |
| 2525 Factory* factory = isolate->factory(); | 2525 Factory* factory = isolate->factory(); |
| 2526 | 2526 |
| 2527 std::pair<const char*, Handle<Object>> literals[] = { | 2527 std::pair<const char*, Handle<Object>> literals[] = { |
| 2528 std::make_pair("var a, b = 10; return a && b;\n", | 2528 std::make_pair("var a, b = 10; return a && b;\n", |
| 2529 factory->undefined_value()), | 2529 factory->undefined_value()), |
| 2530 std::make_pair("var a = 0, b = 10; return a && b / a;\n", | 2530 std::make_pair("var a = 0, b = 10; return a && b / a;\n", |
| 2531 handle(Smi::kZero, isolate)), | 2531 handle(Smi::FromInt(0), isolate)), |
| 2532 std::make_pair("var a = '0', b = 10; return a && b;\n", | 2532 std::make_pair("var a = '0', b = 10; return a && b;\n", |
| 2533 handle(Smi::FromInt(10), isolate)), | 2533 handle(Smi::FromInt(10), isolate)), |
| 2534 std::make_pair("return 0.0 && 3.2;\n", handle(Smi::kZero, isolate)), | 2534 std::make_pair("return 0.0 && 3.2;\n", handle(Smi::FromInt(0), isolate)), |
| 2535 std::make_pair("return 'a' && 'b';\n", | 2535 std::make_pair("return 'a' && 'b';\n", |
| 2536 factory->NewStringFromStaticChars("b")), | 2536 factory->NewStringFromStaticChars("b")), |
| 2537 std::make_pair("return 'a' && 0 || 'b', 'c';\n", | 2537 std::make_pair("return 'a' && 0 || 'b', 'c';\n", |
| 2538 factory->NewStringFromStaticChars("c")), | 2538 factory->NewStringFromStaticChars("c")), |
| 2539 std::make_pair("var x = 1, y = 3; return x && 0 + 1 || y;\n", | 2539 std::make_pair("var x = 1, y = 3; return x && 0 + 1 || y;\n", |
| 2540 handle(Smi::FromInt(1), isolate)), | 2540 handle(Smi::FromInt(1), isolate)), |
| 2541 std::make_pair("var x = 1, y = 3; return (x == 1) && (3 == 3) || y;\n", | 2541 std::make_pair("var x = 1, y = 3; return (x == 1) && (3 == 3) || y;\n", |
| 2542 factory->true_value())}; | 2542 factory->true_value())}; |
| 2543 | 2543 |
| 2544 for (size_t i = 0; i < arraysize(literals); i++) { | 2544 for (size_t i = 0; i < arraysize(literals); i++) { |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2676 | 2676 |
| 2677 std::pair<const char*, Handle<Object>> count_ops[] = { | 2677 std::pair<const char*, Handle<Object>> count_ops[] = { |
| 2678 std::make_pair("var a = 1; return ++a;", | 2678 std::make_pair("var a = 1; return ++a;", |
| 2679 handle(Smi::FromInt(2), isolate)), | 2679 handle(Smi::FromInt(2), isolate)), |
| 2680 std::make_pair("var a = 1; return a++;", | 2680 std::make_pair("var a = 1; return a++;", |
| 2681 handle(Smi::FromInt(1), isolate)), | 2681 handle(Smi::FromInt(1), isolate)), |
| 2682 std::make_pair("var a = 5; return --a;", | 2682 std::make_pair("var a = 5; return --a;", |
| 2683 handle(Smi::FromInt(4), isolate)), | 2683 handle(Smi::FromInt(4), isolate)), |
| 2684 std::make_pair("var a = 5; return a--;", | 2684 std::make_pair("var a = 5; return a--;", |
| 2685 handle(Smi::FromInt(5), isolate)), | 2685 handle(Smi::FromInt(5), isolate)), |
| 2686 std::make_pair("var a = 5.2; return --a;", factory->NewHeapNumber(4.2)), | 2686 std::make_pair("var a = 5.2; return --a;", |
| 2687 std::make_pair("var a = 'string'; return ++a;", factory->nan_value()), | 2687 factory->NewHeapNumber(4.2)), |
| 2688 std::make_pair("var a = 'string'; return a--;", factory->nan_value()), | 2688 std::make_pair("var a = 'string'; return ++a;", |
| 2689 factory->nan_value()), |
| 2690 std::make_pair("var a = 'string'; return a--;", |
| 2691 factory->nan_value()), |
| 2689 std::make_pair("var a = true; return ++a;", | 2692 std::make_pair("var a = true; return ++a;", |
| 2690 handle(Smi::FromInt(2), isolate)), | 2693 handle(Smi::FromInt(2), isolate)), |
| 2691 std::make_pair("var a = false; return a--;", handle(Smi::kZero, isolate)), | 2694 std::make_pair("var a = false; return a--;", |
| 2695 handle(Smi::FromInt(0), isolate)), |
| 2692 std::make_pair("var a = { val: 11 }; return ++a.val;", | 2696 std::make_pair("var a = { val: 11 }; return ++a.val;", |
| 2693 handle(Smi::FromInt(12), isolate)), | 2697 handle(Smi::FromInt(12), isolate)), |
| 2694 std::make_pair("var a = { val: 11 }; return a.val--;", | 2698 std::make_pair("var a = { val: 11 }; return a.val--;", |
| 2695 handle(Smi::FromInt(11), isolate)), | 2699 handle(Smi::FromInt(11), isolate)), |
| 2696 std::make_pair("var a = { val: 11 }; return ++a.val;", | 2700 std::make_pair("var a = { val: 11 }; return ++a.val;", |
| 2697 handle(Smi::FromInt(12), isolate)), | 2701 handle(Smi::FromInt(12), isolate)), |
| 2698 std::make_pair("var name = 'val'; var a = { val: 22 }; return --a[name];", | 2702 std::make_pair("var name = 'val'; var a = { val: 22 }; return --a[name];", |
| 2699 handle(Smi::FromInt(21), isolate)), | 2703 handle(Smi::FromInt(21), isolate)), |
| 2700 std::make_pair("var name = 'val'; var a = { val: 22 }; return a[name]++;", | 2704 std::make_pair("var name = 'val'; var a = { val: 22 }; return a[name]++;", |
| 2701 handle(Smi::FromInt(22), isolate)), | 2705 handle(Smi::FromInt(22), isolate)), |
| 2702 std::make_pair("var a = 1; (function() { a = 2 })(); return ++a;", | 2706 std::make_pair("var a = 1; (function() { a = 2 })(); return ++a;", |
| 2703 handle(Smi::FromInt(3), isolate)), | 2707 handle(Smi::FromInt(3), isolate)), |
| 2704 std::make_pair("var a = 1; (function() { a = 2 })(); return a--;", | 2708 std::make_pair("var a = 1; (function() { a = 2 })(); return a--;", |
| 2705 handle(Smi::FromInt(2), isolate)), | 2709 handle(Smi::FromInt(2), isolate)), |
| 2706 std::make_pair("var i = 5; while(i--) {}; return i;", | 2710 std::make_pair("var i = 5; while(i--) {}; return i;", |
| 2707 handle(Smi::FromInt(-1), isolate)), | 2711 handle(Smi::FromInt(-1), isolate)), |
| 2708 std::make_pair("var i = 1; if(i--) { return 1; } else { return 2; };", | 2712 std::make_pair("var i = 1; if(i--) { return 1; } else { return 2; };", |
| 2709 handle(Smi::FromInt(1), isolate)), | 2713 handle(Smi::FromInt(1), isolate)), |
| 2710 std::make_pair("var i = -2; do {} while(i++) {}; return i;", | 2714 std::make_pair("var i = -2; do {} while(i++) {}; return i;", |
| 2711 handle(Smi::FromInt(1), isolate)), | 2715 handle(Smi::FromInt(1), isolate)), |
| 2712 std::make_pair("var i = -1; for(; i++; ) {}; return i", | 2716 std::make_pair("var i = -1; for(; i++; ) {}; return i", |
| 2713 handle(Smi::FromInt(1), isolate)), | 2717 handle(Smi::FromInt(1), isolate)), |
| 2714 std::make_pair("var i = 20; switch(i++) {\n" | 2718 std::make_pair("var i = 20; switch(i++) {\n" |
| 2715 " case 20: return 1;\n" | 2719 " case 20: return 1;\n" |
| 2716 " default: return 2;\n" | 2720 " default: return 2;\n" |
| 2717 "}", | 2721 "}", |
| 2718 handle(Smi::FromInt(1), isolate)), | 2722 handle(Smi::FromInt(1), isolate)), |
| 2719 }; | 2723 }; |
| 2720 | 2724 |
| 2721 for (size_t i = 0; i < arraysize(count_ops); i++) { | 2725 for (size_t i = 0; i < arraysize(count_ops); i++) { |
| 2722 std::string source(InterpreterTester::SourceForBody(count_ops[i].first)); | 2726 std::string source(InterpreterTester::SourceForBody(count_ops[i].first)); |
| 2723 InterpreterTester tester(isolate, source.c_str()); | 2727 InterpreterTester tester(isolate, source.c_str()); |
| (...skipping 1160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3884 HandleAndZoneScope handles; | 3888 HandleAndZoneScope handles; |
| 3885 Isolate* isolate = handles.main_isolate(); | 3889 Isolate* isolate = handles.main_isolate(); |
| 3886 | 3890 |
| 3887 const char* inner_function_prologue = "function inner() {"; | 3891 const char* inner_function_prologue = "function inner() {"; |
| 3888 const char* inner_function_epilogue = "};"; | 3892 const char* inner_function_epilogue = "};"; |
| 3889 const char* outer_function_epilogue = "return inner();"; | 3893 const char* outer_function_epilogue = "return inner();"; |
| 3890 | 3894 |
| 3891 std::tuple<const char*, const char*, Handle<Object>> lookup_slot[] = { | 3895 std::tuple<const char*, const char*, Handle<Object>> lookup_slot[] = { |
| 3892 // Eval in inner context. | 3896 // Eval in inner context. |
| 3893 std::make_tuple("var x = 0;", "eval(''); return x;", | 3897 std::make_tuple("var x = 0;", "eval(''); return x;", |
| 3894 handle(Smi::kZero, isolate)), | 3898 handle(Smi::FromInt(0), isolate)), |
| 3895 std::make_tuple("var x = 0;", "eval('var x = 1'); return x;", | 3899 std::make_tuple("var x = 0;", "eval('var x = 1'); return x;", |
| 3896 handle(Smi::FromInt(1), isolate)), | 3900 handle(Smi::FromInt(1), isolate)), |
| 3897 std::make_tuple("var x = 0;", | 3901 std::make_tuple("var x = 0;", |
| 3898 "'use strict'; eval('var x = 1'); return x;", | 3902 "'use strict'; eval('var x = 1'); return x;", |
| 3899 handle(Smi::kZero, isolate)), | 3903 handle(Smi::FromInt(0), isolate)), |
| 3900 // Eval in outer context. | 3904 // Eval in outer context. |
| 3901 std::make_tuple("var x = 0; eval('');", "return x;", | 3905 std::make_tuple("var x = 0; eval('');", "return x;", |
| 3902 handle(Smi::kZero, isolate)), | 3906 handle(Smi::FromInt(0), isolate)), |
| 3903 std::make_tuple("var x = 0; eval('var x = 1');", "return x;", | 3907 std::make_tuple("var x = 0; eval('var x = 1');", "return x;", |
| 3904 handle(Smi::FromInt(1), isolate)), | 3908 handle(Smi::FromInt(1), isolate)), |
| 3905 std::make_tuple("'use strict'; var x = 0; eval('var x = 1');", | 3909 std::make_tuple("'use strict'; var x = 0; eval('var x = 1');", |
| 3906 "return x;", handle(Smi::kZero, isolate)), | 3910 "return x;", handle(Smi::FromInt(0), isolate)), |
| 3907 }; | 3911 }; |
| 3908 | 3912 |
| 3909 for (size_t i = 0; i < arraysize(lookup_slot); i++) { | 3913 for (size_t i = 0; i < arraysize(lookup_slot); i++) { |
| 3910 std::string body = std::string(std::get<0>(lookup_slot[i])) + | 3914 std::string body = std::string(std::get<0>(lookup_slot[i])) + |
| 3911 std::string(inner_function_prologue) + | 3915 std::string(inner_function_prologue) + |
| 3912 std::string(std::get<1>(lookup_slot[i])) + | 3916 std::string(std::get<1>(lookup_slot[i])) + |
| 3913 std::string(inner_function_epilogue) + | 3917 std::string(inner_function_epilogue) + |
| 3914 std::string(outer_function_epilogue); | 3918 std::string(outer_function_epilogue); |
| 3915 std::string script = InterpreterTester::SourceForBody(body.c_str()); | 3919 std::string script = InterpreterTester::SourceForBody(body.c_str()); |
| 3916 | 3920 |
| 3917 InterpreterTester tester(isolate, script.c_str()); | 3921 InterpreterTester tester(isolate, script.c_str()); |
| 3918 auto callable = tester.GetCallable<>(); | 3922 auto callable = tester.GetCallable<>(); |
| 3919 | 3923 |
| 3920 Handle<i::Object> return_value = callable().ToHandleChecked(); | 3924 Handle<i::Object> return_value = callable().ToHandleChecked(); |
| 3921 CHECK(return_value->SameValue(*std::get<2>(lookup_slot[i]))); | 3925 CHECK(return_value->SameValue(*std::get<2>(lookup_slot[i]))); |
| 3922 } | 3926 } |
| 3923 } | 3927 } |
| 3924 | 3928 |
| 3925 TEST(InterpreterLookupGlobalSlot) { | 3929 TEST(InterpreterLookupGlobalSlot) { |
| 3926 HandleAndZoneScope handles; | 3930 HandleAndZoneScope handles; |
| 3927 Isolate* isolate = handles.main_isolate(); | 3931 Isolate* isolate = handles.main_isolate(); |
| 3928 | 3932 |
| 3929 const char* inner_function_prologue = "function inner() {"; | 3933 const char* inner_function_prologue = "function inner() {"; |
| 3930 const char* inner_function_epilogue = "};"; | 3934 const char* inner_function_epilogue = "};"; |
| 3931 const char* outer_function_epilogue = "return inner();"; | 3935 const char* outer_function_epilogue = "return inner();"; |
| 3932 | 3936 |
| 3933 std::tuple<const char*, const char*, Handle<Object>> lookup_slot[] = { | 3937 std::tuple<const char*, const char*, Handle<Object>> lookup_slot[] = { |
| 3934 // Eval in inner context. | 3938 // Eval in inner context. |
| 3935 std::make_tuple("x = 0;", "eval(''); return x;", | 3939 std::make_tuple("x = 0;", "eval(''); return x;", |
| 3936 handle(Smi::kZero, isolate)), | 3940 handle(Smi::FromInt(0), isolate)), |
| 3937 std::make_tuple("x = 0;", "eval('var x = 1'); return x;", | 3941 std::make_tuple("x = 0;", "eval('var x = 1'); return x;", |
| 3938 handle(Smi::FromInt(1), isolate)), | 3942 handle(Smi::FromInt(1), isolate)), |
| 3939 std::make_tuple("x = 0;", "'use strict'; eval('var x = 1'); return x;", | 3943 std::make_tuple("x = 0;", "'use strict'; eval('var x = 1'); return x;", |
| 3940 handle(Smi::kZero, isolate)), | 3944 handle(Smi::FromInt(0), isolate)), |
| 3941 // Eval in outer context. | 3945 // Eval in outer context. |
| 3942 std::make_tuple("x = 0; eval('');", "return x;", | 3946 std::make_tuple("x = 0; eval('');", "return x;", |
| 3943 handle(Smi::kZero, isolate)), | 3947 handle(Smi::FromInt(0), isolate)), |
| 3944 std::make_tuple("x = 0; eval('var x = 1');", "return x;", | 3948 std::make_tuple("x = 0; eval('var x = 1');", "return x;", |
| 3945 handle(Smi::FromInt(1), isolate)), | 3949 handle(Smi::FromInt(1), isolate)), |
| 3946 std::make_tuple("'use strict'; x = 0; eval('var x = 1');", "return x;", | 3950 std::make_tuple("'use strict'; x = 0; eval('var x = 1');", "return x;", |
| 3947 handle(Smi::kZero, isolate)), | 3951 handle(Smi::FromInt(0), isolate)), |
| 3948 }; | 3952 }; |
| 3949 | 3953 |
| 3950 for (size_t i = 0; i < arraysize(lookup_slot); i++) { | 3954 for (size_t i = 0; i < arraysize(lookup_slot); i++) { |
| 3951 std::string body = std::string(std::get<0>(lookup_slot[i])) + | 3955 std::string body = std::string(std::get<0>(lookup_slot[i])) + |
| 3952 std::string(inner_function_prologue) + | 3956 std::string(inner_function_prologue) + |
| 3953 std::string(std::get<1>(lookup_slot[i])) + | 3957 std::string(std::get<1>(lookup_slot[i])) + |
| 3954 std::string(inner_function_epilogue) + | 3958 std::string(inner_function_epilogue) + |
| 3955 std::string(outer_function_epilogue); | 3959 std::string(outer_function_epilogue); |
| 3956 std::string script = InterpreterTester::SourceForBody(body.c_str()); | 3960 std::string script = InterpreterTester::SourceForBody(body.c_str()); |
| 3957 | 3961 |
| (...skipping 863 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4821 auto callable = tester.GetCallable<>(); | 4825 auto callable = tester.GetCallable<>(); |
| 4822 | 4826 |
| 4823 Handle<i::Object> return_value = callable().ToHandleChecked(); | 4827 Handle<i::Object> return_value = callable().ToHandleChecked(); |
| 4824 CHECK(return_value->SameValue(*tests[i].second)); | 4828 CHECK(return_value->SameValue(*tests[i].second)); |
| 4825 } | 4829 } |
| 4826 } | 4830 } |
| 4827 | 4831 |
| 4828 } // namespace interpreter | 4832 } // namespace interpreter |
| 4829 } // namespace internal | 4833 } // namespace internal |
| 4830 } // namespace v8 | 4834 } // namespace v8 |
| OLD | NEW |