Commit bea909a9 authored by antonm@chromium.org's avatar antonm@chromium.org

Unification: introduce ExternalReference::pending_exception_address().

Review URL: http://codereview.chromium.org/6335016

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6518 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent b4a2e91d
...@@ -3132,7 +3132,7 @@ void CEntryStub::GenerateThrowUncatchable(MacroAssembler* masm, ...@@ -3132,7 +3132,7 @@ void CEntryStub::GenerateThrowUncatchable(MacroAssembler* masm,
// Set pending exception and r0 to out of memory exception. // Set pending exception and r0 to out of memory exception.
Failure* out_of_memory = Failure::OutOfMemoryException(); Failure* out_of_memory = Failure::OutOfMemoryException();
__ mov(r0, Operand(reinterpret_cast<int32_t>(out_of_memory))); __ mov(r0, Operand(reinterpret_cast<int32_t>(out_of_memory)));
__ mov(r2, Operand(ExternalReference(Top::k_pending_exception_address))); __ mov(r2, Operand(ExternalReference::pending_exception_address()));
__ str(r0, MemOperand(r2)); __ str(r0, MemOperand(r2));
} }
...@@ -3262,7 +3262,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, ...@@ -3262,7 +3262,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
// Retrieve the pending exception and clear the variable. // Retrieve the pending exception and clear the variable.
__ mov(ip, Operand(ExternalReference::the_hole_value_location())); __ mov(ip, Operand(ExternalReference::the_hole_value_location()));
__ ldr(r3, MemOperand(ip)); __ ldr(r3, MemOperand(ip));
__ mov(ip, Operand(ExternalReference(Top::k_pending_exception_address))); __ mov(ip, Operand(ExternalReference::pending_exception_address()));
__ ldr(r0, MemOperand(ip)); __ ldr(r0, MemOperand(ip));
__ str(r3, MemOperand(ip)); __ str(r3, MemOperand(ip));
...@@ -3395,7 +3395,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { ...@@ -3395,7 +3395,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) {
// exception field in the JSEnv and return a failure sentinel. // exception field in the JSEnv and return a failure sentinel.
// Coming in here the fp will be invalid because the PushTryHandler below // Coming in here the fp will be invalid because the PushTryHandler below
// sets it to 0 to signal the existence of the JSEntry frame. // sets it to 0 to signal the existence of the JSEntry frame.
__ mov(ip, Operand(ExternalReference(Top::k_pending_exception_address))); __ mov(ip, Operand(ExternalReference::pending_exception_address()));
__ str(r0, MemOperand(ip)); __ str(r0, MemOperand(ip));
__ mov(r0, Operand(reinterpret_cast<int32_t>(Failure::Exception()))); __ mov(r0, Operand(reinterpret_cast<int32_t>(Failure::Exception())));
__ b(&exit); __ b(&exit);
...@@ -3412,7 +3412,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { ...@@ -3412,7 +3412,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) {
// Clear any pending exceptions. // Clear any pending exceptions.
__ mov(ip, Operand(ExternalReference::the_hole_value_location())); __ mov(ip, Operand(ExternalReference::the_hole_value_location()));
__ ldr(r5, MemOperand(ip)); __ ldr(r5, MemOperand(ip));
__ mov(ip, Operand(ExternalReference(Top::k_pending_exception_address))); __ mov(ip, Operand(ExternalReference::pending_exception_address()));
__ str(r5, MemOperand(ip)); __ str(r5, MemOperand(ip));
// Invoke the function by calling through JS entry trampoline builtin. // Invoke the function by calling through JS entry trampoline builtin.
...@@ -4079,7 +4079,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) { ...@@ -4079,7 +4079,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
// TODO(592): Rerunning the RegExp to get the stack overflow exception. // TODO(592): Rerunning the RegExp to get the stack overflow exception.
__ mov(r0, Operand(ExternalReference::the_hole_value_location())); __ mov(r0, Operand(ExternalReference::the_hole_value_location()));
__ ldr(r0, MemOperand(r0, 0)); __ ldr(r0, MemOperand(r0, 0));
__ mov(r1, Operand(ExternalReference(Top::k_pending_exception_address))); __ mov(r1, Operand(ExternalReference::pending_exception_address()));
__ ldr(r1, MemOperand(r1, 0)); __ ldr(r1, MemOperand(r1, 0));
__ cmp(r0, r1); __ cmp(r0, r1);
__ b(eq, &runtime); __ b(eq, &runtime);
......
...@@ -713,6 +713,11 @@ ExternalReference ExternalReference::handle_scope_limit_address() { ...@@ -713,6 +713,11 @@ ExternalReference ExternalReference::handle_scope_limit_address() {
} }
ExternalReference ExternalReference::pending_exception_address() {
return ExternalReference(Top::pending_exception_address());
}
ExternalReference ExternalReference::scheduled_exception_address() { ExternalReference ExternalReference::scheduled_exception_address() {
return ExternalReference(Top::scheduled_exception_address()); return ExternalReference(Top::scheduled_exception_address());
} }
......
...@@ -551,6 +551,7 @@ class ExternalReference BASE_EMBEDDED { ...@@ -551,6 +551,7 @@ class ExternalReference BASE_EMBEDDED {
static ExternalReference handle_scope_limit_address(); static ExternalReference handle_scope_limit_address();
static ExternalReference handle_scope_level_address(); static ExternalReference handle_scope_level_address();
static ExternalReference pending_exception_address();
static ExternalReference scheduled_exception_address(); static ExternalReference scheduled_exception_address();
// Static variables containing common double constants. // Static variables containing common double constants.
......
...@@ -3922,10 +3922,11 @@ void RegExpExecStub::Generate(MacroAssembler* masm) { ...@@ -3922,10 +3922,11 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
// stack overflow (on the backtrack stack) was detected in RegExp code but // stack overflow (on the backtrack stack) was detected in RegExp code but
// haven't created the exception yet. Handle that in the runtime system. // haven't created the exception yet. Handle that in the runtime system.
// TODO(592): Rerunning the RegExp to get the stack overflow exception. // TODO(592): Rerunning the RegExp to get the stack overflow exception.
ExternalReference pending_exception(Top::k_pending_exception_address); ExternalReference pending_exception_address =
ExternalReference::pending_exception_address();
__ mov(eax, __ mov(eax,
Operand::StaticVariable(ExternalReference::the_hole_value_location())); Operand::StaticVariable(ExternalReference::the_hole_value_location()));
__ cmp(eax, Operand::StaticVariable(pending_exception)); __ cmp(eax, Operand::StaticVariable(pending_exception_address));
__ j(equal, &runtime); __ j(equal, &runtime);
__ bind(&failure); __ bind(&failure);
// For failure and exception return null. // For failure and exception return null.
...@@ -4715,7 +4716,8 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, ...@@ -4715,7 +4716,8 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
__ j(equal, throw_out_of_memory_exception); __ j(equal, throw_out_of_memory_exception);
// Retrieve the pending exception and clear the variable. // Retrieve the pending exception and clear the variable.
ExternalReference pending_exception_address(Top::k_pending_exception_address); ExternalReference pending_exception_address =
ExternalReference::pending_exception_address();
__ mov(eax, Operand::StaticVariable(pending_exception_address)); __ mov(eax, Operand::StaticVariable(pending_exception_address));
__ mov(edx, __ mov(edx,
Operand::StaticVariable(ExternalReference::the_hole_value_location())); Operand::StaticVariable(ExternalReference::the_hole_value_location()));
...@@ -4767,9 +4769,10 @@ void CEntryStub::GenerateThrowUncatchable(MacroAssembler* masm, ...@@ -4767,9 +4769,10 @@ void CEntryStub::GenerateThrowUncatchable(MacroAssembler* masm,
__ mov(Operand::StaticVariable(external_caught), eax); __ mov(Operand::StaticVariable(external_caught), eax);
// Set pending exception and eax to out of memory exception. // Set pending exception and eax to out of memory exception.
ExternalReference pending_exception(Top::k_pending_exception_address); ExternalReference pending_exception_address =
ExternalReference::pending_exception_address();
__ mov(eax, reinterpret_cast<int32_t>(Failure::OutOfMemoryException())); __ mov(eax, reinterpret_cast<int32_t>(Failure::OutOfMemoryException()));
__ mov(Operand::StaticVariable(pending_exception), eax); __ mov(Operand::StaticVariable(pending_exception_address), eax);
} }
// Clear the context pointer. // Clear the context pointer.
...@@ -4885,8 +4888,9 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { ...@@ -4885,8 +4888,9 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) {
// Caught exception: Store result (exception) in the pending // Caught exception: Store result (exception) in the pending
// exception field in the JSEnv and return a failure sentinel. // exception field in the JSEnv and return a failure sentinel.
ExternalReference pending_exception(Top::k_pending_exception_address); ExternalReference pending_exception_address =
__ mov(Operand::StaticVariable(pending_exception), eax); ExternalReference::pending_exception_address();
__ mov(Operand::StaticVariable(pending_exception_address), eax);
__ mov(eax, reinterpret_cast<int32_t>(Failure::Exception())); __ mov(eax, reinterpret_cast<int32_t>(Failure::Exception()));
__ jmp(&exit); __ jmp(&exit);
...@@ -4897,7 +4901,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { ...@@ -4897,7 +4901,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) {
// Clear any pending exceptions. // Clear any pending exceptions.
__ mov(edx, __ mov(edx,
Operand::StaticVariable(ExternalReference::the_hole_value_location())); Operand::StaticVariable(ExternalReference::the_hole_value_location()));
__ mov(Operand::StaticVariable(pending_exception), edx); __ mov(Operand::StaticVariable(pending_exception_address), edx);
// Fake a receiver (NULL). // Fake a receiver (NULL).
__ push(Immediate(0)); // receiver __ push(Immediate(0)); // receiver
......
...@@ -1178,7 +1178,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, ...@@ -1178,7 +1178,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
__ LoadExternalReference(t0, ExternalReference::the_hole_value_location()); __ LoadExternalReference(t0, ExternalReference::the_hole_value_location());
__ lw(a3, MemOperand(t0)); __ lw(a3, MemOperand(t0));
__ LoadExternalReference(t0, __ LoadExternalReference(t0,
ExternalReference(Top::k_pending_exception_address)); ExternalReference::pending_exception_address());
__ lw(v0, MemOperand(t0)); __ lw(v0, MemOperand(t0));
__ sw(a3, MemOperand(t0)); __ sw(a3, MemOperand(t0));
...@@ -1311,7 +1311,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { ...@@ -1311,7 +1311,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) {
// Coming in here the fp will be invalid because the PushTryHandler below // Coming in here the fp will be invalid because the PushTryHandler below
// sets it to 0 to signal the existence of the JSEntry frame. // sets it to 0 to signal the existence of the JSEntry frame.
__ LoadExternalReference(t0, __ LoadExternalReference(t0,
ExternalReference(Top::k_pending_exception_address)); ExternalReference::pending_exception_address());
__ sw(v0, MemOperand(t0)); // We come back from 'invoke'. result is in v0. __ sw(v0, MemOperand(t0)); // We come back from 'invoke'. result is in v0.
__ li(v0, Operand(reinterpret_cast<int32_t>(Failure::Exception()))); __ li(v0, Operand(reinterpret_cast<int32_t>(Failure::Exception())));
__ b(&exit); __ b(&exit);
...@@ -1329,7 +1329,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { ...@@ -1329,7 +1329,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) {
__ LoadExternalReference(t0, ExternalReference::the_hole_value_location()); __ LoadExternalReference(t0, ExternalReference::the_hole_value_location());
__ lw(t1, MemOperand(t0)); __ lw(t1, MemOperand(t0));
__ LoadExternalReference(t0, __ LoadExternalReference(t0,
ExternalReference(Top::k_pending_exception_address)); ExternalReference::pending_exception_address());
__ sw(t1, MemOperand(t0)); __ sw(t1, MemOperand(t0));
// Invoke the function by calling through JS entry trampoline builtin. // Invoke the function by calling through JS entry trampoline builtin.
......
...@@ -142,7 +142,6 @@ class ThreadLocalTop BASE_EMBEDDED { ...@@ -142,7 +142,6 @@ class ThreadLocalTop BASE_EMBEDDED {
C(handler_address) \ C(handler_address) \
C(c_entry_fp_address) \ C(c_entry_fp_address) \
C(context_address) \ C(context_address) \
C(pending_exception_address) \
C(external_caught_exception_address) C(external_caught_exception_address)
#ifdef ENABLE_LOGGING_AND_PROFILING #ifdef ENABLE_LOGGING_AND_PROFILING
......
...@@ -2126,8 +2126,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) { ...@@ -2126,8 +2126,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
// stack overflow (on the backtrack stack) was detected in RegExp code but // stack overflow (on the backtrack stack) was detected in RegExp code but
// haven't created the exception yet. Handle that in the runtime system. // haven't created the exception yet. Handle that in the runtime system.
// TODO(592): Rerunning the RegExp to get the stack overflow exception. // TODO(592): Rerunning the RegExp to get the stack overflow exception.
ExternalReference pending_exception_address(Top::k_pending_exception_address); __ movq(kScratchRegister, ExternalReference::pending_exception_address());
__ movq(kScratchRegister, pending_exception_address);
__ Cmp(kScratchRegister, Factory::the_hole_value()); __ Cmp(kScratchRegister, Factory::the_hole_value());
__ j(equal, &runtime); __ j(equal, &runtime);
__ bind(&failure); __ bind(&failure);
...@@ -2885,8 +2884,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, ...@@ -2885,8 +2884,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
__ j(equal, throw_out_of_memory_exception); __ j(equal, throw_out_of_memory_exception);
// Retrieve the pending exception and clear the variable. // Retrieve the pending exception and clear the variable.
ExternalReference pending_exception_address(Top::k_pending_exception_address); __ movq(kScratchRegister, ExternalReference::pending_exception_address());
__ movq(kScratchRegister, pending_exception_address);
__ movq(rax, Operand(kScratchRegister, 0)); __ movq(rax, Operand(kScratchRegister, 0));
__ movq(rdx, ExternalReference::the_hole_value_location()); __ movq(rdx, ExternalReference::the_hole_value_location());
__ movq(rdx, Operand(rdx, 0)); __ movq(rdx, Operand(rdx, 0));
...@@ -2936,9 +2934,8 @@ void CEntryStub::GenerateThrowUncatchable(MacroAssembler* masm, ...@@ -2936,9 +2934,8 @@ void CEntryStub::GenerateThrowUncatchable(MacroAssembler* masm,
__ store_rax(external_caught); __ store_rax(external_caught);
// Set pending exception and rax to out of memory exception. // Set pending exception and rax to out of memory exception.
ExternalReference pending_exception(Top::k_pending_exception_address);
__ movq(rax, Failure::OutOfMemoryException(), RelocInfo::NONE); __ movq(rax, Failure::OutOfMemoryException(), RelocInfo::NONE);
__ store_rax(pending_exception); __ store_rax(ExternalReference::pending_exception_address());
} }
// Clear the context pointer. // Clear the context pointer.
...@@ -3091,8 +3088,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { ...@@ -3091,8 +3088,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) {
// Caught exception: Store result (exception) in the pending // Caught exception: Store result (exception) in the pending
// exception field in the JSEnv and return a failure sentinel. // exception field in the JSEnv and return a failure sentinel.
ExternalReference pending_exception(Top::k_pending_exception_address); __ store_rax(ExternalReference::pending_exception_address());
__ store_rax(pending_exception);
__ movq(rax, Failure::Exception(), RelocInfo::NONE); __ movq(rax, Failure::Exception(), RelocInfo::NONE);
__ jmp(&exit); __ jmp(&exit);
...@@ -3102,7 +3098,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { ...@@ -3102,7 +3098,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) {
// Clear any pending exceptions. // Clear any pending exceptions.
__ load_rax(ExternalReference::the_hole_value_location()); __ load_rax(ExternalReference::the_hole_value_location());
__ store_rax(pending_exception); __ store_rax(ExternalReference::pending_exception_address());
// Fake a receiver (NULL). // Fake a receiver (NULL).
__ push(Immediate(0)); // receiver __ push(Immediate(0)); // receiver
......
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