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), // |
oth
2015/10/30 09:46:19
It looks like our logic for detecting when to emit
mythria
2015/10/30 15:07:47
I am not sure if it is easy to eliminate return he
oth
2015/10/30 15:31:34
Yes.
| |
1261 B(LdaSmi8), U8(1), // | 1261 B(Return)}, // |
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), // |
1277 B(LdaSmi8), U8(1), // | 1271 B(Return)}, // |
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), // |
1294 B(Return), // | 1281 B(Return)}, // |
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 |