diff options
author | Sebastien Hertz <shertz@google.com> | 2013-09-18 07:10:55 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-09-18 07:10:55 +0000 |
commit | 3523909c99a27729d9a0d6fe3624f09dfadf351c (patch) | |
tree | 610a5acc4d2e78d43a551380527304270d841f73 /runtime/interpreter | |
parent | 8c7ec8cd8e39809ed31cb62bc3b068430042bd76 (diff) | |
parent | 947ff080753c786a74f1cd7aeb09f717bb7074bd (diff) | |
download | android_art-3523909c99a27729d9a0d6fe3624f09dfadf351c.tar.gz android_art-3523909c99a27729d9a0d6fe3624f09dfadf351c.tar.bz2 android_art-3523909c99a27729d9a0d6fe3624f09dfadf351c.zip |
Merge "Load shadow frame's this object only upon instrumentation." into dalvik-dev
Diffstat (limited to 'runtime/interpreter')
-rw-r--r-- | runtime/interpreter/interpreter_common.h | 12 | ||||
-rw-r--r-- | runtime/interpreter/interpreter_goto_table_impl.cc | 36 | ||||
-rw-r--r-- | runtime/interpreter/interpreter_switch_impl.cc | 24 |
3 files changed, 31 insertions, 41 deletions
diff --git a/runtime/interpreter/interpreter_common.h b/runtime/interpreter/interpreter_common.h index 8cd526a79b..794891e501 100644 --- a/runtime/interpreter/interpreter_common.h +++ b/runtime/interpreter/interpreter_common.h @@ -445,24 +445,24 @@ static inline int32_t DoSparseSwitch(const Instruction* inst, static inline uint32_t FindNextInstructionFollowingException(Thread* self, ShadowFrame& shadow_frame, uint32_t dex_pc, - SirtRef<Object>& this_object_ref, - instrumentation::Instrumentation* instrumentation) + mirror::Object* this_object, + const instrumentation::Instrumentation* instrumentation) ALWAYS_INLINE; static inline uint32_t FindNextInstructionFollowingException(Thread* self, ShadowFrame& shadow_frame, uint32_t dex_pc, - SirtRef<Object>& this_object_ref, - instrumentation::Instrumentation* instrumentation) + mirror::Object* this_object, + const instrumentation::Instrumentation* instrumentation) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { self->VerifyStack(); ThrowLocation throw_location; mirror::Throwable* exception = self->GetException(&throw_location); - bool clear_exception; + bool clear_exception = false; uint32_t found_dex_pc = shadow_frame.GetMethod()->FindCatchBlock(exception->GetClass(), dex_pc, &clear_exception); if (found_dex_pc == DexFile::kDexNoIndex) { - instrumentation->MethodUnwindEvent(self, this_object_ref.get(), + instrumentation->MethodUnwindEvent(self, this_object, shadow_frame.GetMethod(), dex_pc); } else { instrumentation->ExceptionCaughtEvent(self, throw_location, diff --git a/runtime/interpreter/interpreter_goto_table_impl.cc b/runtime/interpreter/interpreter_goto_table_impl.cc index 7f4c7c8302..4bef770408 100644 --- a/runtime/interpreter/interpreter_goto_table_impl.cc +++ b/runtime/interpreter/interpreter_goto_table_impl.cc @@ -24,7 +24,6 @@ namespace interpreter { // - "inst" : the current Instruction*. // - "dex_pc": the current pc. // - "shadow_frame": the current shadow frame. -// - "insns": the start of current method's code item. // - "mh": the current MethodHelper. // - "currentHandlersTable": the current table of pointer to each instruction handler. @@ -78,22 +77,16 @@ JValue ExecuteGotoImpl(Thread* self, MethodHelper& mh, const DexFile::CodeItem* return JValue(); } self->VerifyStack(); - instrumentation::Instrumentation* const instrumentation = Runtime::Current()->GetInstrumentation(); - - // As the 'this' object won't change during the execution of current code, we - // want to cache it in local variables. Nevertheless, in order to let the - // garbage collector access it, we store it into sirt references. - SirtRef<Object> this_object_ref(self, shadow_frame.GetThisObject(code_item->ins_size_)); uint32_t dex_pc = shadow_frame.GetDexPC(); + const instrumentation::Instrumentation* const instrumentation = Runtime::Current()->GetInstrumentation(); if (LIKELY(dex_pc == 0)) { // We are entering the method as opposed to deoptimizing.. if (UNLIKELY(instrumentation->HasMethodEntryListeners())) { - instrumentation->MethodEnterEvent(self, this_object_ref.get(), + instrumentation->MethodEnterEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), shadow_frame.GetMethod(), 0); } } - const uint16_t* const insns = code_item->insns_; - const Instruction* inst = Instruction::At(insns + dex_pc); + const Instruction* inst = Instruction::At(code_item->insns_ + dex_pc); // Define handlers table. static const void* handlersTable[kNumPackedOpcodes] = { @@ -212,7 +205,7 @@ JValue ExecuteGotoImpl(Thread* self, MethodHelper& mh, const DexFile::CodeItem* CheckSuspend(self); } if (UNLIKELY(instrumentation->HasMethodExitListeners())) { - instrumentation->MethodExitEvent(self, this_object_ref.get(), + instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), shadow_frame.GetMethod(), dex_pc, result); } @@ -227,7 +220,7 @@ JValue ExecuteGotoImpl(Thread* self, MethodHelper& mh, const DexFile::CodeItem* CheckSuspend(self); } if (UNLIKELY(instrumentation->HasMethodExitListeners())) { - instrumentation->MethodExitEvent(self, this_object_ref.get(), + instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), shadow_frame.GetMethod(), dex_pc, result); } @@ -243,7 +236,7 @@ JValue ExecuteGotoImpl(Thread* self, MethodHelper& mh, const DexFile::CodeItem* CheckSuspend(self); } if (UNLIKELY(instrumentation->HasMethodExitListeners())) { - instrumentation->MethodExitEvent(self, this_object_ref.get(), + instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), shadow_frame.GetMethod(), dex_pc, result); } @@ -258,7 +251,7 @@ JValue ExecuteGotoImpl(Thread* self, MethodHelper& mh, const DexFile::CodeItem* CheckSuspend(self); } if (UNLIKELY(instrumentation->HasMethodExitListeners())) { - instrumentation->MethodExitEvent(self, this_object_ref.get(), + instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), shadow_frame.GetMethod(), dex_pc, result); } @@ -274,7 +267,7 @@ JValue ExecuteGotoImpl(Thread* self, MethodHelper& mh, const DexFile::CodeItem* CheckSuspend(self); } if (UNLIKELY(instrumentation->HasMethodExitListeners())) { - instrumentation->MethodExitEvent(self, this_object_ref.get(), + instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), shadow_frame.GetMethod(), dex_pc, result); } @@ -2324,8 +2317,9 @@ JValue ExecuteGotoImpl(Thread* self, MethodHelper& mh, const DexFile::CodeItem* if (UNLIKELY(self->TestAllFlags())) { CheckSuspend(self); } + Object* this_object = shadow_frame.GetThisObject(code_item->ins_size_); uint32_t found_dex_pc = FindNextInstructionFollowingException(self, shadow_frame, dex_pc, - this_object_ref, + this_object, instrumentation); if (found_dex_pc == DexFile::kDexNoIndex) { return JValue(); /* Handled in caller. */ @@ -2336,11 +2330,11 @@ JValue ExecuteGotoImpl(Thread* self, MethodHelper& mh, const DexFile::CodeItem* } // Create alternative instruction handlers dedicated to instrumentation. -#define INSTRUMENTATION_INSTRUCTION_HANDLER(o, code, n, f, r, i, a, v) \ - instrumentation_op_##code: { \ - instrumentation->DexPcMovedEvent(self, this_object_ref.get(), \ - shadow_frame.GetMethod(), dex_pc); \ - goto *handlersTable[Instruction::code]; \ +#define INSTRUMENTATION_INSTRUCTION_HANDLER(o, code, n, f, r, i, a, v) \ + instrumentation_op_##code: { \ + instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), \ + shadow_frame.GetMethod(), dex_pc); \ + goto *handlersTable[Instruction::code]; \ } #include "dex_instruction_list.h" DEX_INSTRUCTION_LIST(INSTRUMENTATION_INSTRUCTION_HANDLER) diff --git a/runtime/interpreter/interpreter_switch_impl.cc b/runtime/interpreter/interpreter_switch_impl.cc index 5253e9dbbf..01a0e4b457 100644 --- a/runtime/interpreter/interpreter_switch_impl.cc +++ b/runtime/interpreter/interpreter_switch_impl.cc @@ -25,9 +25,10 @@ namespace interpreter { if (UNLIKELY(self->TestAllFlags())) { \ CheckSuspend(self); \ } \ + Object* this_object = shadow_frame.GetThisObject(code_item->ins_size_); \ uint32_t found_dex_pc = FindNextInstructionFollowingException(self, shadow_frame, \ inst->GetDexPc(insns), \ - this_object_ref, \ + this_object, \ instrumentation); \ if (found_dex_pc == DexFile::kDexNoIndex) { \ return JValue(); /* Handled in caller. */ \ @@ -57,17 +58,12 @@ static JValue ExecuteSwitchImpl(Thread* self, MethodHelper& mh, const DexFile::C return JValue(); } self->VerifyStack(); - instrumentation::Instrumentation* const instrumentation = Runtime::Current()->GetInstrumentation(); - - // As the 'this' object won't change during the execution of current code, we - // want to cache it in local variables. Nevertheless, in order to let the - // garbage collector access it, we store it into sirt references. - SirtRef<Object> this_object_ref(self, shadow_frame.GetThisObject(code_item->ins_size_)); uint32_t dex_pc = shadow_frame.GetDexPC(); + const instrumentation::Instrumentation* const instrumentation = Runtime::Current()->GetInstrumentation(); if (LIKELY(dex_pc == 0)) { // We are entering the method as opposed to deoptimizing.. if (UNLIKELY(instrumentation->HasMethodEntryListeners())) { - instrumentation->MethodEnterEvent(self, this_object_ref.get(), + instrumentation->MethodEnterEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), shadow_frame.GetMethod(), 0); } } @@ -77,7 +73,7 @@ static JValue ExecuteSwitchImpl(Thread* self, MethodHelper& mh, const DexFile::C dex_pc = inst->GetDexPc(insns); shadow_frame.SetDexPC(dex_pc); if (UNLIKELY(instrumentation->HasDexPcListeners())) { - instrumentation->DexPcMovedEvent(self, this_object_ref.get(), + instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), shadow_frame.GetMethod(), dex_pc); } TraceExecution(shadow_frame, inst, dex_pc, mh); @@ -176,7 +172,7 @@ static JValue ExecuteSwitchImpl(Thread* self, MethodHelper& mh, const DexFile::C CheckSuspend(self); } if (UNLIKELY(instrumentation->HasMethodExitListeners())) { - instrumentation->MethodExitEvent(self, this_object_ref.get(), + instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), shadow_frame.GetMethod(), inst->GetDexPc(insns), result); } @@ -190,7 +186,7 @@ static JValue ExecuteSwitchImpl(Thread* self, MethodHelper& mh, const DexFile::C CheckSuspend(self); } if (UNLIKELY(instrumentation->HasMethodExitListeners())) { - instrumentation->MethodExitEvent(self, this_object_ref.get(), + instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), shadow_frame.GetMethod(), inst->GetDexPc(insns), result); } @@ -205,7 +201,7 @@ static JValue ExecuteSwitchImpl(Thread* self, MethodHelper& mh, const DexFile::C CheckSuspend(self); } if (UNLIKELY(instrumentation->HasMethodExitListeners())) { - instrumentation->MethodExitEvent(self, this_object_ref.get(), + instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), shadow_frame.GetMethod(), inst->GetDexPc(insns), result); } @@ -219,7 +215,7 @@ static JValue ExecuteSwitchImpl(Thread* self, MethodHelper& mh, const DexFile::C CheckSuspend(self); } if (UNLIKELY(instrumentation->HasMethodExitListeners())) { - instrumentation->MethodExitEvent(self, this_object_ref.get(), + instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), shadow_frame.GetMethod(), inst->GetDexPc(insns), result); } @@ -234,7 +230,7 @@ static JValue ExecuteSwitchImpl(Thread* self, MethodHelper& mh, const DexFile::C CheckSuspend(self); } if (UNLIKELY(instrumentation->HasMethodExitListeners())) { - instrumentation->MethodExitEvent(self, this_object_ref.get(), + instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), shadow_frame.GetMethod(), inst->GetDexPc(insns), result); } |