Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(651)

Side by Side Diff: test/cctest/interpreter/test-bytecode-generator.cc

Issue 1406983010: [Interpreter] Ensure ToBoolean bytecodes are correctly emitted at the start of basic blocks (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/interpreter/bytecode-generator.cc ('k') | test/cctest/interpreter/test-interpreter.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 // TODO(rmcilroy): Remove this define after this flag is turned on globally 5 // TODO(rmcilroy): Remove this define after this flag is turned on globally
6 #define V8_IMMINENT_DEPRECATION_WARNINGS 6 #define V8_IMMINENT_DEPRECATION_WARNINGS
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/compiler.h" 10 #include "src/compiler.h"
(...skipping 1587 matching lines...) Expand 10 before | Expand all | Expand 10 after
1598 TEST(IfConditions) { 1598 TEST(IfConditions) {
1599 InitializedHandleScope handle_scope; 1599 InitializedHandleScope handle_scope;
1600 BytecodeGeneratorHelper helper; 1600 BytecodeGeneratorHelper helper;
1601 1601
1602 Handle<Object> unused = helper.factory()->undefined_value(); 1602 Handle<Object> unused = helper.factory()->undefined_value();
1603 1603
1604 ExpectedSnippet<Handle<Object>> snippets[] = { 1604 ExpectedSnippet<Handle<Object>> snippets[] = {
1605 {"function f() { if (0) { return 1; } else { return -1; } } f()", 1605 {"function f() { if (0) { return 1; } else { return -1; } } f()",
1606 0, 1606 0,
1607 1, 1607 1,
1608 5, 1608 3,
1609 {B(LdaSmi8), U8(-1), // 1609 {
1610 B(Return), // 1610 B(LdaSmi8), U8(-1), //
1611 B(LdaUndefined), // TODO(mythria) redundant return statement 1611 B(Return), //
1612 B(Return)}, // could be eliminated. 1612 },
1613 0, 1613 0,
1614 {unused, unused, unused, unused, unused, unused}}, 1614 {unused, unused, unused, unused, unused, unused}},
1615 {"function f() { if ('lucky') { return 1; } else { return -1; } } f();", 1615 {"function f() { if ('lucky') { return 1; } else { return -1; } } f();",
1616 0, 1616 0,
1617 1, 1617 1,
1618 5, 1618 3,
1619 {B(LdaSmi8), U8(1), // 1619 {
1620 B(Return), // 1620 B(LdaSmi8), U8(1), //
1621 B(LdaUndefined), // TODO(mythria) redundant return statement 1621 B(Return), //
1622 B(Return)}, // could be eliminated. 1622 },
1623 0, 1623 0,
1624 {unused, unused, unused, unused, unused, unused}}, 1624 {unused, unused, unused, unused, unused, unused}},
1625 {"function f() { if (false) { return 1; } else { return -1; } } f();", 1625 {"function f() { if (false) { return 1; } else { return -1; } } f();",
1626 0, 1626 0,
1627 1, 1627 1,
1628 5, 1628 3,
1629 {B(LdaSmi8), U8(-1), // 1629 {
1630 B(Return), // 1630 B(LdaSmi8), U8(-1), //
1631 B(LdaUndefined), // TODO(mythria) redundant return statement 1631 B(Return), //
1632 B(Return)}, // could be eliminated. 1632 },
1633 0, 1633 0,
1634 {unused, unused, unused, unused, unused, unused}}, 1634 {unused, unused, unused, unused, unused, unused}},
1635 {"function f() { if (false) { return 1; } } f();", 1635 {"function f() { if (false) { return 1; } } f();",
1636 0, 1636 0,
1637 1, 1637 1,
1638 2, 1638 2,
1639 {B(LdaUndefined), // 1639 {
1640 B(Return)}, 1640 B(LdaUndefined), //
1641 B(Return), //
1642 },
1641 0, 1643 0,
1642 {unused, unused, unused, unused, unused, unused}}, 1644 {unused, unused, unused, unused, unused, unused}},
1643 {"function f(a) { if (a <= 0) { return 200; } else { return -200; } }" 1645 {"function f(a) { if (a <= 0) { return 200; } else { return -200; } }"
1644 "f(99);", 1646 "f(99);",
1645 0, 1647 0,
1646 2, 1648 2,
1647 15, 1649 13,
1648 {B(LdaZero), // 1650 {
1649 B(TestLessThanOrEqual), A(1, 2), // 1651 B(LdaZero), //
1650 B(JumpIfFalse), U8(7), // 1652 B(TestLessThanOrEqual), A(1, 2), //
1651 B(LdaConstant), U8(0), // 1653 B(JumpIfFalse), U8(5), //
1652 B(Return), // 1654 B(LdaConstant), U8(0), //
1653 B(Jump), U8(5), // 1655 B(Return), //
1654 B(LdaConstant), U8(1), // 1656 B(LdaConstant), U8(1), //
1655 B(Return), // 1657 B(Return), //
1656 B(LdaUndefined), // 1658 B(LdaUndefined), //
1657 B(Return)}, // 1659 B(Return), //
1660 },
1658 2, 1661 2,
1659 {helper.factory()->NewNumberFromInt(200), 1662 {helper.factory()->NewNumberFromInt(200),
1660 helper.factory()->NewNumberFromInt(-200), unused, unused, unused, 1663 helper.factory()->NewNumberFromInt(-200), unused, unused, unused,
1661 unused}}, 1664 unused}},
1662 {"function f(a, b) { if (a in b) { return 200; } }" 1665 {"function f(a, b) { if (a in b) { return 200; } }"
1663 "f('prop', { prop: 'yes'});", 1666 "f('prop', { prop: 'yes'});",
1664 0, 1667 0,
1665 3, 1668 3,
1666 11, 1669 11,
1667 {B(Ldar), A(2, 3), // 1670 {
1668 B(TestIn), A(1, 3), // 1671 B(Ldar), A(2, 3), //
1669 B(JumpIfFalse), U8(5), // 1672 B(TestIn), A(1, 3), //
1670 B(LdaConstant), U8(0), // 1673 B(JumpIfFalse), U8(5), //
1671 B(Return), // 1674 B(LdaConstant), U8(0), //
1672 B(LdaUndefined), // 1675 B(Return), //
1673 B(Return)}, // 1676 B(LdaUndefined), //
1677 B(Return), //
1678 },
mythria 2015/11/03 11:01:59 May be we can have another test where we have retu
rmcilroy 2015/11/03 11:10:12 SGTM, done.
1674 1, 1679 1,
1675 {helper.factory()->NewNumberFromInt(200), unused, unused, unused, unused, 1680 {helper.factory()->NewNumberFromInt(200), unused, unused, unused, unused,
1676 unused}}, 1681 unused}},
1677 {"function f(z) { var a = 0; var b = 0; if (a === 0.01) { " 1682 {"function f(z) { var a = 0; var b = 0; if (a === 0.01) { "
1678 REPEAT_32(SPACE, "b = a; a = b; ") 1683 REPEAT_32(SPACE, "b = a; a = b; ")
1679 " return 200; } else { return -200; } } f(0.001)", 1684 " return 200; } else { return -200; } } f(0.001)",
1680 2 * kPointerSize, 1685 2 * kPointerSize,
1681 2, 1686 2,
1682 278, 1687 276,
1683 { 1688 {
1684 B(LdaZero), // 1689 B(LdaZero), //
1685 B(Star), R(0), // 1690 B(Star), R(0), //
1686 B(LdaZero), // 1691 B(LdaZero), //
1687 B(Star), R(1), // 1692 B(Star), R(1), //
1688 B(LdaConstant), U8(0), // 1693 B(LdaConstant), U8(0), //
1689 B(TestEqualStrict), R(0), // 1694 B(TestEqualStrict), R(0), //
1690 B(JumpIfFalseConstant), U8(2), // 1695 B(JumpIfFalseConstant), U8(2), //
1691 REPEAT_32(COMMA, // 1696 REPEAT_32(COMMA, //
1692 B(Ldar), R(0), // 1697 B(Ldar), R(0), //
1693 B(Star), R(1), // 1698 B(Star), R(1), //
1694 B(Ldar), R(1), // 1699 B(Ldar), R(1), //
1695 B(Star), R(0)), // 1700 B(Star), R(0)), //
1696 B(LdaConstant), U8(1), // 1701 B(LdaConstant), U8(1), //
1697 B(Return), // 1702 B(Return), //
1698 B(Jump), U8(5), //
1699 B(LdaConstant), U8(3), // 1703 B(LdaConstant), U8(3), //
1700 B(Return), // 1704 B(Return), //
1701 B(LdaUndefined), // 1705 B(LdaUndefined), //
1702 B(Return)}, // 1706 B(Return)}, //
1703 4, 1707 4,
1704 {helper.factory()->NewHeapNumber(0.01), 1708 {helper.factory()->NewHeapNumber(0.01),
1705 helper.factory()->NewNumberFromInt(200), 1709 helper.factory()->NewNumberFromInt(200),
1706 helper.factory()->NewNumberFromInt(263), 1710 helper.factory()->NewNumberFromInt(261),
1707 helper.factory()->NewNumberFromInt(-200), unused, unused}}, 1711 helper.factory()->NewNumberFromInt(-200), unused, unused}},
1708 {"function f() { var a = 0; var b = 0; if (a) { " 1712 {"function f() { var a = 0; var b = 0; if (a) { "
1709 REPEAT_32(SPACE, "b = a; a = b; ") 1713 REPEAT_32(SPACE, "b = a; a = b; ")
1710 " return 200; } else { return -200; } } f()", 1714 " return 200; } else { return -200; } } f()",
1711 2 * kPointerSize, 1715 2 * kPointerSize,
1712 1, 1716 1,
1713 276, 1717 274,
1714 { 1718 {
1715 B(LdaZero), // 1719 B(LdaZero), //
1716 B(Star), R(0), // 1720 B(Star), R(0), //
1717 B(LdaZero), // 1721 B(LdaZero), //
1718 B(Star), R(1), // 1722 B(Star), R(1), //
1719 B(Ldar), R(0), // 1723 B(Ldar), R(0), //
1720 B(JumpIfToBooleanFalseConstant), U8(1), // 1724 B(JumpIfToBooleanFalseConstant), U8(1), //
1721 REPEAT_32(COMMA, // 1725 REPEAT_32(COMMA, //
1722 B(Ldar), R(0), // 1726 B(Ldar), R(0), //
1723 B(Star), R(1), // 1727 B(Star), R(1), //
1724 B(Ldar), R(1), // 1728 B(Ldar), R(1), //
1725 B(Star), R(0)), // 1729 B(Star), R(0)), //
1726 B(LdaConstant), U8(0), // 1730 B(LdaConstant), U8(0), //
1727 B(Return), // 1731 B(Return), //
1728 B(Jump), U8(5), //
1729 B(LdaConstant), U8(2), // 1732 B(LdaConstant), U8(2), //
1730 B(Return), // 1733 B(Return), //
1731 B(LdaUndefined), // 1734 B(LdaUndefined), //
1732 B(Return)}, // 1735 B(Return)}, //
1733 3, 1736 3,
1734 {helper.factory()->NewNumberFromInt(200), 1737 {helper.factory()->NewNumberFromInt(200),
1735 helper.factory()->NewNumberFromInt(263), 1738 helper.factory()->NewNumberFromInt(261),
1736 helper.factory()->NewNumberFromInt(-200), unused, unused, unused}}, 1739 helper.factory()->NewNumberFromInt(-200), unused, unused, unused}},
1737 1740
1738 {"function f(a, b) {\n" 1741 {"function f(a, b) {\n"
1739 " if (a == b) { return 1; }\n" 1742 " if (a == b) { return 1; }\n"
1740 " if (a === b) { return 1; }\n" 1743 " if (a === b) { return 1; }\n"
1741 " if (a < b) { return 1; }\n" 1744 " if (a < b) { return 1; }\n"
1742 " if (a > b) { return 1; }\n" 1745 " if (a > b) { return 1; }\n"
1743 " if (a <= b) { return 1; }\n" 1746 " if (a <= b) { return 1; }\n"
1744 " if (a >= b) { return 1; }\n" 1747 " if (a >= b) { return 1; }\n"
1745 " if (a in b) { return 1; }\n" 1748 " if (a in b) { return 1; }\n"
(...skipping 26 matching lines...) Expand all
1772 {"function f() {" 1775 {"function f() {"
1773 " var a = 0;" 1776 " var a = 0;"
1774 " if (a) {" 1777 " if (a) {"
1775 " return 20;" 1778 " return 20;"
1776 "} else {" 1779 "} else {"
1777 " return -20;}" 1780 " return -20;}"
1778 "};" 1781 "};"
1779 "f();", 1782 "f();",
1780 1 * kPointerSize, 1783 1 * kPointerSize,
1781 1, 1784 1,
1782 17, 1785 15,
1783 { 1786 {
1784 B(LdaZero), // 1787 B(LdaZero), //
1785 B(Star), R(0), // 1788 B(Star), R(0), //
1786 B(Ldar), R(0), // 1789 B(Ldar), R(0), //
1787 B(JumpIfToBooleanFalse), U8(7), // 1790 B(JumpIfToBooleanFalse), U8(5), //
1788 B(LdaSmi8), U8(20), // 1791 B(LdaSmi8), U8(20), //
1789 B(Return), // 1792 B(Return), //
1790 B(Jump), U8(5), //
1791 B(LdaSmi8), U8(-20), // 1793 B(LdaSmi8), U8(-20), //
1792 B(Return), // 1794 B(Return), //
1793 B(LdaUndefined), // 1795 B(LdaUndefined), //
1794 B(Return) 1796 B(Return)
1795 }, 1797 },
1796 0, 1798 0,
1797 {unused, unused, unused, unused, unused, unused}} 1799 {unused, unused, unused, unused, unused, unused}}
1798 }; 1800 };
1799 1801
1800 for (size_t i = 0; i < arraysize(snippets); i++) { 1802 for (size_t i = 0; i < arraysize(snippets); i++) {
(...skipping 1540 matching lines...) Expand 10 before | Expand all | Expand 10 after
3341 3343
3342 TEST(TryCatch) { 3344 TEST(TryCatch) {
3343 InitializedHandleScope handle_scope; 3345 InitializedHandleScope handle_scope;
3344 BytecodeGeneratorHelper helper; 3346 BytecodeGeneratorHelper helper;
3345 3347
3346 // TODO(rmcilroy): modify tests when we have real try catch support. 3348 // TODO(rmcilroy): modify tests when we have real try catch support.
3347 ExpectedSnippet<int> snippets[] = { 3349 ExpectedSnippet<int> snippets[] = {
3348 {"try { return 1; } catch(e) { return 2; }", 3350 {"try { return 1; } catch(e) { return 2; }",
3349 kPointerSize, 3351 kPointerSize,
3350 1, 3352 1,
3351 5, 3353 3,
3352 { 3354 {
3353 B(LdaSmi8), U8(1), // 3355 B(LdaSmi8), U8(1), //
3354 B(Return), // 3356 B(Return), //
3355 B(LdaUndefined), //
3356 B(Return), //
3357 }, 3357 },
3358 0}, 3358 0},
3359 }; 3359 };
3360 3360
3361 for (size_t i = 0; i < arraysize(snippets); i++) { 3361 for (size_t i = 0; i < arraysize(snippets); i++) {
3362 Handle<BytecodeArray> bytecode_array = 3362 Handle<BytecodeArray> bytecode_array =
3363 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 3363 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
3364 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 3364 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
3365 } 3365 }
3366 } 3366 }
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
3430 {"throw 'Error';", 3430 {"throw 'Error';",
3431 0, 3431 0,
3432 1, 3432 1,
3433 3, 3433 3,
3434 { 3434 {
3435 B(LdaConstant), U8(0), // 3435 B(LdaConstant), U8(0), //
3436 B(Throw), // 3436 B(Throw), //
3437 }, 3437 },
3438 1, 3438 1,
3439 {"Error"}}, 3439 {"Error"}},
3440 {"if ('test') { throw 'Error'; };", 3440 {"var a = 1; if (a) { throw 'Error'; };",
3441 0, 3441 1 * kPointerSize,
3442 1, 3442 1,
3443 5, 3443 13,
3444 { 3444 {
3445 B(LdaConstant), U8(0), // 3445 B(LdaSmi8), U8(1), //
3446 B(Throw), // 3446 B(Star), R(0), //
3447 B(LdaUndefined), // 3447 B(Ldar), R(0), //
3448 B(Return), // 3448 B(JumpIfToBooleanFalse), U8(5), //
3449 B(LdaConstant), U8(0), //
3450 B(Throw), //
3451 B(LdaUndefined), //
3452 B(Return), //
3449 }, 3453 },
3450 1, 3454 1,
3451 {"Error"}}, 3455 {"Error"}},
3452 }; 3456 };
3453 3457
3454 for (size_t i = 0; i < arraysize(snippets); i++) { 3458 for (size_t i = 0; i < arraysize(snippets); i++) {
3455 Handle<BytecodeArray> bytecode_array = 3459 Handle<BytecodeArray> bytecode_array =
3456 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 3460 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
3457 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 3461 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
3458 } 3462 }
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
3608 B(Star), R(1), // 3612 B(Star), R(1), //
3609 B(Call), R(1), R(2), U8(0), // 3613 B(Call), R(1), R(2), U8(0), //
3610 B(LdaContextSlot), R(0), U8(first_context_slot), // 3614 B(LdaContextSlot), R(0), U8(first_context_slot), //
3611 B(Return), // 3615 B(Return), //
3612 }, 3616 },
3613 1, 3617 1,
3614 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 3618 {InstanceType::SHARED_FUNCTION_INFO_TYPE}},
3615 {"'use strict'; let a = 1; { let b = 2; return function() { a + b; }; }", 3619 {"'use strict'; let a = 1; { let b = 2; return function() { a + b; }; }",
3616 4 * kPointerSize, 3620 4 * kPointerSize,
3617 1, 3621 1,
3618 49, 3622 45,
3619 { 3623 {
3620 B(CallRuntime), U16(Runtime::kNewFunctionContext), // 3624 B(CallRuntime), U16(Runtime::kNewFunctionContext), //
3621 R(closure), U8(1), // 3625 R(closure), U8(1), //
3622 B(PushContext), R(0), // 3626 B(PushContext), R(0), //
3623 B(LdaTheHole), // 3627 B(LdaTheHole), //
3624 B(StaContextSlot), R(0), U8(first_context_slot), // 3628 B(StaContextSlot), R(0), U8(first_context_slot), //
3625 B(LdaSmi8), U8(1), // 3629 B(LdaSmi8), U8(1), //
3626 B(StaContextSlot), R(0), U8(first_context_slot), // 3630 B(StaContextSlot), R(0), U8(first_context_slot), //
3627 B(LdaConstant), U8(0), // 3631 B(LdaConstant), U8(0), //
3628 B(Star), R(2), // 3632 B(Star), R(2), //
3629 B(Ldar), R(closure), // 3633 B(Ldar), R(closure), //
3630 B(Star), R(3), // 3634 B(Star), R(3), //
3631 B(CallRuntime), U16(Runtime::kPushBlockContext), R(2), U8(2), // 3635 B(CallRuntime), U16(Runtime::kPushBlockContext), R(2), U8(2), //
3632 B(PushContext), R(1), // 3636 B(PushContext), R(1), //
3633 B(LdaTheHole), // 3637 B(LdaTheHole), //
3634 B(StaContextSlot), R(1), U8(first_context_slot), // 3638 B(StaContextSlot), R(1), U8(first_context_slot), //
3635 B(LdaSmi8), U8(2), // 3639 B(LdaSmi8), U8(2), //
3636 B(StaContextSlot), R(1), U8(first_context_slot), // 3640 B(StaContextSlot), R(1), U8(first_context_slot), //
3637 B(LdaConstant), U8(1), // 3641 B(LdaConstant), U8(1), //
3638 B(CreateClosure), U8(0), // 3642 B(CreateClosure), U8(0), //
3639 B(Return), // 3643 B(Return), //
3640 // TODO(rmcilroy): Dead code after this point due to return in nested
3641 // block - investigate eliminating this.
3642 B(PopContext), R(0),
3643 B(LdaUndefined), //
3644 B(Return), //
3645 }, 3644 },
3646 2, 3645 2,
3647 {InstanceType::FIXED_ARRAY_TYPE, 3646 {InstanceType::FIXED_ARRAY_TYPE,
3648 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 3647 InstanceType::SHARED_FUNCTION_INFO_TYPE}},
3649 }; 3648 };
3650 3649
3651 for (size_t i = 0; i < arraysize(snippets); i++) { 3650 for (size_t i = 0; i < arraysize(snippets); i++) {
3652 Handle<BytecodeArray> bytecode_array = 3651 Handle<BytecodeArray> bytecode_array =
3653 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 3652 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
3654 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 3653 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
(...skipping 1269 matching lines...) Expand 10 before | Expand all | Expand 10 after
4924 }}, 4923 }},
4925 }; 4924 };
4926 4925
4927 for (size_t i = 0; i < arraysize(snippets); i++) { 4926 for (size_t i = 0; i < arraysize(snippets); i++) {
4928 Handle<BytecodeArray> bytecode_array = 4927 Handle<BytecodeArray> bytecode_array =
4929 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 4928 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
4930 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 4929 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
4931 } 4930 }
4932 } 4931 }
4933 4932
4933
4934 TEST(BasicBlockToBoolean) {
4935 InitializedHandleScope handle_scope;
4936 BytecodeGeneratorHelper helper;
4937
4938 // Check that we don't omit ToBoolean calls if they are at the start of basic
4939 // blocks.
4940 ExpectedSnippet<int> snippets[] = {
4941 {"var a = 1; if (a || a < 0) { return 1 }",
oth 2015/11/02 20:45:58 missing semi-colon
rmcilroy 2015/11/03 11:10:12 Done.
4942 1 * kPointerSize,
4943 1,
4944 18,
4945 {
4946 B(LdaSmi8), U8(1), //
4947 B(Star), R(0), //
4948 B(Ldar), R(0), //
4949 B(JumpIfToBooleanTrue), U8(5), //
4950 B(LdaZero), //
4951 B(TestLessThan), R(0), //
4952 B(JumpIfToBooleanFalse), U8(5), //
4953 B(LdaSmi8), U8(1), //
4954 B(Return), //
4955 B(LdaUndefined), //
4956 B(Return), //
4957 }},
4958 {"var a = 1; if (a && a < 0) { return 1 }",
oth 2015/11/02 20:45:58 missing semi-colon
rmcilroy 2015/11/03 11:10:12 Done.
4959 1 * kPointerSize,
4960 1,
4961 18,
4962 {
4963 B(LdaSmi8), U8(1), //
4964 B(Star), R(0), //
4965 B(Ldar), R(0), //
4966 B(JumpIfToBooleanFalse), U8(5), //
4967 B(LdaZero), //
4968 B(TestLessThan), R(0), //
4969 B(JumpIfToBooleanFalse), U8(5), //
4970 B(LdaSmi8), U8(1), //
4971 B(Return), //
4972 B(LdaUndefined), //
4973 B(Return), //
4974 }},
4975 {"var a = 1; a = (a || a < 0) ? 2 : 3",
oth 2015/11/02 20:45:58 missing semi-colon
rmcilroy 2015/11/03 11:10:12 Done.
4976 1 * kPointerSize,
4977 1,
4978 23,
4979 {
4980 B(LdaSmi8), U8(1), //
4981 B(Star), R(0), //
4982 B(Ldar), R(0), //
4983 B(JumpIfToBooleanTrue), U8(5), //
4984 B(LdaZero), //
4985 B(TestLessThan), R(0), //
4986 B(JumpIfToBooleanFalse), U8(6), //
4987 B(LdaSmi8), U8(2), //
4988 B(Jump), U8(4), //
4989 B(LdaSmi8), U8(3), //
4990 B(Star), R(0), //
4991 B(LdaUndefined), //
4992 B(Return), //
4993 }},
4994 };
4995
4996 for (size_t i = 0; i < arraysize(snippets); i++) {
4997 Handle<BytecodeArray> bytecode_array =
4998 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
4999 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
5000 }
5001 }
5002
5003
5004 TEST(DeadCodeRemoval) {
5005 InitializedHandleScope handle_scope;
5006 BytecodeGeneratorHelper helper;
5007
5008 ExpectedSnippet<int> snippets[] = {
5009 {"return; var a = 1; a();",
5010 1 * kPointerSize,
5011 1,
5012 2,
5013 {
5014 B(LdaUndefined), //
5015 B(Return), //
5016 }},
5017 {"if (false) { return; }; var a = 1;",
5018 1 * kPointerSize,
5019 1,
5020 6,
5021 {
5022 B(LdaSmi8), U8(1), //
5023 B(Star), R(0), //
5024 B(LdaUndefined), //
5025 B(Return), //
5026 }},
5027 {"if (true) { return 1; } else { return 2; };",
5028 0,
5029 1,
5030 3,
5031 {
5032 B(LdaSmi8), U8(1), //
5033 B(Return), //
5034 }},
5035 {"var a = 1; if (a) { return 1; }; return 2;",
5036 1 * kPointerSize,
5037 1,
5038 14,
5039 {
5040 B(LdaSmi8), U8(1), //
5041 B(Star), R(0), //
5042 B(Ldar), R(0), //
5043 B(JumpIfToBooleanFalse), U8(5), //
5044 B(LdaSmi8), U8(1), //
5045 B(Return), //
5046 B(LdaSmi8), U8(2), //
5047 B(Return), //
5048 }},
5049 };
5050
5051 for (size_t i = 0; i < arraysize(snippets); i++) {
5052 Handle<BytecodeArray> bytecode_array =
5053 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
5054 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
5055 }
5056 }
5057
4934 } // namespace interpreter 5058 } // namespace interpreter
4935 } // namespace internal 5059 } // namespace internal
4936 } // namespace v8 5060 } // namespace v8
OLDNEW
« no previous file with comments | « src/interpreter/bytecode-generator.cc ('k') | test/cctest/interpreter/test-interpreter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698