bytearray.java: New file.
authorAndrew Haley <aph@redhat.com>
Wed, 6 Apr 2005 22:30:01 +0000 (22:30 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Wed, 6 Apr 2005 22:30:01 +0000 (22:30 +0000)
2005-04-06  Andrew Haley  <aph@redhat.com>

* 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
libjava/java/lang/ClassLoader.java
libjava/java/lang/natClassLoader.cc
libjava/testsuite/libjava.lang/bytearray.java [new file with mode: 0644]
libjava/testsuite/libjava.lang/bytearray.out [new file with mode: 0644]

index a0d7cc1e88bad78c0d65b8adb43ad6af1075e8dc..298bfeca76ae154e67d1920061e190c0ba9e191f 100644 (file)
@@ -1,3 +1,11 @@
+2005-04-06  Andrew Haley  <aph@redhat.com>
+
+       * 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  <gnustuff@thisiscool.com>
 
        * Makefile.am ($(db_name)): Add $(EXEEXT) suffix to
index db68e60ba8db51a2d86e0f299a8454b445abe057..5737ddad53ae31a4c389ad7eb4cb21a4ba5f503e 100644 (file)
@@ -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 <code>resolveClass()</code>. 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);
index b8d87c6062bc3cd4fda15b441be1678091554834..ed43b7aeb8b06ab2901def36cd3543e193b1d3af 100644 (file)
@@ -63,6 +63,17 @@ static jclass bootstrap_class_list[BOOTSTRAP_CLASS_LIST_SIZE];
 static int bootstrap_index;
 
 
+\f
+
+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);
+}
+
 \f
 
 // 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 (file)
index 0000000..88fdc9a
--- /dev/null
@@ -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 (file)
index 0000000..520d568
--- /dev/null
@@ -0,0 +1,2 @@
+class [B
+class [[Ljava.lang.String;