Revert "JVMTI PopFrame support"
This reverts commit 88a2a9d7a14b67e10525d93b0ee57d9dd6bc345a.
Reason for revert: Fails class-load/prepare tests with jit-at-first-use.
Bug: 73255278
Bug: 111357976
Test: None
Change-Id: Id8dea6dcf124d56e3a8dfa19e6ed39cc70370c34
diff --git a/runtime/thread.cc b/runtime/thread.cc
index afb2c28..4a3d8cb 100644
--- a/runtime/thread.cc
+++ b/runtime/thread.cc
@@ -3368,51 +3368,22 @@
HandleWrapperObjPtr<mirror::Throwable> h_exception(hs.NewHandleWrapper(&exception));
instrumentation->ExceptionThrownEvent(this, exception.Ptr());
}
- // Does instrumentation need to deoptimize the stack or otherwise go to interpreter for something?
- // Note: we do this *after* reporting the exception to instrumentation in case it now requires
- // deoptimization. It may happen if a debugger is attached and requests new events (single-step,
- // breakpoint, ...) when the exception is reported.
- ShadowFrame* cf;
- bool force_frame_pop = false;
- {
- NthCallerVisitor visitor(this, 0, false);
- visitor.WalkStack();
- cf = visitor.GetCurrentShadowFrame();
- if (cf == nullptr) {
- cf = FindDebuggerShadowFrame(visitor.GetFrameId());
- }
- force_frame_pop = cf != nullptr && cf->GetForcePopFrame();
- if (kIsDebugBuild && force_frame_pop) {
- NthCallerVisitor penultimate_visitor(this, 1, false);
- penultimate_visitor.WalkStack();
- ShadowFrame* penultimate_frame = penultimate_visitor.GetCurrentShadowFrame();
- if (penultimate_frame == nullptr) {
- penultimate_frame = FindDebuggerShadowFrame(penultimate_visitor.GetFrameId());
- }
- DCHECK(penultimate_frame != nullptr &&
- penultimate_frame->GetForceRetryInstruction())
- << "Force pop frame without retry instruction found. penultimate frame is null: "
- << (penultimate_frame == nullptr ? "true" : "false");
- }
- }
- if (Dbg::IsForcedInterpreterNeededForException(this) || force_frame_pop) {
+ // Does instrumentation need to deoptimize the stack?
+ // Note: we do this *after* reporting the exception to instrumentation in case it
+ // now requires deoptimization. It may happen if a debugger is attached and requests
+ // new events (single-step, breakpoint, ...) when the exception is reported.
+ if (Dbg::IsForcedInterpreterNeededForException(this)) {
NthCallerVisitor visitor(this, 0, false);
visitor.WalkStack();
if (Runtime::Current()->IsAsyncDeoptimizeable(visitor.caller_pc)) {
- VLOG(deopt) << "Deopting " << cf->GetMethod()->PrettyMethod() << " for frame-pop";
// method_type shouldn't matter due to exception handling.
const DeoptimizationMethodType method_type = DeoptimizationMethodType::kDefault;
// Save the exception into the deoptimization context so it can be restored
// before entering the interpreter.
- if (force_frame_pop) {
- DCHECK(Runtime::Current()->AreNonStandardExitsEnabled());
- // Get rid of the exception since we are doing a framepop instead.
- ClearException();
- }
PushDeoptimizationContext(
JValue(),
false /* is_reference */,
- (force_frame_pop ? nullptr : exception),
+ exception,
false /* from_code */,
method_type);
artDeoptimize(this);