diff options
author | Tom Tromey <tromey@redhat.com> | 2002-12-11 03:15:14 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2002-12-11 03:15:14 +0000 |
commit | ad1121d10ea102d3f193413a4c80e3b48a4ecec2 (patch) | |
tree | b22d13e76c99db3d512cbaf990977196e108fb80 /libjava/gnu/gcj/runtime/natVMClassLoader.cc | |
parent | a7e693d5d2ae7ddd3a14e4420ab88f677efbcebe (diff) | |
download | gcc-ad1121d10ea102d3f193413a4c80e3b48a4ecec2.zip gcc-ad1121d10ea102d3f193413a4c80e3b48a4ecec2.tar.gz gcc-ad1121d10ea102d3f193413a4c80e3b48a4ecec2.tar.bz2 |
Makefile.in: Rebuilt.
* 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.
From-SVN: r60020
Diffstat (limited to 'libjava/gnu/gcj/runtime/natVMClassLoader.cc')
-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 0000000..33b63d6 --- /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; +} |