natVMClassLoader.cc (getSystemClassLoaderInternal): Updated for name change.

* java/lang/natVMClassLoader.cc (getSystemClassLoaderInternal):
	Updated for name change.
	(nativeFindClass): New method.
	(loadClass): Use nativeFindClass.
	* java/lang/natClassLoader.cc (_Jv_FindClass): Use single-argument
	form of loadClass.
	* java/lang/VMClassLoader.java (tried_libraries, lib_control,
	LIB_FULL, LIB_CACHE, LIB_NEVER): New fields from old
	VMClassLoader.
	(initialize): New method.
	(nativeFindClass): Declare.
	* gnu/gcj/runtime/natVMClassLoader.cc: Removed.
	* gnu/gcj/runtime/VMClassLoader.java: Removed.
	* gnu/gcj/runtime/ExtensionClassLoader.java: Renamed from
	VMClassLoader.java.
	(definePackageForNative): Removed.
	(tried_libraries, LIB_CACHE, LIB_FULL, LIB_NEVER, lib_control):
	Moved to VMClassLoader.java.
	* prims.cc (_Jv_CreateJavaVM): Updated for renaming.
	* Makefile.am (gnu/gcj/runtime/ExtensionClassLoader.h): Renamed.
	(ordinary_java_source_files): Added ExtensionClassLoader.java,
	removed VMClassLoader.java.
	(nat_source_files): Removed natVMClassLoader.cc.

From-SVN: r97414
This commit is contained in:
Tom Tromey
2005-04-01 19:19:13 +00:00
committed by Tom Tromey
parent 35913faefb
commit ef87438639
10 changed files with 194 additions and 206 deletions
+70 -3
View File
@@ -23,7 +23,7 @@ details. */
#include <java/lang/VMClassLoader.h>
#include <java/lang/VMCompiler.h>
#include <gnu/gcj/runtime/VMClassLoader.h>
#include <gnu/gcj/runtime/ExtensionClassLoader.h>
#include <gnu/gcj/runtime/SystemClassLoader.h>
#include <gnu/gcj/runtime/BootClassLoader.h>
#include <java/lang/ClassLoader.h>
@@ -31,6 +31,9 @@ details. */
#include <java/lang/Throwable.h>
#include <java/security/ProtectionDomain.h>
#include <java/lang/ClassFormatError.h>
#include <java/lang/StringBuffer.h>
#include <java/lang/Runtime.h>
#include <java/util/HashSet.h>
void
java::lang::VMClassLoader::resolveClass (jclass klass)
@@ -110,8 +113,8 @@ java::lang::VMClassLoader::defineClass (java::lang::ClassLoader *loader,
java::lang::ClassLoader *
java::lang::VMClassLoader::getSystemClassLoaderInternal()
{
_Jv_InitClass (&gnu::gcj::runtime::VMClassLoader::class$);
return gnu::gcj::runtime::VMClassLoader::system_instance;
_Jv_InitClass (&gnu::gcj::runtime::ExtensionClassLoader::class$);
return gnu::gcj::runtime::ExtensionClassLoader::system_instance;
}
jclass
@@ -129,6 +132,68 @@ java::lang::VMClassLoader::initBootLoader(jstring libdir)
bootLoader = new gnu::gcj::runtime::BootClassLoader(libdir);
}
jclass
java::lang::VMClassLoader::nativeFindClass (jstring name)
{
jclass klass = NULL;
if (lib_control != LIB_NEVER)
{
// Turn `gnu.pkg.quux' into `lib-gnu-pkg-quux'. Then search for
// a module named (eg, on Linux) `lib-gnu-pkg-quux.so', followed
// by `lib-gnu-pkg.so' and `lib-gnu.so'. If loading one of
// these causes the class to appear in the cache, then use it.
java::lang::StringBuffer *sb
= new java::lang::StringBuffer (JvNewStringLatin1("lib-"));
// Skip inner classes
jstring cn;
jint ci = name->indexOf('$');
if (ci == -1)
cn = name;
else
cn = name->substring (0, ci);
jstring so_base_name
= (sb->append (cn)->toString ())->replace ('.', '-');
using namespace ::java::lang;
Runtime *rt = Runtime::getRuntime();
_Jv_Utf8Const *name_u = NULL;
// Compare against `3' because that is the length of "lib".
while (! klass && so_base_name && so_base_name->length() > 3)
{
if (lib_control == LIB_CACHE)
{
// If we've already tried this name, we're done.
if (tried_libraries->contains(so_base_name))
break;
tried_libraries->add(so_base_name);
}
jboolean loaded = rt->loadLibraryInternal (so_base_name);
jint nd = so_base_name->lastIndexOf ('-');
if (nd == -1)
so_base_name = NULL;
else
so_base_name = so_base_name->substring (0, nd);
if (loaded)
{
if (name_u == NULL)
name_u = _Jv_makeUtf8Const (name);
klass = _Jv_FindClassInCache (name_u);
}
}
}
if (klass)
definePackageForNative(name);
return klass;
}
jclass
java::lang::VMClassLoader::loadClass(jstring name, jboolean resolve)
{
@@ -142,6 +207,8 @@ java::lang::VMClassLoader::loadClass(jstring name, jboolean resolve)
_Jv_Utf8Const *utf = _Jv_makeUtf8Const (name);
klass = _Jv_FindClassInCache (utf);
}
if (! klass)
klass = nativeFindClass(name);
if (klass)
{
// We never want to return a class without its supers linked.