Make the class loading behavior closer to the RI's.
Change-Id: Ic2ab91dc5a455a97dbcbe1f2d7b464a888d5bb66
diff --git a/src/class_linker.cc b/src/class_linker.cc
index e0bcd04..c14f6bd 100644
--- a/src/class_linker.cc
+++ b/src/class_linker.cc
@@ -1103,8 +1103,6 @@
return EnsureResolved(klass);
}
// Class is not yet loaded.
- JNIEnv* env = self->GetJniEnv();
- ScopedLocalRef<jthrowable> cause(env, NULL);
if (descriptor[0] == '[') {
return CreateArrayClass(descriptor, class_loader);
@@ -1134,6 +1132,7 @@
} else {
std::string class_name_string(DescriptorToDot(descriptor));
ScopedThreadStateChange(self, Thread::kNative);
+ JNIEnv* env = self->GetJniEnv();
ScopedLocalRef<jclass> c(env, AddLocalReference<jclass>(env, GetClassRoot(kJavaLangClassLoader)));
CHECK(c.get() != NULL);
// TODO: cache method?
@@ -1146,16 +1145,9 @@
ScopedLocalRef<jobject> class_loader_object(env, AddLocalReference<jobject>(env, class_loader));
ScopedLocalRef<jobject> result(env, env->CallObjectMethod(class_loader_object.get(), mid,
class_name_object.get()));
- cause.reset(env->ExceptionOccurred());
- if (cause.get() != NULL) {
- // Throw LinkageErrors unmolested...
- env->ExceptionClear();
- static jclass LinkageError_class = CacheClass(env, "java/lang/LinkageError");
- if (env->IsInstanceOf(cause.get(), LinkageError_class)) {
- env->Throw(cause.get());
- return NULL;
- }
- // ...otherwise fall through and throw NCDFE.
+ if (env->ExceptionOccurred()) {
+ // If the ClassLoader threw, pass that exception up.
+ return NULL;
} else if (result.get() == NULL) {
// broken loader - throw NPE to be compatible with Dalvik
ThrowNullPointerException("ClassLoader.loadClass returned null for %s",
@@ -1168,14 +1160,6 @@
}
ThrowNoClassDefFoundError("Class %s not found", PrintableString(StringPiece(descriptor)).c_str());
- if (cause.get() != NULL) {
- // Initialize the cause of the NCDFE.
- ScopedLocalRef<jthrowable> ncdfe(env, env->ExceptionOccurred());
- env->ExceptionClear();
- static jmethodID initCause_mid = env->GetMethodID(env->FindClass("java/lang/Throwable"), "initCause", "(Ljava/lang/Throwable;)Ljava/lang/Throwable;");
- env->CallObjectMethod(ncdfe.get(), initCause_mid, cause.get());
- env->Throw(ncdfe.get());
- }
return NULL;
}
diff --git a/test/003-omnibus-opcodes/expected.txt b/test/003-omnibus-opcodes/expected.txt
index 45fbf2c..3e7ce84 100644
--- a/test/003-omnibus-opcodes/expected.txt
+++ b/test/003-omnibus-opcodes/expected.txt
@@ -68,24 +68,12 @@
UnresTest1...
UnresTest1...
UnresTest2...
-java.lang.NoClassDefFoundError: Class "LUnresClass;" not found
+java.lang.ClassNotFoundException: Didn't find class "UnresClass" on path: /data/art-test/003-omnibus-opcodes.jar
+ at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
+ at java.lang.ClassLoader.loadClass(ClassLoader.java:509)
+ at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at UnresTest2.run(UnresTest2.java:33)
at Main.run(Main.java:64)
at Main.main(Main.java:26)
-Caused by: java.lang.ClassNotFoundException: Didn't find class "UnresClass" on path: /data/art-test/003-omnibus-opcodes.jar
- at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
- at java.lang.ClassLoader.loadClass(ClassLoader.java:509)
- at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
- ... 3 more
-java.lang.NoClassDefFoundError: Class "LUnresClassSubclass;" not found
- at UnresTest2.run(UnresTest2.java:41)
- at Main.run(Main.java:64)
- at Main.main(Main.java:26)
-Caused by: java.lang.ClassNotFoundException: Didn't find class "UnresClassSubclass" on path: /data/art-test/003-omnibus-opcodes.jar
- at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
- at java.lang.ClassLoader.loadClass(ClassLoader.java:509)
- at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
- ... 3 more
-UnresTest2 done
InternedString.run
Done!
diff --git a/test/003-omnibus-opcodes/src/Main.java b/test/003-omnibus-opcodes/src/Main.java
index eecead0..5dcc79c 100644
--- a/test/003-omnibus-opcodes/src/Main.java
+++ b/test/003-omnibus-opcodes/src/Main.java
@@ -64,9 +64,10 @@
UnresTest2.run();
} catch (VerifyError ve) {
System.out.println("Caught: " + ve);
- } catch (NoClassDefFoundError ncdfe) {
- /* UnresClass can cause desktop Java to freak out */
- System.out.println("NOTE: UnresTest2 not available");
+ } catch (Throwable th) {
+ // We and the RI throw ClassNotFoundException, but that isn't declared so javac
+ // won't let us try to catch it.
+ th.printStackTrace();
}
InternedString.run();
}