diff options
author | aph <aph@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-04-16 13:44:59 +0000 |
---|---|---|
committer | aph <aph@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-04-16 13:44:59 +0000 |
commit | 29b881f4d32c3bc9b1eb6ff9fbf786bd6ce49ae7 (patch) | |
tree | 596031af669670b840c0e1c7fc4b9cbcb65204c7 /libjava/gnu | |
parent | 29696c952e863db7de62992906bf178fb7bf60d5 (diff) | |
download | gcc-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.java | 62 |
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(); } } |