From nobody Mon Sep 17 00:00:00 2001 From: Pavel Afremov Date: Tue, 31 Oct 2006 18:29:30 +0300 Subject: [PATCH] Fix ClassLoading in exception raised state. The fix consist in: classLoadier returns NULL in exception raised state, add missed FailedLoadingClass call , add OutOfMemoryError support into ReportFailedClass add support that exception class may be not loaded --- vm/vmcore/src/class_support/Resolve.cpp | 4 ++++ vm/vmcore/src/class_support/classloader.cpp | 17 +++++++++++++++-- vm/vmcore/src/exception/exceptions_impl.cpp | 12 ++++++++++-- 3 files changed, 29 insertions(+), 4 deletions(-) mode change 100644 => 100755 vm/vmcore/src/class_support/classloader.cpp mode change 100644 => 100755 vm/vmcore/src/exception/exceptions_impl.cpp 94e3f60aca7a02609238fbbf3bfb835c9978999b diff --git a/vm/vmcore/src/class_support/Resolve.cpp b/vm/vmcore/src/class_support/Resolve.cpp index b57642a..b9e738c 100644 --- a/vm/vmcore/src/class_support/Resolve.cpp +++ b/vm/vmcore/src/class_support/Resolve.cpp @@ -133,6 +133,10 @@ static Class* _resolve_class(Global_Env Class *clss, unsigned cp_index) { + if (exn_raised()) { + return NULL; + } + assert(hythread_is_suspend_enabled()); Const_Pool *cp = clss->const_pool; diff --git a/vm/vmcore/src/class_support/classloader.cpp b/vm/vmcore/src/class_support/classloader.cpp old mode 100644 new mode 100755 index 6eb1e00..e130e8c --- a/vm/vmcore/src/class_support/classloader.cpp +++ b/vm/vmcore/src/class_support/classloader.cpp @@ -248,6 +248,7 @@ Class* ClassLoader::DefineClass(Global_E uint8* bytecode, unsigned offset, unsigned length, const String** res_name) { + assert(!exn_raised()); const String *className; LOG2("classloader.defineclass", "Defining class " << class_name << " with loader " << this); @@ -256,6 +257,7 @@ Class* ClassLoader::DefineClass(Global_E } 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; @@ -265,7 +267,7 @@ Class* ClassLoader::DefineClass(Global_E *res_name = className; } - Class* clss; + Class* clss = NULL; if((clss = WaitDefinition(env, className)) != NULL || exn_raised()) return clss; @@ -382,6 +384,7 @@ Class* ClassLoader::DefineClass(Global_E Class* ClassLoader::LoadVerifyAndPrepareClass(Global_Env* env, const String* name) { + assert(!exn_raised()); assert(hythread_is_suspend_enabled()); Class* clss = LoadClass(env, name); @@ -439,7 +442,11 @@ void ClassLoader::ReportFailedClass(cons const String* klassName = VM_Global_State::loader_env->string_pool.lookup(klass); jthrowable exn = exn_create(exnclass, exnmsg.str().c_str()); - // ppervov: FIXME: should throw OOME + + if (!exn) { + // exn_create has raised OOME + return; + } AddFailedClass(klassName, exn); } @@ -1103,6 +1110,7 @@ Class* ClassLoader::SetupAsArray(Global_ */ Class* ClassLoader::AllocateAndReportInstance(const Global_Env* env, Class* clss) { + ASSERT_RAISE_AREA; const String* name = clss->name; assert(name); @@ -1704,6 +1712,7 @@ Class* ClassLoader::LoadClass(Global_Env Class* BootstrapClassLoader::DoLoadClass(Global_Env* UNREF env, const String* className) { + assert(!exn_raised()); assert(env == m_env); Class* klass = StartLoadingClass(m_env, className); @@ -1889,6 +1898,8 @@ void BootstrapClassLoader::ReportAndExit 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 ) { @@ -2008,6 +2019,8 @@ Class* BootstrapClassLoader::LoadFromCla 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); diff --git a/vm/vmcore/src/exception/exceptions_impl.cpp b/vm/vmcore/src/exception/exceptions_impl.cpp old mode 100644 new mode 100755 index 86d2782..f50a26a --- a/vm/vmcore/src/exception/exceptions_impl.cpp +++ b/vm/vmcore/src/exception/exceptions_impl.cpp @@ -42,11 +42,19 @@ Class *get_exc_class(const char *excepti 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; } -- 1.3.3