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

AltStyle によって変換されたページ (->オリジナル) /