Index: vmcore/include/exceptions.h =================================================================== --- vmcore/include/exceptions.h (revision 451266) +++ vmcore/include/exceptions.h (working copy) @@ -223,6 +223,16 @@ jthrowable exn_function_catch(); /** + * Stores risen exception. + */ +void exn_store(Exception* exception); + +/** + * Restores risen exception. + */ +void exn_restore(Exception* exception); + +/** * Wrapper for exn_function_try. */ #define exn_try (if (exn_function_try())) Index: vmcore/src/exception/exceptions.cpp =================================================================== --- vmcore/src/exception/exceptions.cpp (revision 451266) +++ vmcore/src/exception/exceptions.cpp (working copy) @@ -365,6 +365,26 @@ } } //exn_rethrow_if_pending +void exn_store(Exception* exception) +{ + tmn_suspend_disable_recursive(); + exception->exc_object = p_TLS_vmthread->thread_exception.exc_object; + exception->exc_class = p_TLS_vmthread->thread_exception.exc_class; + exception->exc_cause = p_TLS_vmthread->thread_exception.exc_cause; + exception->exc_message = p_TLS_vmthread->thread_exception.exc_message; + tmn_suspend_enable_recursive(); +} //exn_store + +void exn_restore(Exception* exception) +{ + tmn_suspend_disable_recursive(); + p_TLS_vmthread->thread_exception.exc_object = exception->exc_object; + p_TLS_vmthread->thread_exception.exc_class = exception->exc_class; + p_TLS_vmthread->thread_exception.exc_cause = exception->exc_cause; + p_TLS_vmthread->thread_exception.exc_message = exception->exc_message; + tmn_suspend_enable_recursive(); +} //exn_restore + ////////////////////////////////////////////////////////////////////////// // Java Stack Trace Utilities #define STF_AS_JLONG 5 Index: vmcore/src/init/finalize.cpp =================================================================== --- vmcore/src/init/finalize.cpp (revision 451266) +++ vmcore/src/init/finalize.cpp (working copy) @@ -322,6 +322,10 @@ p_TLS_vmthread->finalize_thread_flags |= FINALIZER_STARTER; TRACE2("finalize", "run_finalizers() started"); + + // keep an exception risen before running finalizers if any + Exception e; + exn_store(&e); jvalue args[1]; args[0].z = false; @@ -340,6 +344,9 @@ << " while running a wakeFinalization in FinalizerThread"); exn_clear(); } + // restore an exception risen before if any + exn_restore(&e); + p_TLS_vmthread->finalize_thread_flags &= ~FINALIZER_STARTER; } //Objects_To_Finalize::run_finalizers @@ -360,10 +367,16 @@ jboolean* finalizer_on_exit = VM_Global_State::loader_env->finalizer_on_exit; assert(finalizer_on_exit); + // keep an exception risen before finalization if any + Exception e; + exn_store(&e); + for (i=0; ((i