Chromium Code Reviews| 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 1619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1630 "function " + InterpreterTester::function_name() + "(a) {\n" | 1630 "function " + InterpreterTester::function_name() + "(a) {\n" |
| 1631 " return (function(x){ return x + 2; })(a);\n" | 1631 " return (function(x){ return x + 2; })(a);\n" |
| 1632 "}"); | 1632 "}"); |
| 1633 InterpreterTester tester(handles.main_isolate(), source.c_str()); | 1633 InterpreterTester tester(handles.main_isolate(), source.c_str()); |
| 1634 auto callable = tester.GetCallable<Handle<Object>>(); | 1634 auto callable = tester.GetCallable<Handle<Object>>(); |
| 1635 | 1635 |
| 1636 Handle<i::Object> return_val = callable( | 1636 Handle<i::Object> return_val = callable( |
| 1637 Handle<Smi>(Smi::FromInt(3), handles.main_isolate())).ToHandleChecked(); | 1637 Handle<Smi>(Smi::FromInt(3), handles.main_isolate())).ToHandleChecked(); |
| 1638 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(5)); | 1638 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(5)); |
| 1639 } | 1639 } |
| 1640 | |
| 1641 | |
| 1642 TEST(InterpreterCommaSmi) { | |
|
rmcilroy
2015/10/13 15:43:24
I'm not sure these are really useful tests (also t
mythria
2015/10/14 13:33:42
Done.
| |
| 1643 HandleAndZoneScope handles; | |
| 1644 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | |
| 1645 Register reg(0); | |
| 1646 i::Factory* factory = handles.main_isolate()->factory(); | |
| 1647 builder.set_locals_count(1); | |
| 1648 builder.set_parameter_count(0); | |
| 1649 | |
| 1650 builder.LoadLiteral(Smi::FromInt(10)) | |
| 1651 .StoreAccumulatorInRegister(reg) | |
| 1652 .LoadLiteral(Smi::FromInt(300)) | |
| 1653 .Return(); | |
| 1654 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | |
| 1655 | |
| 1656 InterpreterTester tester(handles.main_isolate(), bytecode_array); | |
| 1657 auto callable = tester.GetCallable<>(); | |
| 1658 Handle<Object> return_value = callable().ToHandleChecked(); | |
| 1659 Handle<Object> expected_value = factory->NewNumber(300); | |
| 1660 CHECK(return_value->SameValue(*expected_value)); | |
| 1661 } | |
| 1662 | |
| 1663 | |
| 1664 TEST(InterpreterCommaHeapNumber) { | |
| 1665 double lhs_inputs[] = {32.73, 56e-12}; | |
| 1666 double rhs_inputs[] = {8.3e-27, 32.73}; | |
| 1667 for (size_t l = 0; l < arraysize(lhs_inputs); l++) { | |
| 1668 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { | |
| 1669 HandleAndZoneScope handles; | |
| 1670 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | |
| 1671 Register reg(0); | |
| 1672 i::Factory* factory = handles.main_isolate()->factory(); | |
| 1673 builder.set_locals_count(1); | |
| 1674 builder.set_parameter_count(0); | |
| 1675 | |
| 1676 builder.LoadLiteral(factory->NewNumber(lhs_inputs[l])) | |
| 1677 .StoreAccumulatorInRegister(reg) | |
| 1678 .LoadLiteral(factory->NewNumber(rhs_inputs[r])) | |
| 1679 .Return(); | |
| 1680 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | |
| 1681 | |
| 1682 InterpreterTester tester(handles.main_isolate(), bytecode_array); | |
| 1683 auto callable = tester.GetCallable<>(); | |
| 1684 Handle<Object> return_value = callable().ToHandleChecked(); | |
| 1685 Handle<Object> expected_value = factory->NewNumber(rhs_inputs[r]); | |
| 1686 CHECK(return_value->SameValue(*expected_value)); | |
| 1687 } | |
| 1688 } | |
| 1689 } | |
| 1690 | |
| 1691 | |
| 1692 TEST(InterpreterCommaString) { | |
| 1693 HandleAndZoneScope handles; | |
| 1694 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | |
| 1695 Register reg(0); | |
| 1696 i::Factory* factory = handles.main_isolate()->factory(); | |
| 1697 builder.set_locals_count(1); | |
| 1698 builder.set_parameter_count(0); | |
| 1699 | |
| 1700 builder.LoadLiteral(factory->NewNumber(20.34)) | |
| 1701 .StoreAccumulatorInRegister(reg) | |
| 1702 .LoadLiteral(factory->NewStringFromAsciiChecked("abc")) | |
| 1703 .Return(); | |
| 1704 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | |
| 1705 | |
| 1706 InterpreterTester tester(handles.main_isolate(), bytecode_array); | |
| 1707 auto callable = tester.GetCallable<>(); | |
| 1708 Handle<Object> return_value = callable().ToHandleChecked(); | |
| 1709 Handle<Object> expected_value = factory->NewStringFromAsciiChecked("abc"); | |
| 1710 CHECK(return_value->SameValue(*expected_value)); | |
| 1711 } | |
| 1712 | |
| 1713 | |
| 1714 TEST(InterpreterLogicalOr) { | |
| 1715 int lhs_inputs[] = {0, 1, 12, -345}; | |
| 1716 int rhs_inputs[] = {12, 0, -456, 1}; | |
| 1717 for (size_t l = 0; l < arraysize(lhs_inputs); l++) { | |
| 1718 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { | |
| 1719 HandleAndZoneScope handles; | |
| 1720 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | |
| 1721 builder.set_locals_count(1); | |
| 1722 builder.set_parameter_count(0); | |
| 1723 Register reg(0); | |
| 1724 BytecodeLabel label[2]; | |
| 1725 | |
| 1726 builder.LoadLiteral(Smi::FromInt(lhs_inputs[l])) | |
| 1727 .StoreAccumulatorInRegister(reg) | |
| 1728 .CastAccumulatorToBoolean() | |
| 1729 .JumpIfFalse(&label[0]) | |
| 1730 .LoadAccumulatorWithRegister(reg) | |
| 1731 .Jump(&label[1]) | |
| 1732 .Bind(&label[0]) | |
| 1733 .LoadLiteral(Smi::FromInt(rhs_inputs[r])) | |
| 1734 .Bind(&label[1]) | |
| 1735 .Return(); | |
| 1736 | |
| 1737 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | |
| 1738 InterpreterTester tester(handles.main_isolate(), bytecode_array); | |
| 1739 auto callable = tester.GetCallable<>(); | |
| 1740 Handle<Object> return_value = callable().ToHandleChecked(); | |
| 1741 int expected_value = lhs_inputs[l]; | |
| 1742 if (!lhs_inputs[l]) expected_value = rhs_inputs[r]; | |
| 1743 CHECK_EQ(Smi::cast(*return_value)->value(), expected_value); | |
| 1744 } | |
| 1745 } | |
| 1746 } | |
| 1747 | |
| 1748 | |
| 1749 TEST(InterpreterLogicalAnd) { | |
| 1750 int lhs_inputs[] = {0, 1, 12, -345}; | |
| 1751 int rhs_inputs[] = {12, 0, -456, 1}; | |
| 1752 for (size_t l = 0; l < arraysize(lhs_inputs); l++) { | |
| 1753 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { | |
| 1754 HandleAndZoneScope handles; | |
| 1755 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | |
| 1756 builder.set_locals_count(1); | |
| 1757 builder.set_parameter_count(0); | |
| 1758 Register reg(0); | |
| 1759 BytecodeLabel label[2]; | |
| 1760 | |
| 1761 builder.LoadLiteral(Smi::FromInt(lhs_inputs[l])) | |
| 1762 .StoreAccumulatorInRegister(reg) | |
| 1763 .CastAccumulatorToBoolean() | |
| 1764 .JumpIfTrue(&label[0]) | |
| 1765 .LoadAccumulatorWithRegister(reg) | |
| 1766 .Jump(&label[1]) | |
| 1767 .Bind(&label[0]) | |
| 1768 .LoadLiteral(Smi::FromInt(rhs_inputs[r])) | |
| 1769 .Bind(&label[1]) | |
| 1770 .Return(); | |
| 1771 | |
| 1772 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | |
| 1773 InterpreterTester tester(handles.main_isolate(), bytecode_array); | |
| 1774 auto callable = tester.GetCallable<>(); | |
| 1775 Handle<Object> return_value = callable().ToHandleChecked(); | |
| 1776 int expected_value = lhs_inputs[l]; | |
| 1777 if (lhs_inputs[l]) expected_value = rhs_inputs[r]; | |
| 1778 CHECK_EQ(Smi::cast(*return_value)->value(), expected_value); | |
| 1779 } | |
| 1780 } | |
| 1781 } | |
| OLD | NEW |