diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 20242558b88..e9fe22c7231 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,12 @@ +2002-12-10 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (nat_source_files): Added natVMClassLoader.cc. + * gnu/gcj/runtime/natVMClassLoader.cc: New file. + (gnu::gcj::runtime::VMClassLoader::findClass): Moved here. + * java/lang/natClassLoader.cc + (gnu::gcj::runtime::VMClassLoader::findClass): Removed. + 2002-12-10 Mark Wielaard Tom Tromey diff --git a/libjava/Makefile.am b/libjava/Makefile.am index b993d5028a9..0db820f360f 100644 --- a/libjava/Makefile.am +++ b/libjava/Makefile.am @@ -2320,6 +2320,7 @@ gnu/gcj/runtime/natNameFinder.cc \ gnu/gcj/runtime/natSharedLibLoader.cc \ gnu/gcj/runtime/natStackTrace.cc \ gnu/gcj/runtime/natStringBuffer.cc \ +gnu/gcj/runtime/natVMClassLoader.cc \ java/io/natFile.cc \ java/io/natFileDescriptor.cc \ java/io/natObjectInputStream.cc \ diff --git a/libjava/Makefile.in b/libjava/Makefile.in index 8b74b390365..c8d722f0521 100644 --- a/libjava/Makefile.in +++ b/libjava/Makefile.in @@ -2069,6 +2069,7 @@ gnu/gcj/runtime/natNameFinder.cc \ gnu/gcj/runtime/natSharedLibLoader.cc \ gnu/gcj/runtime/natStackTrace.cc \ gnu/gcj/runtime/natStringBuffer.cc \ +gnu/gcj/runtime/natVMClassLoader.cc \ java/io/natFile.cc \ java/io/natFileDescriptor.cc \ java/io/natObjectInputStream.cc \ @@ -2239,12 +2240,13 @@ gnu/gcj/io/shs.lo gnu/gcj/protocol/core/natCoreInputStream.lo \ gnu/gcj/runtime/natFinalizerThread.lo gnu/gcj/runtime/natFirstThread.lo \ gnu/gcj/runtime/natNameFinder.lo gnu/gcj/runtime/natSharedLibLoader.lo \ gnu/gcj/runtime/natStackTrace.lo gnu/gcj/runtime/natStringBuffer.lo \ -java/io/natFile.lo java/io/natFileDescriptor.lo \ -java/io/natObjectInputStream.lo java/io/natObjectOutputStream.lo \ -java/lang/natCharacter.lo java/lang/natClass.lo \ -java/lang/natClassLoader.lo java/lang/natConcreteProcess.lo \ -java/lang/natDouble.lo java/lang/natFloat.lo java/lang/natMath.lo \ -java/lang/natObject.lo java/lang/natRuntime.lo java/lang/natString.lo \ +gnu/gcj/runtime/natVMClassLoader.lo java/io/natFile.lo \ +java/io/natFileDescriptor.lo java/io/natObjectInputStream.lo \ +java/io/natObjectOutputStream.lo java/lang/natCharacter.lo \ +java/lang/natClass.lo java/lang/natClassLoader.lo \ +java/lang/natConcreteProcess.lo java/lang/natDouble.lo \ +java/lang/natFloat.lo java/lang/natMath.lo java/lang/natObject.lo \ +java/lang/natRuntime.lo java/lang/natString.lo \ java/lang/natStringBuffer.lo java/lang/natSystem.lo \ java/lang/natThread.lo java/lang/natVMSecurityManager.lo \ java/lang/ref/natReference.lo java/lang/reflect/natArray.lo \ @@ -2363,7 +2365,8 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \ .deps/gnu/gcj/runtime/natNameFinder.P \ .deps/gnu/gcj/runtime/natSharedLibLoader.P \ .deps/gnu/gcj/runtime/natStackTrace.P \ -.deps/gnu/gcj/runtime/natStringBuffer.P .deps/gnu/gcj/xlib/Clip.P \ +.deps/gnu/gcj/runtime/natStringBuffer.P \ +.deps/gnu/gcj/runtime/natVMClassLoader.P .deps/gnu/gcj/xlib/Clip.P \ .deps/gnu/gcj/xlib/Colormap.P .deps/gnu/gcj/xlib/Display.P \ .deps/gnu/gcj/xlib/Drawable.P .deps/gnu/gcj/xlib/Font.P \ .deps/gnu/gcj/xlib/GC.P .deps/gnu/gcj/xlib/Pixmap.P \ diff --git a/libjava/gnu/gcj/runtime/natVMClassLoader.cc b/libjava/gnu/gcj/runtime/natVMClassLoader.cc new file mode 100644 index 00000000000..33b63d6759a --- /dev/null +++ b/libjava/gnu/gcj/runtime/natVMClassLoader.cc @@ -0,0 +1,67 @@ +// Native code for VMClassLoader + +/* Copyright (C) 2002 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. */ + +#include + +#include +#include + +#include +#include +#include +#include +#include + +jclass +gnu::gcj::runtime::VMClassLoader::findClass (jstring name) +{ + _Jv_Utf8Const *name_u = _Jv_makeUtf8Const (name); + jclass klass = _Jv_FindClassInCache (name_u, 0); + + if (! klass) + { + // 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 ('.', '-'); + + // Compare against `3' because that is the length of "lib". + while (! klass && so_base_name && so_base_name->length() > 3) + { + using namespace ::java::lang; + Runtime *rt = Runtime::getRuntime(); + 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) + klass = _Jv_FindClassInCache (name_u, 0); + } + } + + // Now try loading using the interpreter. + if (! klass) + klass = java::net::URLClassLoader::findClass (name); + + return klass; +} diff --git a/libjava/java/lang/natClassLoader.cc b/libjava/java/lang/natClassLoader.cc index debcb4f4fed..db5ac9431d3 100644 --- a/libjava/java/lang/natClassLoader.cc +++ b/libjava/java/lang/natClassLoader.cc @@ -189,57 +189,6 @@ java::lang::VMClassLoader::getPrimitiveClass (jchar type) return _Jv_FindClassFromSignature (sig, NULL); } -// This is the findClass() implementation for the System classloader. It is -// the only native method in VMClassLoader, so we define it here. -jclass -gnu::gcj::runtime::VMClassLoader::findClass (jstring name) -{ - _Jv_Utf8Const *name_u = _Jv_makeUtf8Const (name); - jclass klass = _Jv_FindClassInCache (name_u, 0); - - if (! klass) - { - // 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 ('.', '-'); - - // Compare against `3' because that is the length of "lib". - while (! klass && so_base_name && so_base_name->length() > 3) - { - using namespace ::java::lang; - Runtime *rt = Runtime::getRuntime(); - 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) - klass = _Jv_FindClassInCache (name_u, 0); - } - } - - // Now try loading using the interpreter. - if (! klass) - { - klass = java::net::URLClassLoader::findClass (name); - } - - return klass; -} - jclass java::lang::ClassLoader::findLoadedClass (jstring name) {