Bug: LoadClass ("[B") etc doesn't work
Andrew Haley
aph@redhat.com
Mon Apr 4 17:24:00 GMT 2005
This is a fairly evil hack that seems to fix things.
If anyone can think of a better way, please let me know.
Andrew.
Index: java/lang/ClassLoader.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/ClassLoader.java,v
retrieving revision 1.39
diff -c -2 -p -r1.39 ClassLoader.java
*** java/lang/ClassLoader.java 21 Mar 2005 14:50:13 -0000 1.39
--- java/lang/ClassLoader.java 4 Apr 2005 17:21:45 -0000
*************** public abstract class ClassLoader
*** 261,264 ****
--- 261,267 ----
}
+ private final native Class loadClassFromSig(String name, boolean resolve)
+ throws ClassNotFoundException;
+
/**
* Load a class using this ClassLoader or its parent, possibly resolving
*************** public abstract class ClassLoader
*** 284,287 ****
--- 287,293 ----
throws ClassNotFoundException
{
+ if (name.charAt(0) == '[')
+ return loadClassFromSig (name, resolve);
+
// Have we already loaded this class?
Class c = findLoadedClass(name);
Index: java/lang/natClassLoader.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/natClassLoader.cc,v
retrieving revision 1.78
diff -c -2 -p -r1.78 natClassLoader.cc
*** java/lang/natClassLoader.cc 24 Mar 2005 00:04:19 -0000 1.78
--- java/lang/natClassLoader.cc 4 Apr 2005 17:21:45 -0000
*************** _Jv_PushClass (jclass k)
*** 455,456 ****
--- 455,504 ----
k->chain = tmp;
}
+
+ ::java::lang::Class *
+ java::lang::ClassLoader::loadClassFromSig (::java::lang::String *s, jboolean resolve)
+ {
+ int len = _Jv_GetStringUTFLength (s);
+ char sig[len+1];
+ _Jv_GetStringUTFRegion (s, 0, len, sig);
+
+ switch (*sig)
+ {
+ case 'B':
+ return JvPrimClass (byte);
+ case 'S':
+ return JvPrimClass (short);
+ case 'I':
+ return JvPrimClass (int);
+ case 'J':
+ return JvPrimClass (long);
+ case 'Z':
+ return JvPrimClass (boolean);
+ case 'C':
+ return JvPrimClass (char);
+ case 'F':
+ return JvPrimClass (float);
+ case 'D':
+ return JvPrimClass (double);
+ case 'V':
+ return JvPrimClass (void);
+ case 'L':
+ {
+ int i;
+ for (i = 1; sig[i] && sig[i] != ';'; ++i)
+ ;
+ _Jv_Utf8Const *name = _Jv_makeUtf8Const (&sig[1], i - 1);
+ return loadClass (_Jv_NewStringUtf8Const (name), resolve);
+ }
+ case '[':
+ {
+ _Jv_Utf8Const *name = _Jv_makeUtf8Const (&sig[1], len - 1);
+ jclass klass = loadClassFromSig (_Jv_NewStringUtf8Const (name), resolve);
+ if (! klass)
+ return NULL;
+ return _Jv_GetArrayClass (klass, this);
+ }
+ }
+
+ return NULL; // Placate compiler.
+ }
More information about the Java
mailing list