MIPS: stub api getters.
Port r18941 (517adbf) BUG= R=plind44@gmail.com Review URL: https://codereview.chromium.org/148383017 Patch from Balazs Kilvady <kilvadyb@homejinni.com>. git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@18962 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
ad53abec73
commit
5b46492c8e
@ -5659,6 +5659,47 @@ void CallApiFunctionStub::Generate(MacroAssembler* masm) {
|
||||
}
|
||||
|
||||
|
||||
void CallApiGetterStub::Generate(MacroAssembler* masm) {
|
||||
// ----------- S t a t e -------------
|
||||
// -- sp[0] : name
|
||||
// -- sp[4 - kArgsLength*4] : PropertyCallbackArguments object
|
||||
// -- ...
|
||||
// -- a3 : api_function_address
|
||||
// -- a2 : thunk_last_arg
|
||||
// -----------------------------------
|
||||
|
||||
Register api_function_address = a3;
|
||||
Register thunk_last_arg = a2;
|
||||
|
||||
__ mov(a0, sp); // a0 = Handle<Name>
|
||||
__ Addu(a1, a0, Operand(1 * kPointerSize)); // a1 = PCA
|
||||
|
||||
const int kApiStackSpace = 1;
|
||||
FrameScope frame_scope(masm, StackFrame::MANUAL);
|
||||
__ EnterExitFrame(false, kApiStackSpace);
|
||||
|
||||
// Create PropertyAccessorInfo instance on the stack above the exit frame with
|
||||
// a1 (internal::Object** args_) as the data.
|
||||
__ sw(a1, MemOperand(sp, 1 * kPointerSize));
|
||||
__ Addu(a1, sp, Operand(1 * kPointerSize)); // a1 = AccessorInfo&
|
||||
|
||||
const int kStackUnwindSpace = PropertyCallbackArguments::kArgsLength + 1;
|
||||
|
||||
Address thunk_address = FUNCTION_ADDR(&InvokeAccessorGetterCallback);
|
||||
ExternalReference::Type thunk_type =
|
||||
ExternalReference::PROFILING_GETTER_CALL;
|
||||
ApiFunction thunk_fun(thunk_address);
|
||||
ExternalReference thunk_ref = ExternalReference(&thunk_fun, thunk_type,
|
||||
masm->isolate());
|
||||
__ CallApiFunctionAndReturn(api_function_address,
|
||||
thunk_ref,
|
||||
thunk_last_arg,
|
||||
kStackUnwindSpace,
|
||||
MemOperand(fp, 6 * kPointerSize),
|
||||
NULL);
|
||||
}
|
||||
|
||||
|
||||
#undef __
|
||||
|
||||
} } // namespace v8::internal
|
||||
|
@ -1313,40 +1313,19 @@ void LoadStubCompiler::GenerateLoadCallback(
|
||||
__ Addu(scratch2(), sp, 1 * kPointerSize);
|
||||
|
||||
__ mov(a2, scratch2()); // Saved in case scratch2 == a1.
|
||||
__ mov(a0, sp); // (first argument - a0) = Handle<Name>
|
||||
// Abi for CallApiGetter.
|
||||
Register getter_address_reg = a3;
|
||||
Register thunk_last_arg = a2;
|
||||
|
||||
const int kApiStackSpace = 1;
|
||||
FrameScope frame_scope(masm(), StackFrame::MANUAL);
|
||||
__ EnterExitFrame(false, kApiStackSpace);
|
||||
|
||||
// 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&
|
||||
__ Addu(a1, sp, kPointerSize);
|
||||
|
||||
const int kStackUnwindSpace = PropertyCallbackArguments::kArgsLength + 1;
|
||||
Address getter_address = v8::ToCData<Address>(callback->getter());
|
||||
ApiFunction fun(getter_address);
|
||||
ExternalReference::Type type = ExternalReference::DIRECT_GETTER_CALL;
|
||||
ExternalReference ref = ExternalReference(&fun, type, isolate());
|
||||
Register getter_address_reg = a3;
|
||||
Register thunk_last_arg = a2;
|
||||
__ li(getter_address_reg, Operand(ref));
|
||||
__ li(thunk_last_arg, Operand(reinterpret_cast<int32_t>(getter_address)));
|
||||
|
||||
Address thunk_address = FUNCTION_ADDR(&InvokeAccessorGetterCallback);
|
||||
ExternalReference::Type thunk_type =
|
||||
ExternalReference::PROFILING_GETTER_CALL;
|
||||
ApiFunction thunk_fun(thunk_address);
|
||||
ExternalReference thunk_ref = ExternalReference(&thunk_fun, thunk_type,
|
||||
isolate());
|
||||
__ CallApiFunctionAndReturn(getter_address_reg,
|
||||
thunk_ref,
|
||||
thunk_last_arg,
|
||||
kStackUnwindSpace,
|
||||
MemOperand(fp, 6 * kPointerSize),
|
||||
NULL);
|
||||
CallApiGetterStub stub;
|
||||
__ TailCallStub(&stub);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user