Index: src/mips/stub-cache-mips.cc |
diff --git a/src/mips/stub-cache-mips.cc b/src/mips/stub-cache-mips.cc |
index e0cf1b6363bef44944454946c6f8d41c54b4a0cd..7177c701af254151f4b20a2cb58a9c8a7e661114 100644 |
--- a/src/mips/stub-cache-mips.cc |
+++ b/src/mips/stub-cache-mips.cc |
@@ -832,27 +832,25 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm, |
int argc, |
bool restore_context) { |
// ----------- S t a t e ------------- |
- // -- sp[0] : context |
- // -- sp[4] : holder (set by CheckPrototypes) |
- // -- sp[8] : callee JS function |
- // -- sp[12] : call data |
- // -- sp[16] : isolate |
- // -- sp[20] : ReturnValue default value |
- // -- sp[24] : ReturnValue |
+ // -- sp[0] - sp[24] : FunctionCallbackInfo, incl. |
+ // : holder (set by CheckPrototypes) |
// -- sp[28] : last JS argument |
// -- ... |
// -- sp[(argc + 6) * 4] : first JS argument |
// -- sp[(argc + 7) * 4] : receiver |
// ----------------------------------- |
+ typedef FunctionCallbackArguments FCA; |
+ const int kArgs = kFastApiCallArguments; |
// Save calling context. |
- __ sw(cp, MemOperand(sp)); |
+ __ sw(cp, |
+ MemOperand(sp, (kArgs - 1 + FCA::kContextSaveIndex) * kPointerSize)); |
// Get the function and setup the context. |
Handle<JSFunction> function = optimization.constant_function(); |
__ LoadHeapObject(t1, function); |
__ lw(cp, FieldMemOperand(t1, JSFunction::kContextOffset)); |
- __ sw(t1, MemOperand(sp, 2 * kPointerSize)); |
+ __ sw(t1, MemOperand(sp, (kArgs - 1 + FCA::kCalleeIndex) * kPointerSize)); |
- // Pass the additional arguments. |
+ // Construct the FunctionCallbackInfo. |
Handle<CallHandlerInfo> api_call_info = optimization.api_call_info(); |
Handle<Object> call_data(api_call_info->data(), masm->isolate()); |
if (masm->isolate()->heap()->InNewSpace(*call_data)) { |
@@ -862,17 +860,20 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm, |
__ li(t2, call_data); |
} |
// Store call data. |
- __ sw(t2, MemOperand(sp, 3 * kPointerSize)); |
+ __ sw(t2, MemOperand(sp, (kArgs - 1 + FCA::kDataIndex) * kPointerSize)); |
// Store isolate. |
__ li(t3, Operand(ExternalReference::isolate_address(masm->isolate()))); |
- __ sw(t3, MemOperand(sp, 4 * kPointerSize)); |
+ __ sw(t3, MemOperand(sp, (kArgs - 1 + FCA::kIsolateIndex) * kPointerSize)); |
// Store ReturnValue default and ReturnValue. |
__ LoadRoot(t1, Heap::kUndefinedValueRootIndex); |
- __ sw(t1, MemOperand(sp, 5 * kPointerSize)); |
- __ sw(t1, MemOperand(sp, 6 * kPointerSize)); |
+ __ sw(t1, |
+ MemOperand(sp, (kArgs - 1 + FCA::kReturnValueOffset) * kPointerSize)); |
+ __ sw(t1, |
+ MemOperand(sp, |
+ (kArgs - 1 + FCA::kReturnValueDefaultValueIndex) * kPointerSize)); |
// Prepare arguments. |
- __ Addu(a2, sp, Operand((kFastApiCallArguments - 1) * kPointerSize)); |
+ __ Addu(a2, sp, Operand((kArgs - 1) * kPointerSize)); |
// Allocate the v8::Arguments structure in the arguments' space since |
// it's not controlled by GC. |
@@ -896,7 +897,7 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm, |
// v8::Arguments::is_construct_call = 0 |
__ sw(zero_reg, MemOperand(a0, 3 * kPointerSize)); |
- const int kStackUnwindSpace = argc + kFastApiCallArguments + 1; |
+ const int kStackUnwindSpace = argc + kArgs + 1; |
Address function_address = v8::ToCData<Address>(api_call_info->callback()); |
ApiFunction fun(function_address); |
ExternalReference::Type type = ExternalReference::DIRECT_API_CALL; |
@@ -912,9 +913,9 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm, |
AllowExternalCallThatCantCauseGC scope(masm); |
MemOperand context_restore_operand( |
- fp, 2 * kPointerSize); |
+ fp, (kArgs + 1 + FCA::kContextSaveIndex) * kPointerSize); |
MemOperand return_value_operand( |
- fp, (kFastApiCallArguments + 1) * kPointerSize); |
+ fp, (kArgs + 1 + FCA::kReturnValueOffset) * kPointerSize); |
__ CallApiFunctionAndReturn(ref, |
function_address, |
thunk_ref, |