diff options
| -rw-r--r-- | runtime/interpreter/interpreter_common.cc | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/runtime/interpreter/interpreter_common.cc b/runtime/interpreter/interpreter_common.cc index 6f476365e2..f212cda2a4 100644 --- a/runtime/interpreter/interpreter_common.cc +++ b/runtime/interpreter/interpreter_common.cc @@ -1116,12 +1116,19 @@ static inline bool DoCallCommon(ArtMethod* called_method, ObjPtr<mirror::Object> o = shadow_frame.GetVRegReference(src_reg); if (do_assignability_check && o != nullptr) { PointerSize pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize(); - ObjPtr<mirror::Class> arg_type = - method->GetClassFromTypeIndex( - params->GetTypeItem(shorty_pos).type_idx_, true /* resolve */, pointer_size); + const uint32_t type_idx = params->GetTypeItem(shorty_pos).type_idx_; + ObjPtr<mirror::Class> arg_type = method->GetDexCacheResolvedType(type_idx, + pointer_size); if (arg_type == nullptr) { - CHECK(self->IsExceptionPending()); - return false; + StackHandleScope<1> hs(self); + // Preserve o since it is used below and GetClassFromTypeIndex may cause thread + // suspension. + HandleWrapperObjPtr<mirror::Object> h = hs.NewHandleWrapper(&o); + arg_type = method->GetClassFromTypeIndex(type_idx, true /* resolve */, pointer_size); + if (arg_type == nullptr) { + CHECK(self->IsExceptionPending()); + return false; + } } if (!o->VerifierInstanceOf(arg_type)) { // This should never happen. |