Be prepared to handle empty class loader contexts
When executing run-tests we can hit an empty class loader contexts if the
compilation sources are passed with "-cp" and later removed from the
context.
Be prepared for such case and assume a PathClassLoader context.
Bug: 63977059
Test: ./art/test/run-test --host --optimizing --dev
test-art-host
Change-Id: Id0fa853b2407e358592f89766adb5dad19137289
diff --git a/runtime/class_loader_context.cc b/runtime/class_loader_context.cc
index eab3b86..ff440d7 100644
--- a/runtime/class_loader_context.cc
+++ b/runtime/class_loader_context.cc
@@ -145,6 +145,10 @@
// ClasspathElem is the path of dex/jar/apk file.
bool ClassLoaderContext::Parse(const std::string& spec, bool parse_checksums) {
if (spec.empty()) {
+ // By default we load the dex files in a PathClassLoader.
+ // So an empty spec is equivalent to an empty PathClassLoader (this happens when running
+ // tests)
+ class_loader_chain_.push_back(ClassLoaderInfo(kPathClassLoader));
return true;
}
@@ -265,11 +269,15 @@
return OatFile::kSpecialSharedLibrary;
}
- if (class_loader_chain_.empty()) {
- return "";
- }
-
std::ostringstream out;
+ if (class_loader_chain_.empty()) {
+ // We can get in this situation if the context was created with a class path containing the
+ // source dex files which were later removed (happens during run-tests).
+ out << GetClassLoaderTypeName(kPathClassLoader)
+ << kClassLoaderOpeningMark
+ << kClassLoaderClosingMark;
+ return out.str();
+ }
for (size_t i = 0; i < class_loader_chain_.size(); i++) {
const ClassLoaderInfo& info = class_loader_chain_[i];