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/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 |