Index: src/arm/stub-cache-arm.cc |
=================================================================== |
--- src/arm/stub-cache-arm.cc (revision 6680) |
+++ 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 { |
@@ -1241,22 +1239,43 @@ |
__ b(eq, miss); |
// Check that the maps haven't changed. |
- Register reg = |
+ Register holder_reg = |
antonm
2011/02/17 16:13:44
if you change this, please, change other platforms
Zaheer
2011/02/21 10:25:35
Do not wish to touch x86, reverted it back to reg.
|
CheckPrototypes(object, receiver, holder, scratch1, scratch2, scratch3, |
name, miss); |
+ ASSERT(holder_reg.is(receiver) || holder_reg.is(scratch1)); |
antonm
2011/02/17 16:13:44
do you waht to assert this or rather the fact that
Zaheer
2011/02/21 10:25:35
The holder_reg.is(scratch{2,3}) check already happ
antonm
2011/02/21 17:45:12
So why you bother asserting here? What kind of in
Zaheer
2011/02/23 06:34:07
I added this as a sanity check on the return value
|
- // 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); |
+ // Push AccessorInfo arguments and property name below the |
+ // exit frame and hence accessible to GC. |
+ __ push(receiver); |
antonm
2011/02/17 16:13:44
may I ask you to reformat and comment you code sli
Zaheer
2011/02/21 10:25:35
with the merge of pushes, its difficult to separat
|
+ __ mov(scratch2, sp); |
+ __ push(holder_reg); |
+ 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(scratch3); |
+ __ push(name_reg); |
SeRya
2011/02/20 17:28:39
__ Push(receiver, scratch3, name_reg) (or at least
Zaheer
2011/02/21 10:25:35
Done. Merged the last three pushes. cant merge the
|
+ __ 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); |
+ __ str(scratch2, MemOperand(sp, 1 * kPointerSize)); |
antonm
2011/02/17 16:13:44
Please, explain briefly why we need additional wra
SeRya
2011/02/20 17:28:39
Is is an instance of v8::AccessorInfo which consis
Zaheer
2011/02/21 10:25:35
This to create internal::Object** (AccessorInfo on
antonm
2011/02/21 17:45:12
I am sorry, I thought that's some additional wrapp
|
+ __ 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_LOAD_CALL); |
+ return masm()->TryCallApiFunctionAndReturn(ref, kStackUnwindSpace); |
} |