From 58bf803e6c5f7e16989cf8b50b07e9c27264e92a Mon Sep 17 00:00:00 2001 From: Andrew Haley Date: Wed, 6 Apr 2005 22:30:01 +0000 Subject: [PATCH] bytearray.java: New file. 2005-04-06 Andrew Haley * testsuite/libjava.lang/bytearray.java: New file. * testsuite/libjava.lang/bytearray.out: New file. * java/lang/ClassLoader.java (loadClassFromSig): Declare (loadClass): Use it. * java/lang/natClassLoader.cc (loadClassFromSig): New method. From-SVN: r97756 --- libjava/ChangeLog | 8 ++++ libjava/java/lang/ClassLoader.java | 42 ++++++++++++------- libjava/java/lang/natClassLoader.cc | 11 +++++ libjava/testsuite/libjava.lang/bytearray.java | 10 +++++ libjava/testsuite/libjava.lang/bytearray.out | 2 + 5 files changed, 57 insertions(+), 16 deletions(-) create mode 100644 libjava/testsuite/libjava.lang/bytearray.java create mode 100644 libjava/testsuite/libjava.lang/bytearray.out diff --git a/libjava/ChangeLog b/libjava/ChangeLog index a0d7cc1e88b..298bfeca76a 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,11 @@ +2005-04-06 Andrew Haley + + * testsuite/libjava.lang/bytearray.java: New file. + * testsuite/libjava.lang/bytearray.out: New file. + * java/lang/ClassLoader.java (loadClassFromSig): Declare + (loadClass): Use it. + * java/lang/natClassLoader.cc (loadClassFromSig): New method. + 2005-04-06 Mohan Embar * Makefile.am ($(db_name)): Add $(EXEEXT) suffix to diff --git a/libjava/java/lang/ClassLoader.java b/libjava/java/lang/ClassLoader.java index db68e60ba8d..5737ddad53a 100644 --- a/libjava/java/lang/ClassLoader.java +++ b/libjava/java/lang/ClassLoader.java @@ -260,6 +260,9 @@ public abstract class ClassLoader return loadClass(name, false); } + private native Class loadClassFromSig(String name) + throws ClassNotFoundException; + /** * Load a class using this ClassLoader or its parent, possibly resolving * it as well using resolveClass(). It first tries to find @@ -283,29 +286,36 @@ public abstract class ClassLoader protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { - // Have we already loaded this class? - Class c = findLoadedClass(name); - if (c == null) + // Arrays are handled specially. + Class c; + if (name.charAt(0) == '[') + c = loadClassFromSig(name); + else { - // Can the class be loaded by a parent? - try + // Have we already loaded this class? + c = findLoadedClass(name); + if (c == null) { - if (parent == null) + // Can the class be loaded by a parent? + try { - c = VMClassLoader.loadClass(name, resolve); - if (c != null) - return c; + if (parent == null) + { + c = VMClassLoader.loadClass(name, resolve); + if (c != null) + return c; + } + else + { + return parent.loadClass(name, resolve); + } } - else + catch (ClassNotFoundException e) { - return parent.loadClass(name, resolve); } + // Still not found, we have to do it ourself. + c = findClass(name); } - catch (ClassNotFoundException e) - { - } - // Still not found, we have to do it ourself. - c = findClass(name); } if (resolve) resolveClass(c); diff --git a/libjava/java/lang/natClassLoader.cc b/libjava/java/lang/natClassLoader.cc index b8d87c6062b..ed43b7aeb8b 100644 --- a/libjava/java/lang/natClassLoader.cc +++ b/libjava/java/lang/natClassLoader.cc @@ -63,6 +63,17 @@ static jclass bootstrap_class_list[BOOTSTRAP_CLASS_LIST_SIZE]; static int bootstrap_index; + + +jclass +java::lang::ClassLoader::loadClassFromSig(jstring name) +{ + int len = _Jv_GetStringUTFLength (name); + char sig[len + 1]; + _Jv_GetStringUTFRegion (name, 0, name->length(), sig); + return _Jv_FindClassFromSignature(sig, this); +} + // This tries to find a class in our built-in cache. This cache is diff --git a/libjava/testsuite/libjava.lang/bytearray.java b/libjava/testsuite/libjava.lang/bytearray.java new file mode 100644 index 00000000000..88fdc9af014 --- /dev/null +++ b/libjava/testsuite/libjava.lang/bytearray.java @@ -0,0 +1,10 @@ +public class bytearray +{ + public static void main (String[] argv) throws Throwable { + Class c = Class.forName ("[Ljava.lang.String;"); + c = Class.forName ("[B"); + System.out.println (c); + c = ClassLoader.getSystemClassLoader().loadClass ("[[Ljava.lang.String;"); + System.out.println (c); + } +} diff --git a/libjava/testsuite/libjava.lang/bytearray.out b/libjava/testsuite/libjava.lang/bytearray.out new file mode 100644 index 00000000000..520d568e9b0 --- /dev/null +++ b/libjava/testsuite/libjava.lang/bytearray.out @@ -0,0 +1,2 @@ +class [B +class [[Ljava.lang.String;