diff options
author | Tom Tromey <tromey@redhat.com> | 2005-04-01 19:19:13 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2005-04-01 19:19:13 +0000 |
commit | ef87438639663154314e2cc5cd692eddaebfc799 (patch) | |
tree | 3d09f5cb569908269df7399fc0b8e4ca62d64f71 /libjava/java/lang/natVMClassLoader.cc | |
parent | 35913faefbd7d9de8847f449ac4fd750b383e75f (diff) | |
download | gcc-ef87438639663154314e2cc5cd692eddaebfc799.zip gcc-ef87438639663154314e2cc5cd692eddaebfc799.tar.gz gcc-ef87438639663154314e2cc5cd692eddaebfc799.tar.bz2 |
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
Diffstat (limited to 'libjava/java/lang/natVMClassLoader.cc')
-rw-r--r-- | libjava/java/lang/natVMClassLoader.cc | 73 |
1 files changed, 70 insertions, 3 deletions
diff --git a/libjava/java/lang/natVMClassLoader.cc b/libjava/java/lang/natVMClassLoader.cc index c59e1d6..e6c3b94 100644 --- a/libjava/java/lang/natVMClassLoader.cc +++ b/libjava/java/lang/natVMClassLoader.cc @@ -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 @@ -130,6 +133,68 @@ java::lang::VMClassLoader::initBootLoader(jstring 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) { // We try the boot loader first, so that the endorsed directory @@ -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. |