Index: src/mips/stub-cache-mips.cc |
diff --git a/src/mips/stub-cache-mips.cc b/src/mips/stub-cache-mips.cc |
index 7177c701af254151f4b20a2cb58a9c8a7e661114..cd08533ff074f1ac5dba2c39ccef320407b46dac 100644 |
--- a/src/mips/stub-cache-mips.cc |
+++ b/src/mips/stub-cache-mips.cc |
@@ -840,15 +840,13 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm, |
// -- sp[(argc + 7) * 4] : receiver |
// ----------------------------------- |
typedef FunctionCallbackArguments FCA; |
- const int kArgs = kFastApiCallArguments; |
// Save calling context. |
- __ sw(cp, |
- MemOperand(sp, (kArgs - 1 + FCA::kContextSaveIndex) * kPointerSize)); |
+ __ sw(cp, MemOperand(sp, 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, (kArgs - 1 + FCA::kCalleeIndex) * kPointerSize)); |
+ __ sw(t1, MemOperand(sp, FCA::kCalleeIndex * kPointerSize)); |
// Construct the FunctionCallbackInfo. |
Handle<CallHandlerInfo> api_call_info = optimization.api_call_info(); |
@@ -860,20 +858,17 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm, |
__ li(t2, call_data); |
} |
// Store call data. |
- __ sw(t2, MemOperand(sp, (kArgs - 1 + FCA::kDataIndex) * kPointerSize)); |
+ __ sw(t2, MemOperand(sp, FCA::kDataIndex * kPointerSize)); |
// Store isolate. |
__ li(t3, Operand(ExternalReference::isolate_address(masm->isolate()))); |
- __ sw(t3, MemOperand(sp, (kArgs - 1 + FCA::kIsolateIndex) * kPointerSize)); |
+ __ sw(t3, MemOperand(sp, FCA::kIsolateIndex * kPointerSize)); |
// Store ReturnValue default and ReturnValue. |
__ LoadRoot(t1, Heap::kUndefinedValueRootIndex); |
- __ sw(t1, |
- MemOperand(sp, (kArgs - 1 + FCA::kReturnValueOffset) * kPointerSize)); |
- __ sw(t1, |
- MemOperand(sp, |
- (kArgs - 1 + FCA::kReturnValueDefaultValueIndex) * kPointerSize)); |
+ __ sw(t1, MemOperand(sp, FCA::kReturnValueOffset * kPointerSize)); |
+ __ sw(t1, MemOperand(sp, FCA::kReturnValueDefaultValueIndex * kPointerSize)); |
// Prepare arguments. |
- __ Addu(a2, sp, Operand((kArgs - 1) * kPointerSize)); |
+ __ Move(a2, sp); |
// Allocate the v8::Arguments structure in the arguments' space since |
// it's not controlled by GC. |
@@ -882,22 +877,21 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm, |
FrameScope frame_scope(masm, StackFrame::MANUAL); |
__ EnterExitFrame(false, kApiStackSpace); |
- // a0 = v8::Arguments& |
+ // a0 = FunctionCallbackInfo& |
// Arguments is built at sp + 1 (sp is a reserved spot for ra). |
__ Addu(a0, sp, kPointerSize); |
- |
- // v8::Arguments::implicit_args_ |
+ // FunctionCallbackInfo::implicit_args_ |
__ sw(a2, MemOperand(a0, 0 * kPointerSize)); |
- // v8::Arguments::values_ |
- __ Addu(t0, a2, Operand(argc * kPointerSize)); |
+ // FunctionCallbackInfo::values_ |
+ __ Addu(t0, a2, Operand((kFastApiCallArguments - 1 + argc) * kPointerSize)); |
__ sw(t0, MemOperand(a0, 1 * kPointerSize)); |
- // v8::Arguments::length_ = argc |
+ // FunctionCallbackInfo::length_ = argc |
__ li(t0, Operand(argc)); |
__ sw(t0, MemOperand(a0, 2 * kPointerSize)); |
- // v8::Arguments::is_construct_call = 0 |
+ // FunctionCallbackInfo::is_construct_call = 0 |
__ sw(zero_reg, MemOperand(a0, 3 * kPointerSize)); |
- const int kStackUnwindSpace = argc + kArgs + 1; |
+ const int kStackUnwindSpace = argc + kFastApiCallArguments + 1; |
Address function_address = v8::ToCData<Address>(api_call_info->callback()); |
ApiFunction fun(function_address); |
ExternalReference::Type type = ExternalReference::DIRECT_API_CALL; |
@@ -913,9 +907,10 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm, |
AllowExternalCallThatCantCauseGC scope(masm); |
MemOperand context_restore_operand( |
- fp, (kArgs + 1 + FCA::kContextSaveIndex) * kPointerSize); |
+ fp, (2 + FCA::kContextSaveIndex) * kPointerSize); |
MemOperand return_value_operand( |
- fp, (kArgs + 1 + FCA::kReturnValueOffset) * kPointerSize); |
+ fp, (2 + FCA::kReturnValueOffset) * kPointerSize); |
+ |
__ CallApiFunctionAndReturn(ref, |
function_address, |
thunk_ref, |
@@ -937,13 +932,12 @@ static void GenerateFastApiCall(MacroAssembler* masm, |
ASSERT(optimization.is_simple_api_call()); |
ASSERT(!receiver.is(scratch)); |
+ typedef FunctionCallbackArguments FCA; |
const int stack_space = kFastApiCallArguments + argc + 1; |
- const int kHolderIndex = kFastApiCallArguments + |
- FunctionCallbackArguments::kHolderIndex - 1; |
// Assign stack space for the call arguments. |
__ Subu(sp, sp, Operand(stack_space * kPointerSize)); |
// Write holder to stack frame. |
- __ sw(receiver, MemOperand(sp, kHolderIndex * kPointerSize)); |
+ __ sw(receiver, MemOperand(sp, FCA::kHolderIndex * kPointerSize)); |
// Write receiver to stack frame. |
int index = stack_space - 1; |
__ sw(receiver, MemOperand(sp, index * kPointerSize)); |
@@ -1196,8 +1190,6 @@ Register StubCompiler::CheckPrototypes(Handle<JSObject> object, |
int save_at_depth, |
Label* miss, |
PrototypeCheckType check) { |
- const int kHolderIndex = kFastApiCallArguments + |
- FunctionCallbackArguments::kHolderIndex - 1; |
// Make sure that the type feedback oracle harvests the receiver map. |
// TODO(svenpanne) Remove this hack when all ICs are reworked. |
__ li(scratch1, Operand(Handle<Map>(object->map()))); |
@@ -1212,8 +1204,9 @@ Register StubCompiler::CheckPrototypes(Handle<JSObject> object, |
Register reg = object_reg; |
int depth = 0; |
+ typedef FunctionCallbackArguments FCA; |
if (save_at_depth == depth) { |
- __ sw(reg, MemOperand(sp, kHolderIndex * kPointerSize)); |
+ __ sw(reg, MemOperand(sp, FCA::kHolderIndex * kPointerSize)); |
} |
// Check the maps in the prototype chain. |
@@ -1271,7 +1264,7 @@ Register StubCompiler::CheckPrototypes(Handle<JSObject> object, |
} |
if (save_at_depth == depth) { |
- __ sw(reg, MemOperand(sp, kHolderIndex * kPointerSize)); |
+ __ sw(reg, MemOperand(sp, FCA::kHolderIndex * kPointerSize)); |
} |
// Go to the next object in the prototype chain. |
@@ -1429,17 +1422,17 @@ void BaseLoadStubCompiler::GenerateLoadCallback( |
Handle<ExecutableAccessorInfo> callback) { |
// Build AccessorInfo::args_ list on the stack and push property name below |
// the exit frame to make GC aware of them and store pointers to them. |
- STATIC_ASSERT(PropertyCallbackArguments::kThisIndex == 0); |
- STATIC_ASSERT(PropertyCallbackArguments::kDataIndex == -1); |
- STATIC_ASSERT(PropertyCallbackArguments::kReturnValueOffset == -2); |
- STATIC_ASSERT(PropertyCallbackArguments::kReturnValueDefaultValueIndex == -3); |
- STATIC_ASSERT(PropertyCallbackArguments::kIsolateIndex == -4); |
- STATIC_ASSERT(PropertyCallbackArguments::kHolderIndex == -5); |
+ STATIC_ASSERT(PropertyCallbackArguments::kHolderIndex == 0); |
+ STATIC_ASSERT(PropertyCallbackArguments::kIsolateIndex == 1); |
+ STATIC_ASSERT(PropertyCallbackArguments::kReturnValueDefaultValueIndex == 2); |
+ STATIC_ASSERT(PropertyCallbackArguments::kReturnValueOffset == 3); |
+ STATIC_ASSERT(PropertyCallbackArguments::kDataIndex == 4); |
+ STATIC_ASSERT(PropertyCallbackArguments::kThisIndex == 5); |
+ STATIC_ASSERT(PropertyCallbackArguments::kArgsLength == 6); |
ASSERT(!scratch2().is(reg)); |
ASSERT(!scratch3().is(reg)); |
ASSERT(!scratch4().is(reg)); |
__ push(receiver()); |
- __ mov(scratch2(), sp); // scratch2 = AccessorInfo::args_ |
if (heap()->InNewSpace(callback->data())) { |
__ li(scratch3(), callback); |
__ lw(scratch3(), FieldMemOperand(scratch3(), |
@@ -1457,6 +1450,7 @@ void BaseLoadStubCompiler::GenerateLoadCallback( |
__ sw(scratch4(), MemOperand(sp, 2 * kPointerSize)); |
__ sw(reg, MemOperand(sp, 1 * kPointerSize)); |
__ sw(name(), MemOperand(sp, 0 * kPointerSize)); |
+ __ Addu(scratch2(), sp, 1 * kPointerSize); |
__ mov(a2, scratch2()); // Saved in case scratch2 == a1. |
__ mov(a0, sp); // (first argument - a0) = Handle<Name> |
@@ -1465,7 +1459,7 @@ void BaseLoadStubCompiler::GenerateLoadCallback( |
FrameScope frame_scope(masm(), StackFrame::MANUAL); |
__ EnterExitFrame(false, kApiStackSpace); |
- // Create AccessorInfo instance on the stack above the exit frame with |
+ // Create PropertyAccessorInfo instance on the stack above the exit frame with |
// scratch2 (internal::Object** args_) as the data. |
__ sw(a2, MemOperand(sp, kPointerSize)); |
// (second argument - a1) = AccessorInfo& |