diff options
| author | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-06-24 22:48:33 +0000 |
|---|---|---|
| committer | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-06-24 22:48:33 +0000 |
| commit | 0e306e0a8846851477785f3b33c99512b26ab783 (patch) | |
| tree | de416528940c92c7487c2e3625d257a047026d0d /libjava/java/lang | |
| parent | f17c1d00667e1ba9c80876a618ab047076e13db7 (diff) | |
| download | ppe42-gcc-0e306e0a8846851477785f3b33c99512b26ab783.tar.gz ppe42-gcc-0e306e0a8846851477785f3b33c99512b26ab783.zip | |
* java/lang/natClassLoader.cc (_Jv_UnregisterClass): Handle case
where class' name is NULL.
(_Jv_FindClass): Don't wait for class state.
* java/lang/natVMClassLoader.cc (defineClass): Only unregister if
name found.
* include/java-interp.h (_Jv_DefineClass): Updated.
* defineclass.cc (_Jv_DefineClass): Added 'name_result' argument.
(struct _Jv_ClassReader): Likewise.
(found_name): New field.
(handleClassBegin): Set *found_name.
(_Jv_VerifyMethodSignature): Handle case where ptr==NULL.
(handleClassBegin): Throw error if super class not set.
(read_methods): Correctly call check_tag and prepare_pool_entry.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@101301 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/java/lang')
| -rw-r--r-- | libjava/java/lang/natClassLoader.cc | 10 | ||||
| -rw-r--r-- | libjava/java/lang/natVMClassLoader.cc | 6 |
2 files changed, 8 insertions, 8 deletions
diff --git a/libjava/java/lang/natClassLoader.cc b/libjava/java/lang/natClassLoader.cc index fb3515b5a78..43016bf5e63 100644 --- a/libjava/java/lang/natClassLoader.cc +++ b/libjava/java/lang/natClassLoader.cc @@ -107,6 +107,10 @@ _Jv_FindClassInCache (_Jv_Utf8Const *name) void _Jv_UnregisterClass (jclass the_class) { + // This can happen if the class could not be defined properly. + if (! the_class->name) + return; + JvSynchronize sync (&java::lang::Class::class$); jint hash = HASH_UTF(the_class->name); @@ -328,12 +332,6 @@ _Jv_FindClass (_Jv_Utf8Const *name, java::lang::ClassLoader *loader) } } } - else - { - // We need classes to be in the hash while we're loading, so - // that they can refer to themselves. - _Jv_Linker::wait_for_state (klass, JV_STATE_LOADED); - } return klass; } diff --git a/libjava/java/lang/natVMClassLoader.cc b/libjava/java/lang/natVMClassLoader.cc index 2e7b90da789..bffbfc067db 100644 --- a/libjava/java/lang/natVMClassLoader.cc +++ b/libjava/java/lang/natVMClassLoader.cc @@ -71,16 +71,18 @@ java::lang::VMClassLoader::defineClass (java::lang::ClassLoader *loader, klass->name = name2; } + _Jv_Utf8Const *found_name = NULL; try { - _Jv_DefineClass (klass, data, offset, length, pd); + _Jv_DefineClass (klass, data, offset, length, pd, &found_name); } catch (java::lang::Throwable *ex) { klass->state = JV_STATE_ERROR; klass->notifyAll (); - _Jv_UnregisterInitiatingLoader (klass, klass->loader); + if (found_name != NULL) + _Jv_UnregisterInitiatingLoader (klass, klass->loader); // If EX is not a ClassNotFoundException, that's ok, because we // account for the possibility in defineClass(). |

