b149e89e77
* java/lang/Class.h (JV_STATE_LOADING): Added comment. * Makefile.in: Rebuilt. * Makefile.am (nat_source_files): Added natSystemClassLoader.cc. * gnu/gcj/runtime/natSystemClassLoader.cc: New file. * gnu/gcj/runtime/SystemClassLoader.java (nativeClasses): New field. (loadedClasses): Removed. (findClass): Declare. (addClass): Add to nativeClasses, not loadedClasses. From-SVN: r113530
114 lines
3.0 KiB
Java
114 lines
3.0 KiB
Java
/* Copyright (C) 2005, 2006 Free Software Foundation
|
|
|
|
This file is part of libgcj.
|
|
|
|
This software is copyrighted work licensed under the terms of the
|
|
Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
|
|
details. */
|
|
|
|
package gnu.gcj.runtime;
|
|
|
|
import java.io.*;
|
|
import java.lang.reflect.Field;
|
|
import java.util.StringTokenizer;
|
|
import java.util.HashMap;
|
|
import java.net.URL;
|
|
import java.net.URLClassLoader;
|
|
|
|
public final class SystemClassLoader extends URLClassLoader
|
|
{
|
|
SystemClassLoader(ClassLoader parent)
|
|
{
|
|
super(new URL[0], parent);
|
|
}
|
|
|
|
// This holds all the "native" classes linked into the executable
|
|
// and registered with this loader.
|
|
private HashMap nativeClasses = new HashMap();
|
|
|
|
// This is called to register a native class which was linked into
|
|
// the application but which is registered with the system class
|
|
// loader after the VM is initialized.
|
|
void addClass(Class klass)
|
|
{
|
|
String packageName = null;
|
|
String className = klass.getName();
|
|
int lastDot = className.lastIndexOf('.');
|
|
if (lastDot != -1)
|
|
packageName = className.substring(0, lastDot);
|
|
if (packageName != null && getPackage(packageName) == null)
|
|
{
|
|
// Should have some way to store this information in a
|
|
// precompiled manifest.
|
|
definePackage(packageName, null, null, null, null, null, null, null);
|
|
}
|
|
|
|
// Use reflection to access the package-private "loadedClasses" field.
|
|
nativeClasses.put(className, klass);
|
|
}
|
|
|
|
protected native Class findClass(String name);
|
|
|
|
// We add the URLs to the system class loader late. The reason for
|
|
// this is that during bootstrap we don't want to parse URLs or
|
|
// create URL connections, since that will result in circularities
|
|
// causing a crash.
|
|
void init()
|
|
{
|
|
String sep = File.pathSeparator;
|
|
StringTokenizer st
|
|
= new StringTokenizer (System.getProperty ("java.class.path", "."),
|
|
sep, true);
|
|
// Pretend we start with a ':', so if we see a ':' first we add
|
|
// '.'.
|
|
boolean last_was_sep = true;
|
|
while (st.hasMoreElements ())
|
|
{
|
|
String e = st.nextToken ();
|
|
try
|
|
{
|
|
if (sep.equals(e))
|
|
{
|
|
if (last_was_sep)
|
|
{
|
|
// We saw two separators in a row, so add ".".
|
|
addURL(new URL("file", "", -1, "./"));
|
|
last_was_sep = false;
|
|
}
|
|
else
|
|
last_was_sep = true;
|
|
continue;
|
|
}
|
|
|
|
last_was_sep = false;
|
|
File path = new File(e);
|
|
// Ignore invalid paths.
|
|
if (!path.exists())
|
|
continue;
|
|
if (!e.endsWith (File.separator) && path.isDirectory ())
|
|
addURL(new URL("file", "", -1, e + File.separator));
|
|
else
|
|
addURL(new URL("file", "", -1, e));
|
|
}
|
|
catch (java.net.MalformedURLException x)
|
|
{
|
|
// This should never happen.
|
|
throw new RuntimeException(x);
|
|
}
|
|
}
|
|
// If we saw a trailing ":", add "." to the path.
|
|
if (last_was_sep)
|
|
{
|
|
try
|
|
{
|
|
addURL(new URL("file", "", -1, "./"));
|
|
}
|
|
catch (java.net.MalformedURLException x)
|
|
{
|
|
// This should never happen.
|
|
throw new RuntimeException(x);
|
|
}
|
|
}
|
|
}
|
|
}
|