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/compiler.h" | 7 #include "src/compiler.h" |
8 #include "src/interpreter/bytecode-array-iterator.h" | 8 #include "src/interpreter/bytecode-array-iterator.h" |
9 #include "src/interpreter/bytecode-generator.h" | 9 #include "src/interpreter/bytecode-generator.h" |
10 #include "src/interpreter/interpreter.h" | 10 #include "src/interpreter/interpreter.h" |
(...skipping 1236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1247 TEST(IfConditions) { | 1247 TEST(IfConditions) { |
1248 InitializedHandleScope handle_scope; | 1248 InitializedHandleScope handle_scope; |
1249 BytecodeGeneratorHelper helper; | 1249 BytecodeGeneratorHelper helper; |
1250 | 1250 |
1251 Handle<Object> unused = helper.factory()->undefined_value(); | 1251 Handle<Object> unused = helper.factory()->undefined_value(); |
1252 | 1252 |
1253 ExpectedSnippet<Handle<Object>> snippets[] = { | 1253 ExpectedSnippet<Handle<Object>> snippets[] = { |
1254 {"function f() { if (0) { return 1; } else { return -1; } } f()", | 1254 {"function f() { if (0) { return 1; } else { return -1; } } f()", |
1255 0, | 1255 0, |
1256 1, | 1256 1, |
1257 14, | 1257 5, |
1258 {B(LdaZero), // | 1258 {B(LdaSmi8), U8(-1), // |
1259 B(ToBoolean), // | 1259 B(Return), // |
1260 B(JumpIfFalse), U8(7), // | 1260 B(LdaUndefined), // TODO(mythria) redundant return statement |
1261 B(LdaSmi8), U8(1), // | 1261 B(Return)}, // could be eliminated. |
1262 B(Return), // | |
1263 B(Jump), U8(5), // | |
1264 B(LdaSmi8), U8(-1), // | |
1265 B(Return), // | |
1266 B(LdaUndefined), // | |
1267 B(Return)}, // | |
1268 0, | 1262 0, |
1269 {unused, unused, unused, unused, unused, unused}}, | 1263 {unused, unused, unused, unused, unused, unused}}, |
1270 {"function f() { if ('lucky') { return 1; } else { return -1; } } f();", | 1264 {"function f() { if ('lucky') { return 1; } else { return -1; } } f();", |
1271 0, | 1265 0, |
1272 1, | 1266 1, |
1273 15, | 1267 5, |
1274 {B(LdaConstant), U8(0), // | 1268 {B(LdaSmi8), U8(1), // |
1275 B(ToBoolean), // | 1269 B(Return), // |
1276 B(JumpIfFalse), U8(7), // | 1270 B(LdaUndefined), // TODO(mythria) redundant return statement |
1277 B(LdaSmi8), U8(1), // | 1271 B(Return)}, // could be eliminated. |
1278 B(Return), // | 1272 0, |
1279 B(Jump), U8(5), // | 1273 {unused, unused, unused, unused, unused, unused}}, |
1280 B(LdaSmi8), U8(-1), // | |
1281 B(Return), // | |
1282 B(LdaUndefined), // | |
1283 B(Return)}, // | |
1284 1, | |
1285 {helper.factory()->NewStringFromStaticChars("lucky"), unused, unused, | |
1286 unused, unused, unused}}, | |
1287 {"function f() { if (false) { return 1; } else { return -1; } } f();", | 1274 {"function f() { if (false) { return 1; } else { return -1; } } f();", |
1288 0, | 1275 0, |
1289 1, | 1276 1, |
1290 13, | 1277 5, |
1291 {B(LdaFalse), // | 1278 {B(LdaSmi8), U8(-1), // |
1292 B(JumpIfFalse), U8(7), // | 1279 B(Return), // |
1293 B(LdaSmi8), U8(1), // | 1280 B(LdaUndefined), // TODO(mythria) redundant return statement |
1294 B(Return), // | 1281 B(Return)}, // could be eliminated. |
1295 B(Jump), U8(5), // | 1282 0, |
1296 B(LdaSmi8), U8(-1), // | 1283 {unused, unused, unused, unused, unused, unused}}, |
1297 B(Return), // | 1284 {"function f() { if (false) { return 1; } } f();", |
1298 B(LdaUndefined), // | 1285 0, |
1299 B(Return)}, // | 1286 1, |
| 1287 2, |
| 1288 {B(LdaUndefined), B(Return)}, |
1300 0, | 1289 0, |
1301 {unused, unused, unused, unused, unused, unused}}, | 1290 {unused, unused, unused, unused, unused, unused}}, |
1302 {"function f(a) { if (a <= 0) { return 200; } else { return -200; } }" | 1291 {"function f(a) { if (a <= 0) { return 200; } else { return -200; } }" |
1303 "f(99);", | 1292 "f(99);", |
1304 0, | 1293 0, |
1305 2, | 1294 2, |
1306 15, | 1295 15, |
1307 {B(LdaZero), // | 1296 {B(LdaZero), // |
1308 B(TestLessThanOrEqual), A(1, 2), // | 1297 B(TestLessThanOrEqual), A(1, 2), // |
1309 B(JumpIfFalse), U8(7), // | 1298 B(JumpIfFalse), U8(7), // |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1568 " if (i < 0) continue;" | 1557 " if (i < 0) continue;" |
1569 " if (i == 3) break;" | 1558 " if (i == 3) break;" |
1570 " if (i == 4) break;" | 1559 " if (i == 4) break;" |
1571 " if (i == 10) continue;" | 1560 " if (i == 10) continue;" |
1572 " if (i == 5) break;" | 1561 " if (i == 5) break;" |
1573 " i = i + 1;" | 1562 " i = i + 1;" |
1574 "}" | 1563 "}" |
1575 "return i;", | 1564 "return i;", |
1576 1 * kPointerSize, | 1565 1 * kPointerSize, |
1577 1, | 1566 1, |
1578 56, | 1567 53, |
1579 { | 1568 { |
1580 B(LdaZero), // | 1569 B(LdaZero), // |
1581 B(Star), R(0), // | 1570 B(Star), R(0), // |
1582 B(Jump), U8(47), // | 1571 B(LdaZero), // |
1583 B(LdaZero), // | 1572 B(TestLessThan), R(0), // |
1584 B(TestLessThan), R(0), // | 1573 B(JumpIfFalse), U8(4), // |
1585 B(JumpIfFalse), U8(4), // | 1574 B(Jump), U8(40), // |
1586 B(Jump), U8(40), // | 1575 B(LdaSmi8), U8(3), // |
1587 B(LdaSmi8), U8(3), // | 1576 B(TestEqual), R(0), // |
1588 B(TestEqual), R(0), // | 1577 B(JumpIfFalse), U8(4), // |
1589 B(JumpIfFalse), U8(4), // | 1578 B(Jump), U8(34), // |
1590 B(Jump), U8(35), // | 1579 B(LdaSmi8), U8(4), // |
1591 B(LdaSmi8), U8(4), // | 1580 B(TestEqual), R(0), // |
1592 B(TestEqual), R(0), // | 1581 B(JumpIfFalse), U8(4), // |
1593 B(JumpIfFalse), U8(4), // | 1582 B(Jump), U8(26), // |
1594 B(Jump), U8(27), // | 1583 B(LdaSmi8), U8(10), // |
1595 B(LdaSmi8), U8(10), // | 1584 B(TestEqual), R(0), // |
1596 B(TestEqual), R(0), // | 1585 B(JumpIfFalse), U8(4), // |
1597 B(JumpIfFalse), U8(4), // | 1586 B(Jump), U8(16), // |
1598 B(Jump), U8(16), // | 1587 B(LdaSmi8), U8(5), // |
1599 B(LdaSmi8), U8(5), // | 1588 B(TestEqual), R(0), // |
1600 B(TestEqual), R(0), // | 1589 B(JumpIfFalse), U8(4), // |
1601 B(JumpIfFalse), U8(4), // | 1590 B(Jump), U8(10), // |
1602 B(Jump), U8(11), // | 1591 B(LdaSmi8), U8(1), // |
1603 B(LdaSmi8), U8(1), // | 1592 B(Add), R(0), // |
1604 B(Add), R(0), // | 1593 B(Star), R(0), // |
1605 B(Star), R(0), // | 1594 B(Jump), U8(-45), // |
1606 B(LdaTrue), // | 1595 B(Ldar), R(0), // |
1607 B(JumpIfTrue), U8(-46), // | 1596 B(Return), // |
1608 B(Ldar), R(0), // | |
1609 B(Return), // | |
1610 }, | 1597 }, |
1611 0}, | 1598 0}, |
1612 {"var x = 0; var y = 1;" | 1599 {"var x = 0; var y = 1;" |
1613 "do {" | 1600 "do {" |
1614 " y = y * 10;" | 1601 " y = y * 10;" |
1615 " if (x == 5) break;" | 1602 " if (x == 5) break;" |
1616 " if (x == 6) continue;" | 1603 " if (x == 6) continue;" |
1617 " x = x + 1;" | 1604 " x = x + 1;" |
1618 "} while (x < 10);" | 1605 "} while (x < 10);" |
1619 "return y;", | 1606 "return y;", |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1702 " while (i < 3) {" | 1689 " while (i < 3) {" |
1703 " if (i == 2) break;" | 1690 " if (i == 2) break;" |
1704 " i = i + 1;" | 1691 " i = i + 1;" |
1705 " }" | 1692 " }" |
1706 " i = i + 1;" | 1693 " i = i + 1;" |
1707 " break;" | 1694 " break;" |
1708 "}" | 1695 "}" |
1709 "return i;", | 1696 "return i;", |
1710 1 * kPointerSize, | 1697 1 * kPointerSize, |
1711 1, | 1698 1, |
1712 41, | 1699 38, |
1713 { | 1700 { |
1714 B(LdaZero), // | 1701 B(LdaZero), // |
1715 B(Star), R(0), // | 1702 B(Star), R(0), // |
1716 B(Jump), U8(32), // | |
1717 B(Jump), U8(16), // | 1703 B(Jump), U8(16), // |
1718 B(LdaSmi8), U8(2), // | 1704 B(LdaSmi8), U8(2), // |
1719 B(TestEqual), R(0), // | 1705 B(TestEqual), R(0), // |
1720 B(JumpIfFalse), U8(4), // | 1706 B(JumpIfFalse), U8(4), // |
1721 B(Jump), U8(14), // | 1707 B(Jump), U8(14), // |
1722 B(LdaSmi8), U8(1), // | 1708 B(LdaSmi8), U8(1), // |
1723 B(Add), R(0), // | 1709 B(Add), R(0), // |
1724 B(Star), R(0), // | 1710 B(Star), R(0), // |
1725 B(LdaSmi8), U8(3), // | 1711 B(LdaSmi8), U8(3), // |
1726 B(TestLessThan), R(0), // | 1712 B(TestLessThan), R(0), // |
1727 B(JumpIfTrue), U8(-18), // | 1713 B(JumpIfTrue), U8(-18), // |
1728 B(LdaSmi8), U8(1), // | 1714 B(LdaSmi8), U8(1), // |
1729 B(Add), R(0), // | 1715 B(Add), R(0), // |
1730 B(Star), R(0), // | 1716 B(Star), R(0), // |
1731 B(Jump), U8(5), // | 1717 B(Jump), U8(4), // |
1732 B(LdaTrue), // | 1718 B(Jump), U8(-30), // |
1733 B(JumpIfTrue), U8(-31), // | |
1734 B(Ldar), R(0), // | 1719 B(Ldar), R(0), // |
1735 B(Return), // | 1720 B(Return), // |
1736 }, | 1721 }, |
1737 0}, | 1722 0}, |
| 1723 {"var x = 0; var y = 1;" |
| 1724 "do {" |
| 1725 " y = y * 10;" |
| 1726 " if (x == 5) break;" |
| 1727 " x = x + 1;" |
| 1728 " if (x == 6) continue;" |
| 1729 "} while (false);" |
| 1730 "return y;", |
| 1731 2 * kPointerSize, |
| 1732 1, |
| 1733 38, |
| 1734 { |
| 1735 B(LdaZero), // |
| 1736 B(Star), R(0), // |
| 1737 B(LdaSmi8), U8(1), // |
| 1738 B(Star), R(1), // |
| 1739 B(LdaSmi8), U8(10), // |
| 1740 B(Mul), R(1), // |
| 1741 B(Star), R(1), // |
| 1742 B(LdaSmi8), U8(5), // |
| 1743 B(TestEqual), R(0), // |
| 1744 B(JumpIfFalse), U8(4), // |
| 1745 B(Jump), U8(16), // |
| 1746 B(LdaSmi8), U8(1), // |
| 1747 B(Add), R(0), // |
| 1748 B(Star), R(0), // |
| 1749 B(LdaSmi8), U8(6), // |
| 1750 B(TestEqual), R(0), // |
| 1751 B(JumpIfFalse), U8(4), // |
| 1752 B(Jump), U8(2), // |
| 1753 B(Ldar), R(1), // |
| 1754 B(Return), // |
| 1755 }, |
| 1756 0}, |
| 1757 {"var x = 0; var y = 1;" |
| 1758 "do {" |
| 1759 " y = y * 10;" |
| 1760 " if (x == 5) break;" |
| 1761 " x = x + 1;" |
| 1762 " if (x == 6) continue;" |
| 1763 "} while (true);" |
| 1764 "return y;", |
| 1765 2 * kPointerSize, |
| 1766 1, |
| 1767 40, |
| 1768 { |
| 1769 B(LdaZero), // |
| 1770 B(Star), R(0), // |
| 1771 B(LdaSmi8), U8(1), // |
| 1772 B(Star), R(1), // |
| 1773 B(LdaSmi8), U8(10), // |
| 1774 B(Mul), R(1), // |
| 1775 B(Star), R(1), // |
| 1776 B(LdaSmi8), U8(5), // |
| 1777 B(TestEqual), R(0), // |
| 1778 B(JumpIfFalse), U8(4), // |
| 1779 B(Jump), U8(18), // |
| 1780 B(LdaSmi8), U8(1), // |
| 1781 B(Add), R(0), // |
| 1782 B(Star), R(0), // |
| 1783 B(LdaSmi8), U8(6), // |
| 1784 B(TestEqual), R(0), // |
| 1785 B(JumpIfFalse), U8(4), // |
| 1786 B(Jump), U8(2), // |
| 1787 B(Jump), U8(-28), // |
| 1788 B(Ldar), R(1), // |
| 1789 B(Return), // |
| 1790 }, |
| 1791 0}, |
| 1792 {"var x = 0;" |
| 1793 "while(false) {" |
| 1794 " x = x + 1;" |
| 1795 "};" |
| 1796 "return x;", |
| 1797 1 * kPointerSize, |
| 1798 1, |
| 1799 6, |
| 1800 { |
| 1801 B(LdaZero), // |
| 1802 B(Star), R(0), // |
| 1803 B(Ldar), R(0), // |
| 1804 B(Return), // |
| 1805 }, |
| 1806 0}, |
| 1807 {"var x = 0;" |
| 1808 "for( var i = 0; false; i++) {" |
| 1809 " x = x + 1;" |
| 1810 "};" |
| 1811 "return x;", |
| 1812 2 * kPointerSize, |
| 1813 1, |
| 1814 9, |
| 1815 { |
| 1816 B(LdaZero), // |
| 1817 B(Star), R(0), // |
| 1818 B(LdaZero), // |
| 1819 B(Star), R(1), // |
| 1820 B(Ldar), R(0), // |
| 1821 B(Return), // |
| 1822 }, |
| 1823 0}, |
| 1824 {"var x = 0;" |
| 1825 "for( var i = 0; true; ++i) {" |
| 1826 " x = x + 1;" |
| 1827 " if (x == 20) break;" |
| 1828 "};" |
| 1829 "return x;", |
| 1830 2 * kPointerSize, |
| 1831 1, |
| 1832 31, |
| 1833 { |
| 1834 B(LdaZero), // |
| 1835 B(Star), R(0), // |
| 1836 B(LdaZero), // |
| 1837 B(Star), R(1), // |
| 1838 B(LdaSmi8), U8(1), // |
| 1839 B(Add), R(0), // |
| 1840 B(Star), R(0), // |
| 1841 B(LdaSmi8), U8(20), // |
| 1842 B(TestEqual), R(0), // |
| 1843 B(JumpIfFalse), U8(4), // |
| 1844 B(Jump), U8(10), // |
| 1845 B(Ldar), R(1), // |
| 1846 B(ToNumber), // |
| 1847 B(Inc), // |
| 1848 B(Star), R(1), // |
| 1849 B(Jump), U8(-20), // |
| 1850 B(Ldar), R(0), // |
| 1851 B(Return), // |
| 1852 }, |
| 1853 0}, |
1738 }; | 1854 }; |
1739 | 1855 |
1740 for (size_t i = 0; i < arraysize(snippets); i++) { | 1856 for (size_t i = 0; i < arraysize(snippets); i++) { |
1741 Handle<BytecodeArray> bytecode_array = | 1857 Handle<BytecodeArray> bytecode_array = |
1742 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 1858 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
1743 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 1859 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
1744 } | 1860 } |
1745 } | 1861 } |
1746 | 1862 |
1747 | 1863 |
(...skipping 1081 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2829 3, | 2945 3, |
2830 { | 2946 { |
2831 B(LdaConstant), U8(0), // | 2947 B(LdaConstant), U8(0), // |
2832 B(Throw), // | 2948 B(Throw), // |
2833 }, | 2949 }, |
2834 1, | 2950 1, |
2835 {"Error"}}, | 2951 {"Error"}}, |
2836 {"if ('test') { throw 'Error'; };", | 2952 {"if ('test') { throw 'Error'; };", |
2837 0, | 2953 0, |
2838 1, | 2954 1, |
2839 10, | 2955 5, |
2840 { | 2956 { |
2841 B(LdaConstant), U8(0), // | 2957 B(LdaConstant), U8(0), // |
2842 B(ToBoolean), // | |
2843 B(JumpIfFalse), U8(5), // | |
2844 B(LdaConstant), U8(1), // | |
2845 B(Throw), // | 2958 B(Throw), // |
2846 B(LdaUndefined), // | 2959 B(LdaUndefined), // |
2847 B(Return), // | 2960 B(Return), // |
2848 }, | 2961 }, |
2849 2, | 2962 1, |
2850 {"test", "Error"}}, | 2963 {"Error"}}, |
2851 }; | 2964 }; |
2852 | 2965 |
2853 for (size_t i = 0; i < arraysize(snippets); i++) { | 2966 for (size_t i = 0; i < arraysize(snippets); i++) { |
2854 Handle<BytecodeArray> bytecode_array = | 2967 Handle<BytecodeArray> bytecode_array = |
2855 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 2968 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
2856 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 2969 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
2857 } | 2970 } |
2858 } | 2971 } |
2859 | 2972 |
2860 | 2973 |
(...skipping 997 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3858 for (size_t i = 0; i < arraysize(snippets); i++) { | 3971 for (size_t i = 0; i < arraysize(snippets); i++) { |
3859 Handle<BytecodeArray> bytecode_array = | 3972 Handle<BytecodeArray> bytecode_array = |
3860 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 3973 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
3861 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 3974 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
3862 } | 3975 } |
3863 } | 3976 } |
3864 | 3977 |
3865 } // namespace interpreter | 3978 } // namespace interpreter |
3866 } // namespace internal | 3979 } // namespace internal |
3867 } // namespace v8 | 3980 } // namespace v8 |
OLD | NEW |