Be robust in stack trace if source file name is missing from dex file.
Change-Id: Iaf39454bc5b82a2785c236400b0523eba5ab1ae9
diff --git a/src/object.cc b/src/object.cc
index 614df3c..0b6ad51 100644
--- a/src/object.cc
+++ b/src/object.cc
@@ -1109,6 +1109,9 @@
}
String* String::AllocFromModifiedUtf8(const char* utf) {
+ if (utf == NULL) {
+ return NULL;
+ }
size_t char_count = CountModifiedUtf8Chars(utf);
return AllocFromModifiedUtf8(char_count, utf);
}
diff --git a/src/thread.cc b/src/thread.cc
index ff92359..cc6c7e8 100644
--- a/src/thread.cc
+++ b/src/thread.cc
@@ -1191,20 +1191,21 @@
int32_t line_number = mh.GetLineNumFromNativePC(native_pc);
// Allocate element, potentially triggering GC
// TODO: reuse class_name_object via Class::name_?
- std::string class_name(PrettyDescriptor(mh.GetDeclaringClassDescriptor()));
+ const char* descriptor = mh.GetDeclaringClassDescriptor();
+ CHECK(descriptor != NULL);
+ std::string class_name(PrettyDescriptor(descriptor));
SirtRef<String> class_name_object(String::AllocFromModifiedUtf8(class_name.c_str()));
if (class_name_object.get() == NULL) {
return NULL;
}
- SirtRef<String> method_name_object(String::AllocFromModifiedUtf8(mh.GetName()));
+ const char* method_name = mh.GetName();
+ CHECK(method_name != NULL);
+ SirtRef<String> method_name_object(String::AllocFromModifiedUtf8(method_name));
if (method_name_object.get() == NULL) {
return NULL;
}
- SirtRef<String>
- source_name_object(String::AllocFromModifiedUtf8(mh.GetDeclaringClassSourceFile()));
- if (source_name_object.get() == NULL) {
- return NULL;
- }
+ const char* source_file = mh.GetDeclaringClassSourceFile();
+ SirtRef<String> source_name_object(String::AllocFromModifiedUtf8(source_file));
StackTraceElement* obj = StackTraceElement::Alloc(class_name_object.get(),
method_name_object.get(),
source_name_object.get(),