From fd3077e4b9ebadd281777310d26e64443858f653 Mon Sep 17 00:00:00 2001 From: Sebastien Hertz Date: Wed, 23 Apr 2014 10:32:43 +0200 Subject: Refactor exception handling for deoptimization This CL refactors the exception handling (on the quick side) by isolating the search of catch handler and the preparation of deoptimization. We rename the CatchFinder class to QuickExceptionHandler so it's less specific to catch handler search. Finding catch handler happens in QuickExceptionHandler::FindCatch. Since the CatchBlockStackVisitor resolves exception types, it may cause thread suspension and breaks the assertion current thread can't be suspended. Therefore, we place the exception in a SirtRef (while it is detached from the current thread) and remove the thread suspension assertion. Deoptimization now happens in QuickExceptionHandler::DeoptimizeStack. It uses the new DeoptimizeStackVisitor class to create shadow frames. We also add the Thread::GetDeoptimizationException method to get the definition of the fake exception in only one place. Change-Id: I01b19fa72af64329b5c3b6c7f0c3339d2d724978 --- runtime/deoptimize_stack_visitor.h | 53 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 runtime/deoptimize_stack_visitor.h (limited to 'runtime/deoptimize_stack_visitor.h') diff --git a/runtime/deoptimize_stack_visitor.h b/runtime/deoptimize_stack_visitor.h new file mode 100644 index 0000000000..c898e7db77 --- /dev/null +++ b/runtime/deoptimize_stack_visitor.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ART_RUNTIME_DEOPTIMIZE_STACK_VISITOR_H_ +#define ART_RUNTIME_DEOPTIMIZE_STACK_VISITOR_H_ + +#include "base/mutex.h" +#include "stack.h" + +namespace art { + +namespace mirror { +class ArtMethod; +} // namespace mirror +class QuickExceptionHandler; +class Thread; + +// Prepares deoptimization. +class DeoptimizeStackVisitor FINAL : public StackVisitor { + public: + DeoptimizeStackVisitor(Thread* self, Context* context, QuickExceptionHandler* exception_handler) + SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) + : StackVisitor(self, context), self_(self), exception_handler_(exception_handler), + prev_shadow_frame_(nullptr) { + } + + bool VisitFrame() OVERRIDE SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + + private: + bool HandleDeoptimization(mirror::ArtMethod* m) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + + Thread* const self_; + QuickExceptionHandler* const exception_handler_; + ShadowFrame* prev_shadow_frame_; + + DISALLOW_COPY_AND_ASSIGN(DeoptimizeStackVisitor); +}; + +} // namespace art +#endif // ART_RUNTIME_DEOPTIMIZE_STACK_VISITOR_H_ -- cgit v1.2.3-59-g8ed1b