diff options
author | Tom Tromey <tromey@redhat.com> | 2004-01-16 23:54:22 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2004-01-16 23:54:22 +0000 |
commit | b54a271561e04b37b5584033ee64920600fc0e8d (patch) | |
tree | 4fa6a54c6fc16fc9ab0716cf489d234d9d55e8fd /libjava/java/lang/natVMClassLoader.cc | |
parent | 280835807d5eb09402d41db524b879f627f39c8a (diff) | |
download | gcc-b54a271561e04b37b5584033ee64920600fc0e8d.zip gcc-b54a271561e04b37b5584033ee64920600fc0e8d.tar.gz gcc-b54a271561e04b37b5584033ee64920600fc0e8d.tar.bz2 |
natClassLoader.cc: Moved VMClassLoader methods...
* java/lang/natClassLoader.cc: Moved VMClassLoader methods...
* java/lang/natVMClassLoader.cc: ...here. New file.
* Makefile.in: Rebuilt.
* Makefile.am (nat_source_files): Added natVMClassLoader.cc.
From-SVN: r76003
Diffstat (limited to 'libjava/java/lang/natVMClassLoader.cc')
-rw-r--r-- | libjava/java/lang/natVMClassLoader.cc | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/libjava/java/lang/natVMClassLoader.cc b/libjava/java/lang/natVMClassLoader.cc new file mode 100644 index 0000000..8de0a70 --- /dev/null +++ b/libjava/java/lang/natVMClassLoader.cc @@ -0,0 +1,133 @@ +// natVMClassLoader.cc - VMClassLoader native methods + +/* Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 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. */ + +/* Author: Kresten Krab Thorup <krab@gnu.org> */ + +#include <config.h> + +#include <stdlib.h> +#include <string.h> + +#include <gcj/cni.h> +#include <jvm.h> + +#include <java-threads.h> +#include <java-interp.h> + +#include <java/lang/VMClassLoader.h> +#include <gnu/gcj/runtime/VMClassLoader.h> +#include <java/lang/ClassLoader.h> +#include <java/lang/Class.h> +#include <java/lang/Throwable.h> +#include <java/security/ProtectionDomain.h> +#include <java/lang/ClassFormatError.h> + +java::lang::Class * +java::lang::VMClassLoader::defineClass (java::lang::ClassLoader *loader, + jstring name, + jbyteArray data, + jint offset, + jint length, + java::security::ProtectionDomain *pd) +{ +#ifdef INTERPRETER + jclass klass; + klass = (jclass) JvAllocObject (&java::lang::Class::class$, + sizeof (_Jv_InterpClass)); + + // Synchronize on the class, so that it is not attempted initialized + // until we're done loading. + JvSynchronize sync (klass); + + // Record the defining loader. For the system class loader, we + // record NULL. + if (loader != java::lang::ClassLoader::getSystemClassLoader()) + klass->loader = loader; + + if (name != 0) + { + _Jv_Utf8Const *name2 = _Jv_makeUtf8Const (name); + + if (! _Jv_VerifyClassName (name2)) + throw new java::lang::ClassFormatError + (JvNewStringLatin1 ("erroneous class name")); + + klass->name = name2; + } + + try + { + _Jv_DefineClass (klass, data, offset, length); + } + catch (java::lang::Throwable *ex) + { + klass->state = JV_STATE_ERROR; + klass->notifyAll (); + + _Jv_UnregisterClass (klass); + + // If EX is not a ClassNotFoundException, that's ok, because we + // account for the possibility in defineClass(). + throw ex; + } + + klass->protectionDomain = pd; + + // if everything proceeded sucessfully, we're loaded. + JvAssert (klass->state == JV_STATE_LOADED); + + return klass; + +#else // INTERPRETER + + return 0; +#endif +} + +// Finish linking a class. Only called from ClassLoader::resolveClass. +void +java::lang::VMClassLoader::linkClass0 (java::lang::Class *klass) +{ + _Jv_WaitForState (klass, JV_STATE_LINKED); +} + +void +java::lang::VMClassLoader::markClassErrorState0 (java::lang::Class *klass) +{ + klass->state = JV_STATE_ERROR; + klass->notifyAll (); +} + +java::lang::ClassLoader * +java::lang::VMClassLoader::getSystemClassLoaderInternal() +{ + _Jv_InitClass (&gnu::gcj::runtime::VMClassLoader::class$); + return gnu::gcj::runtime::VMClassLoader::instance; +} + +jclass +java::lang::VMClassLoader::getPrimitiveClass (jchar type) +{ + char sig[2]; + sig[0] = (char) type; + sig[1] = '\0'; + return _Jv_FindClassFromSignature (sig, NULL); +} + +jclass +java::lang::VMClassLoader::loadClass(jstring name, jboolean resolve) +{ + _Jv_Utf8Const *utf = _Jv_makeUtf8Const (name); + // FIXME: we culd make _Jv_FindClassFromSignature a template. + jclass klass = _Jv_FindClassInCache (utf, NULL); + if (klass && resolve) + _Jv_InitClass (klass); + return klass; +} |