Tolerant compilation of classes with missing super classes
Change-Id: If64f25ae36204ab2ea5499f27601696dea9d4016
diff --git a/src/object.cc b/src/object.cc
index f47f16e..ff49ad3 100644
--- a/src/object.cc
+++ b/src/object.cc
@@ -751,7 +751,9 @@
(*stub)(this, receiver, self, args, result);
LOG(INFO) << "returned " << PrettyMethod(this) << " code=" << (void*) GetCode() << " stub=" << (void*) stub;
} else {
- LOG(WARNING) << "Not invoking method with no associated code: " << PrettyMethod(this);
+ if (Runtime::Current()->IsStarted()) {
+ LOG(WARNING) << "Not invoking method with no associated code: " << PrettyMethod(this);
+ }
if (result != NULL) {
result->j = 0;
}
@@ -782,8 +784,8 @@
void Class::SetStatus(Status new_status) {
CHECK(new_status > GetStatus() || new_status == kStatusError ||
- !Runtime::Current()->IsStarted()) << GetDescriptor()->ToModifiedUtf8();
- CHECK(sizeof(Status) == sizeof(uint32_t));
+ !Runtime::Current()->IsStarted()) << PrettyClass(this);
+ CHECK(sizeof(Status) == sizeof(uint32_t)) << PrettyClass(this);
return SetField32(OFFSET_OF_OBJECT_MEMBER(Class, status_),
new_status, false);
}
@@ -799,9 +801,9 @@
}
Object* Class::AllocObject() {
- DCHECK(!IsAbstract());
- DCHECK(!IsInterface());
- DCHECK(!IsPrimitive());
+ DCHECK(!IsAbstract()) << PrettyClass(this);
+ DCHECK(!IsInterface()) << PrettyClass(this);
+ DCHECK(!IsPrimitive()) << PrettyClass(this);
return Heap::AllocObject(this, this->object_size_);
}
@@ -927,7 +929,7 @@
bool Class::Implements(const Class* klass) const {
DCHECK(klass != NULL);
- DCHECK(klass->IsInterface());
+ DCHECK(klass->IsInterface()) << PrettyClass(this);
// All interfaces implemented directly and by our superclass, and
// recursively all super-interfaces of those interfaces, are listed
// in iftable_, so we can just do a linear scan through that.
@@ -961,28 +963,28 @@
// Object[] = int[] --> false
//
bool Class::IsArrayAssignableFromArray(const Class* src) const {
- DCHECK(IsArrayClass());
- DCHECK(src->IsArrayClass());
+ DCHECK(IsArrayClass()) << PrettyClass(this);
+ DCHECK(src->IsArrayClass()) << PrettyClass(src);
return GetComponentType()->IsAssignableFrom(src->GetComponentType());
}
bool Class::IsAssignableFromArray(const Class* src) const {
- DCHECK(!IsInterface()); // handled first in IsAssignableFrom
- DCHECK(src->IsArrayClass());
+ DCHECK(!IsInterface()) << PrettyClass(this); // handled first in IsAssignableFrom
+ DCHECK(src->IsArrayClass()) << PrettyClass(src);
if (!IsArrayClass()) {
// If "this" is not also an array, it must be Object.
// src's super should be java_lang_Object, since it is an array.
Class* java_lang_Object = src->GetSuperClass();
- DCHECK(java_lang_Object != NULL);
- DCHECK(java_lang_Object->GetSuperClass() == NULL);
+ DCHECK(java_lang_Object != NULL) << PrettyClass(src);
+ DCHECK(java_lang_Object->GetSuperClass() == NULL) << PrettyClass(src);
return this == java_lang_Object;
}
return IsArrayAssignableFromArray(src);
}
bool Class::IsSubClass(const Class* klass) const {
- DCHECK(!IsInterface());
- DCHECK(!IsArrayClass());
+ DCHECK(!IsInterface()) << PrettyClass(this);
+ DCHECK(!IsArrayClass()) << PrettyClass(this);
const Class* current = this;
do {
if (current == klass) {
@@ -1055,8 +1057,8 @@
Method* Class::FindVirtualMethodForInterface(Method* method) {
Class* declaring_class = method->GetDeclaringClass();
- DCHECK(declaring_class != NULL);
- DCHECK(declaring_class->IsInterface());
+ DCHECK(declaring_class != NULL) << PrettyClass(this);
+ DCHECK(declaring_class->IsInterface()) << PrettyMethod(method);
// TODO cache to improve lookup speed
int32_t iftable_count = GetIfTableCount();
ObjectArray<InterfaceEntry>* iftable = GetIfTable();