diff options
-rw-r--r-- | runtime/art_field-inl.h | 4 | ||||
-rw-r--r-- | runtime/art_field.h | 3 | ||||
-rw-r--r-- | runtime/class_linker-inl.h | 4 | ||||
-rw-r--r-- | runtime/class_linker.cc | 12 | ||||
-rw-r--r-- | runtime/class_linker.h | 4 |
5 files changed, 21 insertions, 6 deletions
diff --git a/runtime/art_field-inl.h b/runtime/art_field-inl.h index c5fb7d5f40..53e4c11511 100644 --- a/runtime/art_field-inl.h +++ b/runtime/art_field-inl.h @@ -399,6 +399,10 @@ inline ArtField* ArtField::FindStaticFieldWithOffset(ObjPtr<mirror::Class> klass return FindFieldWithOffset<kExactOffset>(klass->GetSFields(), field_offset); } +inline mirror::ClassLoader* ArtField::GetClassLoader() { + return GetDeclaringClass()->GetClassLoader(); +} + } // namespace art #endif // ART_RUNTIME_ART_FIELD_INL_H_ diff --git a/runtime/art_field.h b/runtime/art_field.h index 1cf7afa022..bba3ed54b4 100644 --- a/runtime/art_field.h +++ b/runtime/art_field.h @@ -35,6 +35,7 @@ class ScopedObjectAccessAlreadyRunnable; namespace mirror { class Class; +class ClassLoader; class DexCache; class Object; class String; @@ -45,6 +46,8 @@ class ArtField final { template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier> ObjPtr<mirror::Class> GetDeclaringClass() REQUIRES_SHARED(Locks::mutator_lock_); + mirror::ClassLoader* GetClassLoader() REQUIRES_SHARED(Locks::mutator_lock_); + void SetDeclaringClass(ObjPtr<mirror::Class> new_declaring_class) REQUIRES_SHARED(Locks::mutator_lock_); diff --git a/runtime/class_linker-inl.h b/runtime/class_linker-inl.h index 7e011371b7..6703205502 100644 --- a/runtime/class_linker-inl.h +++ b/runtime/class_linker-inl.h @@ -135,7 +135,7 @@ inline ObjPtr<mirror::Class> ClassLinker::ResolveType(dex::TypeIndex type_idx, ObjPtr<mirror::Class> resolved_type = referrer->GetDexCache<kWithoutReadBarrier>()->GetResolvedType(type_idx); if (UNLIKELY(resolved_type == nullptr)) { - resolved_type = DoResolveType(type_idx, referrer->GetDeclaringClass()); + resolved_type = DoResolveType(type_idx, referrer); } return resolved_type; } @@ -149,7 +149,7 @@ inline ObjPtr<mirror::Class> ClassLinker::ResolveType(dex::TypeIndex type_idx, ObjPtr<mirror::Class> resolved_type = referrer->GetDexCache<kWithoutReadBarrier>()->GetResolvedType(type_idx); if (UNLIKELY(resolved_type == nullptr)) { - resolved_type = DoResolveType(type_idx, referrer->GetDeclaringClass()); + resolved_type = DoResolveType(type_idx, referrer); } return resolved_type; } diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index 639fa7ec92..b1eb03b04a 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -8076,14 +8076,22 @@ ObjPtr<mirror::Class> ClassLinker::DoLookupResolvedType(dex::TypeIndex type_idx, 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) { diff --git a/runtime/class_linker.h b/runtime/class_linker.h index 47931fec75..15a7204dd2 100644 --- a/runtime/class_linker.h +++ b/runtime/class_linker.h @@ -931,8 +931,8 @@ class ClassLinker { REQUIRES_SHARED(Locks::mutator_lock_); // Implementation of ResolveType() called when the type was not found in the dex cache. - ObjPtr<mirror::Class> DoResolveType(dex::TypeIndex type_idx, - ObjPtr<mirror::Class> referrer) + template <typename T> + ObjPtr<mirror::Class> DoResolveType(dex::TypeIndex type_idx, T referrer) REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Locks::dex_lock_, !Roles::uninterruptible_); ObjPtr<mirror::Class> DoResolveType(dex::TypeIndex type_idx, |