| 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 1494 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1505 {"function f(a) { return a.func(); }\nf(" FUNC_ARG ")", | 1505 {"function f(a) { return a.func(); }\nf(" FUNC_ARG ")", |
| 1506 2 * kPointerSize, | 1506 2 * kPointerSize, |
| 1507 2, | 1507 2, |
| 1508 17, | 1508 17, |
| 1509 { | 1509 { |
| 1510 B(StackCheck), // | 1510 B(StackCheck), // |
| 1511 B(Ldar), A(1, 2), // | 1511 B(Ldar), A(1, 2), // |
| 1512 B(Star), R(1), // | 1512 B(Star), R(1), // |
| 1513 B(LoadIC), R(1), U8(0), U8(vector->GetIndex(slot2)), // | 1513 B(LoadIC), R(1), U8(0), U8(vector->GetIndex(slot2)), // |
| 1514 B(Star), R(0), // | 1514 B(Star), R(0), // |
| 1515 B(CallIC), R(0), R(1), U8(1), U8(vector->GetIndex(slot1)), // | 1515 B(Call), R(0), R(1), U8(1), U8(vector->GetIndex(slot1)), // |
| 1516 B(Return), // | 1516 B(Return), // |
| 1517 }, | 1517 }, |
| 1518 1, | 1518 1, |
| 1519 {"func"}}, | 1519 {"func"}}, |
| 1520 {"function f(a, b, c) { return a.func(b, c); }\nf(" FUNC_ARG ", 1, 2)", | 1520 {"function f(a, b, c) { return a.func(b, c); }\nf(" FUNC_ARG ", 1, 2)", |
| 1521 4 * kPointerSize, | 1521 4 * kPointerSize, |
| 1522 4, | 1522 4, |
| 1523 25, | 1523 25, |
| 1524 { | 1524 { |
| 1525 B(StackCheck), // | 1525 B(StackCheck), // |
| 1526 B(Ldar), A(1, 4), // | 1526 B(Ldar), A(1, 4), // |
| 1527 B(Star), R(1), // | 1527 B(Star), R(1), // |
| 1528 B(LoadIC), R(1), U8(0), U8(vector->GetIndex(slot2)), // | 1528 B(LoadIC), R(1), U8(0), U8(vector->GetIndex(slot2)), // |
| 1529 B(Star), R(0), // | 1529 B(Star), R(0), // |
| 1530 B(Ldar), A(2, 4), // | 1530 B(Ldar), A(2, 4), // |
| 1531 B(Star), R(2), // | 1531 B(Star), R(2), // |
| 1532 B(Ldar), A(3, 4), // | 1532 B(Ldar), A(3, 4), // |
| 1533 B(Star), R(3), // | 1533 B(Star), R(3), // |
| 1534 B(CallIC), R(0), R(1), U8(3), U8(vector->GetIndex(slot1)), // | 1534 B(Call), R(0), R(1), U8(3), U8(vector->GetIndex(slot1)), // |
| 1535 B(Return) // | 1535 B(Return) // |
| 1536 }, | 1536 }, |
| 1537 1, | 1537 1, |
| 1538 {"func"}}, | 1538 {"func"}}, |
| 1539 {"function f(a, b) { return a.func(b + b, b); }\nf(" FUNC_ARG ", 1)", | 1539 {"function f(a, b) { return a.func(b + b, b); }\nf(" FUNC_ARG ", 1)", |
| 1540 4 * kPointerSize, | 1540 4 * kPointerSize, |
| 1541 3, | 1541 3, |
| 1542 31, | 1542 31, |
| 1543 { | 1543 { |
| 1544 B(StackCheck), // | 1544 B(StackCheck), // |
| 1545 B(Ldar), A(1, 3), // | 1545 B(Ldar), A(1, 3), // |
| 1546 B(Star), R(1), // | 1546 B(Star), R(1), // |
| 1547 B(LoadIC), R(1), U8(0), U8(vector->GetIndex(slot2)), // | 1547 B(LoadIC), R(1), U8(0), U8(vector->GetIndex(slot2)), // |
| 1548 B(Star), R(0), // | 1548 B(Star), R(0), // |
| 1549 B(Ldar), A(2, 3), // | 1549 B(Ldar), A(2, 3), // |
| 1550 B(Star), R(3), // | 1550 B(Star), R(3), // |
| 1551 B(Ldar), A(2, 3), // | 1551 B(Ldar), A(2, 3), // |
| 1552 B(Add), R(3), // | 1552 B(Add), R(3), // |
| 1553 B(Star), R(2), // | 1553 B(Star), R(2), // |
| 1554 B(Ldar), A(2, 3), // | 1554 B(Ldar), A(2, 3), // |
| 1555 B(Star), R(3), // | 1555 B(Star), R(3), // |
| 1556 B(CallIC), R(0), R(1), U8(3), U8(vector->GetIndex(slot1)), // | 1556 B(Call), R(0), R(1), U8(3), U8(vector->GetIndex(slot1)), // |
| 1557 B(Return), // | 1557 B(Return), // |
| 1558 }, | 1558 }, |
| 1559 1, | 1559 1, |
| 1560 {"func"}}, | 1560 {"func"}}, |
| 1561 {"function f(a) {\n" | 1561 {"function f(a) {\n" |
| 1562 " a.func;\n" REPEAT_127( | 1562 " a.func;\n" REPEAT_127( |
| 1563 SPACE, " a.func;\n") " return a.func(); }\nf(" FUNC_ARG ")", | 1563 SPACE, " a.func;\n") " return a.func(); }\nf(" FUNC_ARG ")", |
| 1564 2 * kPointerSize, | 1564 2 * kPointerSize, |
| 1565 2, | 1565 2, |
| 1566 1047, | 1566 1047, |
| 1567 { | 1567 { |
| 1568 B(StackCheck), // | 1568 B(StackCheck), // |
| 1569 B(Ldar), A(1, 2), // | 1569 B(Ldar), A(1, 2), // |
| 1570 B(Star), R(0), // | 1570 B(Star), R(0), // |
| 1571 B(LoadIC), R(0), U8(0), U8(wide_idx += 2), // | 1571 B(LoadIC), R(0), U8(0), U8(wide_idx += 2), // |
| 1572 REPEAT_127(COMMA, // | 1572 REPEAT_127(COMMA, // |
| 1573 B(Ldar), A(1, 2), // | 1573 B(Ldar), A(1, 2), // |
| 1574 B(Star), R(0), // | 1574 B(Star), R(0), // |
| 1575 B(LoadIC), R(0), U8(0), U8((wide_idx += 2))), // | 1575 B(LoadIC), R(0), U8(0), U8((wide_idx += 2))), // |
| 1576 B(Ldar), A(1, 2), // | 1576 B(Ldar), A(1, 2), // |
| 1577 B(Star), R(1), // | 1577 B(Star), R(1), // |
| 1578 B(LoadICWide), R(1), U16(0), U16(wide_idx + 4), // | 1578 B(LoadICWide), R(1), U16(0), U16(wide_idx + 4), // |
| 1579 B(Star), R(0), // | 1579 B(Star), R(0), // |
| 1580 B(CallICWide), R16(0), R16(1), U16(1), U16(wide_idx + 2), // | 1580 B(CallWide), R16(0), R16(1), U16(1), U16(wide_idx + 2), // |
| 1581 B(Return), // | 1581 B(Return), // |
| 1582 }, | 1582 }, |
| 1583 1, | 1583 1, |
| 1584 {"func"}}, | 1584 {"func"}}, |
| 1585 }; | 1585 }; |
| 1586 // clang-format on | 1586 // clang-format on |
| 1587 | 1587 |
| 1588 for (size_t i = 0; i < arraysize(snippets); i++) { | 1588 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1589 Handle<BytecodeArray> bytecode_array = | 1589 Handle<BytecodeArray> bytecode_array = |
| 1590 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); | 1590 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1819 Handle<i::TypeFeedbackVector> vector = | 1819 Handle<i::TypeFeedbackVector> vector = |
| 1820 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); | 1820 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); |
| 1821 | 1821 |
| 1822 // clang-format off | 1822 // clang-format off |
| 1823 ExpectedSnippet<const char*> snippets[] = { | 1823 ExpectedSnippet<const char*> snippets[] = { |
| 1824 {"function t() { }\nfunction f() { return t(); }\nf()", | 1824 {"function t() { }\nfunction f() { return t(); }\nf()", |
| 1825 2 * kPointerSize, | 1825 2 * kPointerSize, |
| 1826 1, | 1826 1, |
| 1827 15, | 1827 15, |
| 1828 { | 1828 { |
| 1829 B(StackCheck), // | 1829 B(StackCheck), // |
| 1830 B(LdaUndefined), // | 1830 B(LdaUndefined), // |
| 1831 B(Star), R(1), // | 1831 B(Star), R(1), // |
| 1832 B(LdaGlobal), U8(0), U8(vector->GetIndex(slot2)), // | 1832 B(LdaGlobal), U8(0), U8(vector->GetIndex(slot2)), // |
| 1833 B(Star), R(0), // | 1833 B(Star), R(0), // |
| 1834 B(CallIC), R(0), R(1), U8(1), U8(vector->GetIndex(slot1)), // | 1834 B(Call), R(0), R(1), U8(1), U8(vector->GetIndex(slot1)), // |
| 1835 B(Return) // | 1835 B(Return) // |
| 1836 }, | 1836 }, |
| 1837 1, | 1837 1, |
| 1838 {"t"}}, | 1838 {"t"}}, |
| 1839 {"function t(a, b, c) { }\nfunction f() { return t(1, 2, 3); }\nf()", | 1839 {"function t(a, b, c) { }\nfunction f() { return t(1, 2, 3); }\nf()", |
| 1840 5 * kPointerSize, | 1840 5 * kPointerSize, |
| 1841 1, | 1841 1, |
| 1842 27, | 1842 27, |
| 1843 { | 1843 { |
| 1844 B(StackCheck), // | 1844 B(StackCheck), // |
| 1845 B(LdaUndefined), // | 1845 B(LdaUndefined), // |
| 1846 B(Star), R(1), // | 1846 B(Star), R(1), // |
| 1847 B(LdaGlobal), U8(0), U8(vector->GetIndex(slot2)), // | 1847 B(LdaGlobal), U8(0), U8(vector->GetIndex(slot2)), // |
| 1848 B(Star), R(0), // | 1848 B(Star), R(0), // |
| 1849 B(LdaSmi8), U8(1), // | 1849 B(LdaSmi8), U8(1), // |
| 1850 B(Star), R(2), // | 1850 B(Star), R(2), // |
| 1851 B(LdaSmi8), U8(2), // | 1851 B(LdaSmi8), U8(2), // |
| 1852 B(Star), R(3), // | 1852 B(Star), R(3), // |
| 1853 B(LdaSmi8), U8(3), // | 1853 B(LdaSmi8), U8(3), // |
| 1854 B(Star), R(4), // | 1854 B(Star), R(4), // |
| 1855 B(CallIC), R(0), R(1), U8(4), U8(vector->GetIndex(slot1)), // | 1855 B(Call), R(0), R(1), U8(4), U8(vector->GetIndex(slot1)), // |
| 1856 B(Return) // | 1856 B(Return) // |
| 1857 }, | 1857 }, |
| 1858 1, | 1858 1, |
| 1859 {"t"}}, | 1859 {"t"}}, |
| 1860 }; | 1860 }; |
| 1861 // clang-format on | 1861 // clang-format on |
| 1862 | 1862 |
| 1863 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1863 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); |
| 1864 for (size_t i = 0; i < num_snippets; i++) { | 1864 for (size_t i = 0; i < num_snippets; i++) { |
| 1865 Handle<BytecodeArray> bytecode_array = | 1865 Handle<BytecodeArray> bytecode_array = |
| 1866 helper.MakeBytecode(snippets[i].code_snippet, "f"); | 1866 helper.MakeBytecode(snippets[i].code_snippet, "f"); |
| (...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2293 B(LdaConstant), U8(0), // | 2293 B(LdaConstant), U8(0), // |
| 2294 B(Star), R(1), // | 2294 B(Star), R(1), // |
| 2295 B(LdaZero), // | 2295 B(LdaZero), // |
| 2296 B(Star), R(2), // | 2296 B(Star), R(2), // |
| 2297 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(1), U8(2), // | 2297 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(1), U8(2), // |
| 2298 B(StackCheck), // | 2298 B(StackCheck), // |
| 2299 B(LdaUndefined), // | 2299 B(LdaUndefined), // |
| 2300 B(Star), R(2), // | 2300 B(Star), R(2), // |
| 2301 B(LdaGlobal), U8(1), U8(load_vector->GetIndex(load_slot_1)), // | 2301 B(LdaGlobal), U8(1), U8(load_vector->GetIndex(load_slot_1)), // |
| 2302 B(Star), R(1), // | 2302 B(Star), R(1), // |
| 2303 B(CallIC), R(1), R(2), U8(1), // | 2303 B(Call), R(1), R(2), U8(1), // |
| 2304 /* */ U8(load_vector->GetIndex(call_slot_1)), // | 2304 /* */ U8(load_vector->GetIndex(call_slot_1)), // |
| 2305 B(Star), R(0), // | 2305 B(Star), R(0), // |
| 2306 B(Return) // | 2306 B(Return) // |
| 2307 }, | 2307 }, |
| 2308 2, | 2308 2, |
| 2309 {InstanceType::FIXED_ARRAY_TYPE, | 2309 {InstanceType::FIXED_ARRAY_TYPE, |
| 2310 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | 2310 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
| 2311 }; | 2311 }; |
| 2312 // clang-format on | 2312 // clang-format on |
| 2313 | 2313 |
| (...skipping 1453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3767 B(CreateClosure), U8(0), U8(0), // | 3767 B(CreateClosure), U8(0), U8(0), // |
| 3768 B(Return) // | 3768 B(Return) // |
| 3769 }, | 3769 }, |
| 3770 1, | 3770 1, |
| 3771 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 3771 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| 3772 {"return (function(){ })()", | 3772 {"return (function(){ })()", |
| 3773 2 * kPointerSize, | 3773 2 * kPointerSize, |
| 3774 1, | 3774 1, |
| 3775 15, | 3775 15, |
| 3776 { | 3776 { |
| 3777 B(StackCheck), // | 3777 B(StackCheck), // |
| 3778 B(LdaUndefined), // | 3778 B(LdaUndefined), // |
| 3779 B(Star), R(1), // | 3779 B(Star), R(1), // |
| 3780 B(CreateClosure), U8(0), U8(0), // | 3780 B(CreateClosure), U8(0), U8(0), // |
| 3781 B(Star), R(0), // | 3781 B(Star), R(0), // |
| 3782 B(CallIC), R(0), R(1), U8(1), U8(vector->GetIndex(slot)), // | 3782 B(Call), R(0), R(1), U8(1), U8(vector->GetIndex(slot)), // |
| 3783 B(Return) // | 3783 B(Return) // |
| 3784 }, | 3784 }, |
| 3785 1, | 3785 1, |
| 3786 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 3786 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| 3787 {"return (function(x){ return x; })(1)", | 3787 {"return (function(x){ return x; })(1)", |
| 3788 3 * kPointerSize, | 3788 3 * kPointerSize, |
| 3789 1, | 3789 1, |
| 3790 19, | 3790 19, |
| 3791 { | 3791 { |
| 3792 B(StackCheck), // | 3792 B(StackCheck), // |
| 3793 B(LdaUndefined), // | 3793 B(LdaUndefined), // |
| 3794 B(Star), R(1), // | 3794 B(Star), R(1), // |
| 3795 B(CreateClosure), U8(0), U8(0), // | 3795 B(CreateClosure), U8(0), U8(0), // |
| 3796 B(Star), R(0), // | 3796 B(Star), R(0), // |
| 3797 B(LdaSmi8), U8(1), // | 3797 B(LdaSmi8), U8(1), // |
| 3798 B(Star), R(2), // | 3798 B(Star), R(2), // |
| 3799 B(CallIC), R(0), R(1), U8(2), U8(vector->GetIndex(slot)), // | 3799 B(Call), R(0), R(1), U8(2), U8(vector->GetIndex(slot)), // |
| 3800 B(Return) // | 3800 B(Return) // |
| 3801 }, | 3801 }, |
| 3802 1, | 3802 1, |
| 3803 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 3803 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| 3804 }; | 3804 }; |
| 3805 // clang-format on | 3805 // clang-format on |
| 3806 | 3806 |
| 3807 for (size_t i = 0; i < arraysize(snippets); i++) { | 3807 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 3808 Handle<BytecodeArray> bytecode_array = | 3808 Handle<BytecodeArray> bytecode_array = |
| 3809 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 3809 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
| 3810 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 3810 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3854 1, | 3854 1, |
| 3855 23, | 3855 23, |
| 3856 { | 3856 { |
| 3857 B(StackCheck), // | 3857 B(StackCheck), // |
| 3858 B(CreateRegExpLiteral), U8(0), U8(0), U8(0), // | 3858 B(CreateRegExpLiteral), U8(0), U8(0), U8(0), // |
| 3859 B(Star), R(1), // | 3859 B(Star), R(1), // |
| 3860 B(LoadIC), R(1), U8(1), U8(vector->GetIndex(slot2)), // | 3860 B(LoadIC), R(1), U8(1), U8(vector->GetIndex(slot2)), // |
| 3861 B(Star), R(0), // | 3861 B(Star), R(0), // |
| 3862 B(LdaConstant), U8(2), // | 3862 B(LdaConstant), U8(2), // |
| 3863 B(Star), R(2), // | 3863 B(Star), R(2), // |
| 3864 B(CallIC), R(0), R(1), U8(2), U8(vector->GetIndex(slot1)), // | 3864 B(Call), R(0), R(1), U8(2), U8(vector->GetIndex(slot1)), // |
| 3865 B(Return), // | 3865 B(Return), // |
| 3866 }, | 3866 }, |
| 3867 3, | 3867 3, |
| 3868 {"ab+d", "exec", "abdd"}}, | 3868 {"ab+d", "exec", "abdd"}}, |
| 3869 }; | 3869 }; |
| 3870 // clang-format on | 3870 // clang-format on |
| 3871 | 3871 |
| 3872 for (size_t i = 0; i < arraysize(snippets); i++) { | 3872 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 3873 Handle<BytecodeArray> bytecode_array = | 3873 Handle<BytecodeArray> bytecode_array = |
| 3874 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 3874 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
| (...skipping 1154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5029 B(CreateClosure), U8(0), U8(0), // | 5029 B(CreateClosure), U8(0), U8(0), // |
| 5030 B(Return), // | 5030 B(Return), // |
| 5031 }, | 5031 }, |
| 5032 1, | 5032 1, |
| 5033 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 5033 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| 5034 {"var a; (function() { a = 2; })(); return a;", | 5034 {"var a; (function() { a = 2; })(); return a;", |
| 5035 3 * kPointerSize, | 5035 3 * kPointerSize, |
| 5036 1, | 5036 1, |
| 5037 25, | 5037 25, |
| 5038 { | 5038 { |
| 5039 B(CallRuntime), U16(Runtime::kNewFunctionContext), // | 5039 B(CallRuntime), U16(Runtime::kNewFunctionContext), // |
| 5040 /* */ R(closure), U8(1), // | 5040 /* */ R(closure), U8(1), // |
| 5041 B(PushContext), R(0), // | 5041 B(PushContext), R(0), // |
| 5042 B(StackCheck), // | 5042 B(StackCheck), // |
| 5043 B(LdaUndefined), // | 5043 B(LdaUndefined), // |
| 5044 B(Star), R(2), // | 5044 B(Star), R(2), // |
| 5045 B(CreateClosure), U8(0), U8(0), // | 5045 B(CreateClosure), U8(0), U8(0), // |
| 5046 B(Star), R(1), // | 5046 B(Star), R(1), // |
| 5047 B(CallIC), R(1), R(2), U8(1), U8(vector->GetIndex(slot)), // | 5047 B(Call), R(1), R(2), U8(1), U8(vector->GetIndex(slot)), // |
| 5048 B(LdaContextSlot), R(context), U8(first_context_slot), // | 5048 B(LdaContextSlot), R(context), U8(first_context_slot), // |
| 5049 B(Return), // | 5049 B(Return), // |
| 5050 }, | 5050 }, |
| 5051 1, | 5051 1, |
| 5052 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 5052 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| 5053 {"'use strict'; let a = 1; { let b = 2; return function() { a + b; }; }", | 5053 {"'use strict'; let a = 1; { let b = 2; return function() { a + b; }; }", |
| 5054 4 * kPointerSize, | 5054 4 * kPointerSize, |
| 5055 1, | 5055 1, |
| 5056 47, | 5056 47, |
| 5057 { | 5057 { |
| 5058 B(CallRuntime), U16(Runtime::kNewFunctionContext), // | 5058 B(CallRuntime), U16(Runtime::kNewFunctionContext), // |
| 5059 /* */ R(closure), U8(1), // | 5059 /* */ R(closure), U8(1), // |
| (...skipping 20 matching lines...) Expand all Loading... |
| 5080 2, | 5080 2, |
| 5081 {InstanceType::FIXED_ARRAY_TYPE, | 5081 {InstanceType::FIXED_ARRAY_TYPE, |
| 5082 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 5082 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| 5083 {"'use strict';\n" | 5083 {"'use strict';\n" |
| 5084 REPEAT_249_UNIQUE_VARS() | 5084 REPEAT_249_UNIQUE_VARS() |
| 5085 "eval();" | 5085 "eval();" |
| 5086 "var b = 100;" | 5086 "var b = 100;" |
| 5087 "return b", | 5087 "return b", |
| 5088 3 * kPointerSize, | 5088 3 * kPointerSize, |
| 5089 1, | 5089 1, |
| 5090 1041, | 5090 1042, |
| 5091 { | 5091 { |
| 5092 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // | 5092 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // |
| 5093 /* */ U8(1), // | 5093 /* */ U8(1), // |
| 5094 B(PushContext), R(0), // | 5094 B(PushContext), R(0), // |
| 5095 B(Ldar), THIS(1), // | 5095 B(Ldar), THIS(1), // |
| 5096 B(StaContextSlot), R(context), U8(first_context_slot), // | 5096 B(StaContextSlot), R(context), U8(first_context_slot), // |
| 5097 B(CreateUnmappedArguments), // | 5097 B(CreateUnmappedArguments), // |
| 5098 B(StaContextSlot), R(context), U8(first_context_slot + 1), // | 5098 B(StaContextSlot), R(context), U8(first_context_slot + 1), // |
| 5099 B(Ldar), R(new_target), // | 5099 B(Ldar), R(new_target), // |
| 5100 B(StaContextSlot), R(context), U8(first_context_slot + 2), // | 5100 B(StaContextSlot), R(context), U8(first_context_slot + 2), // |
| 5101 B(StackCheck), // | 5101 B(StackCheck), // |
| 5102 REPEAT_249(COMMA, // | 5102 REPEAT_249(COMMA, // |
| 5103 B(LdaZero), // | 5103 B(LdaZero), // |
| 5104 B(StaContextSlot), R(context), U8(wide_slot++)), // | 5104 B(StaContextSlot), R(context), U8(wide_slot++)), // |
| 5105 B(LdaUndefined), // | 5105 B(LdaUndefined), // |
| 5106 B(Star), R(2), // | 5106 B(Star), R(2), // |
| 5107 B(LdaGlobal), U8(0), U8(1), // | 5107 B(LdaGlobal), U8(0), U8(1), // |
| 5108 B(Star), R(1), // | 5108 B(Star), R(1), // |
| 5109 B(Call), R(1), R(2), U8(1), // | 5109 B(Call), R(1), R(2), U8(1), U8(0), // |
| 5110 B(LdaSmi8), U8(100), // | 5110 B(LdaSmi8), U8(100), // |
| 5111 B(StaContextSlotWide), R(context), U16(256), // | 5111 B(StaContextSlotWide), R(context), U16(256), // |
| 5112 B(LdaContextSlotWide), R(context), U16(256), // | 5112 B(LdaContextSlotWide), R(context), U16(256), // |
| 5113 B(Return), // | 5113 B(Return), // |
| 5114 }, | 5114 }, |
| 5115 1, | 5115 1, |
| 5116 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | 5116 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
| 5117 }; | 5117 }; |
| 5118 // clang-format on | 5118 // clang-format on |
| 5119 | 5119 |
| (...skipping 1197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6317 7 * kPointerSize, | 6317 7 * kPointerSize, |
| 6318 1, | 6318 1, |
| 6319 86, | 6319 86, |
| 6320 { | 6320 { |
| 6321 B(StackCheck), // | 6321 B(StackCheck), // |
| 6322 B(CreateArrayLiteral), U8(0), U8(0), U8(array_literal_flags), // | 6322 B(CreateArrayLiteral), U8(0), U8(0), U8(array_literal_flags), // |
| 6323 B(Star), R(5), // | 6323 B(Star), R(5), // |
| 6324 B(LdaConstant), U8(1), // | 6324 B(LdaConstant), U8(1), // |
| 6325 B(KeyedLoadIC), R(5), U8(vector->GetIndex(slot2)), // | 6325 B(KeyedLoadIC), R(5), U8(vector->GetIndex(slot2)), // |
| 6326 B(Star), R(4), // | 6326 B(Star), R(4), // |
| 6327 B(CallIC), R(4), R(5), U8(1), U8(vector->GetIndex(slot1)), // | 6327 B(Call), R(4), R(5), U8(1), U8(vector->GetIndex(slot1)), // |
| 6328 B(Star), R(1), // | 6328 B(Star), R(1), // |
| 6329 B(Ldar), R(1), // | 6329 B(Ldar), R(1), // |
| 6330 B(Star), R(6), // | 6330 B(Star), R(6), // |
| 6331 B(LoadIC), R(6), U8(2), U8(vector->GetIndex(slot4)), // | 6331 B(LoadIC), R(6), U8(2), U8(vector->GetIndex(slot4)), // |
| 6332 B(Star), R(5), // | 6332 B(Star), R(5), // |
| 6333 B(CallIC), R(5), R(6), U8(1), U8(vector->GetIndex(slot3)), // | 6333 B(Call), R(5), R(6), U8(1), U8(vector->GetIndex(slot3)), // |
| 6334 B(Star), R(2), // | 6334 B(Star), R(2), // |
| 6335 B(Star), R(4), // | 6335 B(Star), R(4), // |
| 6336 B(CallRuntime), U16(Runtime::kInlineIsJSReceiver), R(4), U8(1), // | 6336 B(CallRuntime), U16(Runtime::kInlineIsJSReceiver), R(4), U8(1), // |
| 6337 B(LogicalNot), // | 6337 B(LogicalNot), // |
| 6338 B(JumpIfFalse), U8(11), // | 6338 B(JumpIfFalse), U8(11), // |
| 6339 B(Ldar), R(2), // | 6339 B(Ldar), R(2), // |
| 6340 B(Star), R(4), // | 6340 B(Star), R(4), // |
| 6341 B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), // | 6341 B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), // |
| 6342 /* */ R(4), U8(1), // | 6342 /* */ R(4), U8(1), // |
| 6343 B(Ldar), R(2), // | 6343 B(Ldar), R(2), // |
| (...skipping 22 matching lines...) Expand all Loading... |
| 6366 1, | 6366 1, |
| 6367 85, | 6367 85, |
| 6368 { | 6368 { |
| 6369 B(StackCheck), // | 6369 B(StackCheck), // |
| 6370 B(LdaConstant), U8(0), // | 6370 B(LdaConstant), U8(0), // |
| 6371 B(Star), R(3), // | 6371 B(Star), R(3), // |
| 6372 B(Star), R(6), // | 6372 B(Star), R(6), // |
| 6373 B(LdaConstant), U8(1), // | 6373 B(LdaConstant), U8(1), // |
| 6374 B(KeyedLoadIC), R(6), U8(vector->GetIndex(slot2)), // | 6374 B(KeyedLoadIC), R(6), U8(vector->GetIndex(slot2)), // |
| 6375 B(Star), R(5), // | 6375 B(Star), R(5), // |
| 6376 B(CallIC), R(5), R(6), U8(1), U8(vector->GetIndex(slot1)), // | 6376 B(Call), R(5), R(6), U8(1), U8(vector->GetIndex(slot1)), // |
| 6377 B(Star), R(1), // | 6377 B(Star), R(1), // |
| 6378 B(Ldar), R(1), // | 6378 B(Ldar), R(1), // |
| 6379 B(Star), R(7), // | 6379 B(Star), R(7), // |
| 6380 B(LoadIC), R(7), U8(2), U8(vector->GetIndex(slot4)), // | 6380 B(LoadIC), R(7), U8(2), U8(vector->GetIndex(slot4)), // |
| 6381 B(Star), R(6), // | 6381 B(Star), R(6), // |
| 6382 B(CallIC), R(6), R(7), U8(1), U8(vector->GetIndex(slot3)), // | 6382 B(Call), R(6), R(7), U8(1), U8(vector->GetIndex(slot3)), // |
| 6383 B(Star), R(2), // | 6383 B(Star), R(2), // |
| 6384 B(Star), R(5), // | 6384 B(Star), R(5), // |
| 6385 B(CallRuntime), U16(Runtime::kInlineIsJSReceiver), R(5), U8(1), // | 6385 B(CallRuntime), U16(Runtime::kInlineIsJSReceiver), R(5), U8(1), // |
| 6386 B(LogicalNot), // | 6386 B(LogicalNot), // |
| 6387 B(JumpIfFalse), U8(11), // | 6387 B(JumpIfFalse), U8(11), // |
| 6388 B(Ldar), R(2), // | 6388 B(Ldar), R(2), // |
| 6389 B(Star), R(5), // | 6389 B(Star), R(5), // |
| 6390 B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), // | 6390 B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), // |
| 6391 /* */ R(5), U8(1), // | 6391 /* */ R(5), U8(1), // |
| 6392 B(Ldar), R(2), // | 6392 B(Ldar), R(2), // |
| (...skipping 24 matching lines...) Expand all Loading... |
| 6417 7 * kPointerSize, | 6417 7 * kPointerSize, |
| 6418 1, | 6418 1, |
| 6419 108, | 6419 108, |
| 6420 { | 6420 { |
| 6421 B(StackCheck), // | 6421 B(StackCheck), // |
| 6422 B(CreateArrayLiteral), U8(0), U8(0), U8(array_literal_flags), // | 6422 B(CreateArrayLiteral), U8(0), U8(0), U8(array_literal_flags), // |
| 6423 B(Star), R(5), // | 6423 B(Star), R(5), // |
| 6424 B(LdaConstant), U8(1), // | 6424 B(LdaConstant), U8(1), // |
| 6425 B(KeyedLoadIC), R(5), U8(vector->GetIndex(slot2)), // | 6425 B(KeyedLoadIC), R(5), U8(vector->GetIndex(slot2)), // |
| 6426 B(Star), R(4), // | 6426 B(Star), R(4), // |
| 6427 B(CallIC), R(4), R(5), U8(1), U8(vector->GetIndex(slot1)), // | 6427 B(Call), R(4), R(5), U8(1), U8(vector->GetIndex(slot1)), // |
| 6428 B(Star), R(1), // | 6428 B(Star), R(1), // |
| 6429 B(Ldar), R(1), // | 6429 B(Ldar), R(1), // |
| 6430 B(Star), R(6), // | 6430 B(Star), R(6), // |
| 6431 B(LoadIC), R(6), U8(2), U8(vector->GetIndex(slot4)), // | 6431 B(LoadIC), R(6), U8(2), U8(vector->GetIndex(slot4)), // |
| 6432 B(Star), R(5), // | 6432 B(Star), R(5), // |
| 6433 B(CallIC), R(5), R(6), U8(1), U8(vector->GetIndex(slot3)), // | 6433 B(Call), R(5), R(6), U8(1), U8(vector->GetIndex(slot3)), // |
| 6434 B(Star), R(2), // | 6434 B(Star), R(2), // |
| 6435 B(Star), R(4), // | 6435 B(Star), R(4), // |
| 6436 B(CallRuntime), U16(Runtime::kInlineIsJSReceiver), R(4), U8(1), // | 6436 B(CallRuntime), U16(Runtime::kInlineIsJSReceiver), R(4), U8(1), // |
| 6437 B(LogicalNot), // | 6437 B(LogicalNot), // |
| 6438 B(JumpIfFalse), U8(11), // | 6438 B(JumpIfFalse), U8(11), // |
| 6439 B(Ldar), R(2), // | 6439 B(Ldar), R(2), // |
| 6440 B(Star), R(4), // | 6440 B(Star), R(4), // |
| 6441 B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), // | 6441 B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), // |
| 6442 /* */ R(4), U8(1), // | 6442 /* */ R(4), U8(1), // |
| 6443 B(Ldar), R(2), // | 6443 B(Ldar), R(2), // |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6479 { | 6479 { |
| 6480 B(StackCheck), // | 6480 B(StackCheck), // |
| 6481 B(CreateObjectLiteral), U8(0), U8(0), U8(object_literal_flags), // | 6481 B(CreateObjectLiteral), U8(0), U8(0), U8(object_literal_flags), // |
| 6482 B(Star), R(3), // | 6482 B(Star), R(3), // |
| 6483 B(Star), R(2), // | 6483 B(Star), R(2), // |
| 6484 B(CreateArrayLiteral), U8(1), U8(1), U8(array_literal_flags), // | 6484 B(CreateArrayLiteral), U8(1), U8(1), U8(array_literal_flags), // |
| 6485 B(Star), R(4), // | 6485 B(Star), R(4), // |
| 6486 B(LdaConstant), U8(2), // | 6486 B(LdaConstant), U8(2), // |
| 6487 B(KeyedLoadIC), R(4), U8(vector->GetIndex(slot2)), // | 6487 B(KeyedLoadIC), R(4), U8(vector->GetIndex(slot2)), // |
| 6488 B(Star), R(3), // | 6488 B(Star), R(3), // |
| 6489 B(CallIC), R(3), R(4), U8(1), U8(vector->GetIndex(slot1)), // | 6489 B(Call), R(3), R(4), U8(1), U8(vector->GetIndex(slot1)), // |
| 6490 B(Star), R(0), // | 6490 B(Star), R(0), // |
| 6491 B(Ldar), R(0), // | 6491 B(Ldar), R(0), // |
| 6492 B(Star), R(5), // | 6492 B(Star), R(5), // |
| 6493 B(LoadIC), R(5), U8(3), U8(vector->GetIndex(slot4)), // | 6493 B(LoadIC), R(5), U8(3), U8(vector->GetIndex(slot4)), // |
| 6494 B(Star), R(4), // | 6494 B(Star), R(4), // |
| 6495 B(CallIC), R(4), R(5), U8(1), U8(vector->GetIndex(slot3)), // | 6495 B(Call), R(4), R(5), U8(1), U8(vector->GetIndex(slot3)), // |
| 6496 B(Star), R(1), // | 6496 B(Star), R(1), // |
| 6497 B(Star), R(3), // | 6497 B(Star), R(3), // |
| 6498 B(CallRuntime), U16(Runtime::kInlineIsJSReceiver), R(3), U8(1), // | 6498 B(CallRuntime), U16(Runtime::kInlineIsJSReceiver), R(3), U8(1), // |
| 6499 B(LogicalNot), // | 6499 B(LogicalNot), // |
| 6500 B(JumpIfFalse), U8(11), // | 6500 B(JumpIfFalse), U8(11), // |
| 6501 B(Ldar), R(1), // | 6501 B(Ldar), R(1), // |
| 6502 B(Star), R(3), // | 6502 B(Star), R(3), // |
| 6503 B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), // | 6503 B(CallRuntime), U16(Runtime::kThrowIteratorResultNotAnObject), // |
| 6504 /* */ R(3), U8(1), // | 6504 /* */ R(3), U8(1), // |
| 6505 B(Ldar), R(1), // | 6505 B(Ldar), R(1), // |
| (...skipping 927 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7433 int context = Register::current_context().index(); | 7433 int context = Register::current_context().index(); |
| 7434 int new_target = Register::new_target().index(); | 7434 int new_target = Register::new_target().index(); |
| 7435 | 7435 |
| 7436 int first_context_slot = Context::MIN_CONTEXT_SLOTS; | 7436 int first_context_slot = Context::MIN_CONTEXT_SLOTS; |
| 7437 | 7437 |
| 7438 // clang-format off | 7438 // clang-format off |
| 7439 ExpectedSnippet<const char*> snippets[] = { | 7439 ExpectedSnippet<const char*> snippets[] = { |
| 7440 {"return eval('1;');", | 7440 {"return eval('1;');", |
| 7441 9 * kPointerSize, | 7441 9 * kPointerSize, |
| 7442 1, | 7442 1, |
| 7443 64, | 7443 65, |
| 7444 { | 7444 { |
| 7445 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // | 7445 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // |
| 7446 /* */ U8(1), // | 7446 /* */ U8(1), // |
| 7447 B(PushContext), R(0), // | 7447 B(PushContext), R(0), // |
| 7448 B(Ldar), THIS(1), // | 7448 B(Ldar), THIS(1), // |
| 7449 B(StaContextSlot), R(context), U8(first_context_slot), // | 7449 B(StaContextSlot), R(context), U8(first_context_slot), // |
| 7450 B(CreateMappedArguments), // | 7450 B(CreateMappedArguments), // |
| 7451 B(StaContextSlot), R(context), U8(first_context_slot + 1), // | 7451 B(StaContextSlot), R(context), U8(first_context_slot + 1), // |
| 7452 B(Ldar), R(new_target), // | 7452 B(Ldar), R(new_target), // |
| 7453 B(StaContextSlot), R(context), U8(first_context_slot + 2), // | 7453 B(StaContextSlot), R(context), U8(first_context_slot + 2), // |
| 7454 B(StackCheck), // | 7454 B(StackCheck), // |
| 7455 B(LdaConstant), U8(0), // | 7455 B(LdaConstant), U8(0), // |
| 7456 B(Star), R(3), // | 7456 B(Star), R(3), // |
| 7457 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlotForCall), // | 7457 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlotForCall), // |
| 7458 /* */ R(3), U8(1), R(1), // | 7458 /* */ R(3), U8(1), R(1), // |
| 7459 B(LdaConstant), U8(1), // | 7459 B(LdaConstant), U8(1), // |
| 7460 B(Star), R(3), // | 7460 B(Star), R(3), // |
| 7461 B(Mov), R(1), R(4), // | 7461 B(Mov), R(1), R(4), // |
| 7462 B(Mov), R(3), R(5), // | 7462 B(Mov), R(3), R(5), // |
| 7463 B(Mov), R(closure), R(6), // | 7463 B(Mov), R(closure), R(6), // |
| 7464 B(LdaZero), // | 7464 B(LdaZero), // |
| 7465 B(Star), R(7), // | 7465 B(Star), R(7), // |
| 7466 B(LdaSmi8), U8(10), // | 7466 B(LdaSmi8), U8(10), // |
| 7467 B(Star), R(8), // | 7467 B(Star), R(8), // |
| 7468 B(CallRuntime), U16(Runtime::kResolvePossiblyDirectEval), R(4), // | 7468 B(CallRuntime), U16(Runtime::kResolvePossiblyDirectEval), R(4), // |
| 7469 /* */ U8(5), // | 7469 /* */ U8(5), // |
| 7470 B(Star), R(1), // | 7470 B(Star), R(1), // |
| 7471 B(Call), R(1), R(2), U8(2), // | 7471 B(Call), R(1), R(2), U8(2), U8(0), // |
| 7472 B(Return), // | 7472 B(Return), // |
| 7473 }, | 7473 }, |
| 7474 2, | 7474 2, |
| 7475 {"eval", "1;"}}, | 7475 {"eval", "1;"}}, |
| 7476 }; | 7476 }; |
| 7477 // clang-format on | 7477 // clang-format on |
| 7478 | 7478 |
| 7479 for (size_t i = 0; i < arraysize(snippets); i++) { | 7479 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 7480 Handle<BytecodeArray> bytecode_array = | 7480 Handle<BytecodeArray> bytecode_array = |
| 7481 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 7481 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
| 7482 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 7482 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 7483 } | 7483 } |
| 7484 } | 7484 } |
| 7485 | 7485 |
| 7486 | 7486 |
| 7487 TEST(LookupSlot) { | 7487 TEST(LookupSlot) { |
| 7488 InitializedHandleScope handle_scope; | 7488 InitializedHandleScope handle_scope; |
| 7489 BytecodeGeneratorHelper helper; | 7489 BytecodeGeneratorHelper helper; |
| 7490 | 7490 |
| 7491 int closure = Register::function_closure().index(); | 7491 int closure = Register::function_closure().index(); |
| 7492 int context = Register::current_context().index(); | 7492 int context = Register::current_context().index(); |
| 7493 int first_context_slot = Context::MIN_CONTEXT_SLOTS; | 7493 int first_context_slot = Context::MIN_CONTEXT_SLOTS; |
| 7494 int new_target = Register::new_target().index(); | 7494 int new_target = Register::new_target().index(); |
| 7495 | 7495 |
| 7496 // clang-format off | 7496 // clang-format off |
| 7497 ExpectedSnippet<const char*> snippets[] = { | 7497 ExpectedSnippet<const char*> snippets[] = { |
| 7498 {"eval('var x = 10;'); return x;", | 7498 {"eval('var x = 10;'); return x;", |
| 7499 9 * kPointerSize, | 7499 9 * kPointerSize, |
| 7500 1, | 7500 1, |
| 7501 66, | 7501 67, |
| 7502 { | 7502 { |
| 7503 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // | 7503 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // |
| 7504 /* */ U8(1), // | 7504 /* */ U8(1), // |
| 7505 B(PushContext), R(0), // | 7505 B(PushContext), R(0), // |
| 7506 B(Ldar), THIS(1), // | 7506 B(Ldar), THIS(1), // |
| 7507 B(StaContextSlot), R(context), U8(first_context_slot), // | 7507 B(StaContextSlot), R(context), U8(first_context_slot), // |
| 7508 B(CreateMappedArguments), // | 7508 B(CreateMappedArguments), // |
| 7509 B(StaContextSlot), R(context), U8(first_context_slot + 1), // | 7509 B(StaContextSlot), R(context), U8(first_context_slot + 1), // |
| 7510 B(Ldar), R(new_target), // | 7510 B(Ldar), R(new_target), // |
| 7511 B(StaContextSlot), R(context), U8(first_context_slot + 2), // | 7511 B(StaContextSlot), R(context), U8(first_context_slot + 2), // |
| 7512 B(StackCheck), // | 7512 B(StackCheck), // |
| 7513 B(LdaConstant), U8(0), // | 7513 B(LdaConstant), U8(0), // |
| 7514 B(Star), R(3), // | 7514 B(Star), R(3), // |
| 7515 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlotForCall), // | 7515 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlotForCall), // |
| 7516 R(3), U8(1), R(1), // | 7516 R(3), U8(1), R(1), // |
| 7517 B(LdaConstant), U8(1), // | 7517 B(LdaConstant), U8(1), // |
| 7518 B(Star), R(3), // | 7518 B(Star), R(3), // |
| 7519 B(Mov), R(1), R(4), // | 7519 B(Mov), R(1), R(4), // |
| 7520 B(Mov), R(3), R(5), // | 7520 B(Mov), R(3), R(5), // |
| 7521 B(Mov), R(closure), R(6), // | 7521 B(Mov), R(closure), R(6), // |
| 7522 B(LdaZero), // | 7522 B(LdaZero), // |
| 7523 B(Star), R(7), // | 7523 B(Star), R(7), // |
| 7524 B(LdaSmi8), U8(10), // | 7524 B(LdaSmi8), U8(10), // |
| 7525 B(Star), R(8), // | 7525 B(Star), R(8), // |
| 7526 B(CallRuntime), U16(Runtime::kResolvePossiblyDirectEval), R(4), // | 7526 B(CallRuntime), U16(Runtime::kResolvePossiblyDirectEval), R(4), // |
| 7527 U8(5), // | 7527 U8(5), // |
| 7528 B(Star), R(1), // | 7528 B(Star), R(1), // |
| 7529 B(Call), R(1), R(2), U8(2), // | 7529 B(Call), R(1), R(2), U8(2), U8(0), // |
| 7530 B(LdaLookupSlot), U8(2), // | 7530 B(LdaLookupSlot), U8(2), // |
| 7531 B(Return), // | 7531 B(Return), // |
| 7532 }, | 7532 }, |
| 7533 3, | 7533 3, |
| 7534 {"eval", "var x = 10;", "x"}}, | 7534 {"eval", "var x = 10;", "x"}}, |
| 7535 {"eval('var x = 10;'); return typeof x;", | 7535 {"eval('var x = 10;'); return typeof x;", |
| 7536 9 * kPointerSize, | 7536 9 * kPointerSize, |
| 7537 1, | 7537 1, |
| 7538 67, | 7538 68, |
| 7539 { | 7539 { |
| 7540 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // | 7540 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // |
| 7541 /* */ U8(1), // | 7541 /* */ U8(1), // |
| 7542 B(PushContext), R(0), // | 7542 B(PushContext), R(0), // |
| 7543 B(Ldar), THIS(1), // | 7543 B(Ldar), THIS(1), // |
| 7544 B(StaContextSlot), R(context), U8(first_context_slot), // | 7544 B(StaContextSlot), R(context), U8(first_context_slot), // |
| 7545 B(CreateMappedArguments), // | 7545 B(CreateMappedArguments), // |
| 7546 B(StaContextSlot), R(context), U8(first_context_slot + 1), // | 7546 B(StaContextSlot), R(context), U8(first_context_slot + 1), // |
| 7547 B(Ldar), R(new_target), // | 7547 B(Ldar), R(new_target), // |
| 7548 B(StaContextSlot), R(context), U8(first_context_slot + 2), // | 7548 B(StaContextSlot), R(context), U8(first_context_slot + 2), // |
| 7549 B(StackCheck), // | 7549 B(StackCheck), // |
| 7550 B(LdaConstant), U8(0), // | 7550 B(LdaConstant), U8(0), // |
| 7551 B(Star), R(3), // | 7551 B(Star), R(3), // |
| 7552 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlotForCall), // | 7552 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlotForCall), // |
| 7553 /* */ R(3), U8(1), R(1), // | 7553 /* */ R(3), U8(1), R(1), // |
| 7554 B(LdaConstant), U8(1), // | 7554 B(LdaConstant), U8(1), // |
| 7555 B(Star), R(3), // | 7555 B(Star), R(3), // |
| 7556 B(Mov), R(1), R(4), // | 7556 B(Mov), R(1), R(4), // |
| 7557 B(Mov), R(3), R(5), // | 7557 B(Mov), R(3), R(5), // |
| 7558 B(Mov), R(closure), R(6), // | 7558 B(Mov), R(closure), R(6), // |
| 7559 B(LdaZero), // | 7559 B(LdaZero), // |
| 7560 B(Star), R(7), // | 7560 B(Star), R(7), // |
| 7561 B(LdaSmi8), U8(10), // | 7561 B(LdaSmi8), U8(10), // |
| 7562 B(Star), R(8), // | 7562 B(Star), R(8), // |
| 7563 B(CallRuntime), U16(Runtime::kResolvePossiblyDirectEval), R(4), // | 7563 B(CallRuntime), U16(Runtime::kResolvePossiblyDirectEval), R(4), // |
| 7564 /* */ U8(5), // | 7564 /* */ U8(5), // |
| 7565 B(Star), R(1), // | 7565 B(Star), R(1), // |
| 7566 B(Call), R(1), R(2), U8(2), // | 7566 B(Call), R(1), R(2), U8(2), U8(0), // |
| 7567 B(LdaLookupSlotInsideTypeof), U8(2), // | 7567 B(LdaLookupSlotInsideTypeof), U8(2), // |
| 7568 B(TypeOf), // | 7568 B(TypeOf), // |
| 7569 B(Return), // | 7569 B(Return), // |
| 7570 }, | 7570 }, |
| 7571 3, | 7571 3, |
| 7572 {"eval", "var x = 10;", "x"}}, | 7572 {"eval", "var x = 10;", "x"}}, |
| 7573 {"x = 20; return eval('');", | 7573 {"x = 20; return eval('');", |
| 7574 9 * kPointerSize, | 7574 9 * kPointerSize, |
| 7575 1, | 7575 1, |
| 7576 68, | 7576 69, |
| 7577 { | 7577 { |
| 7578 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // | 7578 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // |
| 7579 U8(1), // | 7579 U8(1), // |
| 7580 B(PushContext), R(0), // | 7580 B(PushContext), R(0), // |
| 7581 B(Ldar), THIS(1), // | 7581 B(Ldar), THIS(1), // |
| 7582 B(StaContextSlot), R(context), U8(first_context_slot), // | 7582 B(StaContextSlot), R(context), U8(first_context_slot), // |
| 7583 B(CreateMappedArguments), // | 7583 B(CreateMappedArguments), // |
| 7584 B(StaContextSlot), R(context), U8(first_context_slot + 1), // | 7584 B(StaContextSlot), R(context), U8(first_context_slot + 1), // |
| 7585 B(Ldar), R(new_target), // | 7585 B(Ldar), R(new_target), // |
| 7586 B(StaContextSlot), R(context), U8(first_context_slot + 2), // | 7586 B(StaContextSlot), R(context), U8(first_context_slot + 2), // |
| 7587 B(StackCheck), // | 7587 B(StackCheck), // |
| 7588 B(LdaSmi8), U8(20), // | 7588 B(LdaSmi8), U8(20), // |
| 7589 B(StaLookupSlotSloppy), U8(0), // | 7589 B(StaLookupSlotSloppy), U8(0), // |
| 7590 B(LdaConstant), U8(1), // | 7590 B(LdaConstant), U8(1), // |
| 7591 B(Star), R(3), // | 7591 B(Star), R(3), // |
| 7592 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlotForCall), // | 7592 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlotForCall), // |
| 7593 /* */ R(3), U8(1), R(1), // | 7593 /* */ R(3), U8(1), R(1), // |
| 7594 B(LdaConstant), U8(2), // | 7594 B(LdaConstant), U8(2), // |
| 7595 B(Star), R(3), // | 7595 B(Star), R(3), // |
| 7596 B(Mov), R(1), R(4), // | 7596 B(Mov), R(1), R(4), // |
| 7597 B(Mov), R(3), R(5), // | 7597 B(Mov), R(3), R(5), // |
| 7598 B(Mov), R(closure), R(6), // | 7598 B(Mov), R(closure), R(6), // |
| 7599 B(LdaZero), // | 7599 B(LdaZero), // |
| 7600 B(Star), R(7), // | 7600 B(Star), R(7), // |
| 7601 B(LdaSmi8), U8(10), // | 7601 B(LdaSmi8), U8(10), // |
| 7602 B(Star), R(8), // | 7602 B(Star), R(8), // |
| 7603 B(CallRuntime), U16(Runtime::kResolvePossiblyDirectEval), R(4), // | 7603 B(CallRuntime), U16(Runtime::kResolvePossiblyDirectEval), R(4), // |
| 7604 /* */ U8(5), // | 7604 /* */ U8(5), // |
| 7605 B(Star), R(1), // | 7605 B(Star), R(1), // |
| 7606 B(Call), R(1), R(2), U8(2), // | 7606 B(Call), R(1), R(2), U8(2), U8(0), // |
| 7607 B(Return), // | 7607 B(Return), // |
| 7608 }, | 7608 }, |
| 7609 3, | 7609 3, |
| 7610 {"x", "eval", ""}}, | 7610 {"x", "eval", ""}}, |
| 7611 }; | 7611 }; |
| 7612 // clang-format on | 7612 // clang-format on |
| 7613 | 7613 |
| 7614 for (size_t i = 0; i < arraysize(snippets); i++) { | 7614 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 7615 Handle<BytecodeArray> bytecode_array = | 7615 Handle<BytecodeArray> bytecode_array = |
| 7616 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 7616 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 7634 | 7634 |
| 7635 int closure = Register::function_closure().index(); | 7635 int closure = Register::function_closure().index(); |
| 7636 int context = Register::current_context().index(); | 7636 int context = Register::current_context().index(); |
| 7637 int new_target = Register::new_target().index(); | 7637 int new_target = Register::new_target().index(); |
| 7638 | 7638 |
| 7639 // clang-format off | 7639 // clang-format off |
| 7640 ExpectedSnippet<InstanceType> snippets[] = { | 7640 ExpectedSnippet<InstanceType> snippets[] = { |
| 7641 {"g = function(){}; eval(''); return g();", | 7641 {"g = function(){}; eval(''); return g();", |
| 7642 9 * kPointerSize, | 7642 9 * kPointerSize, |
| 7643 1, | 7643 1, |
| 7644 84, | 7644 85, |
| 7645 { | 7645 { |
| 7646 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // | 7646 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // |
| 7647 /* */ U8(1), // | 7647 /* */ U8(1), // |
| 7648 B(PushContext), R(0), // | 7648 B(PushContext), R(0), // |
| 7649 B(Ldar), THIS(1), // | 7649 B(Ldar), THIS(1), // |
| 7650 B(StaContextSlot), R(context), U8(4), // | 7650 B(StaContextSlot), R(context), U8(4), // |
| 7651 B(CreateMappedArguments), // | 7651 B(CreateMappedArguments), // |
| 7652 B(StaContextSlot), R(context), U8(5), // | 7652 B(StaContextSlot), R(context), U8(5), // |
| 7653 B(Ldar), R(new_target), // | 7653 B(Ldar), R(new_target), // |
| 7654 B(StaContextSlot), R(context), U8(6), // | 7654 B(StaContextSlot), R(context), U8(6), // |
| 7655 B(StackCheck), // | 7655 B(StackCheck), // |
| 7656 B(CreateClosure), U8(0), U8(0), // | 7656 B(CreateClosure), U8(0), U8(0), // |
| 7657 B(StaLookupSlotSloppy), U8(1), // | 7657 B(StaLookupSlotSloppy), U8(1), // |
| 7658 B(LdaConstant), U8(2), // | 7658 B(LdaConstant), U8(2), // |
| 7659 B(Star), R(3), // | 7659 B(Star), R(3), // |
| 7660 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlotForCall), // | 7660 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlotForCall), // |
| 7661 R(3), U8(1), R(1), // | 7661 R(3), U8(1), R(1), // |
| 7662 B(LdaConstant), U8(3), // | 7662 B(LdaConstant), U8(3), // |
| 7663 B(Star), R(3), // | 7663 B(Star), R(3), // |
| 7664 B(Mov), R(1), R(4), // | 7664 B(Mov), R(1), R(4), // |
| 7665 B(Mov), R(3), R(5), // | 7665 B(Mov), R(3), R(5), // |
| 7666 B(Mov), R(closure), R(6), // | 7666 B(Mov), R(closure), R(6), // |
| 7667 B(LdaZero), // | 7667 B(LdaZero), // |
| 7668 B(Star), R(7), // | 7668 B(Star), R(7), // |
| 7669 B(LdaSmi8), U8(10), // | 7669 B(LdaSmi8), U8(10), // |
| 7670 B(Star), R(8), // | 7670 B(Star), R(8), // |
| 7671 B(CallRuntime), U16(Runtime::kResolvePossiblyDirectEval), R(4), // | 7671 B(CallRuntime), U16(Runtime::kResolvePossiblyDirectEval), R(4), // |
| 7672 U8(5), // | 7672 U8(5), // |
| 7673 B(Star), R(1), // | 7673 B(Star), R(1), // |
| 7674 B(Call), R(1), R(2), U8(2), // | 7674 B(Call), R(1), R(2), U8(2), U8(0), // |
| 7675 B(LdaConstant), U8(1), // | 7675 B(LdaConstant), U8(1), // |
| 7676 B(Star), R(3), // | 7676 B(Star), R(3), // |
| 7677 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlotForCall), // | 7677 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlotForCall), // |
| 7678 R(3), U8(1), R(1), // | 7678 R(3), U8(1), R(1), // |
| 7679 B(CallIC), R(1), R(2), U8(1), U8(vector->GetIndex(slot2)), // | 7679 B(Call), R(1), R(2), U8(1), U8(vector->GetIndex(slot2)), // |
| 7680 B(Return), // | 7680 B(Return), // |
| 7681 }, | 7681 }, |
| 7682 4, | 7682 4, |
| 7683 {InstanceType::SHARED_FUNCTION_INFO_TYPE, | 7683 {InstanceType::SHARED_FUNCTION_INFO_TYPE, |
| 7684 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | 7684 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 7685 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | 7685 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 7686 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | 7686 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
| 7687 }; | 7687 }; |
| 7688 // clang-format on | 7688 // clang-format on |
| 7689 | 7689 |
| (...skipping 1372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9062 B(LdaTheHole), // | 9062 B(LdaTheHole), // |
| 9063 B(Star), R(3), // | 9063 B(Star), R(3), // |
| 9064 B(CreateClosure), U8(0), U8(0), // | 9064 B(CreateClosure), U8(0), U8(0), // |
| 9065 B(Star), R(4), // | 9065 B(Star), R(4), // |
| 9066 B(LdaSmi8), U8(30), // | 9066 B(LdaSmi8), U8(30), // |
| 9067 B(Star), R(5), // | 9067 B(Star), R(5), // |
| 9068 B(LdaSmi8), U8(67), // | 9068 B(LdaSmi8), U8(67), // |
| 9069 B(Star), R(6), // | 9069 B(Star), R(6), // |
| 9070 B(CallRuntime), U16(Runtime::kDefineClass), R(3), U8(4), // | 9070 B(CallRuntime), U16(Runtime::kDefineClass), R(3), U8(4), // |
| 9071 B(Star), R(3), // | 9071 B(Star), R(3), // |
| 9072 B(LoadIC), R(3), U8(1), U8(1), // | 9072 B(LoadIC), R(3), U8(1), U8(1), // |
| 9073 B(Star), R(4), // | 9073 B(Star), R(4), // |
| 9074 B(CallRuntime), U16(Runtime::kFinalizeClassDefinition), R(3), U8(2), // | 9074 B(CallRuntime), U16(Runtime::kFinalizeClassDefinition), R(3), U8(2), // |
| 9075 B(Star), R(0), // | 9075 B(Star), R(0), // |
| 9076 B(Star), R(1), // | 9076 B(Star), R(1), // |
| 9077 B(JumpIfNotHole), U8(11), // | 9077 B(JumpIfNotHole), U8(11), // |
| 9078 B(LdaConstant), U8(2), // | 9078 B(LdaConstant), U8(2), // |
| 9079 B(Star), R(4), // | 9079 B(Star), R(4), // |
| 9080 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(4), U8(1), // | 9080 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(4), U8(1), // |
| 9081 B(Star), R(3), // | 9081 B(Star), R(3), // |
| 9082 B(New), R(3), R(0), U8(0), // | 9082 B(New), R(3), R(0), U8(0), // |
| 9083 B(Return), // | 9083 B(Return), // |
| 9084 }, | 9084 }, |
| 9085 3, | 9085 3, |
| 9086 { InstanceType::SHARED_FUNCTION_INFO_TYPE, | 9086 { InstanceType::SHARED_FUNCTION_INFO_TYPE, |
| 9087 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | 9087 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 9088 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | 9088 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
| 9089 }; | 9089 }; |
| 9090 // clang-format on | 9090 // clang-format on |
| 9091 | 9091 |
| 9092 for (size_t i = 0; i < arraysize(snippets); i++) { | 9092 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 9093 Handle<BytecodeArray> bytecode_array = | 9093 Handle<BytecodeArray> bytecode_array = |
| 9094 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 9094 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
| 9095 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 9095 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 9096 } | 9096 } |
| 9097 } | 9097 } |
| 9098 | 9098 |
| 9099 TEST(TailCall) { | |
| 9100 bool old_tailcall_flag = FLAG_harmony_tailcalls; | |
| 9101 FLAG_harmony_tailcalls = true; | |
| 9102 | |
| 9103 InitializedHandleScope handle_scope; | |
| 9104 BytecodeGeneratorHelper helper; | |
| 9105 | |
| 9106 int closure = Register::function_closure().index(); | |
| 9107 int context = Register::current_context().index(); | |
| 9108 int new_target = Register::new_target().index(); | |
| 9109 | |
| 9110 // clang-format off | |
| 9111 ExpectedSnippet<const char*> snippets[] = { | |
| 9112 {"function g() { throw new Error('foo'); };" | |
| 9113 "var eval = g;" | |
| 9114 "function f() {" | |
| 9115 " 'use strict';" | |
| 9116 " return eval('g()');" | |
| 9117 "}", | |
| 9118 9 * kPointerSize, | |
| 9119 1, | |
| 9120 63, | |
| 9121 { | |
| 9122 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // | |
| 9123 U8(1), // | |
| 9124 B(PushContext), R(0), // | |
| 9125 B(Ldar), THIS(1), // | |
| 9126 B(StaContextSlot), R(context), U8(4), // | |
| 9127 B(CreateUnmappedArguments), // | |
| 9128 B(StaContextSlot), R(context), U8(5), // | |
| 9129 B(Ldar), R(new_target), // | |
| 9130 B(StaContextSlot), R(context), U8(6), // | |
| 9131 B(StackCheck), // | |
| 9132 B(LdaUndefined), // | |
| 9133 B(Star), R(2), // | |
| 9134 B(LdaGlobal), U8(0), U8(1), // | |
| 9135 B(Star), R(1), // | |
| 9136 B(LdaConstant), U8(1), // | |
| 9137 B(Star), R(3), // | |
| 9138 B(Mov), R(1), R(4), // | |
| 9139 B(Mov), R(3), R(5), // | |
| 9140 B(Mov), R(closure), R(6), // | |
| 9141 B(LdaSmi8), U8(1), // | |
| 9142 B(Star), R(7), // | |
| 9143 B(LdaSmi8), U8(64), // | |
| 9144 B(Star), R(8), // | |
| 9145 B(CallRuntime), U16(Runtime::kResolvePossiblyDirectEval), R(4), // | |
| 9146 U8(5), // | |
| 9147 B(Star), R(1), // | |
| 9148 B(TailCall), R(1), R(2), U8(2), // | |
| 9149 B(Return), // | |
| 9150 }, | |
| 9151 2, | |
| 9152 {"eval", | |
| 9153 "g()"}} | |
| 9154 }; | |
| 9155 // clang-format on | |
| 9156 | |
| 9157 for (size_t i = 0; i < arraysize(snippets); i++) { | |
| 9158 Handle<BytecodeArray> bytecode_array = | |
| 9159 helper.MakeBytecodeForFunction(snippets[i].code_snippet); | |
| 9160 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | |
| 9161 } | |
| 9162 | |
| 9163 FLAG_harmony_tailcalls = old_tailcall_flag; | |
| 9164 } | |
| 9165 | |
| 9166 TEST(TailCallIC) { | |
| 9167 bool old_tailcall_flag = FLAG_harmony_tailcalls; | |
| 9168 FLAG_harmony_tailcalls = true; | |
| 9169 | |
| 9170 InitializedHandleScope handle_scope; | |
| 9171 BytecodeGeneratorHelper helper; | |
| 9172 | |
| 9173 // clang-format off | |
| 9174 ExpectedSnippet<const char*> snippets[] = { | |
| 9175 {"function g() { return 0; };" | |
| 9176 "function f() {" | |
| 9177 " 'use strict';" | |
| 9178 " return g();" | |
| 9179 "}", | |
| 9180 2 * kPointerSize, | |
| 9181 1, | |
| 9182 15, | |
| 9183 { | |
| 9184 B(StackCheck), // | |
| 9185 B(LdaUndefined), // | |
| 9186 B(Star), R(1), // | |
| 9187 B(LdaGlobal), U8(0), U8(3), // | |
| 9188 B(Star), R(0), // | |
| 9189 B(TailCallIC), R(0), R(1), U8(1), U8(1), // | |
| 9190 B(Return), | |
| 9191 }, | |
| 9192 1, | |
| 9193 {"g"}} | |
| 9194 }; | |
| 9195 // clang-format on | |
| 9196 | |
| 9197 for (size_t i = 0; i < arraysize(snippets); i++) { | |
| 9198 Handle<BytecodeArray> bytecode_array = | |
| 9199 helper.MakeBytecodeForFunction(snippets[i].code_snippet); | |
| 9200 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | |
| 9201 } | |
| 9202 | |
| 9203 FLAG_harmony_tailcalls = old_tailcall_flag; | |
| 9204 } | |
| 9205 | |
| 9206 // TODO(oth): Add tests for super keyword. | 9099 // TODO(oth): Add tests for super keyword. |
| 9207 | 9100 |
| 9208 } // namespace interpreter | 9101 } // namespace interpreter |
| 9209 } // namespace internal | 9102 } // namespace internal |
| 9210 } // namespace v8 | 9103 } // namespace v8 |
| OLD | NEW |