Index: src/arm/stub-cache-arm.cc |
diff --git a/src/arm/stub-cache-arm.cc b/src/arm/stub-cache-arm.cc |
index e623ea1914ff06e96447bfca8f722042090bd58e..e2501125a0662a542a42076aff91104c7ff31800 100644 |
--- a/src/arm/stub-cache-arm.cc |
+++ b/src/arm/stub-cache-arm.cc |
@@ -655,12 +655,10 @@ static MaybeObject* GenerateFastApiDirectCall(MacroAssembler* masm, |
// already generated). Do not allow the assembler to perform a |
// garbage collection but instead return the allocation failure |
// object. |
- MaybeObject* result = masm->TryCallApiFunctionAndReturn( |
- &fun, argc + kFastApiCallArguments + 1); |
- if (result->IsFailure()) { |
- return result; |
- } |
- return Heap::undefined_value(); |
+ const int kStackUnwindSpace = argc + kFastApiCallArguments + 1; |
+ ExternalReference ref = |
+ ExternalReference(&fun, ExternalReference::DIRECT_API_CALL); |
+ return masm->TryCallApiFunctionAndReturn(ref, kStackUnwindSpace); |
} |
class CallInterceptorCompiler BASE_EMBEDDED { |
@@ -1245,18 +1243,38 @@ MaybeObject* StubCompiler::GenerateLoadCallback(JSObject* object, |
CheckPrototypes(object, receiver, holder, scratch1, scratch2, scratch3, |
name, miss); |
- // Push the arguments on the JS stack of the caller. |
- __ push(receiver); // Receiver. |
- __ mov(scratch3, Operand(Handle<AccessorInfo>(callback))); // callback data |
- __ ldr(ip, FieldMemOperand(scratch3, AccessorInfo::kDataOffset)); |
- __ Push(reg, ip, scratch3, name_reg); |
+ // Build AccessorInfo::args_ list on the stack and push property name below |
+ // the exit frame to make GC aware of them and store pointers to them. |
+ __ push(receiver); |
+ __ mov(scratch2, sp); // scratch2 = AccessorInfo::args_ |
+ Handle<AccessorInfo> callback_handle(callback); |
+ if (Heap::InNewSpace(callback_handle->data())) { |
+ __ Move(scratch3, callback_handle); |
+ __ ldr(scratch3, FieldMemOperand(scratch3, AccessorInfo::kDataOffset)); |
+ } else { |
+ __ Move(scratch3, Handle<Object>(callback_handle->data())); |
+ } |
+ __ Push(reg, scratch3, name_reg); |
+ __ mov(r0, sp); // r0 = Handle<String> |
+ |
+ Address getter_address = v8::ToCData<Address>(callback->getter()); |
+ ApiFunction fun(getter_address); |
- // Do tail-call to the runtime system. |
- ExternalReference load_callback_property = |
- ExternalReference(IC_Utility(IC::kLoadCallbackProperty)); |
- __ TailCallExternalReference(load_callback_property, 5, 1); |
+ const int kApiStackSpace = 1; |
+ __ EnterExitFrame(false, kApiStackSpace); |
+ // Create AccessorInfo instance on the stack above the exit frame with |
+ // scratch2 (internal::Object **args_) as the data. |
+ __ str(scratch2, MemOperand(sp, 1 * kPointerSize)); |
+ __ add(r1, sp, Operand(1 * kPointerSize)); // r1 = AccessorInfo& |
- return Heap::undefined_value(); // Success. |
+ // Emitting a stub call may try to allocate (if the code is not |
+ // already generated). Do not allow the assembler to perform a |
+ // garbage collection but instead return the allocation failure |
+ // object. |
+ const int kStackUnwindSpace = 4; |
+ ExternalReference ref = |
+ ExternalReference(&fun, ExternalReference::DIRECT_GETTER_CALL); |
+ return masm()->TryCallApiFunctionAndReturn(ref, kStackUnwindSpace); |
} |