diff options
Diffstat (limited to 'runtime/interpreter/interpreter.cc')
-rw-r--r-- | runtime/interpreter/interpreter.cc | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/runtime/interpreter/interpreter.cc b/runtime/interpreter/interpreter.cc index ce242a74c7..5f176db2f7 100644 --- a/runtime/interpreter/interpreter.cc +++ b/runtime/interpreter/interpreter.cc @@ -275,17 +275,38 @@ static inline JValue Execute( method, 0); if (UNLIKELY(shadow_frame.GetForcePopFrame())) { - // The caller will retry this invoke. Just return immediately without any value. + // The caller will retry this invoke or ignore the result. Just return immediately without + // any value. DCHECK(Runtime::Current()->AreNonStandardExitsEnabled()); - DCHECK(PrevFrameWillRetry(self, shadow_frame)); - return JValue(); + JValue ret = JValue(); + bool res = PerformNonStandardReturn<MonitorState::kNoMonitorsLocked>( + self, + shadow_frame, + ret, + instrumentation, + accessor.InsSize(), + 0); + DCHECK(res) << "Expected to perform non-standard return!"; + return ret; } if (UNLIKELY(self->IsExceptionPending())) { instrumentation->MethodUnwindEvent(self, shadow_frame.GetThisObject(accessor.InsSize()), method, 0); - return JValue(); + JValue ret = JValue(); + if (UNLIKELY(shadow_frame.GetForcePopFrame())) { + DCHECK(Runtime::Current()->AreNonStandardExitsEnabled()); + bool res = PerformNonStandardReturn<MonitorState::kNoMonitorsLocked>( + self, + shadow_frame, + ret, + instrumentation, + accessor.InsSize(), + 0); + DCHECK(res) << "Expected to perform non-standard return!"; + } + return ret; } } |