gcc/libjava/gnu/gcj/runtime/SystemClassLoader.java
Tom Tromey b149e89e77 Class.h (JV_STATE_LOADING): Added comment.
* 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
2006-05-04 15:29:22 +00:00

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);
}
}
}
}