diff options
| author | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-12-11 03:15:14 +0000 |
|---|---|---|
| committer | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-12-11 03:15:14 +0000 |
| commit | 29da560dd749cbcbd4dfcc96f37b91490d8f3354 (patch) | |
| tree | b22d13e76c99db3d512cbaf990977196e108fb80 /libjava/gnu/gcj | |
| parent | ddc28fdc7152a612dab9ff04eaafc2c20a875544 (diff) | |
| download | ppe42-gcc-29da560dd749cbcbd4dfcc96f37b91490d8f3354.tar.gz ppe42-gcc-29da560dd749cbcbd4dfcc96f37b91490d8f3354.zip | |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@60020 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/gnu/gcj')
| -rw-r--r-- | libjava/gnu/gcj/runtime/natVMClassLoader.cc | 67 |
1 files changed, 67 insertions, 0 deletions
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 <config.h> + +#include <gcj/cni.h> +#include <jvm.h> + +#include <gnu/gcj/runtime/VMClassLoader.h> +#include <java/lang/Class.h> +#include <java/lang/StringBuffer.h> +#include <java/net/URLClassLoader.h> +#include <java/lang/Runtime.h> + +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; +} |

