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 654 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
665 effect = graph()->NewNode( | 665 effect = graph()->NewNode( |
666 common()->BeginRegion(RegionObservability::kNotObservable), effect); | 666 common()->BeginRegion(RegionObservability::kNotObservable), effect); |
667 Node* value = effect = | 667 Node* value = effect = |
668 graph()->NewNode(simplified()->Allocate(NOT_TENURED), | 668 graph()->NewNode(simplified()->Allocate(NOT_TENURED), |
669 jsgraph()->Constant(ConsString::kSize), effect, control); | 669 jsgraph()->Constant(ConsString::kSize), effect, control); |
670 NodeProperties::SetType(value, Type::OtherString()); | 670 NodeProperties::SetType(value, Type::OtherString()); |
671 effect = graph()->NewNode(simplified()->StoreField(AccessBuilder::ForMap()), | 671 effect = graph()->NewNode(simplified()->StoreField(AccessBuilder::ForMap()), |
672 value, value_map, effect, control); | 672 value, value_map, effect, control); |
673 effect = graph()->NewNode( | 673 effect = graph()->NewNode( |
674 simplified()->StoreField(AccessBuilder::ForNameHashField()), value, | 674 simplified()->StoreField(AccessBuilder::ForNameHashField()), value, |
675 jsgraph()->Uint32Constant(Name::kEmptyHashField), effect, control); | 675 jsgraph()->Constant(Name::kEmptyHashField), effect, control); |
676 effect = graph()->NewNode( | 676 effect = graph()->NewNode( |
677 simplified()->StoreField(AccessBuilder::ForStringLength()), value, length, | 677 simplified()->StoreField(AccessBuilder::ForStringLength()), value, length, |
678 effect, control); | 678 effect, control); |
679 effect = graph()->NewNode( | 679 effect = graph()->NewNode( |
680 simplified()->StoreField(AccessBuilder::ForConsStringFirst()), value, | 680 simplified()->StoreField(AccessBuilder::ForConsStringFirst()), value, |
681 first, effect, control); | 681 first, effect, control); |
682 effect = graph()->NewNode( | 682 effect = graph()->NewNode( |
683 simplified()->StoreField(AccessBuilder::ForConsStringSecond()), value, | 683 simplified()->StoreField(AccessBuilder::ForConsStringSecond()), value, |
684 second, effect, control); | 684 second, effect, control); |
685 | 685 |
(...skipping 1156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1842 | 1842 |
1843 ReduceBuiltin(isolate(), jsgraph(), node, builtin_index, arity, flags); | 1843 ReduceBuiltin(isolate(), jsgraph(), node, builtin_index, arity, flags); |
1844 } else { | 1844 } else { |
1845 // Patch {node} to an indirect call via the {function}s construct stub. | 1845 // Patch {node} to an indirect call via the {function}s construct stub. |
1846 Callable callable(handle(shared->construct_stub(), isolate()), | 1846 Callable callable(handle(shared->construct_stub(), isolate()), |
1847 ConstructStubDescriptor(isolate())); | 1847 ConstructStubDescriptor(isolate())); |
1848 node->RemoveInput(arity + 1); | 1848 node->RemoveInput(arity + 1); |
1849 node->InsertInput(graph()->zone(), 0, | 1849 node->InsertInput(graph()->zone(), 0, |
1850 jsgraph()->HeapConstant(callable.code())); | 1850 jsgraph()->HeapConstant(callable.code())); |
1851 node->InsertInput(graph()->zone(), 2, new_target); | 1851 node->InsertInput(graph()->zone(), 2, new_target); |
1852 node->InsertInput(graph()->zone(), 3, jsgraph()->Int32Constant(arity)); | 1852 node->InsertInput(graph()->zone(), 3, jsgraph()->Constant(arity)); |
1853 node->InsertInput(graph()->zone(), 4, jsgraph()->UndefinedConstant()); | 1853 node->InsertInput(graph()->zone(), 4, jsgraph()->UndefinedConstant()); |
1854 node->InsertInput(graph()->zone(), 5, jsgraph()->UndefinedConstant()); | 1854 node->InsertInput(graph()->zone(), 5, jsgraph()->UndefinedConstant()); |
1855 NodeProperties::ChangeOp( | 1855 NodeProperties::ChangeOp( |
1856 node, common()->Call(Linkage::GetStubCallDescriptor( | 1856 node, common()->Call(Linkage::GetStubCallDescriptor( |
1857 isolate(), graph()->zone(), callable.descriptor(), | 1857 isolate(), graph()->zone(), callable.descriptor(), |
1858 1 + arity, flags))); | 1858 1 + arity, flags))); |
1859 } | 1859 } |
1860 return Changed(node); | 1860 return Changed(node); |
1861 } | 1861 } |
1862 | 1862 |
1863 // Check if {target} is a JSFunction. | 1863 // Check if {target} is a JSFunction. |
1864 if (target_type->Is(Type::Function())) { | 1864 if (target_type->Is(Type::Function())) { |
1865 // Patch {node} to an indirect call via the ConstructFunction builtin. | 1865 // Patch {node} to an indirect call via the ConstructFunction builtin. |
1866 Callable callable = CodeFactory::ConstructFunction(isolate()); | 1866 Callable callable = CodeFactory::ConstructFunction(isolate()); |
1867 node->RemoveInput(arity + 1); | 1867 node->RemoveInput(arity + 1); |
1868 node->InsertInput(graph()->zone(), 0, | 1868 node->InsertInput(graph()->zone(), 0, |
1869 jsgraph()->HeapConstant(callable.code())); | 1869 jsgraph()->HeapConstant(callable.code())); |
1870 node->InsertInput(graph()->zone(), 2, new_target); | 1870 node->InsertInput(graph()->zone(), 2, new_target); |
1871 node->InsertInput(graph()->zone(), 3, jsgraph()->Int32Constant(arity)); | 1871 node->InsertInput(graph()->zone(), 3, jsgraph()->Constant(arity)); |
1872 node->InsertInput(graph()->zone(), 4, jsgraph()->UndefinedConstant()); | 1872 node->InsertInput(graph()->zone(), 4, jsgraph()->UndefinedConstant()); |
1873 NodeProperties::ChangeOp( | 1873 NodeProperties::ChangeOp( |
1874 node, common()->Call(Linkage::GetStubCallDescriptor( | 1874 node, common()->Call(Linkage::GetStubCallDescriptor( |
1875 isolate(), graph()->zone(), callable.descriptor(), 1 + arity, | 1875 isolate(), graph()->zone(), callable.descriptor(), 1 + arity, |
1876 CallDescriptor::kNeedsFrameState))); | 1876 CallDescriptor::kNeedsFrameState))); |
1877 return Changed(node); | 1877 return Changed(node); |
1878 } | 1878 } |
1879 | 1879 |
1880 return NoChange(); | 1880 return NoChange(); |
1881 } | 1881 } |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1932 // Update the effect dependency for the {node}. | 1932 // Update the effect dependency for the {node}. |
1933 NodeProperties::ReplaceEffectInput(node, effect); | 1933 NodeProperties::ReplaceEffectInput(node, effect); |
1934 | 1934 |
1935 // Compute flags for the call. | 1935 // Compute flags for the call. |
1936 CallDescriptor::Flags flags = CallDescriptor::kNeedsFrameState; | 1936 CallDescriptor::Flags flags = CallDescriptor::kNeedsFrameState; |
1937 if (p.tail_call_mode() == TailCallMode::kAllow) { | 1937 if (p.tail_call_mode() == TailCallMode::kAllow) { |
1938 flags |= CallDescriptor::kSupportsTailCalls; | 1938 flags |= CallDescriptor::kSupportsTailCalls; |
1939 } | 1939 } |
1940 | 1940 |
1941 Node* new_target = jsgraph()->UndefinedConstant(); | 1941 Node* new_target = jsgraph()->UndefinedConstant(); |
1942 Node* argument_count = jsgraph()->Int32Constant(arity); | 1942 Node* argument_count = jsgraph()->Constant(arity); |
1943 if (NeedsArgumentAdaptorFrame(shared, arity)) { | 1943 if (NeedsArgumentAdaptorFrame(shared, arity)) { |
1944 // Patch {node} to an indirect call via the ArgumentsAdaptorTrampoline. | 1944 // Patch {node} to an indirect call via the ArgumentsAdaptorTrampoline. |
1945 Callable callable = CodeFactory::ArgumentAdaptor(isolate()); | 1945 Callable callable = CodeFactory::ArgumentAdaptor(isolate()); |
1946 node->InsertInput(graph()->zone(), 0, | 1946 node->InsertInput(graph()->zone(), 0, |
1947 jsgraph()->HeapConstant(callable.code())); | 1947 jsgraph()->HeapConstant(callable.code())); |
1948 node->InsertInput(graph()->zone(), 2, new_target); | 1948 node->InsertInput(graph()->zone(), 2, new_target); |
1949 node->InsertInput(graph()->zone(), 3, argument_count); | 1949 node->InsertInput(graph()->zone(), 3, argument_count); |
1950 node->InsertInput( | 1950 node->InsertInput( |
1951 graph()->zone(), 4, | 1951 graph()->zone(), 4, |
1952 jsgraph()->Int32Constant(shared->internal_formal_parameter_count())); | 1952 jsgraph()->Constant(shared->internal_formal_parameter_count())); |
1953 NodeProperties::ChangeOp( | 1953 NodeProperties::ChangeOp( |
1954 node, common()->Call(Linkage::GetStubCallDescriptor( | 1954 node, common()->Call(Linkage::GetStubCallDescriptor( |
1955 isolate(), graph()->zone(), callable.descriptor(), | 1955 isolate(), graph()->zone(), callable.descriptor(), |
1956 1 + arity, flags))); | 1956 1 + arity, flags))); |
1957 } else if (is_builtin && Builtins::HasCppImplementation(builtin_index) && | 1957 } else if (is_builtin && Builtins::HasCppImplementation(builtin_index) && |
1958 ((flags & CallDescriptor::kSupportsTailCalls) == 0)) { | 1958 ((flags & CallDescriptor::kSupportsTailCalls) == 0)) { |
1959 // Patch {node} to a direct CEntryStub call. | 1959 // Patch {node} to a direct CEntryStub call. |
1960 ReduceBuiltin(isolate(), jsgraph(), node, builtin_index, arity, flags); | 1960 ReduceBuiltin(isolate(), jsgraph(), node, builtin_index, arity, flags); |
1961 } else { | 1961 } else { |
1962 // Patch {node} to a direct call. | 1962 // Patch {node} to a direct call. |
(...skipping 11 matching lines...) Expand all Loading... |
1974 // Compute flags for the call. | 1974 // Compute flags for the call. |
1975 CallDescriptor::Flags flags = CallDescriptor::kNeedsFrameState; | 1975 CallDescriptor::Flags flags = CallDescriptor::kNeedsFrameState; |
1976 if (p.tail_call_mode() == TailCallMode::kAllow) { | 1976 if (p.tail_call_mode() == TailCallMode::kAllow) { |
1977 flags |= CallDescriptor::kSupportsTailCalls; | 1977 flags |= CallDescriptor::kSupportsTailCalls; |
1978 } | 1978 } |
1979 | 1979 |
1980 // Patch {node} to an indirect call via the CallFunction builtin. | 1980 // Patch {node} to an indirect call via the CallFunction builtin. |
1981 Callable callable = CodeFactory::CallFunction(isolate(), convert_mode); | 1981 Callable callable = CodeFactory::CallFunction(isolate(), convert_mode); |
1982 node->InsertInput(graph()->zone(), 0, | 1982 node->InsertInput(graph()->zone(), 0, |
1983 jsgraph()->HeapConstant(callable.code())); | 1983 jsgraph()->HeapConstant(callable.code())); |
1984 node->InsertInput(graph()->zone(), 2, jsgraph()->Int32Constant(arity)); | 1984 node->InsertInput(graph()->zone(), 2, jsgraph()->Constant(arity)); |
1985 NodeProperties::ChangeOp( | 1985 NodeProperties::ChangeOp( |
1986 node, common()->Call(Linkage::GetStubCallDescriptor( | 1986 node, common()->Call(Linkage::GetStubCallDescriptor( |
1987 isolate(), graph()->zone(), callable.descriptor(), 1 + arity, | 1987 isolate(), graph()->zone(), callable.descriptor(), 1 + arity, |
1988 flags))); | 1988 flags))); |
1989 return Changed(node); | 1989 return Changed(node); |
1990 } | 1990 } |
1991 | 1991 |
1992 // Maybe we did at least learn something about the {receiver}. | 1992 // Maybe we did at least learn something about the {receiver}. |
1993 if (p.convert_mode() != convert_mode) { | 1993 if (p.convert_mode() != convert_mode) { |
1994 NodeProperties::ChangeOp( | 1994 NodeProperties::ChangeOp( |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2250 } | 2250 } |
2251 | 2251 |
2252 | 2252 |
2253 CompilationDependencies* JSTypedLowering::dependencies() const { | 2253 CompilationDependencies* JSTypedLowering::dependencies() const { |
2254 return dependencies_; | 2254 return dependencies_; |
2255 } | 2255 } |
2256 | 2256 |
2257 } // namespace compiler | 2257 } // namespace compiler |
2258 } // namespace internal | 2258 } // namespace internal |
2259 } // namespace v8 | 2259 } // namespace v8 |
OLD | NEW |