diff options
author | 2018-10-15 11:46:46 +0100 | |
---|---|---|
committer | 2018-10-17 18:37:32 +0000 | |
commit | 1f5ab4ecc6589a8d5a671ef56e6efcc3e40d7c5b (patch) | |
tree | a0912961631749e7bca17a527b1e106a10554185 | |
parent | 21ff4ad92e8d74cfe8d95ec64b177d47084ec374 (diff) |
Rename fast_invoke template argument of DoInvoke to is_mterp.
This is more descriptive than "fast".
Test: test.py -b --interpreter --host
Change-Id: I107c59db2aa00dd6fd727fe08c739c940dd7899c
-rw-r--r-- | runtime/interpreter/interpreter_common.h | 36 | ||||
-rw-r--r-- | runtime/interpreter/interpreter_switch_impl.cc | 20 | ||||
-rw-r--r-- | runtime/interpreter/mterp/mterp.cc | 20 |
3 files changed, 38 insertions, 38 deletions
diff --git a/runtime/interpreter/interpreter_common.h b/runtime/interpreter/interpreter_common.h index 1e4239edfd..3c5abe124e 100644 --- a/runtime/interpreter/interpreter_common.h +++ b/runtime/interpreter/interpreter_common.h @@ -123,7 +123,7 @@ bool DoCall(ArtMethod* called_method, Thread* self, ShadowFrame& shadow_frame, // Handles all invoke-XXX/range instructions except for invoke-polymorphic[/range]. // Returns true on success, otherwise throws an exception and returns false. -template<InvokeType type, bool is_range, bool do_access_check, bool fast_invoke = false> +template<InvokeType type, bool is_range, bool do_access_check, bool is_mterp> static ALWAYS_INLINE bool DoInvoke(Thread* self, ShadowFrame& shadow_frame, const Instruction* inst, @@ -169,29 +169,29 @@ static ALWAYS_INLINE bool DoInvoke(Thread* self, CHECK(self->IsExceptionPending()); result->SetJ(0); return false; - } else if (UNLIKELY(!called_method->IsInvokable())) { + } + if (UNLIKELY(!called_method->IsInvokable())) { called_method->ThrowInvocationTimeError(); result->SetJ(0); return false; - } else { - jit::Jit* jit = Runtime::Current()->GetJit(); - if (jit != nullptr && (type == kVirtual || type == kInterface)) { - jit->InvokeVirtualOrInterface(receiver, sf_method, shadow_frame.GetDexPC(), called_method); - } - // The fast invoke is used from mterp for some invoke variants. - // The non-fast version is used from switch interpreter and it might not support intrinsics. - // TODO: Unify both paths. - if (fast_invoke) { - if (called_method->IsIntrinsic()) { - if (MterpHandleIntrinsic(&shadow_frame, called_method, inst, inst_data, - shadow_frame.GetResultRegister())) { - return !self->IsExceptionPending(); - } + } + + jit::Jit* jit = Runtime::Current()->GetJit(); + if (jit != nullptr && (type == kVirtual || type == kInterface)) { + jit->InvokeVirtualOrInterface(receiver, sf_method, shadow_frame.GetDexPC(), called_method); + } + + if (is_mterp && !is_range && called_method->IsIntrinsic()) { + if (type == kDirect || type == kStatic || type == kVirtual) { + if (MterpHandleIntrinsic(&shadow_frame, called_method, inst, inst_data, + shadow_frame.GetResultRegister())) { + return !self->IsExceptionPending(); } } - return DoCall<is_range, do_access_check>(called_method, self, shadow_frame, inst, inst_data, - result); } + + return DoCall<is_range, do_access_check>(called_method, self, shadow_frame, inst, inst_data, + result); } static inline ObjPtr<mirror::MethodHandle> ResolveMethodHandle(Thread* self, diff --git a/runtime/interpreter/interpreter_switch_impl.cc b/runtime/interpreter/interpreter_switch_impl.cc index cb64ff402a..d9f76eee6e 100644 --- a/runtime/interpreter/interpreter_switch_impl.cc +++ b/runtime/interpreter/interpreter_switch_impl.cc @@ -1669,70 +1669,70 @@ ATTRIBUTE_NO_SANITIZE_ADDRESS void ExecuteSwitchImplCpp(SwitchImplContext* ctx) } case Instruction::INVOKE_VIRTUAL: { PREAMBLE(); - bool success = DoInvoke<kVirtual, false, do_access_check>( + bool success = DoInvoke<kVirtual, false, do_access_check, /*is_mterp=*/ false>( self, shadow_frame, inst, inst_data, &result_register); POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(!success); break; } case Instruction::INVOKE_VIRTUAL_RANGE: { PREAMBLE(); - bool success = DoInvoke<kVirtual, true, do_access_check>( + bool success = DoInvoke<kVirtual, true, do_access_check, /*is_mterp=*/ false>( self, shadow_frame, inst, inst_data, &result_register); POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(!success); break; } case Instruction::INVOKE_SUPER: { PREAMBLE(); - bool success = DoInvoke<kSuper, false, do_access_check>( + bool success = DoInvoke<kSuper, false, do_access_check, /*is_mterp=*/ false>( self, shadow_frame, inst, inst_data, &result_register); POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(!success); break; } case Instruction::INVOKE_SUPER_RANGE: { PREAMBLE(); - bool success = DoInvoke<kSuper, true, do_access_check>( + bool success = DoInvoke<kSuper, true, do_access_check, /*is_mterp=*/ false>( self, shadow_frame, inst, inst_data, &result_register); POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(!success); break; } case Instruction::INVOKE_DIRECT: { PREAMBLE(); - bool success = DoInvoke<kDirect, false, do_access_check>( + bool success = DoInvoke<kDirect, false, do_access_check, /*is_mterp=*/ false>( self, shadow_frame, inst, inst_data, &result_register); POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(!success); break; } case Instruction::INVOKE_DIRECT_RANGE: { PREAMBLE(); - bool success = DoInvoke<kDirect, true, do_access_check>( + bool success = DoInvoke<kDirect, true, do_access_check, /*is_mterp=*/ false>( self, shadow_frame, inst, inst_data, &result_register); POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(!success); break; } case Instruction::INVOKE_INTERFACE: { PREAMBLE(); - bool success = DoInvoke<kInterface, false, do_access_check>( + bool success = DoInvoke<kInterface, false, do_access_check, /*is_mterp=*/ false>( self, shadow_frame, inst, inst_data, &result_register); POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(!success); break; } case Instruction::INVOKE_INTERFACE_RANGE: { PREAMBLE(); - bool success = DoInvoke<kInterface, true, do_access_check>( + bool success = DoInvoke<kInterface, true, do_access_check, /*is_mterp=*/ false>( self, shadow_frame, inst, inst_data, &result_register); POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(!success); break; } case Instruction::INVOKE_STATIC: { PREAMBLE(); - bool success = DoInvoke<kStatic, false, do_access_check>( + bool success = DoInvoke<kStatic, false, do_access_check, /*is_mterp=*/ false>( self, shadow_frame, inst, inst_data, &result_register); POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(!success); break; } case Instruction::INVOKE_STATIC_RANGE: { PREAMBLE(); - bool success = DoInvoke<kStatic, true, do_access_check>( + bool success = DoInvoke<kStatic, true, do_access_check, /*is_mterp=*/ false>( self, shadow_frame, inst, inst_data, &result_register); POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(!success); break; diff --git a/runtime/interpreter/mterp/mterp.cc b/runtime/interpreter/mterp/mterp.cc index 633a51337c..be985ff12d 100644 --- a/runtime/interpreter/mterp/mterp.cc +++ b/runtime/interpreter/mterp/mterp.cc @@ -173,7 +173,7 @@ extern "C" size_t MterpInvokeVirtual(Thread* self, REQUIRES_SHARED(Locks::mutator_lock_) { JValue* result_register = shadow_frame->GetResultRegister(); const Instruction* inst = Instruction::At(dex_pc_ptr); - return DoInvoke<kVirtual, /*is_range*/ false, /*access_check*/ false, /*fast_invoke*/ true>( + return DoInvoke<kVirtual, /*is_range=*/ false, /*do_access_check=*/ false, /*is_mterp=*/ true>( self, *shadow_frame, inst, inst_data, result_register); } @@ -184,7 +184,7 @@ extern "C" size_t MterpInvokeSuper(Thread* self, REQUIRES_SHARED(Locks::mutator_lock_) { JValue* result_register = shadow_frame->GetResultRegister(); const Instruction* inst = Instruction::At(dex_pc_ptr); - return DoInvoke<kSuper, /*is_range*/ false, /*access_check*/ false>( + return DoInvoke<kSuper, /*is_range=*/ false, /*do_access_check=*/ false, /*is_mterp=*/ true>( self, *shadow_frame, inst, inst_data, result_register); } @@ -195,7 +195,7 @@ extern "C" size_t MterpInvokeInterface(Thread* self, REQUIRES_SHARED(Locks::mutator_lock_) { JValue* result_register = shadow_frame->GetResultRegister(); const Instruction* inst = Instruction::At(dex_pc_ptr); - return DoInvoke<kInterface, /*is_range*/ false, /*access_check*/ false>( + return DoInvoke<kInterface, /*is_range=*/ false, /*do_access_check=*/ false, /*is_mterp=*/ true>( self, *shadow_frame, inst, inst_data, result_register); } @@ -206,7 +206,7 @@ extern "C" size_t MterpInvokeDirect(Thread* self, REQUIRES_SHARED(Locks::mutator_lock_) { JValue* result_register = shadow_frame->GetResultRegister(); const Instruction* inst = Instruction::At(dex_pc_ptr); - return DoInvoke<kDirect, /*is_range*/ false, /*access_check*/ false, /*fast_invoke*/ true>( + return DoInvoke<kDirect, /*is_range=*/ false, /*do_access_check=*/ false, /*is_mterp=*/ true>( self, *shadow_frame, inst, inst_data, result_register); } @@ -217,7 +217,7 @@ extern "C" size_t MterpInvokeStatic(Thread* self, REQUIRES_SHARED(Locks::mutator_lock_) { JValue* result_register = shadow_frame->GetResultRegister(); const Instruction* inst = Instruction::At(dex_pc_ptr); - return DoInvoke<kStatic, /*is_range*/ false, /*access_check*/ false, /*fast_invoke*/ true>( + return DoInvoke<kStatic, /*is_range=*/ false, /*do_access_check=*/ false, /*is_mterp=*/ true>( self, *shadow_frame, inst, inst_data, result_register); } @@ -250,7 +250,7 @@ extern "C" size_t MterpInvokeVirtualRange(Thread* self, REQUIRES_SHARED(Locks::mutator_lock_) { JValue* result_register = shadow_frame->GetResultRegister(); const Instruction* inst = Instruction::At(dex_pc_ptr); - return DoInvoke<kVirtual, /*is_range*/ true, /*access_check*/ false>( + return DoInvoke<kVirtual, /*is_range=*/ true, /*do_access_check=*/ false, /*is_mterp=*/ true>( self, *shadow_frame, inst, inst_data, result_register); } @@ -261,7 +261,7 @@ extern "C" size_t MterpInvokeSuperRange(Thread* self, REQUIRES_SHARED(Locks::mutator_lock_) { JValue* result_register = shadow_frame->GetResultRegister(); const Instruction* inst = Instruction::At(dex_pc_ptr); - return DoInvoke<kSuper, /*is_range*/ true, /*access_check*/ false>( + return DoInvoke<kSuper, /*is_range=*/ true, /*do_access_check=*/ false, /*is_mterp=*/ true>( self, *shadow_frame, inst, inst_data, result_register); } @@ -272,7 +272,7 @@ extern "C" size_t MterpInvokeInterfaceRange(Thread* self, REQUIRES_SHARED(Locks::mutator_lock_) { JValue* result_register = shadow_frame->GetResultRegister(); const Instruction* inst = Instruction::At(dex_pc_ptr); - return DoInvoke<kInterface, /*is_range*/ true, /*access_check*/ false>( + return DoInvoke<kInterface, /*is_range=*/ true, /*do_access_check=*/ false, /*is_mterp=*/ true>( self, *shadow_frame, inst, inst_data, result_register); } @@ -283,7 +283,7 @@ extern "C" size_t MterpInvokeDirectRange(Thread* self, REQUIRES_SHARED(Locks::mutator_lock_) { JValue* result_register = shadow_frame->GetResultRegister(); const Instruction* inst = Instruction::At(dex_pc_ptr); - return DoInvoke<kDirect, /*is_range*/ true, /*access_check*/ false>( + return DoInvoke<kDirect, /*is_range=*/ true, /*do_access_check=*/ false, /*is_mterp=*/ true>( self, *shadow_frame, inst, inst_data, result_register); } @@ -294,7 +294,7 @@ extern "C" size_t MterpInvokeStaticRange(Thread* self, REQUIRES_SHARED(Locks::mutator_lock_) { JValue* result_register = shadow_frame->GetResultRegister(); const Instruction* inst = Instruction::At(dex_pc_ptr); - return DoInvoke<kStatic, /*is_range*/ true, /*access_check*/ false>( + return DoInvoke<kStatic, /*is_range=*/ true, /*do_access_check=*/ false, /*is_mterp=*/ true>( self, *shadow_frame, inst, inst_data, result_register); } |