diff options
| -rw-r--r-- | runtime/interpreter/interpreter.cc | 28 | ||||
| -rw-r--r-- | runtime/interpreter/interpreter_goto_table_impl.cc | 28 | ||||
| -rw-r--r-- | runtime/interpreter/interpreter_switch_impl.cc | 27 |
3 files changed, 28 insertions, 55 deletions
diff --git a/runtime/interpreter/interpreter.cc b/runtime/interpreter/interpreter.cc index ec63fdf90e..dca792c8fc 100644 --- a/runtime/interpreter/interpreter.cc +++ b/runtime/interpreter/interpreter.cc @@ -26,6 +26,7 @@ #include "stack.h" #include "unstarted_runtime.h" #include "mterp/mterp.h" +#include "jit/jit.h" namespace art { namespace interpreter { @@ -280,6 +281,33 @@ static inline JValue Execute(Thread* self, const DexFile::CodeItem* code_item, ShadowFrame& shadow_frame, JValue result_register) { DCHECK(!shadow_frame.GetMethod()->IsAbstract()); DCHECK(!shadow_frame.GetMethod()->IsNative()); + if (LIKELY(shadow_frame.GetDexPC() == 0)) { // Entering the method, but not via deoptimization. + if (kIsDebugBuild) { + self->AssertNoPendingException(); + } + instrumentation::Instrumentation* instrumentation = Runtime::Current()->GetInstrumentation(); + ArtMethod *method = shadow_frame.GetMethod(); + + if (UNLIKELY(instrumentation->HasMethodEntryListeners())) { + instrumentation->MethodEnterEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), + method, 0); + } + + if (UNLIKELY(Runtime::Current()->GetJit() != nullptr && + Runtime::Current()->GetJit()->JitAtFirstUse() && + method->HasAnyCompiledCode())) { + JValue result; + + // Pop the shadow frame before calling into compiled code. + self->PopShadowFrame(); + ArtInterpreterToCompiledCodeBridge(self, code_item, &shadow_frame, &result); + // Push the shadow frame back as the caller will expect it. + self->PushShadowFrame(&shadow_frame); + + return result; + } + } + shadow_frame.GetMethod()->GetDeclaringClass()->AssertInitializedOrInitializingInThread(self); bool transaction_active = Runtime::Current()->IsActiveTransaction(); diff --git a/runtime/interpreter/interpreter_goto_table_impl.cc b/runtime/interpreter/interpreter_goto_table_impl.cc index d50cfe64ae..940d34449a 100644 --- a/runtime/interpreter/interpreter_goto_table_impl.cc +++ b/runtime/interpreter/interpreter_goto_table_impl.cc @@ -21,7 +21,6 @@ #include "base/stl_util.h" // MakeUnique #include "experimental_flags.h" #include "interpreter_common.h" -#include "jit/jit.h" #include "safe_math.h" #include <memory> // std::unique_ptr @@ -179,33 +178,6 @@ JValue ExecuteGotoImpl(Thread* self, const DexFile::CodeItem* code_item, ShadowF uint16_t inst_data; const void* const* currentHandlersTable; UPDATE_HANDLER_TABLE(); - if (LIKELY(dex_pc == 0)) { // We are entering the method as opposed to deoptimizing. - if (kIsDebugBuild) { - self->AssertNoPendingException(); - } - instrumentation::Instrumentation* instrumentation = Runtime::Current()->GetInstrumentation(); - ArtMethod *method = shadow_frame.GetMethod(); - - if (UNLIKELY(instrumentation->HasMethodEntryListeners())) { - instrumentation->MethodEnterEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), - method, 0); - } - - if (UNLIKELY(Runtime::Current()->GetJit() != nullptr && - Runtime::Current()->GetJit()->JitAtFirstUse() && - method->HasAnyCompiledCode())) { - JValue result; - - // Pop the shadow frame before calling into compiled code. - self->PopShadowFrame(); - ArtInterpreterToCompiledCodeBridge(self, code_item, &shadow_frame, &result); - // Push the shadow frame back as the caller will expect it. - self->PushShadowFrame(&shadow_frame); - - return result; - } - } - std::unique_ptr<lambda::ClosureBuilder> lambda_closure_builder; size_t lambda_captured_variable_index = 0; diff --git a/runtime/interpreter/interpreter_switch_impl.cc b/runtime/interpreter/interpreter_switch_impl.cc index 56a213cd1f..f7b9cdf487 100644 --- a/runtime/interpreter/interpreter_switch_impl.cc +++ b/runtime/interpreter/interpreter_switch_impl.cc @@ -17,7 +17,6 @@ #include "base/stl_util.h" // MakeUnique #include "experimental_flags.h" #include "interpreter_common.h" -#include "jit/jit.h" #include "safe_math.h" #include <memory> // std::unique_ptr @@ -93,32 +92,6 @@ JValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, uint32_t dex_pc = shadow_frame.GetDexPC(); const auto* const instrumentation = Runtime::Current()->GetInstrumentation(); - if (LIKELY(dex_pc == 0)) { // We are entering the method as opposed to deoptimizing. - if (kIsDebugBuild) { - self->AssertNoPendingException(); - } - - ArtMethod* method = shadow_frame.GetMethod(); - - if (UNLIKELY(instrumentation->HasMethodEntryListeners())) { - instrumentation->MethodEnterEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), - method, 0); - } - - if (UNLIKELY(Runtime::Current()->GetJit() != nullptr && - Runtime::Current()->GetJit()->JitAtFirstUse() && - method->HasAnyCompiledCode())) { - JValue result; - - // Pop the shadow frame before calling into compiled code. - self->PopShadowFrame(); - ArtInterpreterToCompiledCodeBridge(self, code_item, &shadow_frame, &result); - // Push the shadow frame back as the caller will expect it. - self->PushShadowFrame(&shadow_frame); - - return result; - } - } const uint16_t* const insns = code_item->insns_; const Instruction* inst = Instruction::At(insns + dex_pc); uint16_t inst_data; |