Index: src/ic/arm64/handler-compiler-arm64.cc |
diff --git a/src/ic/arm64/handler-compiler-arm64.cc b/src/ic/arm64/handler-compiler-arm64.cc |
index 53f084b1d406f6c387201ddfa089e7aec8f89f0a..5de315d2e025891595c184ab4bfd456cac8548bc 100644 |
--- a/src/ic/arm64/handler-compiler-arm64.cc |
+++ b/src/ic/arm64/handler-compiler-arm64.cc |
@@ -221,7 +221,7 @@ void PropertyHandlerCompiler::GenerateApiAccessorCall( |
void NamedStoreHandlerCompiler::GenerateStoreViaSetter( |
MacroAssembler* masm, Handle<HeapType> type, Register receiver, |
- Handle<JSFunction> setter) { |
+ Register holder, int accessor_index, int expected_arguments) { |
// ----------- S t a t e ------------- |
// -- lr : return address |
// ----------------------------------- |
@@ -233,7 +233,7 @@ void NamedStoreHandlerCompiler::GenerateStoreViaSetter( |
// Save value register, so we can restore it later. |
__ Push(value()); |
- if (!setter.is_null()) { |
+ if (accessor_index >= 0) { |
// Call the JavaScript setter with receiver and value on the stack. |
if (IC::TypeToMap(*type, masm->isolate())->IsJSGlobalObjectMap()) { |
// Swap in the global receiver. |
@@ -242,9 +242,14 @@ void NamedStoreHandlerCompiler::GenerateStoreViaSetter( |
} |
__ Push(receiver, value()); |
ParameterCount actual(1); |
- ParameterCount expected(setter); |
- __ InvokeFunction(setter, expected, actual, CALL_FUNCTION, |
- NullCallWrapper()); |
+ ParameterCount expected(expected_arguments); |
+ Register scratch = holder; |
+ __ Ldr(scratch, FieldMemOperand(holder, HeapObject::kMapOffset)); |
+ __ LoadInstanceDescriptors(scratch, scratch); |
+ __ Ldr(scratch, FieldMemOperand(scratch, DescriptorArray::GetValueOffset( |
+ accessor_index))); |
+ __ Ldr(x1, FieldMemOperand(scratch, AccessorPair::kSetterOffset)); |
+ __ InvokeFunction(x1, expected, actual, CALL_FUNCTION, NullCallWrapper()); |
} else { |
// If we generate a global code snippet for deoptimization only, remember |
// the place to continue after deoptimization. |