< prev index next >

src/share/vm/runtime/frame.cpp

Print this page

        

*** 142,173 **** // the idealized value in the frame object. This undoes the magic conversion // that happens for deoptimized frames. In addition it makes the value the // hardware would want to see in the native frame. The only user (at this point) // is deoptimization. It likely no one else should ever use it. ! address frame::raw_pc() const { if (is_deoptimized_frame()) { nmethod* nm = cb()->as_nmethod_or_null(); if (nm->is_method_handle_return(pc())) return nm->deopt_mh_handler_begin() - pc_return_offset; else return nm->deopt_handler_begin() - pc_return_offset; } else { return (pc() - pc_return_offset); } } // Change the pc in a frame object. This does not change the actual pc in // actual frame. To do that use patch_pc. // ! void frame::set_pc(address newpc ) { #ifdef ASSERT if (_cb != NULL && _cb->is_nmethod()) { assert(!((nmethod*)_cb)->is_deopt_pc(_pc), "invariant violation"); } #endif // ASSERT // Unsafe to use the is_deoptimzed tester after changing pc _deopt_state = unknown; _pc = newpc; _cb = CodeCache::find_blob_unsafe(_pc); --- 142,185 ---- // the idealized value in the frame object. This undoes the magic conversion // that happens for deoptimized frames. In addition it makes the value the // hardware would want to see in the native frame. The only user (at this point) // is deoptimization. It likely no one else should ever use it. ! address frame::raw_pc(Thread* thread) const { ! // On Intel the return_address is always the word on the stack ! address ret_pc = *(address*)(sp() - 1); ! if (SharedRuntime::is_memento_stack_trace_return_handler(ret_pc)) { ! assert(thread->memento_original_return_address() != NULL, "memento original return address must be set if patched"); ! return ret_pc; ! } else { if (is_deoptimized_frame()) { nmethod* nm = cb()->as_nmethod_or_null(); if (nm->is_method_handle_return(pc())) return nm->deopt_mh_handler_begin() - pc_return_offset; else return nm->deopt_handler_begin() - pc_return_offset; } else { return (pc() - pc_return_offset); } + } } // Change the pc in a frame object. This does not change the actual pc in // actual frame. To do that use patch_pc. // ! void frame::set_pc(Thread* thread, address newpc) { #ifdef ASSERT if (_cb != NULL && _cb->is_nmethod()) { assert(!((nmethod*)_cb)->is_deopt_pc(_pc), "invariant violation"); } #endif // ASSERT + if (SharedRuntime::is_memento_stack_trace_return_handler(newpc)) { + newpc = thread->memento_original_return_address(); + assert(newpc != NULL, "memento original return address must be set if patched"); + } + // Unsafe to use the is_deoptimzed tester after changing pc _deopt_state = unknown; _pc = newpc; _cb = CodeCache::find_blob_unsafe(_pc);
< prev index next >