diff options
Diffstat (limited to 'runtime/method_handles.cc')
-rw-r--r-- | runtime/method_handles.cc | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/runtime/method_handles.cc b/runtime/method_handles.cc index 54d45b1e79..090bac1173 100644 --- a/runtime/method_handles.cc +++ b/runtime/method_handles.cc @@ -514,7 +514,15 @@ static inline bool DoCallPolymorphic(ArtMethod* called_method, } } - PerformCall(self, code_item, shadow_frame.GetMethod(), first_dest_reg, new_shadow_frame, result); + bool use_interpreter_entrypoint = ClassLinker::ShouldUseInterpreterEntrypoint( + called_method, called_method->GetEntryPointFromQuickCompiledCode()); + PerformCall(self, + code_item, + shadow_frame.GetMethod(), + first_dest_reg, + new_shadow_frame, + result, + use_interpreter_entrypoint); if (self->IsExceptionPending()) { return false; } @@ -602,12 +610,15 @@ static inline bool DoCallTransform(ArtMethod* called_method, new_shadow_frame->SetVRegReference(0, receiver.Get()); new_shadow_frame->SetVRegReference(1, sf.Get()); + bool use_interpreter_entrypoint = ClassLinker::ShouldUseInterpreterEntrypoint( + called_method, called_method->GetEntryPointFromQuickCompiledCode()); PerformCall(self, code_item, shadow_frame.GetMethod(), 0 /* first destination register */, new_shadow_frame, - result); + result, + use_interpreter_entrypoint); if (self->IsExceptionPending()) { return false; } @@ -1091,7 +1102,15 @@ bool DoInvokePolymorphicExact(Thread* self, num_input_regs); self->EndAssertNoThreadSuspension(old_cause); - PerformCall(self, code_item, shadow_frame.GetMethod(), first_dest_reg, new_shadow_frame, result); + bool use_interpreter_entrypoint = ClassLinker::ShouldUseInterpreterEntrypoint( + called_method, called_method->GetEntryPointFromQuickCompiledCode()); + PerformCall(self, + code_item, + shadow_frame.GetMethod(), + first_dest_reg, + new_shadow_frame, + result, + use_interpreter_entrypoint); if (self->IsExceptionPending()) { return false; } |