Chromium Code Reviews| 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 { |
| @@ -1244,19 +1242,40 @@ |
| Register reg = |
| CheckPrototypes(object, receiver, holder, scratch1, scratch2, scratch3, |
| name, miss); |
| + ASSERT(reg.is(receiver) || reg.is(scratch1)); |
| - // 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 Accessor Getter arguments and property name on the stack below |
|
antonm
2011/02/21 17:45:12
won't it be more correct to phrase it like: build
Zaheer
2011/02/23 06:34:07
Done.
|
| + // the exit frame to make GC aware of them and store pointers to them. |
| + __ push(receiver); |
| + __ mov(scratch2, sp); |
|
antonm
2011/02/21 17:45:12
maybe: // scratch = AccessorInfo::args_ ?
Zaheer
2011/02/23 06:34:07
Done.
|
| + 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); |
| } |