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