OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/bailout-reason.h" | 7 #include "src/bailout-reason.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 #include "src/field-index.h" | 9 #include "src/field-index.h" |
10 #include "src/hydrogen.h" | 10 #include "src/hydrogen.h" |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 | 86 |
87 // BuildCheckAndInstallOptimizedCode emits code to install the optimized | 87 // BuildCheckAndInstallOptimizedCode emits code to install the optimized |
88 // function found in the optimized code map at map_index in js_function, if | 88 // function found in the optimized code map at map_index in js_function, if |
89 // the function at map_index matches the given native_context. Builder is | 89 // the function at map_index matches the given native_context. Builder is |
90 // left in the "Then()" state after the install. | 90 // left in the "Then()" state after the install. |
91 void BuildCheckAndInstallOptimizedCode(HValue* js_function, | 91 void BuildCheckAndInstallOptimizedCode(HValue* js_function, |
92 HValue* native_context, | 92 HValue* native_context, |
93 IfBuilder* builder, | 93 IfBuilder* builder, |
94 HValue* optimized_map, | 94 HValue* optimized_map, |
95 HValue* map_index); | 95 HValue* map_index); |
| 96 void BuildInstallOptimizedCode(HValue* js_function, HValue* native_context, |
| 97 HValue* code_object, HValue* literals); |
96 void BuildInstallCode(HValue* js_function, HValue* shared_info); | 98 void BuildInstallCode(HValue* js_function, HValue* shared_info); |
97 | 99 |
98 HInstruction* LoadFromOptimizedCodeMap(HValue* optimized_map, | 100 HInstruction* LoadFromOptimizedCodeMap(HValue* optimized_map, |
99 HValue* iterator, | 101 HValue* iterator, |
100 int field_offset); | 102 int field_offset); |
101 void BuildInstallFromOptimizedCodeMap(HValue* js_function, | 103 void BuildInstallFromOptimizedCodeMap(HValue* js_function, |
102 HValue* shared_info, | 104 HValue* shared_info, |
103 HValue* native_context); | 105 HValue* native_context); |
104 | 106 |
105 private: | 107 private: |
(...skipping 1538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1644 builder->If<HCompareObjectEqAndBranch>(native_context, | 1646 builder->If<HCompareObjectEqAndBranch>(native_context, |
1645 context_slot); | 1647 context_slot); |
1646 builder->AndIf<HCompareObjectEqAndBranch>(osr_ast_slot, osr_ast_id_none); | 1648 builder->AndIf<HCompareObjectEqAndBranch>(osr_ast_slot, osr_ast_id_none); |
1647 builder->Then(); | 1649 builder->Then(); |
1648 HValue* code_object = LoadFromOptimizedCodeMap(optimized_map, | 1650 HValue* code_object = LoadFromOptimizedCodeMap(optimized_map, |
1649 map_index, SharedFunctionInfo::kCachedCodeOffset); | 1651 map_index, SharedFunctionInfo::kCachedCodeOffset); |
1650 // and the literals | 1652 // and the literals |
1651 HValue* literals = LoadFromOptimizedCodeMap(optimized_map, | 1653 HValue* literals = LoadFromOptimizedCodeMap(optimized_map, |
1652 map_index, SharedFunctionInfo::kLiteralsOffset); | 1654 map_index, SharedFunctionInfo::kLiteralsOffset); |
1653 | 1655 |
| 1656 BuildInstallOptimizedCode(js_function, native_context, code_object, literals); |
| 1657 |
| 1658 // The builder continues in the "then" after this function. |
| 1659 } |
| 1660 |
| 1661 |
| 1662 void CodeStubGraphBuilderBase::BuildInstallOptimizedCode(HValue* js_function, |
| 1663 HValue* native_context, |
| 1664 HValue* code_object, |
| 1665 HValue* literals) { |
1654 Counters* counters = isolate()->counters(); | 1666 Counters* counters = isolate()->counters(); |
1655 AddIncrementCounter(counters->fast_new_closure_install_optimized()); | 1667 AddIncrementCounter(counters->fast_new_closure_install_optimized()); |
1656 | 1668 |
1657 // TODO(fschneider): Idea: store proper code pointers in the optimized code | 1669 // TODO(fschneider): Idea: store proper code pointers in the optimized code |
1658 // map and either unmangle them on marking or do nothing as the whole map is | 1670 // map and either unmangle them on marking or do nothing as the whole map is |
1659 // discarded on major GC anyway. | 1671 // discarded on major GC anyway. |
1660 Add<HStoreCodeEntry>(js_function, code_object); | 1672 Add<HStoreCodeEntry>(js_function, code_object); |
1661 Add<HStoreNamedField>(js_function, HObjectAccess::ForLiteralsPointer(), | 1673 Add<HStoreNamedField>(js_function, HObjectAccess::ForLiteralsPointer(), |
1662 literals); | 1674 literals); |
1663 | 1675 |
1664 // Now link a function into a list of optimized functions. | 1676 // Now link a function into a list of optimized functions. |
1665 HValue* optimized_functions_list = Add<HLoadNamedField>( | 1677 HValue* optimized_functions_list = Add<HLoadNamedField>( |
1666 native_context, nullptr, | 1678 native_context, nullptr, |
1667 HObjectAccess::ForContextSlot(Context::OPTIMIZED_FUNCTIONS_LIST)); | 1679 HObjectAccess::ForContextSlot(Context::OPTIMIZED_FUNCTIONS_LIST)); |
1668 Add<HStoreNamedField>(js_function, | 1680 Add<HStoreNamedField>(js_function, |
1669 HObjectAccess::ForNextFunctionLinkPointer(), | 1681 HObjectAccess::ForNextFunctionLinkPointer(), |
1670 optimized_functions_list); | 1682 optimized_functions_list); |
1671 | 1683 |
1672 // This store is the only one that should have a write barrier. | 1684 // This store is the only one that should have a write barrier. |
1673 Add<HStoreNamedField>(native_context, | 1685 Add<HStoreNamedField>(native_context, |
1674 HObjectAccess::ForContextSlot(Context::OPTIMIZED_FUNCTIONS_LIST), | 1686 HObjectAccess::ForContextSlot(Context::OPTIMIZED_FUNCTIONS_LIST), |
1675 js_function); | 1687 js_function); |
1676 | |
1677 // The builder continues in the "then" after this function. | |
1678 } | 1688 } |
1679 | 1689 |
1680 | 1690 |
1681 void CodeStubGraphBuilderBase::BuildInstallCode(HValue* js_function, | 1691 void CodeStubGraphBuilderBase::BuildInstallCode(HValue* js_function, |
1682 HValue* shared_info) { | 1692 HValue* shared_info) { |
1683 Add<HStoreNamedField>(js_function, | 1693 Add<HStoreNamedField>(js_function, |
1684 HObjectAccess::ForNextFunctionLinkPointer(), | 1694 HObjectAccess::ForNextFunctionLinkPointer(), |
1685 graph()->GetConstantUndefined()); | 1695 graph()->GetConstantUndefined()); |
1686 HValue* code_object = Add<HLoadNamedField>(shared_info, nullptr, | 1696 HValue* code_object = Add<HLoadNamedField>(shared_info, nullptr, |
1687 HObjectAccess::ForCodeOffset()); | 1697 HObjectAccess::ForCodeOffset()); |
(...skipping 17 matching lines...) Expand all Loading... |
1705 Add<HLoadKeyed>(optimized_map, field_slot, nullptr, FAST_ELEMENTS); | 1715 Add<HLoadKeyed>(optimized_map, field_slot, nullptr, FAST_ELEMENTS); |
1706 return field_entry; | 1716 return field_entry; |
1707 } | 1717 } |
1708 | 1718 |
1709 | 1719 |
1710 void CodeStubGraphBuilderBase::BuildInstallFromOptimizedCodeMap( | 1720 void CodeStubGraphBuilderBase::BuildInstallFromOptimizedCodeMap( |
1711 HValue* js_function, | 1721 HValue* js_function, |
1712 HValue* shared_info, | 1722 HValue* shared_info, |
1713 HValue* native_context) { | 1723 HValue* native_context) { |
1714 Counters* counters = isolate()->counters(); | 1724 Counters* counters = isolate()->counters(); |
| 1725 Factory* factory = isolate()->factory(); |
1715 IfBuilder is_optimized(this); | 1726 IfBuilder is_optimized(this); |
1716 HInstruction* optimized_map = Add<HLoadNamedField>( | 1727 HInstruction* optimized_map = Add<HLoadNamedField>( |
1717 shared_info, nullptr, HObjectAccess::ForOptimizedCodeMap()); | 1728 shared_info, nullptr, HObjectAccess::ForOptimizedCodeMap()); |
1718 HValue* null_constant = Add<HConstant>(0); | 1729 HValue* null_constant = Add<HConstant>(0); |
1719 is_optimized.If<HCompareObjectEqAndBranch>(optimized_map, null_constant); | 1730 is_optimized.If<HCompareObjectEqAndBranch>(optimized_map, null_constant); |
1720 is_optimized.Then(); | 1731 is_optimized.Then(); |
1721 { | 1732 { |
1722 BuildInstallCode(js_function, shared_info); | 1733 BuildInstallCode(js_function, shared_info); |
1723 } | 1734 } |
1724 is_optimized.Else(); | 1735 is_optimized.Else(); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1757 IfBuilder done_check(this); | 1768 IfBuilder done_check(this); |
1758 BuildCheckAndInstallOptimizedCode(js_function, native_context, | 1769 BuildCheckAndInstallOptimizedCode(js_function, native_context, |
1759 &done_check, | 1770 &done_check, |
1760 optimized_map, | 1771 optimized_map, |
1761 slot_iterator); | 1772 slot_iterator); |
1762 // Fall out of the loop | 1773 // Fall out of the loop |
1763 loop_builder.Break(); | 1774 loop_builder.Break(); |
1764 } | 1775 } |
1765 loop_builder.EndBody(); | 1776 loop_builder.EndBody(); |
1766 | 1777 |
1767 // If slot_iterator equals first entry index, then we failed to find and | 1778 // If slot_iterator equals first entry index, then we failed to find a |
1768 // install optimized code | 1779 // context-dependent code and try context-independent code next. |
1769 IfBuilder no_optimized_code_check(this); | 1780 IfBuilder no_optimized_code_check(this); |
1770 no_optimized_code_check.If<HCompareNumericAndBranch>( | 1781 no_optimized_code_check.If<HCompareNumericAndBranch>( |
1771 slot_iterator, first_entry_index, Token::EQ); | 1782 slot_iterator, first_entry_index, Token::EQ); |
1772 no_optimized_code_check.Then(); | 1783 no_optimized_code_check.Then(); |
1773 { | 1784 { |
1774 // Store the unoptimized code | 1785 IfBuilder shared_code_check(this); |
1775 BuildInstallCode(js_function, shared_info); | 1786 HValue* shared_code = Add<HLoadNamedField>( |
| 1787 optimized_map, nullptr, |
| 1788 HObjectAccess::ForOptimizedCodeMapSharedCode()); |
| 1789 shared_code_check.IfNot<HCompareObjectEqAndBranch>( |
| 1790 shared_code, graph()->GetConstantUndefined()); |
| 1791 shared_code_check.Then(); |
| 1792 { |
| 1793 // Store the context-independent optimized code. |
| 1794 HValue* literals = Add<HConstant>(factory->empty_fixed_array()); |
| 1795 BuildInstallOptimizedCode(js_function, native_context, shared_code, |
| 1796 literals); |
| 1797 } |
| 1798 shared_code_check.Else(); |
| 1799 { |
| 1800 // Store the unoptimized code. |
| 1801 BuildInstallCode(js_function, shared_info); |
| 1802 } |
1776 } | 1803 } |
1777 } | 1804 } |
1778 } | 1805 } |
1779 } | 1806 } |
1780 | 1807 |
1781 | 1808 |
1782 template<> | 1809 template<> |
1783 HValue* CodeStubGraphBuilder<FastNewClosureStub>::BuildCodeStub() { | 1810 HValue* CodeStubGraphBuilder<FastNewClosureStub>::BuildCodeStub() { |
1784 Counters* counters = isolate()->counters(); | 1811 Counters* counters = isolate()->counters(); |
1785 Factory* factory = isolate()->factory(); | 1812 Factory* factory = isolate()->factory(); |
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2226 return Pop(); | 2253 return Pop(); |
2227 } | 2254 } |
2228 | 2255 |
2229 | 2256 |
2230 Handle<Code> KeyedLoadGenericStub::GenerateCode() { | 2257 Handle<Code> KeyedLoadGenericStub::GenerateCode() { |
2231 return DoGenerateCode(this); | 2258 return DoGenerateCode(this); |
2232 } | 2259 } |
2233 | 2260 |
2234 } // namespace internal | 2261 } // namespace internal |
2235 } // namespace v8 | 2262 } // namespace v8 |
OLD | NEW |