hotspot/src/share/vm/prims/jvmtiThreadState.cpp
void JvmtiThreadState::process_pending_step_for_earlyret() {
{- -------------------------------------------
(1)
---------------------------------------- -}
// We are single stepping as the last part of the ForceEarlyReturn
// dance so we have some house keeping to do.
if (is_earlyret_pending()) {
// If the earlyret_state field is not earlyret_inactive, then
// we missed all of the earlyret_field cleanup points:
//
// - remove_activation() was not called
// (did not get suspended in a call_vm() family call and did
// not complete a call_vm() family call on the way here)
//
// One legitimate way for us to miss all the cleanup points is
// if we got here right after handling a compiled return. If that
// is the case, then we consider our return from compiled code to
// complete the ForceEarlyReturn request and we clear the condition.
clr_earlyret_pending();
set_earlyret_oop(NULL);
clr_earlyret_value();
}
{- -------------------------------------------
(1) JvmtiThreadState::clr_pending_step_for_earlyret() を呼んで
この JvmtiThreadState 中の
---------------------------------------- -}
// clearing the flag indicates we are done with
// the ForceEarlyReturn() dance
clr_pending_step_for_earlyret();
{- -------------------------------------------
(1)
---------------------------------------- -}
// If step is pending for earlyret then it may not be a repeat step.
// The new_bci and method_id is same as current_bci and current
// method_id after earlyret and step for recursive calls.
// Force the step by clearing the last location.
JvmtiEnvThreadStateIterator it(this);
for (JvmtiEnvThreadState* ets = it.first(); ets != NULL; ets = it.next(ets)) {
ets->clear_current_location();
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.