aboutsummaryrefslogtreecommitdiff
path: root/libjava/gnu/gcj/runtime/natVMClassLoader.cc
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2002-12-11 03:15:14 +0000
committerTom Tromey <tromey@gcc.gnu.org>2002-12-11 03:15:14 +0000
commitad1121d10ea102d3f193413a4c80e3b48a4ecec2 (patch)
treeb22d13e76c99db3d512cbaf990977196e108fb80 /libjava/gnu/gcj/runtime/natVMClassLoader.cc
parenta7e693d5d2ae7ddd3a14e4420ab88f677efbcebe (diff)
downloadgcc-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.cc67
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;
+}