summaryrefslogtreecommitdiff
path: root/runtime/class_linker.cc
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/class_linker.cc')
-rw-r--r--runtime/class_linker.cc23
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,