summaryrefslogtreecommitdiff
path: root/runtime/class_linker-inl.h
diff options
context:
space:
mode:
author Nicolas Geoffray <ngeoffray@google.com> 2021-09-13 09:20:33 +0100
committer Nicolas Geoffray <ngeoffray@google.com> 2021-09-13 10:47:54 +0000
commitc07f48875c60d88205283c979898ce31df2a2026 (patch)
treed161f50a0b964468879ca14e4601fd1f6c029ae0 /runtime/class_linker-inl.h
parent7fae86c62a9ffeb94a7c11f1660c94873368dcec (diff)
Add a test and consistency checks in method / field resolution.
Always use the associated class loader of a dex cache. Test: test.py Bug: 199246839 Change-Id: Ib512126915cac4af229a5a206a8b4d9d73bdf02a
Diffstat (limited to 'runtime/class_linker-inl.h')
-rw-r--r--runtime/class_linker-inl.h6
1 files changed, 6 insertions, 0 deletions
diff --git a/runtime/class_linker-inl.h b/runtime/class_linker-inl.h
index c45f001aa3..13191016b2 100644
--- a/runtime/class_linker-inl.h
+++ b/runtime/class_linker-inl.h
@@ -164,6 +164,7 @@ inline ObjPtr<mirror::Class> ClassLinker::ResolveType(dex::TypeIndex type_idx,
Handle<mirror::DexCache> dex_cache,
Handle<mirror::ClassLoader> class_loader) {
DCHECK(dex_cache != nullptr);
+ DCHECK(dex_cache->GetClassLoader().Ptr() == class_loader.Get());
Thread::PoisonObjectPointersIfDebug();
ObjPtr<mirror::Class> resolved = dex_cache->GetResolvedType(type_idx);
if (resolved == nullptr) {
@@ -212,6 +213,7 @@ inline ObjPtr<mirror::Class> ClassLinker::LookupResolvedType(
dex::TypeIndex type_idx,
ObjPtr<mirror::DexCache> dex_cache,
ObjPtr<mirror::ClassLoader> class_loader) {
+ DCHECK(dex_cache->GetClassLoader().Ptr() == class_loader.Ptr());
ObjPtr<mirror::Class> type = dex_cache->GetResolvedType(type_idx);
if (type == nullptr) {
type = DoLookupResolvedType(type_idx, dex_cache, class_loader);
@@ -273,6 +275,7 @@ inline bool ClassLinker::CheckInvokeClassMismatch(ObjPtr<mirror::DexCache> dex_c
InvokeType type,
uint32_t method_idx,
ObjPtr<mirror::ClassLoader> class_loader) {
+ DCHECK(dex_cache->GetClassLoader().Ptr() == class_loader.Ptr());
return CheckInvokeClassMismatch<kThrow>(
dex_cache,
type,
@@ -288,6 +291,7 @@ inline bool ClassLinker::CheckInvokeClassMismatch(ObjPtr<mirror::DexCache> dex_c
inline ArtMethod* ClassLinker::LookupResolvedMethod(uint32_t method_idx,
ObjPtr<mirror::DexCache> dex_cache,
ObjPtr<mirror::ClassLoader> class_loader) {
+ DCHECK(dex_cache->GetClassLoader().Ptr() == class_loader.Ptr());
ArtMethod* resolved = dex_cache->GetResolvedMethod(method_idx);
if (resolved == nullptr) {
const DexFile& dex_file = *dex_cache->GetDexFile();
@@ -433,6 +437,7 @@ inline ArtField* ClassLinker::LookupResolvedField(uint32_t field_idx,
ArtField* field = referrer->GetDexCache<kWithoutReadBarrier>()->GetResolvedField(
field_idx);
if (field == nullptr) {
+ referrer = referrer->GetInterfaceMethodIfProxy(image_pointer_size_);
ObjPtr<mirror::ClassLoader> class_loader = referrer->GetDeclaringClass()->GetClassLoader();
field = LookupResolvedField(field_idx, referrer->GetDexCache(), class_loader, is_static);
}
@@ -449,6 +454,7 @@ inline ArtField* ClassLinker::ResolveField(uint32_t field_idx,
field_idx);
if (UNLIKELY(resolved_field == nullptr)) {
StackHandleScope<2> hs(Thread::Current());
+ referrer = referrer->GetInterfaceMethodIfProxy(image_pointer_size_);
ObjPtr<mirror::Class> referring_class = referrer->GetDeclaringClass();
Handle<mirror::DexCache> dex_cache(hs.NewHandle(referrer->GetDexCache()));
Handle<mirror::ClassLoader> class_loader(hs.NewHandle(referring_class->GetClassLoader()));