Use StackArgumentsAccessor for PropertyCallback and FunctionCallback for X64
R=danno@chromium.org Review URL: https://codereview.chromium.org/25682002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17093 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
3a3c8e760e
commit
df37f91699
@ -520,10 +520,12 @@ static void GenerateFastApiCall(MacroAssembler* masm,
|
||||
|
||||
Address thunk_address = FUNCTION_ADDR(&InvokeFunctionCallback);
|
||||
|
||||
Operand context_restore_operand(rbp,
|
||||
(2 + FCA::kContextSaveIndex) * kPointerSize);
|
||||
Operand return_value_operand(rbp,
|
||||
(2 + FCA::kReturnValueOffset) * kPointerSize);
|
||||
StackArgumentsAccessor args_from_rbp(rbp, kFastApiCallArguments,
|
||||
ARGUMENTS_DONT_CONTAIN_RECEIVER);
|
||||
Operand context_restore_operand = args_from_rbp.GetArgumentOperand(
|
||||
kFastApiCallArguments - 1 - FCA::kContextSaveIndex);
|
||||
Operand return_value_operand = args_from_rbp.GetArgumentOperand(
|
||||
kFastApiCallArguments - 1 - FCA::kReturnValueOffset);
|
||||
__ CallApiFunctionAndReturn(
|
||||
function_address,
|
||||
thunk_address,
|
||||
@ -544,24 +546,23 @@ static void GenerateFastApiCall(MacroAssembler* masm,
|
||||
ASSERT(optimization.is_simple_api_call());
|
||||
ASSERT(!receiver.is(scratch));
|
||||
|
||||
const int stack_space = kFastApiCallArguments + argc + 1;
|
||||
const int kHolderIndex = FunctionCallbackArguments::kHolderIndex + 1;
|
||||
// Copy return value.
|
||||
__ movq(scratch, Operand(rsp, 0));
|
||||
// Assign stack space for the call arguments.
|
||||
__ subq(rsp, Immediate(stack_space * kPointerSize));
|
||||
// Move the return address on top of the stack.
|
||||
__ movq(Operand(rsp, 0), scratch);
|
||||
const int fast_api_call_argc = argc + kFastApiCallArguments;
|
||||
StackArgumentsAccessor args(rsp, fast_api_call_argc);
|
||||
// argc + 1 is the argument number before FastApiCall arguments, 1 ~ receiver
|
||||
const int kHolderIndex = argc + 1 +
|
||||
kFastApiCallArguments - 1 - FunctionCallbackArguments::kHolderIndex;
|
||||
__ movq(scratch, StackOperandForReturnAddress(0));
|
||||
// Assign stack space for the call arguments and receiver.
|
||||
__ subq(rsp, Immediate((fast_api_call_argc + 1) * kPointerSize));
|
||||
__ movq(StackOperandForReturnAddress(0), scratch);
|
||||
// Write holder to stack frame.
|
||||
__ movq(Operand(rsp, kHolderIndex * kPointerSize), receiver);
|
||||
// Write receiver to stack frame.
|
||||
int index = stack_space;
|
||||
__ movq(Operand(rsp, index-- * kPointerSize), receiver);
|
||||
__ movq(args.GetArgumentOperand(kHolderIndex), receiver);
|
||||
__ movq(args.GetReceiverOperand(), receiver);
|
||||
// Write the arguments to stack frame.
|
||||
for (int i = 0; i < argc; i++) {
|
||||
ASSERT(!receiver.is(values[i]));
|
||||
ASSERT(!scratch.is(values[i]));
|
||||
__ movq(Operand(rsp, index-- * kPointerSize), values[i]);
|
||||
__ movq(args.GetArgumentOperand(i + 1), values[i]);
|
||||
}
|
||||
|
||||
GenerateFastApiCall(masm, optimization, argc, true);
|
||||
@ -1094,7 +1095,6 @@ Register StubCompiler::CheckPrototypes(Handle<JSObject> object,
|
||||
int save_at_depth,
|
||||
Label* miss,
|
||||
PrototypeCheckType check) {
|
||||
const int kHolderIndex = FunctionCallbackArguments::kHolderIndex + 1;
|
||||
// Make sure that the type feedback oracle harvests the receiver map.
|
||||
// TODO(svenpanne) Remove this hack when all ICs are reworked.
|
||||
__ Move(scratch1, Handle<Map>(object->map()));
|
||||
@ -1111,8 +1111,13 @@ Register StubCompiler::CheckPrototypes(Handle<JSObject> object,
|
||||
Register reg = object_reg;
|
||||
int depth = 0;
|
||||
|
||||
StackArgumentsAccessor args(rsp, kFastApiCallArguments,
|
||||
ARGUMENTS_DONT_CONTAIN_RECEIVER);
|
||||
const int kHolderIndex = kFastApiCallArguments - 1 -
|
||||
FunctionCallbackArguments::kHolderIndex;
|
||||
|
||||
if (save_at_depth == depth) {
|
||||
__ movq(Operand(rsp, kHolderIndex * kPointerSize), object_reg);
|
||||
__ movq(args.GetArgumentOperand(kHolderIndex), object_reg);
|
||||
}
|
||||
|
||||
// Check the maps in the prototype chain.
|
||||
@ -1172,7 +1177,7 @@ Register StubCompiler::CheckPrototypes(Handle<JSObject> object,
|
||||
}
|
||||
|
||||
if (save_at_depth == depth) {
|
||||
__ movq(Operand(rsp, kHolderIndex * kPointerSize), reg);
|
||||
__ movq(args.GetArgumentOperand(kHolderIndex), reg);
|
||||
}
|
||||
|
||||
// Go to the next object in the prototype chain.
|
||||
@ -1390,11 +1395,16 @@ void BaseLoadStubCompiler::GenerateLoadCallback(
|
||||
|
||||
Address thunk_address = FUNCTION_ADDR(&InvokeAccessorGetterCallback);
|
||||
|
||||
// The name handler is counted as an argument.
|
||||
StackArgumentsAccessor args(rbp, PropertyCallbackArguments::kArgsLength);
|
||||
Operand return_value_operand = args.GetArgumentOperand(
|
||||
PropertyCallbackArguments::kArgsLength - 1 -
|
||||
PropertyCallbackArguments::kReturnValueOffset);
|
||||
__ CallApiFunctionAndReturn(getter_address,
|
||||
thunk_address,
|
||||
getter_arg,
|
||||
kStackSpace,
|
||||
Operand(rbp, 6 * kPointerSize),
|
||||
return_value_operand,
|
||||
NULL);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user