diff options
| author | 2014-06-11 12:32:31 +0000 | |
|---|---|---|
| committer | 2014-06-10 21:26:11 +0000 | |
| commit | 3283ade469f515f89d70cf47b6ac6fe1814147f2 (patch) | |
| tree | 6b730cbe56ded370d1b4293629826ad2c7b06f7f /runtime/quick_exception_handler.cc | |
| parent | bc72903b909f5147b8cb207f3e5d02a8ef85e4e7 (diff) | |
| parent | 9f1020305292a21fd14a402b189c765a125226ab (diff) | |
Merge "Fix exception reporting from interpreter"
Diffstat (limited to 'runtime/quick_exception_handler.cc')
| -rw-r--r-- | runtime/quick_exception_handler.cc | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/runtime/quick_exception_handler.cc b/runtime/quick_exception_handler.cc index e3f9afc787..103492334c 100644 --- a/runtime/quick_exception_handler.cc +++ b/runtime/quick_exception_handler.cc @@ -110,7 +110,8 @@ class CatchBlockStackVisitor FINAL : public StackVisitor { }; void QuickExceptionHandler::FindCatch(const ThrowLocation& throw_location, - mirror::Throwable* exception) { + mirror::Throwable* exception, + bool is_exception_reported) { DCHECK(!is_deoptimization_); if (kDebugExceptionDelivery) { mirror::String* msg = exception->GetDetailMessage(); @@ -141,12 +142,24 @@ void QuickExceptionHandler::FindCatch(const ThrowLocation& throw_location, } else { // Put exception back in root set with clear throw location. self_->SetException(ThrowLocation(), exception_ref.Get()); + self_->SetExceptionReportedToInstrumentation(is_exception_reported); } // The debugger may suspend this thread and walk its stack. Let's do this before popping // instrumentation frames. - instrumentation::Instrumentation* instrumentation = Runtime::Current()->GetInstrumentation(); - instrumentation->ExceptionCaughtEvent(self_, throw_location, handler_method_, handler_dex_pc_, - exception_ref.Get()); + if (!is_exception_reported) { + instrumentation::Instrumentation* instrumentation = Runtime::Current()->GetInstrumentation(); + instrumentation->ExceptionCaughtEvent(self_, throw_location, handler_method_, handler_dex_pc_, + exception_ref.Get()); + // We're not catching this exception but let's remind we already reported the exception above + // to avoid reporting it twice. + self_->SetExceptionReportedToInstrumentation(true); + } + bool caught_exception = (handler_method_ != nullptr && handler_dex_pc_ != DexFile::kDexNoIndex); + if (caught_exception) { + // We're catching this exception so we finish reporting it. We do it here to avoid doing it + // in the compiled code. + self_->SetExceptionReportedToInstrumentation(false); + } } // Prepares deoptimization. |