Review URL: http://codereview.chromium.org/555164
git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3775 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
c4bd2aa054
commit
0045327b7d
@ -6182,13 +6182,6 @@ void GenericUnaryOpStub::Generate(MacroAssembler* masm) {
|
||||
}
|
||||
|
||||
|
||||
int CEntryStub::MinorKey() {
|
||||
ASSERT(result_size_ <= 2);
|
||||
// Result returned in r0 or r0+r1 by default.
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) {
|
||||
// r0 holds the exception.
|
||||
|
||||
@ -6296,7 +6289,6 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
|
||||
Label* throw_normal_exception,
|
||||
Label* throw_termination_exception,
|
||||
Label* throw_out_of_memory_exception,
|
||||
ExitFrame::Mode mode,
|
||||
bool do_gc,
|
||||
bool always_allocate) {
|
||||
// r0: result parameter for PerformGC, if any
|
||||
@ -6356,7 +6348,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
|
||||
// r0:r1: result
|
||||
// sp: stack pointer
|
||||
// fp: frame pointer
|
||||
__ LeaveExitFrame(mode);
|
||||
__ LeaveExitFrame(mode_);
|
||||
|
||||
// check if we should retry or throw exception
|
||||
Label retry;
|
||||
@ -6389,7 +6381,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
|
||||
}
|
||||
|
||||
|
||||
void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
|
||||
void CEntryStub::Generate(MacroAssembler* masm) {
|
||||
// Called from JavaScript; parameters are on stack as if calling JS function
|
||||
// r0: number of arguments including receiver
|
||||
// r1: pointer to builtin function
|
||||
@ -6397,17 +6389,15 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
|
||||
// sp: stack pointer (restored as callee's sp after C call)
|
||||
// cp: current context (C callee-saved)
|
||||
|
||||
// Result returned in r0 or r0+r1 by default.
|
||||
|
||||
// NOTE: Invocations of builtins may return failure objects
|
||||
// instead of a proper result. The builtin entry handles
|
||||
// this by performing a garbage collection and retrying the
|
||||
// builtin once.
|
||||
|
||||
ExitFrame::Mode mode = is_debug_break
|
||||
? ExitFrame::MODE_DEBUG
|
||||
: ExitFrame::MODE_NORMAL;
|
||||
|
||||
// Enter the exit frame that transitions from JavaScript to C++.
|
||||
__ EnterExitFrame(mode);
|
||||
__ EnterExitFrame(mode_);
|
||||
|
||||
// r4: number of arguments (C callee-saved)
|
||||
// r5: pointer to builtin function (C callee-saved)
|
||||
@ -6422,7 +6412,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
|
||||
&throw_normal_exception,
|
||||
&throw_termination_exception,
|
||||
&throw_out_of_memory_exception,
|
||||
mode,
|
||||
false,
|
||||
false);
|
||||
|
||||
@ -6431,7 +6420,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
|
||||
&throw_normal_exception,
|
||||
&throw_termination_exception,
|
||||
&throw_out_of_memory_exception,
|
||||
mode,
|
||||
true,
|
||||
false);
|
||||
|
||||
@ -6442,7 +6430,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
|
||||
&throw_normal_exception,
|
||||
&throw_termination_exception,
|
||||
&throw_out_of_memory_exception,
|
||||
mode,
|
||||
true,
|
||||
true);
|
||||
|
||||
|
@ -98,7 +98,7 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm,
|
||||
__ mov(r0, Operand(0)); // no arguments
|
||||
__ mov(r1, Operand(ExternalReference::debug_break()));
|
||||
|
||||
CEntryStub ceb(1);
|
||||
CEntryStub ceb(1, ExitFrame::MODE_DEBUG);
|
||||
__ CallStub(&ceb);
|
||||
|
||||
// Restore the register values containing object pointers from the expression
|
||||
|
@ -479,6 +479,19 @@ void ArgumentsAccessStub::Generate(MacroAssembler* masm) {
|
||||
}
|
||||
|
||||
|
||||
int CEntryStub::MinorKey() {
|
||||
ASSERT(result_size_ <= 2);
|
||||
#ifdef _WIN64
|
||||
const indirect_result = result_size_ > 1;
|
||||
#else
|
||||
const bool indirect_result = false;
|
||||
#endif
|
||||
|
||||
return ExitFrameModeBits::encode(mode_)
|
||||
| IndirectResultBits::encode(indirect_result > 1);
|
||||
}
|
||||
|
||||
|
||||
bool ApiGetterEntryStub::GetCustomCache(Code** code_out) {
|
||||
Object* cache = info()->load_stub_cache();
|
||||
if (cache->IsUndefined()) {
|
||||
|
@ -330,25 +330,30 @@ class CompareStub: public CodeStub {
|
||||
|
||||
class CEntryStub : public CodeStub {
|
||||
public:
|
||||
explicit CEntryStub(int result_size) : result_size_(result_size) { }
|
||||
explicit CEntryStub(int result_size,
|
||||
ExitFrame::Mode mode = ExitFrame::MODE_NORMAL)
|
||||
: result_size_(result_size), mode_(mode) { }
|
||||
|
||||
void Generate(MacroAssembler* masm) { GenerateBody(masm, false); }
|
||||
void Generate(MacroAssembler* masm);
|
||||
|
||||
protected:
|
||||
void GenerateBody(MacroAssembler* masm, bool is_debug_break);
|
||||
private:
|
||||
void GenerateCore(MacroAssembler* masm,
|
||||
Label* throw_normal_exception,
|
||||
Label* throw_termination_exception,
|
||||
Label* throw_out_of_memory_exception,
|
||||
ExitFrame::Mode mode,
|
||||
bool do_gc,
|
||||
bool always_allocate_scope);
|
||||
void GenerateThrowTOS(MacroAssembler* masm);
|
||||
void GenerateThrowUncatchable(MacroAssembler* masm,
|
||||
UncatchableExceptionType type);
|
||||
private:
|
||||
|
||||
// Number of pointers/values returned.
|
||||
int result_size_;
|
||||
int const result_size_;
|
||||
ExitFrame::Mode const mode_;
|
||||
|
||||
// Minor key encoding
|
||||
class ExitFrameModeBits: public BitField<ExitFrame::Mode, 0, 1> {};
|
||||
class IndirectResultBits: public BitField<bool, 1, 1> {};
|
||||
|
||||
Major MajorKey() { return CEntry; }
|
||||
// Minor key must differ if different result_size_ values means different
|
||||
@ -385,7 +390,7 @@ class ApiGetterEntryStub : public CodeStub {
|
||||
};
|
||||
|
||||
|
||||
// Mark the debugger statemet to be recognized bu debugger (by the MajorKey)
|
||||
// Mark the debugger statemet to be recognized by debugger (by the MajorKey)
|
||||
class DebugerStatementStub : public CodeStub {
|
||||
public:
|
||||
DebugerStatementStub() { }
|
||||
|
@ -410,7 +410,7 @@ Object*& ExitFrame::code_slot() const {
|
||||
Code* ExitFrame::code() const {
|
||||
Object* code = code_slot();
|
||||
if (code->IsSmi()) {
|
||||
return Heap::c_entry_debug_break_code();
|
||||
return Heap::debugger_statement_code();
|
||||
} else {
|
||||
return Code::cast(code);
|
||||
}
|
||||
|
@ -1500,7 +1500,7 @@ void Heap::CreateRegExpCEntryStub() {
|
||||
|
||||
void Heap::CreateCEntryDebugBreakStub() {
|
||||
DebugerStatementStub stub;
|
||||
set_c_entry_debug_break_code(*stub.GetCode());
|
||||
set_debugger_statement_code(*stub.GetCode());
|
||||
}
|
||||
|
||||
|
||||
@ -1527,7 +1527,7 @@ void Heap::CreateFixedStubs() {
|
||||
// c_entry_code_ = *stub.GetCode();
|
||||
// }
|
||||
// { DebugerStatementStub stub;
|
||||
// c_entry_debug_break_code_ = *stub.GetCode();
|
||||
// debugger_statement_code_ = *stub.GetCode();
|
||||
// }
|
||||
// To workaround the problem, make separate functions without inlining.
|
||||
Heap::CreateCEntryStub();
|
||||
|
@ -101,7 +101,7 @@ namespace internal {
|
||||
V(Code, js_entry_code, JsEntryCode) \
|
||||
V(Code, js_construct_entry_code, JsConstructEntryCode) \
|
||||
V(Code, c_entry_code, CEntryCode) \
|
||||
V(Code, c_entry_debug_break_code, CEntryDebugBreakCode) \
|
||||
V(Code, debugger_statement_code, DebuggerStatementCode) \
|
||||
V(FixedArray, number_string_cache, NumberStringCache) \
|
||||
V(FixedArray, single_character_string_cache, SingleCharacterStringCache) \
|
||||
V(FixedArray, natives_source_cache, NativesSourceCache) \
|
||||
|
@ -9073,13 +9073,6 @@ void CallFunctionStub::Generate(MacroAssembler* masm) {
|
||||
}
|
||||
|
||||
|
||||
int CEntryStub::MinorKey() {
|
||||
ASSERT(result_size_ <= 2);
|
||||
// Result returned in eax, or eax+edx if result_size_ is 2.
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) {
|
||||
// eax holds the exception.
|
||||
|
||||
@ -9189,7 +9182,6 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
|
||||
Label* throw_normal_exception,
|
||||
Label* throw_termination_exception,
|
||||
Label* throw_out_of_memory_exception,
|
||||
ExitFrame::Mode mode,
|
||||
bool do_gc,
|
||||
bool always_allocate_scope) {
|
||||
// eax: result parameter for PerformGC, if any
|
||||
@ -9199,6 +9191,8 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
|
||||
// edi: number of arguments including receiver (C callee-saved)
|
||||
// esi: pointer to the first argument (C callee-saved)
|
||||
|
||||
// Result returned in eax, or eax+edx if result_size_ is 2.
|
||||
|
||||
if (do_gc) {
|
||||
__ mov(Operand(esp, 0 * kPointerSize), eax); // Result.
|
||||
__ call(FUNCTION_ADDR(Runtime::PerformGC), RelocInfo::RUNTIME_ENTRY);
|
||||
@ -9239,7 +9233,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
|
||||
__ j(zero, &failure_returned, not_taken);
|
||||
|
||||
// Exit the JavaScript to C++ exit frame.
|
||||
__ LeaveExitFrame(mode);
|
||||
__ LeaveExitFrame(mode_);
|
||||
__ ret(0);
|
||||
|
||||
// Handling of failure.
|
||||
@ -9326,7 +9320,7 @@ void CEntryStub::GenerateThrowUncatchable(MacroAssembler* masm,
|
||||
}
|
||||
|
||||
|
||||
void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
|
||||
void CEntryStub::Generate(MacroAssembler* masm) {
|
||||
// eax: number of arguments including receiver
|
||||
// ebx: pointer to C function (C callee-saved)
|
||||
// ebp: frame pointer (restored after C call)
|
||||
@ -9338,12 +9332,8 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
|
||||
// of a proper result. The builtin entry handles this by performing
|
||||
// a garbage collection and retrying the builtin (twice).
|
||||
|
||||
ExitFrame::Mode mode = is_debug_break
|
||||
? ExitFrame::MODE_DEBUG
|
||||
: ExitFrame::MODE_NORMAL;
|
||||
|
||||
// Enter the exit frame that transitions from JavaScript to C++.
|
||||
__ EnterExitFrame(mode);
|
||||
__ EnterExitFrame(mode_);
|
||||
|
||||
// eax: result parameter for PerformGC, if any (setup below)
|
||||
// ebx: pointer to builtin function (C callee-saved)
|
||||
@ -9361,7 +9351,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
|
||||
&throw_normal_exception,
|
||||
&throw_termination_exception,
|
||||
&throw_out_of_memory_exception,
|
||||
mode,
|
||||
false,
|
||||
false);
|
||||
|
||||
@ -9370,7 +9359,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
|
||||
&throw_normal_exception,
|
||||
&throw_termination_exception,
|
||||
&throw_out_of_memory_exception,
|
||||
mode,
|
||||
true,
|
||||
false);
|
||||
|
||||
@ -9381,7 +9369,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
|
||||
&throw_normal_exception,
|
||||
&throw_termination_exception,
|
||||
&throw_out_of_memory_exception,
|
||||
mode,
|
||||
true,
|
||||
true);
|
||||
|
||||
|
@ -94,7 +94,7 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm,
|
||||
__ Set(eax, Immediate(0)); // no arguments
|
||||
__ mov(ebx, Immediate(ExternalReference::debug_break()));
|
||||
|
||||
CEntryStub ceb(1);
|
||||
CEntryStub ceb(1, ExitFrame::MODE_DEBUG);
|
||||
__ CallStub(&ceb);
|
||||
|
||||
// Restore the register values containing object pointers from the expression
|
||||
|
@ -7332,21 +7332,6 @@ void ArgumentsAccessStub::GenerateReadLength(MacroAssembler* masm) {
|
||||
}
|
||||
|
||||
|
||||
int CEntryStub::MinorKey() {
|
||||
ASSERT(result_size_ <= 2);
|
||||
#ifdef _WIN64
|
||||
// Simple results returned in rax (using default code).
|
||||
// Complex results must be written to address passed as first argument.
|
||||
return (result_size_ < 2) ? 0 : 1;
|
||||
#else
|
||||
// Single results returned in rax (both AMD64 and Win64 calling conventions)
|
||||
// and a struct of two pointers in rax+rdx (AMD64 calling convention only)
|
||||
// by default.
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) {
|
||||
// Check that stack should contain next handler, frame pointer, state and
|
||||
// return address in that order.
|
||||
@ -7380,7 +7365,6 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
|
||||
Label* throw_normal_exception,
|
||||
Label* throw_termination_exception,
|
||||
Label* throw_out_of_memory_exception,
|
||||
ExitFrame::Mode mode,
|
||||
bool do_gc,
|
||||
bool always_allocate_scope) {
|
||||
// rax: result parameter for PerformGC, if any.
|
||||
@ -7392,6 +7376,10 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
|
||||
// This pointer is reused in LeaveExitFrame(), so it is stored in a
|
||||
// callee-saved register.
|
||||
|
||||
// Simple results returned in rax (both AMD64 and Win64 calling conventions).
|
||||
// Complex results must be written to address passed as first argument.
|
||||
// AMD64 calling convention: a struct of two pointers in rax+rdx
|
||||
|
||||
if (do_gc) {
|
||||
// Pass failure code returned from last attempt as first argument to GC.
|
||||
#ifdef _WIN64
|
||||
@ -7463,7 +7451,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
|
||||
__ j(zero, &failure_returned);
|
||||
|
||||
// Exit the JavaScript to C++ exit frame.
|
||||
__ LeaveExitFrame(mode, result_size_);
|
||||
__ LeaveExitFrame(mode_, result_size_);
|
||||
__ ret(0);
|
||||
|
||||
// Handling of failure.
|
||||
@ -7607,7 +7595,7 @@ void CallFunctionStub::Generate(MacroAssembler* masm) {
|
||||
}
|
||||
|
||||
|
||||
void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
|
||||
void CEntryStub::Generate(MacroAssembler* masm) {
|
||||
// rax: number of arguments including receiver
|
||||
// rbx: pointer to C function (C callee-saved)
|
||||
// rbp: frame pointer of calling JS frame (restored after C call)
|
||||
@ -7619,12 +7607,8 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
|
||||
// this by performing a garbage collection and retrying the
|
||||
// builtin once.
|
||||
|
||||
ExitFrame::Mode mode = is_debug_break ?
|
||||
ExitFrame::MODE_DEBUG :
|
||||
ExitFrame::MODE_NORMAL;
|
||||
|
||||
// Enter the exit frame that transitions from JavaScript to C++.
|
||||
__ EnterExitFrame(mode, result_size_);
|
||||
__ EnterExitFrame(mode_, result_size_);
|
||||
|
||||
// rax: Holds the context at this point, but should not be used.
|
||||
// On entry to code generated by GenerateCore, it must hold
|
||||
@ -7647,7 +7631,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
|
||||
&throw_normal_exception,
|
||||
&throw_termination_exception,
|
||||
&throw_out_of_memory_exception,
|
||||
mode,
|
||||
false,
|
||||
false);
|
||||
|
||||
@ -7656,7 +7639,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
|
||||
&throw_normal_exception,
|
||||
&throw_termination_exception,
|
||||
&throw_out_of_memory_exception,
|
||||
mode,
|
||||
true,
|
||||
false);
|
||||
|
||||
@ -7667,7 +7649,6 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) {
|
||||
&throw_normal_exception,
|
||||
&throw_termination_exception,
|
||||
&throw_out_of_memory_exception,
|
||||
mode,
|
||||
true,
|
||||
true);
|
||||
|
||||
|
@ -68,7 +68,7 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm,
|
||||
__ xor_(rax, rax); // No arguments (argc == 0).
|
||||
__ movq(rbx, ExternalReference::debug_break());
|
||||
|
||||
CEntryStub ceb(1);
|
||||
CEntryStub ceb(1, ExitFrame::MODE_DEBUG);
|
||||
__ CallStub(&ceb);
|
||||
|
||||
// Restore the register values containing object pointers from the expression
|
||||
|
Loading…
Reference in New Issue
Block a user