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();
     }