Index: src/ia32/code-stubs-ia32.cc |
=================================================================== |
--- src/ia32/code-stubs-ia32.cc (revision 5685) |
+++ src/ia32/code-stubs-ia32.cc (working copy) |
@@ -3058,74 +3058,12 @@ |
} |
-// If true, a Handle<T> passed by value is passed and returned by |
-// using the location_ field directly. If false, it is passed and |
-// returned as a pointer to a handle. |
-#ifdef USING_BSD_ABI |
-static const bool kPassHandlesDirectly = true; |
-#else |
-static const bool kPassHandlesDirectly = false; |
-#endif |
- |
- |
void ApiGetterEntryStub::Generate(MacroAssembler* masm) { |
- Label empty_handle; |
- Label prologue; |
- Label promote_scheduled_exception; |
- __ EnterApiExitFrame(kStackSpace, kArgc); |
- STATIC_ASSERT(kArgc == 4); |
- if (kPassHandlesDirectly) { |
- // When handles as passed directly we don't have to allocate extra |
- // space for and pass an out parameter. |
- __ mov(Operand(esp, 0 * kPointerSize), ebx); // name. |
- __ mov(Operand(esp, 1 * kPointerSize), eax); // arguments pointer. |
- } else { |
- // The function expects three arguments to be passed but we allocate |
- // four to get space for the output cell. The argument slots are filled |
- // as follows: |
- // |
- // 3: output cell |
- // 2: arguments pointer |
- // 1: name |
- // 0: pointer to the output cell |
- // |
- // Note that this is one more "argument" than the function expects |
- // so the out cell will have to be popped explicitly after returning |
- // from the function. |
- __ mov(Operand(esp, 1 * kPointerSize), ebx); // name. |
- __ mov(Operand(esp, 2 * kPointerSize), eax); // arguments pointer. |
- __ mov(ebx, esp); |
- __ add(Operand(ebx), Immediate(3 * kPointerSize)); |
- __ mov(Operand(esp, 0 * kPointerSize), ebx); // output |
- __ mov(Operand(esp, 3 * kPointerSize), Immediate(0)); // out cell. |
- } |
- // Call the api function! |
- __ call(fun()->address(), RelocInfo::RUNTIME_ENTRY); |
- // Check if the function scheduled an exception. |
- ExternalReference scheduled_exception_address = |
- ExternalReference::scheduled_exception_address(); |
- __ cmp(Operand::StaticVariable(scheduled_exception_address), |
- Immediate(Factory::the_hole_value())); |
- __ j(not_equal, &promote_scheduled_exception, not_taken); |
- if (!kPassHandlesDirectly) { |
- // The returned value is a pointer to the handle holding the result. |
- // Dereference this to get to the location. |
- __ mov(eax, Operand(eax, 0)); |
- } |
- // Check if the result handle holds 0. |
- __ test(eax, Operand(eax)); |
- __ j(zero, &empty_handle, not_taken); |
- // It was non-zero. Dereference to get the result value. |
- __ mov(eax, Operand(eax, 0)); |
- __ bind(&prologue); |
- __ LeaveExitFrame(); |
- __ ret(0); |
- __ bind(&promote_scheduled_exception); |
- __ TailCallRuntime(Runtime::kPromoteScheduledException, 0, 1); |
- __ bind(&empty_handle); |
- // It was zero; the result is undefined. |
- __ mov(eax, Factory::undefined_value()); |
- __ jmp(&prologue); |
+ __ PrepareCallApiFunction(kStackSpace, kArgc); |
+ STATIC_ASSERT(kArgc == 2); |
+ __ mov(ApiParameterOperand(0), ebx); // name. |
+ __ mov(ApiParameterOperand(1), eax); // arguments pointer. |
+ __ CallApiFunctionAndReturn(fun(), kArgc); |
} |