| Index: src/arm/stub-cache-arm.cc
|
| ===================================================================
|
| --- src/arm/stub-cache-arm.cc (revision 6858)
|
| +++ src/arm/stub-cache-arm.cc (working copy)
|
| @@ -655,12 +655,10 @@
|
| // 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 @@
|
| 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>
|
|
|
| - // Do tail-call to the runtime system.
|
| - ExternalReference load_callback_property =
|
| - ExternalReference(IC_Utility(IC::kLoadCallbackProperty));
|
| - __ TailCallExternalReference(load_callback_property, 5, 1);
|
| + Address getter_address = v8::ToCData<Address>(callback->getter());
|
| + ApiFunction fun(getter_address);
|
|
|
| - return Heap::undefined_value(); // Success.
|
| + 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&
|
| +
|
| + // 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);
|
| }
|
|
|
|
|
|
|