Author: amiloslavskiy Date: Thu Oct 15 10:13:54 2020 New Revision: 1882519 URL: http://svn.apache.org/viewvc?rev=1882519&view=rev Log: JavaHL: Introduce new helper class to temporarily stash Java exceptions
This will be used in subsequent commits. Committed separately to facilitate code review and cherry-picks. [in subversion/bindings/javahl] * native/JNIUtil.cpp * native/JNIUtil.h New class 'StashException', please refer to code comments. Modified: subversion/branches/javahl-1.14-fixes/subversion/bindings/javahl/native/JNIUtil.cpp subversion/branches/javahl-1.14-fixes/subversion/bindings/javahl/native/JNIUtil.h Modified: subversion/branches/javahl-1.14-fixes/subversion/bindings/javahl/native/JNIUtil.cpp URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.14-fixes/subversion/bindings/javahl/native/JNIUtil.cpp?rev=1882519&r1=1882518&r2=1882519&view=diff ============================================================================== --- subversion/branches/javahl-1.14-fixes/subversion/bindings/javahl/native/JNIUtil.cpp (original) +++ subversion/branches/javahl-1.14-fixes/subversion/bindings/javahl/native/JNIUtil.cpp Thu Oct 15 10:13:54 2020 @@ -1169,3 +1169,28 @@ jthrowable JNIUtil::unwrapJavaException( return WrappedException::get_exception(err->pool); } + +StashException::StashException(JNIEnv* env) +{ + m_env = env; + m_stashed = NULL; + stashException(); +} + +StashException::~StashException() +{ + if (m_stashed) + m_env->Throw(m_stashed); +} + +void StashException::stashException() +{ + jthrowable jexc = m_env->ExceptionOccurred(); + if (!jexc) + return; + + if (!m_stashed) + m_stashed = jexc; + + m_env->ExceptionClear(); +} Modified: subversion/branches/javahl-1.14-fixes/subversion/bindings/javahl/native/JNIUtil.h URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.14-fixes/subversion/bindings/javahl/native/JNIUtil.h?rev=1882519&r1=1882518&r2=1882519&view=diff ============================================================================== --- subversion/branches/javahl-1.14-fixes/subversion/bindings/javahl/native/JNIUtil.h (original) +++ subversion/branches/javahl-1.14-fixes/subversion/bindings/javahl/native/JNIUtil.h Thu Oct 15 10:13:54 2020 @@ -330,4 +330,37 @@ class JNIUtil } \ } while(0) +/** + * If there's an exception pending, temporarily stash it away, then + * re-throw again in destructor. The goal is to allow some Java calls + * to be made despite a pending exception. For example, doing some + * necessary cleanup. + */ +class StashException +{ + public: + /* + * Works like stashException(). + */ + StashException(JNIEnv* env); + + /** + * If there's an exception stashed, re-throws it. + */ + ~StashException(); + + /** + * Check for a pending exception. + * If present, stash it away until this class's destructor. + * If another exception is already stashed, forget the _new_ one. The + * reason behind it is that usually the first exception is the most + * informative. + */ + void stashException(); + + private: + JNIEnv* m_env; + jthrowable m_stashed; +}; + #endif // JNIUTIL_H