Index: src/ia32/stub-cache-ia32.cc |
=================================================================== |
--- src/ia32/stub-cache-ia32.cc (revision 3132) |
+++ src/ia32/stub-cache-ia32.cc (working copy) |
@@ -776,39 +776,20 @@ |
CheckPrototypes(object, receiver, holder, |
scratch1, scratch2, name, miss); |
- Handle<AccessorInfo> callback_handle(callback); |
- |
- Register other = reg.is(scratch1) ? scratch2 : scratch1; |
- __ EnterInternalFrame(); |
- __ PushHandleScope(other); |
- // Push the stack address where the list of arguments ends |
- __ mov(other, esp); |
- __ sub(Operand(other), Immediate(2 * kPointerSize)); |
- __ push(other); |
+ // Push the arguments on the JS stack of the caller. |
+ __ pop(scratch2); // remove return address |
__ push(receiver); // receiver |
__ push(reg); // holder |
- __ mov(other, Immediate(callback_handle)); |
- __ push(other); |
- __ push(FieldOperand(other, AccessorInfo::kDataOffset)); // data |
+ __ mov(reg, Immediate(Handle<AccessorInfo>(callback))); // callback data |
+ __ push(reg); |
+ __ push(FieldOperand(reg, AccessorInfo::kDataOffset)); |
__ push(name_reg); // name |
- // Save a pointer to where we pushed the arguments pointer. |
- // This will be passed as the const Arguments& to the C++ callback. |
- __ mov(eax, esp); |
- __ add(Operand(eax), Immediate(5 * kPointerSize)); |
- __ mov(ebx, esp); |
+ __ push(scratch2); // restore return address |
- // Do call through the api. |
- ASSERT_EQ(6, ApiGetterEntryStub::kStackSpace); |
- Address getter_address = v8::ToCData<Address>(callback->getter()); |
- ApiFunction fun(getter_address); |
- ApiGetterEntryStub stub(callback_handle, &fun); |
- __ CallStub(&stub); |
- |
- Register tmp = other.is(eax) ? reg : other; |
- __ PopHandleScope(tmp); |
- __ LeaveInternalFrame(); |
- |
- __ ret(0); |
+ // Do tail-call to the runtime system. |
+ ExternalReference load_callback_property = |
+ ExternalReference(IC_Utility(IC::kLoadCallbackProperty)); |
+ __ TailCallRuntime(load_callback_property, 5, 1); |
} |