* Merged gcj-abi-2-dev-branch to trunk.
(Actual changes too large to list in the commit message; see ChangeLog.) From-SVN: r91270
This commit is contained in:
parent
ec0641f612
commit
367390404d
70 changed files with 11301 additions and 3355 deletions
|
@ -22,6 +22,7 @@ details. */
|
|||
#include <java-interp.h>
|
||||
|
||||
#include <java/lang/VMClassLoader.h>
|
||||
#include <java/lang/VMCompiler.h>
|
||||
#include <gnu/gcj/runtime/VMClassLoader.h>
|
||||
#include <java/lang/ClassLoader.h>
|
||||
#include <java/lang/Class.h>
|
||||
|
@ -29,6 +30,21 @@ details. */
|
|||
#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,
|
||||
|
@ -37,72 +53,61 @@ java::lang::VMClassLoader::defineClass (java::lang::ClassLoader *loader,
|
|||
jint length,
|
||||
java::security::ProtectionDomain *pd)
|
||||
{
|
||||
jclass klass = VMCompiler::compileClass(loader, name, data,
|
||||
offset, length, pd);
|
||||
|
||||
if (klass != NULL)
|
||||
{
|
||||
JvSynchronize sync (&java::lang::Class::class$);
|
||||
_Jv_RegisterClass (klass);
|
||||
}
|
||||
#ifdef INTERPRETER
|
||||
jclass klass;
|
||||
klass = new java::lang::Class ();
|
||||
klass->aux_info = (void *) _Jv_AllocBytes (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)
|
||||
else
|
||||
{
|
||||
_Jv_Utf8Const *name2 = _Jv_makeUtf8Const (name);
|
||||
klass = new java::lang::Class ();
|
||||
|
||||
if (! _Jv_VerifyClassName (name2))
|
||||
throw new java::lang::ClassFormatError
|
||||
(JvNewStringLatin1 ("erroneous class name"));
|
||||
// Synchronize on the class, so that it is not attempted initialized
|
||||
// until we're done loading.
|
||||
JvSynchronize sync (klass);
|
||||
|
||||
klass->name = name2;
|
||||
// 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, pd);
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
// if everything proceeded sucessfully, we're loaded.
|
||||
JvAssert (klass->state == JV_STATE_LOADED);
|
||||
}
|
||||
|
||||
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);
|
||||
#endif // INTERPRETER
|
||||
|
||||
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 *
|
||||
|
@ -125,9 +130,16 @@ 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);
|
||||
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);
|
||||
}
|
||||
return klass;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue