ART: Fix ResolveType with ArtMethod
ArtMethods may be obsolete. In that case, the dex cache of the
declaring class is not correct. Refactor the code to avoid
issues.
Partially reverts commit 09c5ca40635faee00f40f6ca0581dd475efd545e.
Bug: 119830111
Test: m test-art-host
Change-Id: Ibf89af48e6384569c2abd6d5846cf05c929679d0
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc
index 639fa7e..b1eb03b 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -8076,14 +8076,22 @@
return type;
}
-ObjPtr<mirror::Class> ClassLinker::DoResolveType(dex::TypeIndex type_idx,
- ObjPtr<mirror::Class> referrer) {
+template <typename T>
+ObjPtr<mirror::Class> ClassLinker::DoResolveType(dex::TypeIndex type_idx, T referrer) {
StackHandleScope<2> hs(Thread::Current());
Handle<mirror::DexCache> dex_cache(hs.NewHandle(referrer->GetDexCache()));
Handle<mirror::ClassLoader> class_loader(hs.NewHandle(referrer->GetClassLoader()));
return DoResolveType(type_idx, dex_cache, class_loader);
}
+// Instantiate the above.
+template ObjPtr<mirror::Class> ClassLinker::DoResolveType(dex::TypeIndex type_idx,
+ ArtField* referrer);
+template ObjPtr<mirror::Class> ClassLinker::DoResolveType(dex::TypeIndex type_idx,
+ ArtMethod* referrer);
+template ObjPtr<mirror::Class> ClassLinker::DoResolveType(dex::TypeIndex type_idx,
+ ObjPtr<mirror::Class> referrer);
+
ObjPtr<mirror::Class> ClassLinker::DoResolveType(dex::TypeIndex type_idx,
Handle<mirror::DexCache> dex_cache,
Handle<mirror::ClassLoader> class_loader) {