aa893047e8
* Makefile.in: Rebuilt. * Makefile.am (AM_CXXFLAGS): Define TOOLEXECLIBDIR. (libgcj0_convenience_la_SOURCES): Don't include gnu_xml_source_files. (libgcj0_convenience_la_LIBADD): New variable. (libgcj_la_LIBADD): Don't include sax or w3c_dom. (all_java_source_files): javax_imageio_source_files, javax_xml_source_files, and gnu_java_beans_source_files. ($(gnu_xml_source_files:.java=.lo)): Removed target. (gnu-xml.lo): New target. (javax-imageio.lo): Likewise. (javax-xml.lo): Likewise. (gnu-java-beans.lo): Likewise. (gnu_java_beans_source_files): New variable. (javax_imageio_source_files): Likewise. (javax_xml_source_files): Likewise. (javax_source_files): Moved files to other variable. (awt_java_source_files): Likewise. (ordinary_java_source_files): Added BootClassLoader.java. * java/lang/natVMClassLoader.cc (defineClass): Use boot loader, not system class loader. (initBootLoader): New method. (loadClass): Search bootLoader. * java/lang/natClassLoader.cc (_Jv_RegisterInitiatingLoader): Use boot loader, not system class loader. (_Jv_UnregisterInitiatingLoader): Likewise. (_Jv_FindClass): Likewise. Ensure entries in bootstrap_class_list are unique. * java/lang/natClass.cc (getClassLoader): Don't special case system class loader. * java/lang/VMClassLoader.java (bootLoader): New field. (getResource): Use bootLoader. (getResources): Likewise. (initBootLoader): Declare. * gnu/gcj/runtime/BootClassLoader.java: New file. * external/sax/org/xml/sax/helpers/NamespaceSupport.java (EMPTY_ENUMERATION): Now package-private. * external/w3c_com/Makefile.in: Rebuilt. * external/w3c_com/Makefile.am (MULTIBUILDTOP): New variable. (w3c.jar): New target. (classes.stamp): Updated. (toolexeclib_LTLIBRARIES): Renamed from noinst_LTLIBRARIES. Changed name of library. (libw3c_gcj_la_SOURCES): New variable. (libw3c_gcj_la_GCJFLAGS): Likewise. (source_files): Renamed from lib3c_convenience_la_SOURCES. * external/sax/Makefile.in: Rebuilt. * external/sax/Makefile.am (MULTIBUILDTOP): New variable. (sax.jar): New target. (classes.stamp): Updated. (toolexeclib_LTLIBRARIES): Renamed from noinst_LTLIBRARIES. Changed name of library. (libsax_gcj_la_SOURCES): New variable. (libsax_gcj_la_GCJFLAGS): Likewise. (source_files): Renamed from libsax_convenience_la_SOURCES. * stacktrace.cc (non_system_trace_fn): Don't look at system class loader. * prims.cc (_Jv_CreateJavaVM): Initialize the bootstrap class loader. (_Jv_RunMain): Handle case where 'runtime' is NULL at exit. From-SVN: r96960
160 lines
3.8 KiB
C++
160 lines
3.8 KiB
C++
// natVMClassLoader.cc - VMClassLoader native methods
|
|
|
|
/* Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 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 <java/lang/VMCompiler.h>
|
|
#include <gnu/gcj/runtime/VMClassLoader.h>
|
|
#include <gnu/gcj/runtime/SystemClassLoader.h>
|
|
#include <gnu/gcj/runtime/BootClassLoader.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>
|
|
|
|
void
|
|
java::lang::VMClassLoader::resolveClass (jclass klass)
|
|
{
|
|
JvSynchronize sync (klass);
|
|
try
|
|
{
|
|
_Jv_Linker::wait_for_state (klass, JV_STATE_LINKED);
|
|
}
|
|
catch (java::lang::Throwable *x)
|
|
{
|
|
klass->set_state(JV_STATE_ERROR);
|
|
transformException(klass, x);
|
|
}
|
|
}
|
|
|
|
java::lang::Class *
|
|
java::lang::VMClassLoader::defineClass (java::lang::ClassLoader *loader,
|
|
jstring name,
|
|
jbyteArray data,
|
|
jint offset,
|
|
jint length,
|
|
java::security::ProtectionDomain *pd)
|
|
{
|
|
jclass klass = VMCompiler::compileClass(loader, name, data,
|
|
offset, length, pd);
|
|
|
|
#ifdef INTERPRETER
|
|
if (klass == NULL)
|
|
{
|
|
klass = new java::lang::Class ();
|
|
|
|
// 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 bootstrap class loader,
|
|
// we record NULL.
|
|
if (loader != bootLoader)
|
|
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, pd);
|
|
}
|
|
catch (java::lang::Throwable *ex)
|
|
{
|
|
klass->state = JV_STATE_ERROR;
|
|
klass->notifyAll ();
|
|
|
|
_Jv_UnregisterInitiatingLoader (klass, klass->loader);
|
|
|
|
// If EX is not a ClassNotFoundException, that's ok, because we
|
|
// account for the possibility in defineClass().
|
|
throw ex;
|
|
}
|
|
|
|
// if everything proceeded sucessfully, we're loaded.
|
|
JvAssert (klass->state == JV_STATE_LOADED);
|
|
}
|
|
#endif // INTERPRETER
|
|
|
|
return klass;
|
|
}
|
|
|
|
java::lang::ClassLoader *
|
|
java::lang::VMClassLoader::getSystemClassLoaderInternal()
|
|
{
|
|
_Jv_InitClass (&gnu::gcj::runtime::VMClassLoader::class$);
|
|
return gnu::gcj::runtime::VMClassLoader::system_instance;
|
|
}
|
|
|
|
jclass
|
|
java::lang::VMClassLoader::getPrimitiveClass (jchar type)
|
|
{
|
|
char sig[2];
|
|
sig[0] = (char) type;
|
|
sig[1] = '\0';
|
|
return _Jv_FindClassFromSignature (sig, NULL);
|
|
}
|
|
|
|
void
|
|
java::lang::VMClassLoader::initBootLoader(jstring libdir)
|
|
{
|
|
bootLoader = new gnu::gcj::runtime::BootClassLoader(libdir);
|
|
}
|
|
|
|
jclass
|
|
java::lang::VMClassLoader::loadClass(jstring name, jboolean resolve)
|
|
{
|
|
// We try the boot loader first, so that the endorsed directory
|
|
// overrides compiled-in classes.
|
|
jclass klass = NULL;
|
|
if (bootLoader)
|
|
klass = bootLoader->bootLoadClass(name);
|
|
if (! klass)
|
|
{
|
|
_Jv_Utf8Const *utf = _Jv_makeUtf8Const (name);
|
|
klass = _Jv_FindClassInCache (utf);
|
|
}
|
|
if (klass)
|
|
{
|
|
// We never want to return a class without its supers linked.
|
|
// It isn't clear from the spec, but this is what other
|
|
// implementations do in practice.
|
|
if (resolve)
|
|
_Jv_InitClass (klass);
|
|
else
|
|
_Jv_Linker::wait_for_state (klass, JV_STATE_LOADING);
|
|
|
|
definePackageForNative(name);
|
|
}
|
|
|
|
return klass;
|
|
}
|