Index: src/compiler/js-typed-lowering.cc |
diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc |
index ed8f3b0dae4afa3f5db2af01cef9c10f2d79852d..fea72bf40046316ff3f47eed8b4dce577e85e6e5 100644 |
--- a/src/compiler/js-typed-lowering.cc |
+++ b/src/compiler/js-typed-lowering.cc |
@@ -1542,16 +1542,18 @@ void ReduceBuiltin(Isolate* isolate, JSGraph* jsgraph, Node* node, |
const int argc = arity + BuiltinArguments::kNumExtraArgsWithReceiver; |
Node* argc_node = jsgraph->Int32Constant(argc); |
- node->InsertInput(zone, arity + 2, argc_node); |
- node->InsertInput(zone, arity + 3, target); |
- node->InsertInput(zone, arity + 4, new_target); |
+ static const int kStubAndReceiver = 2; |
+ int cursor = arity + kStubAndReceiver; |
+ node->InsertInput(zone, cursor++, argc_node); |
+ node->InsertInput(zone, cursor++, target); |
+ node->InsertInput(zone, cursor++, new_target); |
Address entry = Builtins::CppEntryOf(builtin_index); |
ExternalReference entry_ref(ExternalReference(entry, isolate)); |
Node* entry_node = jsgraph->ExternalConstant(entry_ref); |
- node->InsertInput(zone, arity + 5, entry_node); |
- node->InsertInput(zone, arity + 6, argc_node); |
+ node->InsertInput(zone, cursor++, entry_node); |
+ node->InsertInput(zone, cursor++, argc_node); |
static const int kReturnCount = 1; |
const char* debug_name = Builtins::name(builtin_index); |
@@ -1562,6 +1564,12 @@ void ReduceBuiltin(Isolate* isolate, JSGraph* jsgraph, Node* node, |
NodeProperties::ChangeOp(node, jsgraph->common()->Call(desc)); |
} |
+bool NeedsArgumentAdaptorFrame(Handle<SharedFunctionInfo> shared, int arity) { |
+ static const int sentinel = SharedFunctionInfo::kDontAdaptArgumentsSentinel; |
+ const int num_decl_parms = shared->internal_formal_parameter_count(); |
+ return (num_decl_parms != arity && num_decl_parms != sentinel); |
+} |
+ |
} // namespace |
Reduction JSTypedLowering::ReduceJSCallConstruct(Node* node) { |
@@ -1587,9 +1595,7 @@ Reduction JSTypedLowering::ReduceJSCallConstruct(Node* node) { |
CallDescriptor::Flags flags = CallDescriptor::kNeedsFrameState; |
if (is_builtin && Builtins::HasCppImplementation(builtin_index) && |
- (shared->internal_formal_parameter_count() == arity || |
- shared->internal_formal_parameter_count() == |
- SharedFunctionInfo::kDontAdaptArgumentsSentinel)) { |
+ !NeedsArgumentAdaptorFrame(shared, arity)) { |
// Patch {node} to a direct CEntryStub call. |
// Load the context from the {target}. |
@@ -1701,22 +1707,7 @@ Reduction JSTypedLowering::ReduceJSCallFunction(Node* node) { |
Node* new_target = jsgraph()->UndefinedConstant(); |
Node* argument_count = jsgraph()->Int32Constant(arity); |
- if (is_builtin && Builtins::HasCppImplementation(builtin_index) && |
- (shared->internal_formal_parameter_count() == arity || |
- shared->internal_formal_parameter_count() == |
- SharedFunctionInfo::kDontAdaptArgumentsSentinel)) { |
- // Patch {node} to a direct CEntryStub call. |
- ReduceBuiltin(isolate(), jsgraph(), node, builtin_index, arity, flags); |
- } else if (shared->internal_formal_parameter_count() == arity || |
- shared->internal_formal_parameter_count() == |
- SharedFunctionInfo::kDontAdaptArgumentsSentinel) { |
- // Patch {node} to a direct call. |
- node->InsertInput(graph()->zone(), arity + 2, new_target); |
- node->InsertInput(graph()->zone(), arity + 3, argument_count); |
- NodeProperties::ChangeOp(node, |
- common()->Call(Linkage::GetJSCallDescriptor( |
- graph()->zone(), false, 1 + arity, flags))); |
- } else { |
+ if (NeedsArgumentAdaptorFrame(shared, arity)) { |
// Patch {node} to an indirect call via the ArgumentsAdaptorTrampoline. |
Callable callable = CodeFactory::ArgumentAdaptor(isolate()); |
node->InsertInput(graph()->zone(), 0, |
@@ -1730,6 +1721,16 @@ Reduction JSTypedLowering::ReduceJSCallFunction(Node* node) { |
node, common()->Call(Linkage::GetStubCallDescriptor( |
isolate(), graph()->zone(), callable.descriptor(), |
1 + arity, flags))); |
+ } else if (is_builtin && Builtins::HasCppImplementation(builtin_index)) { |
+ // Patch {node} to a direct CEntryStub call. |
+ ReduceBuiltin(isolate(), jsgraph(), node, builtin_index, arity, flags); |
+ } else { |
+ // Patch {node} to a direct call. |
+ node->InsertInput(graph()->zone(), arity + 2, new_target); |
+ node->InsertInput(graph()->zone(), arity + 3, argument_count); |
+ NodeProperties::ChangeOp(node, |
+ common()->Call(Linkage::GetJSCallDescriptor( |
+ graph()->zone(), false, 1 + arity, flags))); |
} |
return Changed(node); |
} |