Index: src/compiler/js-native-context-specialization.cc |
diff --git a/src/compiler/js-native-context-specialization.cc b/src/compiler/js-native-context-specialization.cc |
index 4ab0ad8eded8d95781f53a2ee93b777da8e01fd2..408a6cda39ac3f4a343acf831b13afb843779ee5 100644 |
--- a/src/compiler/js-native-context-specialization.cc |
+++ b/src/compiler/js-native-context-specialization.cc |
@@ -1023,10 +1023,9 @@ JSNativeContextSpecialization::BuildPropertyAccess( |
Handle<FunctionTemplateInfo> function_template_info( |
Handle<FunctionTemplateInfo>::cast(access_info.constant())); |
DCHECK(!function_template_info->call_code()->IsUndefined(isolate())); |
- ZoneVector<Node*> stack_parameters(graph()->zone()); |
ValueEffectControl value_effect_control = InlineApiCall( |
- receiver, context, target, frame_state0, &stack_parameters, |
- effect, control, shared_info, function_template_info); |
+ receiver, context, target, frame_state0, nullptr, effect, control, |
+ shared_info, function_template_info); |
value = value_effect_control.value(); |
effect = value_effect_control.effect(); |
control = value_effect_control.control(); |
@@ -1060,11 +1059,9 @@ JSNativeContextSpecialization::BuildPropertyAccess( |
Handle<FunctionTemplateInfo> function_template_info( |
Handle<FunctionTemplateInfo>::cast(access_info.constant())); |
DCHECK(!function_template_info->call_code()->IsUndefined(isolate())); |
- ZoneVector<Node*> stack_parameters(graph()->zone()); |
- stack_parameters.push_back(value); |
ValueEffectControl value_effect_control = InlineApiCall( |
- receiver, context, target, frame_state0, &stack_parameters, |
- effect, control, shared_info, function_template_info); |
+ receiver, context, target, frame_state0, value, effect, control, |
+ shared_info, function_template_info); |
value = value_effect_control.value(); |
effect = value_effect_control.effect(); |
control = value_effect_control.control(); |
@@ -1563,25 +1560,25 @@ JSNativeContextSpecialization::BuildElementAccess( |
JSNativeContextSpecialization::ValueEffectControl |
JSNativeContextSpecialization::InlineApiCall( |
- Node* receiver, Node* context, Node* target, Node* frame_state, |
- ZoneVector<Node*>* stack_parameters, Node* effect, Node* control, |
- Handle<SharedFunctionInfo> shared_info, |
+ Node* receiver, Node* context, Node* target, Node* frame_state, Node* value, |
+ Node* effect, Node* control, Handle<SharedFunctionInfo> shared_info, |
Handle<FunctionTemplateInfo> function_template_info) { |
Handle<CallHandlerInfo> call_handler_info = handle( |
CallHandlerInfo::cast(function_template_info->call_code()), isolate()); |
Handle<Object> call_data_object(call_handler_info->data(), isolate()); |
+ // Only setters have a value. |
+ int const argc = value == nullptr ? 0 : 1; |
// The stub always expects the receiver as the first param on the stack. |
CallApiCallbackStub stub( |
- isolate(), static_cast<int>(stack_parameters->size()), |
- call_data_object->IsUndefined(isolate()), |
- true /* TODO(epertoso): similar to CallOptimization */); |
+ isolate(), argc, call_data_object->IsUndefined(isolate()), |
+ true /* FunctionTemplateInfo doesn't have an associated context. */); |
CallInterfaceDescriptor call_interface_descriptor = |
stub.GetCallInterfaceDescriptor(); |
CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( |
isolate(), graph()->zone(), call_interface_descriptor, |
- call_interface_descriptor.GetStackParameterCount() + |
- static_cast<int>(stack_parameters->size()) + 1, |
+ call_interface_descriptor.GetStackParameterCount() + argc + |
+ 1 /* implicit receiver */, |
CallDescriptor::kNeedsFrameState, Operator::kNoProperties, |
MachineType::AnyTagged(), 1); |
@@ -1592,30 +1589,21 @@ JSNativeContextSpecialization::InlineApiCall( |
&function, ExternalReference::DIRECT_API_CALL, isolate()))); |
Node* code = jsgraph()->HeapConstant(stub.GetCode()); |
- ZoneVector<Node*> inputs(zone()); |
- inputs.push_back(code); |
- |
- // CallApiCallbackStub's register arguments. |
- inputs.push_back(target); |
- inputs.push_back(data); |
- inputs.push_back(receiver); |
- inputs.push_back(function_reference); |
- |
- // Stack parameters: CallApiCallbackStub expects the first one to be the |
- // receiver. |
- inputs.push_back(receiver); |
- for (Node* node : *stack_parameters) { |
- inputs.push_back(node); |
+ // Add CallApiCallbackStub's register argument as well. |
+ Node* inputs[11] = { |
+ code, target, data, receiver /* holder */, function_reference, receiver}; |
+ if (value != nullptr) { |
+ inputs[6] = value; |
} |
- inputs.push_back(context); |
- inputs.push_back(frame_state); |
- inputs.push_back(effect); |
- inputs.push_back(control); |
+ int index = 6 + argc; |
+ inputs[index++] = context; |
+ inputs[index++] = frame_state; |
+ inputs[index++] = effect; |
+ inputs[index++] = control; |
Node* effect0; |
Node* value0 = effect0 = |
- graph()->NewNode(common()->Call(call_descriptor), |
- static_cast<int>(inputs.size()), inputs.data()); |
+ graph()->NewNode(common()->Call(call_descriptor), index, inputs); |
Node* control0 = graph()->NewNode(common()->IfSuccess(), value0); |
return ValueEffectControl(value0, effect0, control0); |
} |