From daa4e295752aca4a0cda33ea5e05af597382d12d Mon Sep 17 00:00:00 2001 From: tromey Date: Mon, 7 Feb 2005 21:29:04 +0000 Subject: [PATCH] * defineclass.cc (handleClassBegin): Use _Jv_RegisterInitiatingLoader. * java/lang/Class.h (_Jv_UnregisterInitiatingLoader): Declare. * java/lang/natVMClassLoader.cc (resolveClass): Don't register class. Use _Jv_UnregisterInitiatingLoader. * java/lang/natClassLoader.cc (_Jv_UnregisterInitiatingLoader): New function. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@94717 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/ChangeLog | 10 ++++++++++ libjava/defineclass.cc | 14 ++++++-------- libjava/java/lang/Class.h | 2 ++ libjava/java/lang/natClassLoader.cc | 10 ++++++++++ libjava/java/lang/natVMClassLoader.cc | 9 ++------- 5 files changed, 30 insertions(+), 15 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 9b3a5a3..2ebbbdd 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,13 @@ +2005-02-07 Tom Tromey + + * defineclass.cc (handleClassBegin): Use + _Jv_RegisterInitiatingLoader. + * java/lang/Class.h (_Jv_UnregisterInitiatingLoader): Declare. + * java/lang/natVMClassLoader.cc (resolveClass): Don't register + class. Use _Jv_UnregisterInitiatingLoader. + * java/lang/natClassLoader.cc (_Jv_UnregisterInitiatingLoader): + New function. + 2005-02-07 Mark Wielaard Reported by Timo Lindfors diff --git a/libjava/defineclass.cc b/libjava/defineclass.cc index a40bff1..382b321 100644 --- a/libjava/defineclass.cc +++ b/libjava/defineclass.cc @@ -908,16 +908,14 @@ _Jv_ClassReader::handleClassBegin (int access_flags, int this_class, int super_c throw_no_class_def_found_error ("loading java.lang.Object"); } - // In the pre-loading state, it can be looked up in the - // cache only by this thread! This allows the super-class - // to include references to this class. - def->state = JV_STATE_PRELOADING; - { - JvSynchronize sync (&java::lang::Class::class$); - _Jv_RegisterClass (def); - } + // Register this class with its defining loader as well (despite the + // name of the function we're calling), so that super class lookups + // work properly. If there is an error, our caller will unregister + // this class from the class loader. Also, we don't need to hold a + // lock here, as our caller has acquired it. + _Jv_RegisterInitiatingLoader (def, def->loader); if (super_class != 0) { diff --git a/libjava/java/lang/Class.h b/libjava/java/lang/Class.h index 4e061ce..34ff5df 100644 --- a/libjava/java/lang/Class.h +++ b/libjava/java/lang/Class.h @@ -212,6 +212,7 @@ class java::io::ObjectStreamClass; void _Jv_RegisterClassHookDefault (jclass klass); void _Jv_RegisterInitiatingLoader (jclass,java::lang::ClassLoader*); +void _Jv_UnregisterInitiatingLoader (jclass,java::lang::ClassLoader*); void _Jv_UnregisterClass (jclass); jclass _Jv_FindClass (_Jv_Utf8Const *name, java::lang::ClassLoader *loader); @@ -436,6 +437,7 @@ private: size_t count); friend void ::_Jv_RegisterClassHookDefault (jclass klass); friend void ::_Jv_RegisterInitiatingLoader (jclass,java::lang::ClassLoader*); + friend void ::_Jv_UnregisterInitiatingLoader (jclass,java::lang::ClassLoader*); friend void ::_Jv_UnregisterClass (jclass); friend jclass (::_Jv_FindClass) (_Jv_Utf8Const *name, java::lang::ClassLoader *loader); diff --git a/libjava/java/lang/natClassLoader.cc b/libjava/java/lang/natClassLoader.cc index 15fb9eb..17b2a88 100644 --- a/libjava/java/lang/natClassLoader.cc +++ b/libjava/java/lang/natClassLoader.cc @@ -110,6 +110,16 @@ _Jv_RegisterInitiatingLoader (jclass klass, java::lang::ClassLoader *loader) loader->loadedClasses->put(klass->name->toString(), klass); } +// If we found an error while defining an interpreted class, we must +// go back and unregister it. +void +_Jv_UnregisterInitiatingLoader (jclass klass, java::lang::ClassLoader *loader) +{ + if (! loader) + loader = java::lang::ClassLoader::getSystemClassLoader(); + loader->loadedClasses->remove(klass->name->toString()); +} + // This function is called many times during startup, before main() is // run. At that point in time we know for certain we are running // single-threaded, so we don't need to lock when adding classes to the diff --git a/libjava/java/lang/natVMClassLoader.cc b/libjava/java/lang/natVMClassLoader.cc index cd98e7e..1da7949 100644 --- a/libjava/java/lang/natVMClassLoader.cc +++ b/libjava/java/lang/natVMClassLoader.cc @@ -57,13 +57,8 @@ java::lang::VMClassLoader::defineClass (java::lang::ClassLoader *loader, jclass klass = VMCompiler::compileClass(loader, name, data, offset, length, pd); - if (klass != NULL) - { - JvSynchronize sync (&java::lang::Class::class$); - _Jv_RegisterClass (klass); - } #ifdef INTERPRETER - else + if (klass == NULL) { klass = new java::lang::Class (); @@ -96,7 +91,7 @@ java::lang::VMClassLoader::defineClass (java::lang::ClassLoader *loader, klass->state = JV_STATE_ERROR; klass->notifyAll (); - _Jv_UnregisterClass (klass); + _Jv_UnregisterInitiatingLoader (klass, klass->loader); // If EX is not a ClassNotFoundException, that's ok, because we // account for the possibility in defineClass(). -- 2.7.4