Index: include/version_svn_tag.h =================================================================== --- include/version_svn_tag.h (revision 443073) +++ include/version_svn_tag.h (working copy) @@ -17,6 +17,6 @@ #ifndef _VERSION_SVN_TAG_ #define _VERSION_SVN_TAG_ -#define VERSION_SVN_TAG "441745" +#define VERSION_SVN_TAG "443073" #endif // _VERSION_SVN_TAG_ Index: include/environment.h =================================================================== --- include/environment.h (revision 443073) +++ include/environment.h (working copy) @@ -127,6 +127,7 @@ Class* java_lang_NullPointerException_Class; Class* java_lang_StackOverflowError_Class; + ObjectHandle java_lang_StackOverflowError; Class* java_lang_ClassNotFoundException_Class; Class* java_lang_NoClassDefFoundError_Class; Index: src/exception/exceptions.cpp =================================================================== --- src/exception/exceptions.cpp (revision 443073) +++ src/exception/exceptions.cpp (working copy) @@ -322,8 +322,15 @@ void exn_raise_by_name(const char *exception_name) { - jthrowable exc = create_exception(exception_name); - exn_raise_only(exc); + if(!hythread_is_suspend_enabled() && (!strcmp(exception_name, "java/lang/StackOverflowError"))) + { + // set the precreated SOE object on thread since the state is suspend disabled + set_current_thread_exception_internal(VM_Global_State::loader_env->java_lang_StackOverflowError->object); + } + else{ + jthrowable exc = create_exception(exception_name); + exn_raise_only(exc); + } } // exn_raise_by_name(const char* exception_name) void exn_raise_by_name(const char *exception_name, const char *message) @@ -511,9 +518,6 @@ assert(!hythread_is_suspend_enabled()); p_TLS_vmthread->p_exception_object = NULL; - if (p_TLS_vmthread->restore_guard_page) { - set_guard_stack(); - } } //clear_current_thread_exception void rethrow_current_thread_exception() @@ -522,6 +526,9 @@ assert(exn); clear_current_thread_exception(); exn_athrow(exn, NULL); + //check if the stack guard needs restoring + if (p_TLS_vmthread->restore_guard_page) + set_guard_stack(); } //rethrow_current_thread_exception void rethrow_current_thread_exception_if_pending() @@ -530,6 +537,9 @@ if (exn) { clear_current_thread_exception(); exn_athrow(exn, NULL); + //check if the stack guard needs restoring + if (p_TLS_vmthread->restore_guard_page) + set_guard_stack(); } } //rethrow_current_thread_exception_if_pending Index: src/class_support/Environment.cpp =================================================================== --- src/class_support/Environment.cpp (revision 443073) +++ src/class_support/Environment.cpp (working copy) @@ -118,6 +118,7 @@ java_lang_ExceptionInInitializerError_Class = NULL; java_lang_NullPointerException_Class = NULL; java_lang_StackOverflowError_Class = NULL; + java_lang_StackOverflowError = NULL; java_lang_ArrayIndexOutOfBoundsException_Class = NULL; java_lang_ArrayStoreException_Class = NULL; java_lang_ArithmeticException_Class = NULL; Index: src/init/vm_init.cpp =================================================================== --- src/init/vm_init.cpp (revision 443073) +++ src/init/vm_init.cpp (working copy) @@ -280,6 +280,7 @@ preload_class(env, env->JavaLangNullPointerException_String); env->java_lang_StackOverflowError_Class = preload_class(env, "java/lang/StackOverflowError"); + env->java_lang_StackOverflowError = oh_allocate_global_handle(); env->java_lang_ArrayIndexOutOfBoundsException_Class = preload_class(env, env->JavaLangArrayIndexOutOfBoundsException_String); env->java_lang_ArrayStoreException_Class = @@ -293,8 +294,9 @@ env->java_lang_OutOfMemoryError = oh_allocate_global_handle(); tmn_suspend_disable(); - // precompile StackOverflowError - class_alloc_new_object_and_run_default_constructor(env->java_lang_StackOverflowError_Class); + // precompile StackOverflowError and create exception object + env->java_lang_StackOverflowError->object = + class_alloc_new_object_and_run_default_constructor(env->java_lang_StackOverflowError_Class); env->java_lang_OutOfMemoryError->object = class_alloc_new_object(env->java_lang_OutOfMemoryError_Class); tmn_suspend_enable();