diff options
Diffstat (limited to 'runtime/class_linker-inl.h')
| -rw-r--r-- | runtime/class_linker-inl.h | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/runtime/class_linker-inl.h b/runtime/class_linker-inl.h index 7e8a4a4fcd..f3e260be56 100644 --- a/runtime/class_linker-inl.h +++ b/runtime/class_linker-inl.h @@ -116,9 +116,10 @@ inline ArtMethod* ClassLinker::GetResolvedMethod(uint32_t method_idx, ArtMethod* return resolved_method; } -inline mirror::Class* ClassLinker::ResolveReferencedClassOfMethod(Thread* self, - uint32_t method_idx, - ArtMethod* referrer) { +inline mirror::Class* ClassLinker::ResolveReferencedClassOfMethod( + uint32_t method_idx, + Handle<mirror::DexCache> dex_cache, + Handle<mirror::ClassLoader> class_loader) { // NB: We cannot simply use `GetResolvedMethod(method_idx, ...)->GetDeclaringClass()`. This is // because if we did so than an invoke-super could be incorrectly dispatched in cases where // GetMethodId(method_idx).class_idx_ refers to a non-interface, non-direct-superclass @@ -127,15 +128,11 @@ inline mirror::Class* ClassLinker::ResolveReferencedClassOfMethod(Thread* self, // interface (either miranda, default or conflict) we would incorrectly assume that is what we // want to invoke on, instead of the 'concrete' implementation that the direct superclass // contains. - mirror::Class* declaring_class = referrer->GetDeclaringClass(); - StackHandleScope<2> hs(self); - Handle<mirror::DexCache> h_dex_cache(hs.NewHandle(declaring_class->GetDexCache())); - const DexFile* dex_file = h_dex_cache->GetDexFile(); + const DexFile* dex_file = dex_cache->GetDexFile(); const DexFile::MethodId& method = dex_file->GetMethodId(method_idx); - mirror::Class* resolved_type = h_dex_cache->GetResolvedType(method.class_idx_); + mirror::Class* resolved_type = dex_cache->GetResolvedType(method.class_idx_); if (UNLIKELY(resolved_type == nullptr)) { - Handle<mirror::ClassLoader> class_loader(hs.NewHandle(declaring_class->GetClassLoader())); - resolved_type = ResolveType(*dex_file, method.class_idx_, h_dex_cache, class_loader); + resolved_type = ResolveType(*dex_file, method.class_idx_, dex_cache, class_loader); } return resolved_type; } |