diff options
Diffstat (limited to 'runtime/class_linker.cc')
-rw-r--r-- | runtime/class_linker.cc | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index 0de647f509..f13060a1fd 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -40,6 +40,7 @@ #include "base/time_utils.h" #include "base/unix_file/fd_file.h" #include "base/value_object.h" +#include "cha.h" #include "class_linker-inl.h" #include "class_table-inl.h" #include "compiler_callbacks.h" @@ -96,6 +97,7 @@ #include "ScopedLocalRef.h" #include "scoped_thread_state_change-inl.h" #include "thread-inl.h" +#include "thread_list.h" #include "trace.h" #include "utils.h" #include "utils/dex_cache_arrays_layout-inl.h" @@ -5111,6 +5113,12 @@ bool ClassLinker::LinkClass(Thread* self, if (klass->ShouldHaveImt()) { klass->SetImt(imt, image_pointer_size_); } + + // Update CHA info based on whether we override methods. + // Have to do this before setting the class as resolved which allows + // instantiation of klass. + Runtime::Current()->GetClassHierarchyAnalysis()->UpdateAfterLoadingOf(klass); + // This will notify waiters on klass that saw the not yet resolved // class in the class_table_ during EnsureResolved. mirror::Class::SetStatus(klass, mirror::Class::kStatusResolved, self); @@ -5154,6 +5162,11 @@ bool ClassLinker::LinkClass(Thread* self, } } + // Update CHA info based on whether we override methods. + // Have to do this before setting the class as resolved which allows + // instantiation of klass. + Runtime::Current()->GetClassHierarchyAnalysis()->UpdateAfterLoadingOf(h_new_class); + // This will notify waiters on temp class that saw the not yet resolved class in the // class_table_ during EnsureResolved. mirror::Class::SetStatus(klass, mirror::Class::kStatusRetired, self); |