Index: vm/vmcore/src/class_support/classloader.cpp =================================================================== --- vm/vmcore/src/class_support/classloader.cpp (revision 490549) +++ vm/vmcore/src/class_support/classloader.cpp (working copy) @@ -218,6 +218,7 @@ uint8* bytecode, unsigned offset, unsigned length, const String** res_name) { + assert(!exn_raised()); const String *className; LOG2("classloader.defineclass", "Defining class " << (NULL != class_name ? class_name : "NULL") << " with loader " << this); @@ -226,6 +227,7 @@ } else { className = class_extract_name(env, bytecode, offset, length); if(className == NULL) { + FailedLoadingClass(className); exn_raise_by_name("java/lang/ClassFormatError", "class name could not be extracted from provided class data", NULL); return NULL; @@ -235,7 +237,7 @@ *res_name = className; } - Class* clss; + Class* clss = NULL; if((clss = WaitDefinition(env, className)) != NULL || exn_raised()) return clss; @@ -336,6 +338,7 @@ Class* ClassLoader::LoadVerifyAndPrepareClass(Global_Env* env, const String* name) { + assert(!exn_raised()); assert(hythread_is_suspend_enabled()); Class* clss = LoadClass(env, name); @@ -908,6 +911,7 @@ */ Class* ClassLoader::AllocateAndReportInstance(const Global_Env* env, Class* clss) { + ASSERT_RAISE_AREA; const String* name = clss->get_name(); assert(name); @@ -1486,6 +1490,7 @@ Class* BootstrapClassLoader::DoLoadClass(Global_Env* UNREF env, const String* className) { + assert(!exn_raised()); assert(env == m_env); assert(!exn_raised()); @@ -1669,6 +1674,8 @@ Class* BootstrapClassLoader::LoadFromFile(const String* class_name) { + assert(!exn_raised()); + // the symptom of circularity (illegal) is that a null class name is passed, // so detect this immediately if( !class_name->bytes || *(class_name->bytes) == 0 ) { @@ -1788,6 +1795,8 @@ Class* BootstrapClassLoader::LoadFromJarFile( JarFile* jar_file, const char* class_name_in_jar, const String* class_name, bool* not_found) { + assert(!exn_raised()); + // find archive entry in archive file *not_found = false; const JarEntry *entry = jar_file->Lookup(class_name_in_jar); Index: vm/vmcore/src/class_support/Resolve.cpp =================================================================== --- vm/vmcore/src/class_support/Resolve.cpp (revision 490549) +++ vm/vmcore/src/class_support/Resolve.cpp (working copy) @@ -143,6 +143,10 @@ Class* Class::_resolve_class(Global_Env* env, unsigned cp_index) { + if (exn_raised()) { + return NULL; + } + assert(hythread_is_suspend_enabled()); ConstantPool& cp = m_const_pool; Index: vm/vmcore/src/exception/exceptions_impl.cpp =================================================================== --- vm/vmcore/src/exception/exceptions_impl.cpp (revision 490549) +++ vm/vmcore/src/exception/exceptions_impl.cpp (working copy) @@ -42,11 +42,19 @@ String *exc_str = env->string_pool.lookup(exception_name); Class *exc_class = env->bootstrap_class_loader->LoadVerifyAndPrepareClass(env, exc_str); - if (exc_class == NULL) return NULL; + + if (exc_class == NULL) { + return NULL; + } + tmn_suspend_disable(); class_initialize(exc_class); tmn_suspend_enable(); - assert(!exn_raised()); + + if (exn_raised()) { + return NULL; + } + return exc_class; }