src/cpu/x86/vm/runtime_x86_32.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
*** old/src/cpu/x86/vm/runtime_x86_32.cpp Wed Dec 2 16:26:38 2009
--- new/src/cpu/x86/vm/runtime_x86_32.cpp Wed Dec 2 16:26:38 2009
*** 41,55 ****
--- 41,55 ----
// for the nmethod.
//
// This code is entered with a jmp.
//
// Arguments:
- // rax,: exception oop
// rdx: exception pc
//
// Results:
- // rax,: exception oop
// rdx: exception pc in caller or ???
// destination: exception handler of caller
//
// Note: the exception pc MUST be at a call (precise debug information)
// Only register rax, rdx, rcx are not callee saved.
*** 111,131 ****
--- 111,131 ----
__ movptr(rbp, Address(rsp, rbp_off * wordSize));
__ addptr(rsp, return_off * wordSize); // Epilog!
__ pop(rdx); // Exception pc
+ // rax: exception handler for given <exception oop/exception pc>
// rax,: exception handler for given <exception oop/exception pc>
+ // Restore SP from BP if the exception PC is a MethodHandle call.
+ __ cmpl(Address(rcx, JavaThread::is_method_handle_exception_offset()), 0);
+ __ cmovptr(Assembler::notEqual, rsp, rbp);
// We have a handler in rax, (could be deopt blob)
// rdx - throwing pc, deopt blob will need it.
__ push(rax);
// rcx contains handler address
__ get_thread(rcx); // TLS
// Get the exception
__ movptr(rax, Address(rcx, JavaThread::exception_oop_offset()));
// Get the exception pc in case we are deoptimized
__ movptr(rdx, Address(rcx, JavaThread::exception_pc_offset()));
#ifdef ASSERT
*** 135,145 ****
--- 135,145 ----
// Clear the exception oop so GC no longer processes it as a root.
__ movptr(Address(rcx, JavaThread::exception_oop_offset()), NULL_WORD);
__ pop(rcx);
- // rax,: exception oop
// rcx: exception handler
// rdx: exception pc
__ jmp (rcx);
// -------------
src/cpu/x86/vm/runtime_x86_32.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File