diff options
Diffstat (limited to 'runtime/class_linker.h')
-rw-r--r-- | runtime/class_linker.h | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/runtime/class_linker.h b/runtime/class_linker.h index cb28187839..bf14aebb52 100644 --- a/runtime/class_linker.h +++ b/runtime/class_linker.h @@ -60,6 +60,7 @@ namespace mirror { using MethodDexCacheType = std::atomic<MethodDexCachePair>; } // namespace mirror +class ClassHierarchyAnalysis; class ClassTable; template<class T> class Handle; class ImtConflictTable; @@ -140,7 +141,7 @@ class ClassLinker { }; explicit ClassLinker(InternTable* intern_table); - ~ClassLinker(); + virtual ~ClassLinker(); // Initialize class linker by bootstraping from dex files. bool InitWithoutImage(std::vector<std::unique_ptr<const DexFile>> boot_class_path, @@ -396,9 +397,6 @@ class ClassLinker { ObjPtr<mirror::ClassLoader> class_loader) REQUIRES(!Locks::dex_lock_) REQUIRES_SHARED(Locks::mutator_lock_); - void RegisterBootClassPathDexFile(const DexFile& dex_file, ObjPtr<mirror::DexCache> dex_cache) - REQUIRES(!Locks::dex_lock_) - REQUIRES_SHARED(Locks::mutator_lock_); const std::vector<const DexFile*>& GetBootClassPath() { return boot_class_path_; @@ -637,9 +635,9 @@ class ClassLinker { // Create the IMT and conflict tables for a class. void FillIMTAndConflictTables(ObjPtr<mirror::Class> klass) REQUIRES_SHARED(Locks::mutator_lock_); - // Clear class table strong roots (other than classes themselves). This is done by dex2oat to - // allow pruning dex caches. - void ClearClassTableStrongRoots() const + // Visit all of the class tables. This is used by dex2oat to allow pruning dex caches. + template <class Visitor> + void VisitClassTables(const Visitor& visitor) REQUIRES(!Locks::classlinker_classes_lock_) REQUIRES_SHARED(Locks::mutator_lock_); @@ -672,6 +670,10 @@ class ClassLinker { bool ValidateSuperClassDescriptors(Handle<mirror::Class> klass) REQUIRES_SHARED(Locks::mutator_lock_); + ClassHierarchyAnalysis* GetClassHierarchyAnalysis() { + return cha_.get(); + } + struct DexCacheData { // Construct an invalid data object. DexCacheData() @@ -700,6 +702,14 @@ class ClassLinker { ClassTable* class_table; }; + protected: + virtual bool InitializeClass(Thread* self, + Handle<mirror::Class> klass, + bool can_run_clinit, + bool can_init_parents) + REQUIRES_SHARED(Locks::mutator_lock_) + REQUIRES(!Locks::dex_lock_); + private: class LinkInterfaceMethodsHelper; @@ -718,7 +728,7 @@ class ClassLinker { REQUIRES(!Locks::dex_lock_) REQUIRES_SHARED(Locks::mutator_lock_); - static void DeleteClassLoader(Thread* self, const ClassLoaderData& data) + void DeleteClassLoader(Thread* self, const ClassLoaderData& data) REQUIRES_SHARED(Locks::mutator_lock_); void VisitClassesInternal(ClassVisitor* visitor) @@ -889,12 +899,6 @@ class ClassLinker { REQUIRES(!Locks::dex_lock_) REQUIRES_SHARED(Locks::mutator_lock_); - bool InitializeClass(Thread* self, - Handle<mirror::Class> klass, - bool can_run_clinit, - bool can_init_parents) - REQUIRES_SHARED(Locks::mutator_lock_) - REQUIRES(!Locks::dex_lock_); bool InitializeDefaultInterfaceRecursive(Thread* self, Handle<mirror::Class> klass, bool can_run_clinit, @@ -1268,6 +1272,8 @@ class ClassLinker { // Image pointer size. PointerSize image_pointer_size_; + std::unique_ptr<ClassHierarchyAnalysis> cha_; + class FindVirtualMethodHolderVisitor; friend class AppImageClassLoadersAndDexCachesHelper; |