diff options
Diffstat (limited to 'runtime/class_linker.cc')
-rw-r--r-- | runtime/class_linker.cc | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index c87d0f7fd3..04455847cd 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -5361,14 +5361,15 @@ bool ClassLinker::CanWeInitializeClass(ObjPtr<mirror::Class> klass, bool can_ini return false; } } - // If we are a class we need to initialize all interfaces with default methods when we are - // initialized. Check all of them. - if (!klass->IsInterface()) { - size_t num_interfaces = klass->GetIfTableCount(); - for (size_t i = 0; i < num_interfaces; i++) { - ObjPtr<mirror::Class> iface = klass->GetIfTable()->GetInterface(i); - if (iface->HasDefaultMethods() && - !CanWeInitializeClass(iface, can_init_statics, can_init_parents)) { + } + // If we are a class we need to initialize all interfaces with default methods when we are + // initialized. Check all of them. + if (!klass->IsInterface()) { + size_t num_interfaces = klass->GetIfTableCount(); + for (size_t i = 0; i < num_interfaces; i++) { + ObjPtr<mirror::Class> iface = klass->GetIfTable()->GetInterface(i); + if (iface->HasDefaultMethods() && !iface->IsInitialized()) { + if (!can_init_parents || !CanWeInitializeClass(iface, can_init_statics, can_init_parents)) { return false; } } @@ -5378,10 +5379,10 @@ bool ClassLinker::CanWeInitializeClass(ObjPtr<mirror::Class> klass, bool can_ini return true; } ObjPtr<mirror::Class> super_class = klass->GetSuperClass(); - if (!can_init_parents && !super_class->IsInitialized()) { - return false; + if (super_class->IsInitialized()) { + return true; } - return CanWeInitializeClass(super_class, can_init_statics, can_init_parents); + return can_init_parents && CanWeInitializeClass(super_class, can_init_statics, can_init_parents); } bool ClassLinker::InitializeClass(Thread* self, Handle<mirror::Class> klass, |