diff options
author | 2017-05-26 21:47:30 +0000 | |
---|---|---|
committer | 2017-05-26 21:47:32 +0000 | |
commit | 0a5ace58e973da278049f837bf2cdbaf7b44849c (patch) | |
tree | 3ef8f5c2d148c7d4d30696cf3a618984546398b9 /runtime/method_handles.cc | |
parent | d8b6461dfda391284e4b6942df0e872a3da24ce9 (diff) | |
parent | 5ea8413714ceec50a758df6614dc4a3ec6179112 (diff) |
Merge "Stop interpreter from accessing code items of compiled code."
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; } |