Dump current klass_ on bad ChangeClass
Change-Id: Idbe55d7e00a4b40993e6382b2bcfbb34ac39cc41
diff --git a/src/logging.cc b/src/logging.cc
index f962e41..4aacd3b 100644
--- a/src/logging.cc
+++ b/src/logging.cc
@@ -74,6 +74,11 @@
return;
}
+ if (address_ == NULL) {
+ os << "00000000:";
+ return;
+ }
+
static const char gHexDigit[] = "0123456789abcdef";
const unsigned char* addr = reinterpret_cast<const unsigned char*>(address_);
char out[76]; /* exact fit */
diff --git a/src/object_utils.h b/src/object_utils.h
index 249fffb..cb963cc 100644
--- a/src/object_utils.h
+++ b/src/object_utils.h
@@ -71,7 +71,7 @@
}
void ChangeClass(const Class* new_c) {
- CHECK(new_c != NULL);
+ CHECK(new_c != NULL) << "klass_=" << HexDump(klass_, sizeof(Class), true);
if (dex_cache_ != NULL) {
DexCache* new_c_dex_cache = new_c->GetDexCache();
if (new_c_dex_cache != dex_cache_) {
@@ -87,6 +87,7 @@
// The returned const char* is only guaranteed to be valid for the lifetime of the ClassHelper.
// If you need it longer, copy it into a std::string.
const char* GetDescriptor() {
+ CHECK(klass_ != NULL);
if (UNLIKELY(klass_->IsArrayClass())) {
return GetArrayDescriptor();
} else if (UNLIKELY(klass_->IsPrimitive())) {
@@ -104,6 +105,7 @@
const char* GetArrayDescriptor() {
std::string result("[");
const Class* saved_klass = klass_;
+ CHECK(saved_klass != NULL);
ChangeClass(klass_->GetComponentType());
result += GetDescriptor();
ChangeClass(saved_klass);
@@ -121,6 +123,7 @@
}
uint32_t NumInterfaces() {
+ DCHECK(klass_ != NULL);
if (klass_->IsPrimitive()) {
return 0;
} else if (klass_->IsArrayClass()) {
@@ -138,12 +141,14 @@
}
uint16_t GetInterfaceTypeIdx(uint32_t idx) {
+ DCHECK(klass_ != NULL);
DCHECK(!klass_->IsPrimitive());
DCHECK(!klass_->IsArrayClass());
return GetInterfaceTypeList()->GetTypeItem(idx).type_idx_;
}
Class* GetInterface(uint32_t idx) {
+ DCHECK(klass_ != NULL);
DCHECK(!klass_->IsPrimitive());
if (klass_->IsArrayClass()) {
if (idx == 0) {
@@ -203,6 +208,7 @@
DexCache* GetDexCache() {
DexCache* result = dex_cache_;
if (result == NULL) {
+ DCHECK(klass_ != NULL);
result = klass_->GetDexCache();
dex_cache_ = result;
}