| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/compiler/js-typed-lowering.h" | 5 #include "src/compiler/js-typed-lowering.h" |
| 6 | 6 |
| 7 #include "src/ast/modules.h" | 7 #include "src/ast/modules.h" |
| 8 #include "src/builtins/builtins-utils.h" | 8 #include "src/builtins/builtins-utils.h" |
| 9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
| 10 #include "src/compilation-dependencies.h" | 10 #include "src/compilation-dependencies.h" |
| (...skipping 1685 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1696 } | 1696 } |
| 1697 | 1697 |
| 1698 bool NeedsArgumentAdaptorFrame(Handle<SharedFunctionInfo> shared, int arity) { | 1698 bool NeedsArgumentAdaptorFrame(Handle<SharedFunctionInfo> shared, int arity) { |
| 1699 static const int sentinel = SharedFunctionInfo::kDontAdaptArgumentsSentinel; | 1699 static const int sentinel = SharedFunctionInfo::kDontAdaptArgumentsSentinel; |
| 1700 const int num_decl_parms = shared->internal_formal_parameter_count(); | 1700 const int num_decl_parms = shared->internal_formal_parameter_count(); |
| 1701 return (num_decl_parms != arity && num_decl_parms != sentinel); | 1701 return (num_decl_parms != arity && num_decl_parms != sentinel); |
| 1702 } | 1702 } |
| 1703 | 1703 |
| 1704 } // namespace | 1704 } // namespace |
| 1705 | 1705 |
| 1706 Reduction JSTypedLowering::ReduceJSConstructForwardVarargs(Node* node) { |
| 1707 DCHECK_EQ(IrOpcode::kJSConstructForwardVarargs, node->opcode()); |
| 1708 ConstructForwardVarargsParameters p = |
| 1709 ConstructForwardVarargsParametersOf(node->op()); |
| 1710 DCHECK_LE(2u, p.arity()); |
| 1711 int const arity = static_cast<int>(p.arity() - 2); |
| 1712 int const start_index = static_cast<int>(p.start_index()); |
| 1713 Node* target = NodeProperties::GetValueInput(node, 0); |
| 1714 Type* target_type = NodeProperties::GetType(target); |
| 1715 Node* new_target = NodeProperties::GetValueInput(node, arity + 1); |
| 1716 |
| 1717 // Check if {target} is a JSFunction. |
| 1718 if (target_type->Is(Type::Function())) { |
| 1719 // Patch {node} to an indirect call via ConstructFunctionForwardVarargs. |
| 1720 Callable callable = CodeFactory::ConstructFunctionForwardVarargs(isolate()); |
| 1721 node->RemoveInput(arity + 1); |
| 1722 node->InsertInput(graph()->zone(), 0, |
| 1723 jsgraph()->HeapConstant(callable.code())); |
| 1724 node->InsertInput(graph()->zone(), 2, new_target); |
| 1725 node->InsertInput(graph()->zone(), 3, jsgraph()->Constant(arity)); |
| 1726 node->InsertInput(graph()->zone(), 4, jsgraph()->Constant(start_index)); |
| 1727 node->InsertInput(graph()->zone(), 5, jsgraph()->UndefinedConstant()); |
| 1728 NodeProperties::ChangeOp( |
| 1729 node, common()->Call(Linkage::GetStubCallDescriptor( |
| 1730 isolate(), graph()->zone(), callable.descriptor(), arity + 1, |
| 1731 CallDescriptor::kNeedsFrameState))); |
| 1732 return Changed(node); |
| 1733 } |
| 1734 |
| 1735 return NoChange(); |
| 1736 } |
| 1737 |
| 1706 Reduction JSTypedLowering::ReduceJSConstruct(Node* node) { | 1738 Reduction JSTypedLowering::ReduceJSConstruct(Node* node) { |
| 1707 DCHECK_EQ(IrOpcode::kJSConstruct, node->opcode()); | 1739 DCHECK_EQ(IrOpcode::kJSConstruct, node->opcode()); |
| 1708 ConstructParameters const& p = ConstructParametersOf(node->op()); | 1740 ConstructParameters const& p = ConstructParametersOf(node->op()); |
| 1709 DCHECK_LE(2u, p.arity()); | 1741 DCHECK_LE(2u, p.arity()); |
| 1710 int const arity = static_cast<int>(p.arity() - 2); | 1742 int const arity = static_cast<int>(p.arity() - 2); |
| 1711 Node* target = NodeProperties::GetValueInput(node, 0); | 1743 Node* target = NodeProperties::GetValueInput(node, 0); |
| 1712 Type* target_type = NodeProperties::GetType(target); | 1744 Type* target_type = NodeProperties::GetType(target); |
| 1713 Node* new_target = NodeProperties::GetValueInput(node, arity + 1); | 1745 Node* new_target = NodeProperties::GetValueInput(node, arity + 1); |
| 1714 Node* effect = NodeProperties::GetEffectInput(node); | 1746 Node* effect = NodeProperties::GetEffectInput(node); |
| 1715 Node* control = NodeProperties::GetControlInput(node); | 1747 Node* control = NodeProperties::GetControlInput(node); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1774 CallDescriptor::kNeedsFrameState))); | 1806 CallDescriptor::kNeedsFrameState))); |
| 1775 return Changed(node); | 1807 return Changed(node); |
| 1776 } | 1808 } |
| 1777 | 1809 |
| 1778 return NoChange(); | 1810 return NoChange(); |
| 1779 } | 1811 } |
| 1780 | 1812 |
| 1781 Reduction JSTypedLowering::ReduceJSCallForwardVarargs(Node* node) { | 1813 Reduction JSTypedLowering::ReduceJSCallForwardVarargs(Node* node) { |
| 1782 DCHECK_EQ(IrOpcode::kJSCallForwardVarargs, node->opcode()); | 1814 DCHECK_EQ(IrOpcode::kJSCallForwardVarargs, node->opcode()); |
| 1783 CallForwardVarargsParameters p = CallForwardVarargsParametersOf(node->op()); | 1815 CallForwardVarargsParameters p = CallForwardVarargsParametersOf(node->op()); |
| 1816 DCHECK_LE(2u, p.arity()); |
| 1817 int const arity = static_cast<int>(p.arity() - 2); |
| 1818 int const start_index = static_cast<int>(p.start_index()); |
| 1784 Node* target = NodeProperties::GetValueInput(node, 0); | 1819 Node* target = NodeProperties::GetValueInput(node, 0); |
| 1785 Type* target_type = NodeProperties::GetType(target); | 1820 Type* target_type = NodeProperties::GetType(target); |
| 1786 | 1821 |
| 1787 // Check if {target} is a JSFunction. | 1822 // Check if {target} is a JSFunction. |
| 1788 if (target_type->Is(Type::Function())) { | 1823 if (target_type->Is(Type::Function())) { |
| 1789 // Compute flags for the call. | 1824 // Compute flags for the call. |
| 1790 CallDescriptor::Flags flags = CallDescriptor::kNeedsFrameState; | 1825 CallDescriptor::Flags flags = CallDescriptor::kNeedsFrameState; |
| 1791 if (p.tail_call_mode() == TailCallMode::kAllow) { | 1826 if (p.tail_call_mode() == TailCallMode::kAllow) { |
| 1792 flags |= CallDescriptor::kSupportsTailCalls; | 1827 flags |= CallDescriptor::kSupportsTailCalls; |
| 1793 } | 1828 } |
| 1794 | 1829 |
| 1795 // Patch {node} to an indirect call via CallFunctionForwardVarargs. | 1830 // Patch {node} to an indirect call via CallFunctionForwardVarargs. |
| 1796 Callable callable = CodeFactory::CallFunctionForwardVarargs(isolate()); | 1831 Callable callable = CodeFactory::CallFunctionForwardVarargs(isolate()); |
| 1797 node->InsertInput(graph()->zone(), 0, | 1832 node->InsertInput(graph()->zone(), 0, |
| 1798 jsgraph()->HeapConstant(callable.code())); | 1833 jsgraph()->HeapConstant(callable.code())); |
| 1799 node->InsertInput(graph()->zone(), 2, jsgraph()->Constant(p.start_index())); | 1834 node->InsertInput(graph()->zone(), 2, jsgraph()->Constant(arity)); |
| 1835 node->InsertInput(graph()->zone(), 3, jsgraph()->Constant(start_index)); |
| 1800 NodeProperties::ChangeOp( | 1836 NodeProperties::ChangeOp( |
| 1801 node, | 1837 node, common()->Call(Linkage::GetStubCallDescriptor( |
| 1802 common()->Call(Linkage::GetStubCallDescriptor( | 1838 isolate(), graph()->zone(), callable.descriptor(), arity + 1, |
| 1803 isolate(), graph()->zone(), callable.descriptor(), 1, flags))); | 1839 flags))); |
| 1804 return Changed(node); | 1840 return Changed(node); |
| 1805 } | 1841 } |
| 1806 | 1842 |
| 1807 return NoChange(); | 1843 return NoChange(); |
| 1808 } | 1844 } |
| 1809 | 1845 |
| 1810 Reduction JSTypedLowering::ReduceJSCall(Node* node) { | 1846 Reduction JSTypedLowering::ReduceJSCall(Node* node) { |
| 1811 DCHECK_EQ(IrOpcode::kJSCall, node->opcode()); | 1847 DCHECK_EQ(IrOpcode::kJSCall, node->opcode()); |
| 1812 CallParameters const& p = CallParametersOf(node->op()); | 1848 CallParameters const& p = CallParametersOf(node->op()); |
| 1813 int const arity = static_cast<int>(p.arity() - 2); | 1849 int const arity = static_cast<int>(p.arity() - 2); |
| (...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2169 case IrOpcode::kJSLoadContext: | 2205 case IrOpcode::kJSLoadContext: |
| 2170 return ReduceJSLoadContext(node); | 2206 return ReduceJSLoadContext(node); |
| 2171 case IrOpcode::kJSStoreContext: | 2207 case IrOpcode::kJSStoreContext: |
| 2172 return ReduceJSStoreContext(node); | 2208 return ReduceJSStoreContext(node); |
| 2173 case IrOpcode::kJSLoadModule: | 2209 case IrOpcode::kJSLoadModule: |
| 2174 return ReduceJSLoadModule(node); | 2210 return ReduceJSLoadModule(node); |
| 2175 case IrOpcode::kJSStoreModule: | 2211 case IrOpcode::kJSStoreModule: |
| 2176 return ReduceJSStoreModule(node); | 2212 return ReduceJSStoreModule(node); |
| 2177 case IrOpcode::kJSConvertReceiver: | 2213 case IrOpcode::kJSConvertReceiver: |
| 2178 return ReduceJSConvertReceiver(node); | 2214 return ReduceJSConvertReceiver(node); |
| 2215 case IrOpcode::kJSConstructForwardVarargs: |
| 2216 return ReduceJSConstructForwardVarargs(node); |
| 2179 case IrOpcode::kJSConstruct: | 2217 case IrOpcode::kJSConstruct: |
| 2180 return ReduceJSConstruct(node); | 2218 return ReduceJSConstruct(node); |
| 2181 case IrOpcode::kJSCallForwardVarargs: | 2219 case IrOpcode::kJSCallForwardVarargs: |
| 2182 return ReduceJSCallForwardVarargs(node); | 2220 return ReduceJSCallForwardVarargs(node); |
| 2183 case IrOpcode::kJSCall: | 2221 case IrOpcode::kJSCall: |
| 2184 return ReduceJSCall(node); | 2222 return ReduceJSCall(node); |
| 2185 case IrOpcode::kJSForInNext: | 2223 case IrOpcode::kJSForInNext: |
| 2186 return ReduceJSForInNext(node); | 2224 return ReduceJSForInNext(node); |
| 2187 case IrOpcode::kJSLoadMessage: | 2225 case IrOpcode::kJSLoadMessage: |
| 2188 return ReduceJSLoadMessage(node); | 2226 return ReduceJSLoadMessage(node); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2237 } | 2275 } |
| 2238 | 2276 |
| 2239 | 2277 |
| 2240 CompilationDependencies* JSTypedLowering::dependencies() const { | 2278 CompilationDependencies* JSTypedLowering::dependencies() const { |
| 2241 return dependencies_; | 2279 return dependencies_; |
| 2242 } | 2280 } |
| 2243 | 2281 |
| 2244 } // namespace compiler | 2282 } // namespace compiler |
| 2245 } // namespace internal | 2283 } // namespace internal |
| 2246 } // namespace v8 | 2284 } // namespace v8 |
| OLD | NEW |