* Merged gcj-abi-2-dev-branch to trunk.

(Actual changes too large to list in the commit message;
see ChangeLog.)

From-SVN: r91270
This commit is contained in:
Tom Tromey 2004-11-25 03:47:08 +00:00
parent ec0641f612
commit 367390404d
70 changed files with 11301 additions and 3355 deletions

View file

@ -54,6 +54,8 @@ import java.security.SecureClassLoader;
import java.security.cert.Certificate;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.StringTokenizer;
import java.util.Vector;
import java.util.jar.Attributes;
import java.util.jar.JarEntry;
@ -144,9 +146,10 @@ public class URLClassLoader extends SecureClassLoader
private final Vector urls = new Vector();
/**
* Store pre-parsed information for each url into this vector
* each element is a URL loader, corresponding to the URL of
* the same index in "urls"
* Store pre-parsed information for each url into this vector: each
* element is a URL loader. A jar file has its own class-path
* attribute which adds to the URLs that will be searched, but this
* does not add to the list of urls.
*/
private final Vector urlinfos = new Vector();
@ -188,10 +191,15 @@ public class URLClassLoader extends SecureClassLoader
final CodeSource noCertCodeSource;
URLLoader(URLClassLoader classloader, URL baseURL)
{
this(classloader, baseURL, baseURL);
}
URLLoader(URLClassLoader classloader, URL baseURL, URL overrideURL)
{
this.classloader = classloader;
this.baseURL = baseURL;
this.noCertCodeSource = new CodeSource(baseURL, null);
this.noCertCodeSource = new CodeSource(overrideURL, null);
}
/**
@ -221,6 +229,11 @@ public class URLClassLoader extends SecureClassLoader
{
return null;
}
Vector getClassPath()
{
return null;
}
}
/**
@ -290,6 +303,10 @@ public class URLClassLoader extends SecureClassLoader
final JarFile jarfile; // The jar file for this url
final URL baseJarURL; // Base jar: url for all resources loaded from jar
Vector classPath; // The "Class-Path" attribute of this Jar's manifest
SoURLLoader soURLLoader;
public JarURLLoader(URLClassLoader classloader, URL baseURL)
{
super(classloader, baseURL);
@ -302,25 +319,87 @@ public class URLClassLoader extends SecureClassLoader
sb.append("!/");
String jarURL = sb.toString();
this.soURLLoader = null;
this.classPath = null;
URL baseJarURL = null;
JarFile jarfile = null;
try
{
baseJarURL =
new URL(null, jarURL, classloader.getURLStreamHandler("jar"));
{
baseJarURL
= new URL(null, jarURL, classloader.getURLStreamHandler("jar"));
jarfile
= ((JarURLConnection) baseJarURL.openConnection()).getJarFile();
jarfile =
((JarURLConnection) baseJarURL.openConnection()).getJarFile();
}
if (jarfile != null)
{
String fileName = baseURL.getFile();
if (fileName != null)
{
File f = new File(fileName);
String libDirName = f.getCanonicalFile().getParent()
+ File.separator + "GCJLIBS";
File libDir = new File(libDirName);
if (libDir != null && (libDir.isDirectory()))
{
File soFile = new File (libDirName
+ File.separator + f.getName()
+ ".so");
if (soFile != null && soFile.isFile())
this.soURLLoader
= new SoURLLoader (classloader, soFile.toURL(),
baseURL);
}
}
Manifest manifest;
Attributes attributes;
String classPathString;
if ((manifest = jarfile.getManifest()) != null
&& (attributes = manifest.getMainAttributes()) != null
&& ((classPathString
= attributes.getValue(Attributes.Name.CLASS_PATH))
!= null))
{
this.classPath = new Vector();
StringTokenizer st
= new StringTokenizer
(classPathString,
System.getProperty ("path.separator", ":"));
while (st.hasMoreElements ())
{
String e = st.nextToken ();
try
{
URL url = new URL(baseURL, e);
this.classPath.add(url);
}
catch (java.net.MalformedURLException xx)
{
// Give up
}
}
}
}
}
catch (IOException ioe)
{
/* ignored */
/* ignored */
}
this.baseJarURL = baseJarURL;
this.jarfile = jarfile;
}
Class getClass(String className)
{
if (soURLLoader != null)
return soURLLoader.getClass(className);
return null;
}
/** get resource with the name "name" in the jar url */
Resource getResource(String name)
{
@ -337,6 +416,11 @@ public class URLClassLoader extends SecureClassLoader
return null;
}
public String toString ()
{
return "jarfile " + jarfile.getName();
}
Manifest getManifest()
{
try
@ -348,6 +432,11 @@ public class URLClassLoader extends SecureClassLoader
return null;
}
}
Vector getClassPath()
{
return classPath;
}
}
static final class JarURLResource extends Resource
@ -486,7 +575,12 @@ public class URLClassLoader extends SecureClassLoader
SoURLLoader(URLClassLoader classloader, URL url)
{
super(classloader, url);
this(classloader, url, url);
}
SoURLLoader(URLClassLoader classloader, URL url, URL overrideURL)
{
super(classloader, url, overrideURL);
helper = SharedLibHelper.findHelper(classloader, url.getFile(),
noCertCodeSource);
}
@ -577,6 +671,11 @@ public class URLClassLoader extends SecureClassLoader
return (int) file.length();
}
public String toString ()
{
return "file " +file.getAbsolutePath();
}
public URL getURL()
{
try
@ -729,6 +828,7 @@ public class URLClassLoader extends SecureClassLoader
*/
protected void addURL(URL newUrl)
{
urls.add(newUrl);
addURLImpl(newUrl);
}
@ -761,8 +861,21 @@ public class URLClassLoader extends SecureClassLoader
urlloaders.put(newUrl, loader);
}
urls.add(newUrl);
urlinfos.add(loader);
urlinfos.add(loader);
Vector extraUrls = loader.getClassPath();
if (extraUrls != null)
{
Iterator it = extraUrls.iterator();
while (it.hasNext())
{
URL url = (URL)it.next();
URLLoader extraLoader = (URLLoader) urlloaders.get(url);
if (! urlinfos.contains (extraLoader))
addURLImpl(url);
}
}
}
}
@ -773,7 +886,7 @@ public class URLClassLoader extends SecureClassLoader
private void addURLs(URL[] newUrls)
{
for (int i = 0; i < newUrls.length; i++)
addURLImpl(newUrls[i]);
addURL(newUrls[i]);
}
/**
@ -830,7 +943,7 @@ public class URLClassLoader extends SecureClassLoader
{
// Just try to find the resource by the (almost) same name
String resourceName = className.replace('.', '/') + ".class";
int max = urls.size();
int max = urlinfos.size();
Resource resource = null;
for (int i = 0; i < max && resource == null; i++)
{
@ -939,7 +1052,7 @@ public class URLClassLoader extends SecureClassLoader
*/
private Resource findURLResource(String resourceName)
{
int max = urls.size();
int max = urlinfos.size();
for (int i = 0; i < max; i++)
{
URLLoader loader = (URLLoader) urlinfos.elementAt(i);
@ -1010,7 +1123,7 @@ public class URLClassLoader extends SecureClassLoader
throws IOException
{
Vector resources = new Vector();
int max = urls.size();
int max = urlinfos.size();
for (int i = 0; i < max; i++)
{
URLLoader loader = (URLLoader) urlinfos.elementAt(i);