diff options
author | 2023-01-31 15:31:23 +0000 | |
---|---|---|
committer | 2023-01-31 17:45:39 +0000 | |
commit | ef0b1544519f91fc5663b06d433da474115feb5a (patch) | |
tree | 9efe00c85ffef56b415ae0b3f52b5accfbcaa4b1 /runtime/class_linker.cc | |
parent | 10d6870ae4d0a52579fd520e8ee0fdcb4dfcd25a (diff) |
Revert "Walk up the super chain to find an IMT to share."
This reverts commit fa26b96f2f56ea2380d96922f3c859a2c3b417e8.
Bug: 266937358
Reason for revert: Breaks libcore tests
Change-Id: I4a889029203ffbc6ecdd09c4d5e4dea163da0ffc
Diffstat (limited to 'runtime/class_linker.cc')
-rw-r--r-- | runtime/class_linker.cc | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index c265c0e5dc..d5efb685c8 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -5973,6 +5973,17 @@ ClassTable* ClassLinker::ClassTableForClassLoader(ObjPtr<mirror::ClassLoader> cl return class_loader == nullptr ? boot_class_table_.get() : class_loader->GetClassTable(); } +static ImTable* FindSuperImt(ObjPtr<mirror::Class> klass, PointerSize pointer_size) + REQUIRES_SHARED(Locks::mutator_lock_) { + while (klass->HasSuperClass()) { + klass = klass->GetSuperClass(); + if (klass->ShouldHaveImt()) { + return klass->GetImt(pointer_size); + } + } + return nullptr; +} + bool ClassLinker::LinkClass(Thread* self, const char* descriptor, Handle<mirror::Class> klass, @@ -6008,7 +6019,7 @@ bool ClassLinker::LinkClass(Thread* self, // will possibly create a table that is incorrect for either of the classes. // Same IMT with new_conflict does not happen very often. if (!new_conflict) { - ImTable* super_imt = klass->FindSuperImt(image_pointer_size_); + ImTable* super_imt = FindSuperImt(klass.Get(), image_pointer_size_); if (super_imt != nullptr) { bool imt_equals = true; for (size_t i = 0; i < ImTable::kSize && imt_equals; ++i) { @@ -6382,8 +6393,9 @@ void ClassLinker::FillIMTAndConflictTables(ObjPtr<mirror::Class> klass) { // Compare the IMT with the super class including the conflict methods. If they are equivalent, // we can just use the same pointer. ImTable* imt = nullptr; - ImTable* super_imt = klass->FindSuperImt(image_pointer_size_); - if (super_imt != nullptr) { + ObjPtr<mirror::Class> super_class = klass->GetSuperClass(); + if (super_class != nullptr && super_class->ShouldHaveImt()) { + ImTable* super_imt = super_class->GetImt(image_pointer_size_); bool same = true; for (size_t i = 0; same && i < ImTable::kSize; ++i) { ArtMethod* method = imt_data[i]; @@ -6412,7 +6424,6 @@ void ClassLinker::FillIMTAndConflictTables(ObjPtr<mirror::Class> klass) { if (imt == nullptr) { imt = klass->GetImt(image_pointer_size_); DCHECK(imt != nullptr); - DCHECK_NE(imt, super_imt); imt->Populate(imt_data, image_pointer_size_); } else { klass->SetImt(imt, image_pointer_size_); |