Commit 2dc3eca4 authored by marja@chromium.org's avatar marja@chromium.org

Refactoring PropertyCallbackInfo & FunctionCallbackInfo, step 2.

This step reorders the FunctionCallbackInfo fields.

BUG=
R=dcarney@chromium.org, mstarzinger@chromium.org

Review URL: https://codereview.chromium.org/23484037

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16961 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 4078a89a
...@@ -2386,13 +2386,13 @@ class FunctionCallbackInfo { ...@@ -2386,13 +2386,13 @@ class FunctionCallbackInfo {
protected: protected:
friend class internal::FunctionCallbackArguments; friend class internal::FunctionCallbackArguments;
friend class internal::CustomArguments<FunctionCallbackInfo>; friend class internal::CustomArguments<FunctionCallbackInfo>;
static const int kReturnValueIndex = 0; static const int kContextSaveIndex = 0;
static const int kReturnValueDefaultValueIndex = -1; static const int kCalleeIndex = -1;
static const int kIsolateIndex = -2; static const int kDataIndex = -2;
static const int kDataIndex = -3; static const int kReturnValueIndex = -3;
static const int kCalleeIndex = -4; static const int kReturnValueDefaultValueIndex = -4;
static const int kHolderIndex = -5; static const int kIsolateIndex = -5;
static const int kContextSaveIndex = -6; static const int kHolderIndex = -6;
V8_INLINE FunctionCallbackInfo(internal::Object** implicit_args, V8_INLINE FunctionCallbackInfo(internal::Object** implicit_args,
internal::Object** values, internal::Object** values,
......
...@@ -238,6 +238,12 @@ class FunctionCallbackArguments ...@@ -238,6 +238,12 @@ class FunctionCallbackArguments
typedef CustomArguments<T> Super; typedef CustomArguments<T> Super;
static const int kArgsLength = T::kArgsLength; static const int kArgsLength = T::kArgsLength;
static const int kHolderIndex = T::kHolderIndex; static const int kHolderIndex = T::kHolderIndex;
static const int kDataIndex = T::kDataIndex;
static const int kReturnValueDefaultValueIndex =
T::kReturnValueDefaultValueIndex;
static const int kIsolateIndex = T::kIsolateIndex;
static const int kCalleeIndex = T::kCalleeIndex;
static const int kContextSaveIndex = T::kContextSaveIndex;
FunctionCallbackArguments(internal::Isolate* isolate, FunctionCallbackArguments(internal::Isolate* isolate,
internal::Object* data, internal::Object* data,
......
...@@ -842,27 +842,25 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm, ...@@ -842,27 +842,25 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm,
int argc, int argc,
bool restore_context) { bool restore_context) {
// ----------- S t a t e ------------- // ----------- S t a t e -------------
// -- sp[0] : context // -- sp[0] - sp[24] : FunctionCallbackInfo, incl.
// -- sp[4] : holder (set by CheckPrototypes) // : 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[28] : last JS argument // -- sp[28] : last JS argument
// -- ... // -- ...
// -- sp[(argc + 6) * 4] : first JS argument // -- sp[(argc + 6) * 4] : first JS argument
// -- sp[(argc + 7) * 4] : receiver // -- sp[(argc + 7) * 4] : receiver
// ----------------------------------- // -----------------------------------
typedef FunctionCallbackArguments FCA;
const int kArgs = kFastApiCallArguments;
// Save calling context. // Save calling context.
__ str(cp, MemOperand(sp)); __ str(cp,
MemOperand(sp, (kArgs - 1 + FCA::kContextSaveIndex) * kPointerSize));
// Get the function and setup the context. // Get the function and setup the context.
Handle<JSFunction> function = optimization.constant_function(); Handle<JSFunction> function = optimization.constant_function();
__ LoadHeapObject(r5, function); __ LoadHeapObject(r5, function);
__ ldr(cp, FieldMemOperand(r5, JSFunction::kContextOffset)); __ ldr(cp, FieldMemOperand(r5, JSFunction::kContextOffset));
__ str(r5, MemOperand(sp, 2 * kPointerSize)); __ str(r5, MemOperand(sp, (kArgs - 1 + FCA::kCalleeIndex) * kPointerSize));
// Pass the additional arguments. // Construct the FunctionCallbackInfo.
Handle<CallHandlerInfo> api_call_info = optimization.api_call_info(); Handle<CallHandlerInfo> api_call_info = optimization.api_call_info();
Handle<Object> call_data(api_call_info->data(), masm->isolate()); Handle<Object> call_data(api_call_info->data(), masm->isolate());
if (masm->isolate()->heap()->InNewSpace(*call_data)) { if (masm->isolate()->heap()->InNewSpace(*call_data)) {
...@@ -872,17 +870,21 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm, ...@@ -872,17 +870,21 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm,
__ Move(r6, call_data); __ Move(r6, call_data);
} }
// Store call data. // Store call data.
__ str(r6, MemOperand(sp, 3 * kPointerSize)); __ str(r6, MemOperand(sp, (kArgs - 1 + FCA::kDataIndex) * kPointerSize));
// Store isolate. // Store isolate.
__ mov(r5, Operand(ExternalReference::isolate_address(masm->isolate()))); __ mov(r5, Operand(ExternalReference::isolate_address(masm->isolate())));
__ str(r5, MemOperand(sp, 4 * kPointerSize)); __ str(r5, MemOperand(sp, (kArgs - 1 + FCA::kIsolateIndex) * kPointerSize));
// Store ReturnValue default and ReturnValue. // Store ReturnValue default and ReturnValue.
__ LoadRoot(r5, Heap::kUndefinedValueRootIndex); __ LoadRoot(r5, Heap::kUndefinedValueRootIndex);
__ str(r5, MemOperand(sp, 5 * kPointerSize)); __ str(r5,
__ str(r5, MemOperand(sp, 6 * kPointerSize)); MemOperand(sp, (kArgs - 1 + FCA::kReturnValueOffset) * kPointerSize));
__ str(
r5,
MemOperand(
sp, (kArgs - 1 + FCA::kReturnValueDefaultValueIndex) * kPointerSize));
// Prepare arguments. // Prepare arguments.
__ add(r2, sp, Operand((kFastApiCallArguments - 1) * kPointerSize)); __ add(r2, sp, Operand((kArgs - 1) * kPointerSize));
// Allocate the v8::Arguments structure in the arguments' space since // Allocate the v8::Arguments structure in the arguments' space since
// it's not controlled by GC. // it's not controlled by GC.
...@@ -906,7 +908,7 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm, ...@@ -906,7 +908,7 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm,
__ mov(ip, Operand::Zero()); __ mov(ip, Operand::Zero());
__ str(ip, MemOperand(r0, 3 * kPointerSize)); __ str(ip, MemOperand(r0, 3 * kPointerSize));
const int kStackUnwindSpace = argc + kFastApiCallArguments + 1; const int kStackUnwindSpace = argc + kArgs + 1;
Address function_address = v8::ToCData<Address>(api_call_info->callback()); Address function_address = v8::ToCData<Address>(api_call_info->callback());
ApiFunction fun(function_address); ApiFunction fun(function_address);
ExternalReference::Type type = ExternalReference::DIRECT_API_CALL; ExternalReference::Type type = ExternalReference::DIRECT_API_CALL;
...@@ -921,9 +923,9 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm, ...@@ -921,9 +923,9 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm,
AllowExternalCallThatCantCauseGC scope(masm); AllowExternalCallThatCantCauseGC scope(masm);
MemOperand context_restore_operand( MemOperand context_restore_operand(
fp, 2 * kPointerSize); fp, (kArgs + 1 + FCA::kContextSaveIndex) * kPointerSize);
MemOperand return_value_operand( MemOperand return_value_operand(
fp, (kFastApiCallArguments + 1) * kPointerSize); fp, (kArgs + 1 + FCA::kReturnValueOffset) * kPointerSize);
__ CallApiFunctionAndReturn(ref, __ CallApiFunctionAndReturn(ref,
function_address, function_address,
thunk_ref, thunk_ref,
......
...@@ -462,51 +462,48 @@ static void GenerateFastApiCall(MacroAssembler* masm, ...@@ -462,51 +462,48 @@ static void GenerateFastApiCall(MacroAssembler* masm,
bool restore_context) { bool restore_context) {
// ----------- S t a t e ------------- // ----------- S t a t e -------------
// -- esp[0] : return address // -- esp[0] : return address
// -- esp[4] : context // -- esp[4] - esp[28] : FunctionCallbackInfo, incl.
// -- esp[8] : object passing the type check // : object passing the type check
// (last fast api call extra argument, // (set by CheckPrototypes)
// set by CheckPrototypes)
// -- esp[12] : api function
// (first fast api call extra argument)
// -- esp[16] : api call data
// -- esp[20] : isolate
// -- esp[24] : ReturnValue default value
// -- esp[28] : ReturnValue
// -- esp[32] : last argument // -- esp[32] : last argument
// -- ... // -- ...
// -- esp[(argc + 7) * 4] : first argument // -- esp[(argc + 7) * 4] : first argument
// -- esp[(argc + 8) * 4] : receiver // -- esp[(argc + 8) * 4] : receiver
// ----------------------------------- // -----------------------------------
typedef FunctionCallbackArguments FCA;
const int kArgs = kFastApiCallArguments;
// Save calling context. // Save calling context.
__ mov(Operand(esp, kPointerSize), esi); __ mov(Operand(esp, (kArgs + FCA::kContextSaveIndex) * kPointerSize), esi);
// Get the function and setup the context. // Get the function and setup the context.
Handle<JSFunction> function = optimization.constant_function(); Handle<JSFunction> function = optimization.constant_function();
__ LoadHeapObject(edi, function); __ LoadHeapObject(edi, function);
__ mov(esi, FieldOperand(edi, JSFunction::kContextOffset)); __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset));
// Pass the additional arguments. // Construct the FunctionCallbackInfo.
__ mov(Operand(esp, 3 * kPointerSize), edi); __ mov(Operand(esp, (kArgs + FCA::kCalleeIndex) * kPointerSize), edi);
Handle<CallHandlerInfo> api_call_info = optimization.api_call_info(); Handle<CallHandlerInfo> api_call_info = optimization.api_call_info();
Handle<Object> call_data(api_call_info->data(), masm->isolate()); Handle<Object> call_data(api_call_info->data(), masm->isolate());
if (masm->isolate()->heap()->InNewSpace(*call_data)) { if (masm->isolate()->heap()->InNewSpace(*call_data)) {
__ mov(ecx, api_call_info); __ mov(ecx, api_call_info);
__ mov(ebx, FieldOperand(ecx, CallHandlerInfo::kDataOffset)); __ mov(ebx, FieldOperand(ecx, CallHandlerInfo::kDataOffset));
__ mov(Operand(esp, 4 * kPointerSize), ebx); __ mov(Operand(esp, (kArgs + FCA::kDataIndex) * kPointerSize), ebx);
} else { } else {
__ mov(Operand(esp, 4 * kPointerSize), Immediate(call_data)); __ mov(Operand(esp, (kArgs + FCA::kDataIndex) * kPointerSize),
Immediate(call_data));
} }
__ mov(Operand(esp, 5 * kPointerSize), __ mov(Operand(esp, (kArgs + FCA::kIsolateIndex) * kPointerSize),
Immediate(reinterpret_cast<int>(masm->isolate()))); Immediate(reinterpret_cast<int>(masm->isolate())));
__ mov(Operand(esp, 6 * kPointerSize), __ mov(Operand(esp, (kArgs + FCA::kReturnValueOffset) * kPointerSize),
masm->isolate()->factory()->undefined_value()); masm->isolate()->factory()->undefined_value());
__ mov(Operand(esp, 7 * kPointerSize), __ mov(
Operand(esp, (kArgs + FCA::kReturnValueDefaultValueIndex) * kPointerSize),
masm->isolate()->factory()->undefined_value()); masm->isolate()->factory()->undefined_value());
// Prepare arguments. // Prepare arguments.
STATIC_ASSERT(kFastApiCallArguments == 7); STATIC_ASSERT(kArgs == 7);
__ lea(eax, Operand(esp, kFastApiCallArguments * kPointerSize)); __ lea(eax, Operand(esp, kArgs * kPointerSize));
// API function gets reference to the v8::Arguments. If CPU profiler // API function gets reference to the v8::Arguments. If CPU profiler
...@@ -539,13 +536,14 @@ static void GenerateFastApiCall(MacroAssembler* masm, ...@@ -539,13 +536,14 @@ static void GenerateFastApiCall(MacroAssembler* masm,
Address thunk_address = FUNCTION_ADDR(&InvokeFunctionCallback); Address thunk_address = FUNCTION_ADDR(&InvokeFunctionCallback);
Operand context_restore_operand(ebp, 2 * kPointerSize); Operand context_restore_operand(
ebp, (kArgs + 1 + FCA::kContextSaveIndex) * kPointerSize);
Operand return_value_operand( Operand return_value_operand(
ebp, (kFastApiCallArguments + 1) * kPointerSize); ebp, (kArgs + 1 + FCA::kReturnValueOffset) * kPointerSize);
__ CallApiFunctionAndReturn(function_address, __ CallApiFunctionAndReturn(function_address,
thunk_address, thunk_address,
ApiParameterOperand(1), ApiParameterOperand(1),
argc + kFastApiCallArguments + 1, argc + kArgs + 1,
return_value_operand, return_value_operand,
restore_context ? restore_context ?
&context_restore_operand : NULL); &context_restore_operand : NULL);
......
...@@ -447,49 +447,45 @@ static void GenerateFastApiCall(MacroAssembler* masm, ...@@ -447,49 +447,45 @@ static void GenerateFastApiCall(MacroAssembler* masm,
bool restore_context) { bool restore_context) {
// ----------- S t a t e ------------- // ----------- S t a t e -------------
// -- rsp[0] : return address // -- rsp[0] : return address
// -- rsp[8] : context save // -- rsp[8] - rsp[58] : FunctionCallbackInfo, incl.
// -- rsp[16] : object passing the type check // : object passing the type check
// (last fast api call extra argument, // (set by CheckPrototypes)
// set by CheckPrototypes)
// -- rsp[24] : api function
// (first fast api call extra argument)
// -- rsp[32] : api call data
// -- rsp[40] : isolate
// -- rsp[48] : ReturnValue default value
// -- rsp[56] : ReturnValue
//
// -- rsp[64] : last argument // -- rsp[64] : last argument
// -- ... // -- ...
// -- rsp[(argc + 7) * 8] : first argument // -- rsp[(argc + 7) * 8] : first argument
// -- rsp[(argc + 8) * 8] : receiver // -- rsp[(argc + 8) * 8] : receiver
// ----------------------------------- // -----------------------------------
int api_call_argc = argc + kFastApiCallArguments; typedef FunctionCallbackArguments FCA;
StackArgumentsAccessor args(rsp, api_call_argc); StackArgumentsAccessor args(rsp, argc + kFastApiCallArguments);
// Save calling context. // Save calling context.
__ movq(args.GetArgumentOperand(api_call_argc), rsi); __ movq(args.GetArgumentOperand(argc + 1 - FCA::kContextSaveIndex), rsi);
// Get the function and setup the context. // Get the function and setup the context.
Handle<JSFunction> function = optimization.constant_function(); Handle<JSFunction> function = optimization.constant_function();
__ LoadHeapObject(rdi, function); __ LoadHeapObject(rdi, function);
__ movq(rsi, FieldOperand(rdi, JSFunction::kContextOffset)); __ movq(rsi, FieldOperand(rdi, JSFunction::kContextOffset));
// Pass the additional arguments. // Construct the FunctionCallbackInfo on the stack.
__ movq(args.GetArgumentOperand(api_call_argc - 2), rdi); __ movq(args.GetArgumentOperand(argc + 1 - FCA::kCalleeIndex), rdi);
Handle<CallHandlerInfo> api_call_info = optimization.api_call_info(); Handle<CallHandlerInfo> api_call_info = optimization.api_call_info();
Handle<Object> call_data(api_call_info->data(), masm->isolate()); Handle<Object> call_data(api_call_info->data(), masm->isolate());
if (masm->isolate()->heap()->InNewSpace(*call_data)) { if (masm->isolate()->heap()->InNewSpace(*call_data)) {
__ Move(rcx, api_call_info); __ Move(rcx, api_call_info);
__ movq(rbx, FieldOperand(rcx, CallHandlerInfo::kDataOffset)); __ movq(rbx, FieldOperand(rcx, CallHandlerInfo::kDataOffset));
__ movq(args.GetArgumentOperand(api_call_argc - 3), rbx); __ movq(args.GetArgumentOperand(argc + 1 - FCA::kDataIndex), rbx);
} else { } else {
__ Move(args.GetArgumentOperand(api_call_argc - 3), call_data); __ Move(args.GetArgumentOperand(argc + 1 - FCA::kDataIndex), call_data);
} }
__ movq(kScratchRegister, __ movq(kScratchRegister,
ExternalReference::isolate_address(masm->isolate())); ExternalReference::isolate_address(masm->isolate()));
__ movq(args.GetArgumentOperand(api_call_argc - 4), kScratchRegister); __ movq(args.GetArgumentOperand(argc + 1 - FCA::kIsolateIndex),
kScratchRegister);
__ LoadRoot(kScratchRegister, Heap::kUndefinedValueRootIndex); __ LoadRoot(kScratchRegister, Heap::kUndefinedValueRootIndex);
__ movq(args.GetArgumentOperand(api_call_argc - 5), kScratchRegister); __ movq(
__ movq(args.GetArgumentOperand(api_call_argc - 6), kScratchRegister); args.GetArgumentOperand(argc + 1 - FCA::kReturnValueDefaultValueIndex),
kScratchRegister);
__ movq(args.GetArgumentOperand(argc + 1 - FCA::kReturnValueOffset),
kScratchRegister);
// Prepare arguments. // Prepare arguments.
STATIC_ASSERT(kFastApiCallArguments == 7); STATIC_ASSERT(kFastApiCallArguments == 7);
...@@ -524,16 +520,18 @@ static void GenerateFastApiCall(MacroAssembler* masm, ...@@ -524,16 +520,18 @@ static void GenerateFastApiCall(MacroAssembler* masm,
Address thunk_address = FUNCTION_ADDR(&InvokeFunctionCallback); Address thunk_address = FUNCTION_ADDR(&InvokeFunctionCallback);
Operand context_restore_operand(rbp, 2 * kPointerSize); Operand context_restore_operand(
rbp, (kFastApiCallArguments + 1 + FCA::kContextSaveIndex) * kPointerSize);
Operand return_value_operand( Operand return_value_operand(
rbp, (kFastApiCallArguments + 1) * kPointerSize); rbp,
__ CallApiFunctionAndReturn(function_address, (kFastApiCallArguments + 1 + FCA::kReturnValueOffset) * kPointerSize);
__ CallApiFunctionAndReturn(
function_address,
thunk_address, thunk_address,
callback_arg, callback_arg,
api_call_argc + 1, argc + kFastApiCallArguments + 1,
return_value_operand, return_value_operand,
restore_context ? restore_context ? &context_restore_operand : NULL);
&context_restore_operand : NULL);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment