| Index: src/mips/stub-cache-mips.cc
|
| diff --git a/src/mips/stub-cache-mips.cc b/src/mips/stub-cache-mips.cc
|
| index d95f3becb6559db0479c7b6049dd9bb8ceb431de..7e7a3f77e6fe4948e441d4a73490fea612e2a262 100644
|
| --- a/src/mips/stub-cache-mips.cc
|
| +++ b/src/mips/stub-cache-mips.cc
|
| @@ -924,28 +924,31 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm,
|
|
|
| // NOTE: the O32 abi requires a0 to hold a special pointer when returning a
|
| // struct from the function (which is currently the case). This means we pass
|
| - // the first argument in a1 instead of a0. TryCallApiFunctionAndReturn
|
| - // will handle setting up a0.
|
| + // the first argument in a1 instead of a0, if returns_handle is true.
|
| + // CallApiFunctionAndReturn will set up a0.
|
|
|
| - // a1 = v8::Arguments&
|
| + Address function_address = v8::ToCData<Address>(api_call_info->callback());
|
| + bool returns_handle =
|
| + !CallbackTable::ReturnsVoid(masm->isolate(), function_address);
|
| +
|
| + Register first_arg = returns_handle ? a1 : a0;
|
| +
|
| + // first_arg = v8::Arguments&
|
| // Arguments is built at sp + 1 (sp is a reserved spot for ra).
|
| - __ Addu(a1, sp, kPointerSize);
|
| + __ Addu(first_arg, sp, kPointerSize);
|
|
|
| // v8::Arguments::implicit_args_
|
| - __ sw(a2, MemOperand(a1, 0 * kPointerSize));
|
| + __ sw(a2, MemOperand(first_arg, 0 * kPointerSize));
|
| // v8::Arguments::values_
|
| __ Addu(t0, a2, Operand(argc * kPointerSize));
|
| - __ sw(t0, MemOperand(a1, 1 * kPointerSize));
|
| + __ sw(t0, MemOperand(first_arg, 1 * kPointerSize));
|
| // v8::Arguments::length_ = argc
|
| __ li(t0, Operand(argc));
|
| - __ sw(t0, MemOperand(a1, 2 * kPointerSize));
|
| + __ sw(t0, MemOperand(first_arg, 2 * kPointerSize));
|
| // v8::Arguments::is_construct_call = 0
|
| - __ sw(zero_reg, MemOperand(a1, 3 * kPointerSize));
|
| + __ sw(zero_reg, MemOperand(first_arg, 3 * kPointerSize));
|
|
|
| const int kStackUnwindSpace = argc + kFastApiCallArguments + 1;
|
| - Address function_address = v8::ToCData<Address>(api_call_info->callback());
|
| - bool returns_handle =
|
| - !CallbackTable::ReturnsVoid(masm->isolate(), function_address);
|
| ApiFunction fun(function_address);
|
| ExternalReference::Type type =
|
| returns_handle ?
|
| @@ -1442,13 +1445,20 @@ void BaseLoadStubCompiler::GenerateLoadCallback(
|
| __ sw(scratch4(), MemOperand(sp, 1 * kPointerSize));
|
| __ sw(name(), MemOperand(sp, 0 * kPointerSize));
|
|
|
| + Address getter_address = v8::ToCData<Address>(callback->getter());
|
| + bool returns_handle =
|
| + !CallbackTable::ReturnsVoid(isolate(), getter_address);
|
| +
|
| + Register first_arg = returns_handle ? a1 : a0;
|
| + Register second_arg = returns_handle ? a2 : a1;
|
| +
|
| __ mov(a2, scratch2()); // Saved in case scratch2 == a1.
|
| - __ mov(a1, sp); // a1 (first argument - see note below) = Handle<Name>
|
| + __ mov(first_arg, sp); // (first argument - see note below) = Handle<Name>
|
|
|
| // NOTE: the O32 abi requires a0 to hold a special pointer when returning a
|
| // struct from the function (which is currently the case). This means we pass
|
| - // the arguments in a1-a2 instead of a0-a1. TryCallApiFunctionAndReturn
|
| - // will handle setting up a0.
|
| + // the arguments in a1-a2 instead of a0-a1, if returns_handle is true.
|
| + // CallApiFunctionAndReturn will set up a0.
|
|
|
| const int kApiStackSpace = 1;
|
| FrameScope frame_scope(masm(), StackFrame::MANUAL);
|
| @@ -1457,13 +1467,10 @@ void BaseLoadStubCompiler::GenerateLoadCallback(
|
| // Create AccessorInfo instance on the stack above the exit frame with
|
| // scratch2 (internal::Object** args_) as the data.
|
| __ sw(a2, MemOperand(sp, kPointerSize));
|
| - // a2 (second argument - see note above) = AccessorInfo&
|
| - __ Addu(a2, sp, kPointerSize);
|
| + // (second argument - see note above) = AccessorInfo&
|
| + __ Addu(second_arg, sp, kPointerSize);
|
|
|
| const int kStackUnwindSpace = kFastApiCallArguments + 1;
|
| - Address getter_address = v8::ToCData<Address>(callback->getter());
|
| - bool returns_handle =
|
| - !CallbackTable::ReturnsVoid(isolate(), getter_address);
|
| ApiFunction fun(getter_address);
|
| ExternalReference::Type type =
|
| returns_handle ?
|
|
|