Fixing a bug in ClassLoader.defineClass(); basically this method has to still return...
[jpf-core.git] / src / peers / gov / nasa / jpf / vm / JPF_java_lang_ClassLoader.java
index f6eb53da9107e9c4da02e1eafc46f908a1f86273..cfea25c6ae1db7995ba1247ae0ee44086e013943 100644 (file)
@@ -143,9 +143,10 @@ public class JPF_java_lang_ClassLoader extends NativePeer {
     ClassLoaderInfo cl = env.getClassLoaderInfo(objRef);
 
     // determine whether that the corresponding class is already defined by this
-    // classloader, if so, just return the already defined class!
+    // classloader, if so, this attempt is invalid, and loading throws a LinkageError
     if (cl.getDefinedClassInfo(cname) != null) {  // attempt to define twice
-      return cl.getDefinedClassInfo(cname).getClassObjectRef();
+      env.throwException("java.lang.LinkageError");
+      return MJIEnv.NULL;
     }
         
     byte[] buffer = env.getByteArrayObject(bufferRef);
@@ -180,8 +181,16 @@ public class JPF_java_lang_ClassLoader extends NativePeer {
 
     int sysObjRef = env.getSystemClassLoaderInfo().getClassLoaderObjectRef();
     if (objRef != sysObjRef) {
-      return defineClass0__Ljava_lang_String_2_3BII__Ljava_lang_Class_2
-              (env, sysObjRef, nameRef, bufferRef, offset, length);
+      // Check if this class has been defined in the SystemClassLoader
+      ClassLoaderInfo cl = env.getSystemClassLoaderInfo();
+      String cname = env.getStringObject(nameRef);
+      if (cl.getDefinedClassInfo(cname) != null) {
+        ClassInfo ci = cl.getResolvedClassInfo(cname);
+        return ci.getClassObjectRef();
+      } else {
+        return defineClass0__Ljava_lang_String_2_3BII__Ljava_lang_Class_2
+                (env, sysObjRef, nameRef, bufferRef, offset, length);
+      }
     }
     env.throwException("java.lang.ClassNotFoundException");
     return MJIEnv.NULL;