6972759: Step over not working after thrown exception and Pop
Reset jvmtithreadstate exception state after frame pop and forceearlyreturn processed Reviewed-by: minqi, dholmes, dlong
This commit is contained in:
parent
8efd785f67
commit
af9f073374
@ -319,6 +319,15 @@ void JvmtiThreadState::process_pending_step_for_popframe() {
|
|||||||
// clearing the flag indicates we are done with the PopFrame() dance
|
// clearing the flag indicates we are done with the PopFrame() dance
|
||||||
clr_pending_step_for_popframe();
|
clr_pending_step_for_popframe();
|
||||||
|
|
||||||
|
// If exception was thrown in this frame, need to reset jvmti thread state.
|
||||||
|
// Single stepping may not get enabled correctly by the agent since
|
||||||
|
// exception state is passed in MethodExit event which may be sent at some
|
||||||
|
// time in the future. JDWP agent ignores MethodExit events if caused by
|
||||||
|
// an exception.
|
||||||
|
//
|
||||||
|
if (is_exception_detected()) {
|
||||||
|
clear_exception_detected();
|
||||||
|
}
|
||||||
// If step is pending for popframe then it may not be
|
// If step is pending for popframe then it may not be
|
||||||
// a repeat step. The new_bci and method_id is same as current_bci
|
// a repeat step. The new_bci and method_id is same as current_bci
|
||||||
// and current method_id after pop and step for recursive calls.
|
// and current method_id after pop and step for recursive calls.
|
||||||
@ -385,6 +394,15 @@ void JvmtiThreadState::process_pending_step_for_earlyret() {
|
|||||||
// the ForceEarlyReturn() dance
|
// the ForceEarlyReturn() dance
|
||||||
clr_pending_step_for_earlyret();
|
clr_pending_step_for_earlyret();
|
||||||
|
|
||||||
|
// If exception was thrown in this frame, need to reset jvmti thread state.
|
||||||
|
// Single stepping may not get enabled correctly by the agent since
|
||||||
|
// exception state is passed in MethodExit event which may be sent at some
|
||||||
|
// time in the future. JDWP agent ignores MethodExit events if caused by
|
||||||
|
// an exception.
|
||||||
|
//
|
||||||
|
if (is_exception_detected()) {
|
||||||
|
clear_exception_detected();
|
||||||
|
}
|
||||||
// If step is pending for earlyret then it may not be a repeat step.
|
// 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
|
// The new_bci and method_id is same as current_bci and current
|
||||||
// method_id after earlyret and step for recursive calls.
|
// method_id after earlyret and step for recursive calls.
|
||||||
|
@ -165,6 +165,10 @@ class JvmtiThreadState : public CHeapObj {
|
|||||||
inline bool is_exception_caught() { return _exception_caught; }
|
inline bool is_exception_caught() { return _exception_caught; }
|
||||||
inline void set_exception_detected() { _exception_detected = true;
|
inline void set_exception_detected() { _exception_detected = true;
|
||||||
_exception_caught = false; }
|
_exception_caught = false; }
|
||||||
|
inline void clear_exception_detected() {
|
||||||
|
_exception_detected = false;
|
||||||
|
assert(_exception_caught == false, "_exception_caught is out of phase");
|
||||||
|
}
|
||||||
inline void set_exception_caught() { _exception_caught = true;
|
inline void set_exception_caught() { _exception_caught = true;
|
||||||
_exception_detected = false; }
|
_exception_detected = false; }
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user