summaryrefslogtreecommitdiff
path: root/libjava/gnu
diff options
context:
space:
mode:
authoraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>2007-04-16 13:44:59 +0000
committeraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>2007-04-16 13:44:59 +0000
commit29b881f4d32c3bc9b1eb6ff9fbf786bd6ce49ae7 (patch)
tree596031af669670b840c0e1c7fc4b9cbcb65204c7 /libjava/gnu
parent29696c952e863db7de62992906bf178fb7bf60d5 (diff)
downloadgcc-29b881f4d32c3bc9b1eb6ff9fbf786bd6ce49ae7.tar.gz
2007-04-16 Andrew Haley <aph@redhat.com>
* gnu/gcj/runtime/BootClassLoader.java (getBootURLLoader): New method. (bootGetResource): Use getBootURLLoader() to load resources. (bootGetResources): Likewise. * java/lang/reflect/natMethod.cc (Method::invoke): In invoke also check that the method's declaring class is accessible. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@123862 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/gnu')
-rw-r--r--libjava/gnu/gcj/runtime/BootClassLoader.java62
1 files changed, 60 insertions, 2 deletions
diff --git a/libjava/gnu/gcj/runtime/BootClassLoader.java b/libjava/gnu/gcj/runtime/BootClassLoader.java
index 731703ab8f3..40f3147b7be 100644
--- a/libjava/gnu/gcj/runtime/BootClassLoader.java
+++ b/libjava/gnu/gcj/runtime/BootClassLoader.java
@@ -9,9 +9,13 @@ details. */
package gnu.gcj.runtime;
import gnu.java.net.protocol.core.Handler;
+import java.io.File;
import java.io.IOException;
import java.net.URL;
+import java.net.URLClassLoader;
import java.util.Enumeration;
+import java.util.StringTokenizer;
+import java.util.Vector;
/**
* This is a helper for the bootstrap class loader. It is a
@@ -27,6 +31,9 @@ public final class BootClassLoader extends HelperClassLoader
// path fails otherwise.
static Class coreHandler = gnu.java.net.protocol.core.Handler.class;
+ private boolean initialized;
+ private URLClassLoader bootURLLoader;
+
BootClassLoader(String libdir)
{
// The BootClassLoader is the top of the delegation chain. It does not
@@ -68,13 +75,64 @@ public final class BootClassLoader extends HelperClassLoader
return c;
}
+ // Parse the boot classpath and create a URLClassLoader that loads
+ // resources from it. This is provided for the benefit of code that
+ // does things like
+ // ClassLoader.getResourceAsStream("java/lang/Object.class")
+ private synchronized URLClassLoader getBootURLLoader()
+ {
+ if (initialized)
+ return bootURLLoader;
+ initialized = true;
+
+ Vector<URL> urls = new Vector<URL>();
+ String bootClasspath = System.getProperty ("sun.boot.class.path");
+ StringTokenizer st =
+ new StringTokenizer(bootClasspath, File.pathSeparator);
+ while (st.hasMoreTokens())
+ {
+ try
+ {
+ urls.add(new File(st.nextToken()).toURL());
+ }
+ catch (java.net.MalformedURLException e)
+ {
+ }
+ }
+
+ if (urls.size() > 0)
+ bootURLLoader = new URLClassLoader(urls.toArray(new URL[urls.size()]));
+ return bootURLLoader;
+ }
+
public URL bootGetResource(String name)
{
- return findResource(name);
+ URL url = findResource(name);
+ if (url != null)
+ return url;
+
+ URLClassLoader loader = getBootURLLoader();
+ if (loader != null)
+ url = loader.findResource(name);
+
+ return url;
}
public Enumeration bootGetResources(String name) throws IOException
{
- return findResources(name);
+ URLClassLoader loader = getBootURLLoader();
+ Enumeration[] e =
+ {
+ findResources(name),
+ (loader != null) ? loader.findResources(name) : null
+ };
+
+ Vector v = new Vector();
+ for (Enumeration en : e)
+ if (en != null)
+ while (en.hasMoreElements())
+ v.add(en.nextElement());
+
+ return v.elements();
}
}