WALA/com.ibm.wala.cast/source/c/jni/Exceptions.cpp

60 lines
1.7 KiB
C++

#include <jni.h>
#include <setjmp.h>
#include <string.h>
#include "Exceptions.h"
#ifdef _MSC_VER
#include <malloc.h>
#endif
Exceptions::Exceptions(JNIEnv *java_env, jmp_buf& c_env) :
_java_env(java_env),
_c_env(c_env)
{
_jre = java_env->FindClass("java/lang/RuntimeException");
_ctr = java_env->GetMethodID(_jre, "<init>", "(Ljava/lang/String;)V");
_wrapper_ctr =
java_env->GetMethodID(_jre,
"<init>",
"(Ljava/lang/String;Ljava/lang/Throwable;)V");
}
void Exceptions::throwAnyException(const char *file_name, int line_number) {
if (_java_env->ExceptionCheck()) throwException(file_name, line_number);
}
void Exceptions::throwException(const char *file_name, int line_number) {
jthrowable real_ex = _java_env->ExceptionOccurred();
_java_env->ExceptionClear();
char msg[strlen(file_name) + 1024];
memset(msg, 0, strlen(file_name) + 1024);
sprintf(msg, "exception at %s:%d", file_name, line_number);
jstring java_message = _java_env->NewStringUTF(msg);
jthrowable ex = (jthrowable)
_java_env->NewObject(_jre, _wrapper_ctr, java_message, real_ex);
if (_java_env->ExceptionCheck()) {
jthrowable new_real_ex = _java_env->ExceptionOccurred();
_java_env->Throw(new_real_ex);
} else {
_java_env->Throw(ex);
}
longjmp( _c_env, -1 );
}
void
Exceptions::throwException(const char *file_name, int line_number, const char *c_message) {
char msg[strlen(file_name) + strlen(c_message) + 1024];
memset(msg, 0, strlen(file_name) + strlen(c_message) + 1024);
sprintf(msg, "exception at %s:%d: %s", file_name, line_number, c_message);
jstring java_message = _java_env->NewStringUTF(msg);
jthrowable ex = (jthrowable)_java_env->NewObject(_jre, _ctr, java_message);
_java_env->Throw(ex);
longjmp( _c_env, -1 );
}