diff options
Diffstat (limited to 'libjava/gnu/gcj/jvmti/natExceptionEvent.cc')
-rw-r--r-- | libjava/gnu/gcj/jvmti/natExceptionEvent.cc | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/libjava/gnu/gcj/jvmti/natExceptionEvent.cc b/libjava/gnu/gcj/jvmti/natExceptionEvent.cc new file mode 100644 index 00000000000..dfc8e669dd8 --- /dev/null +++ b/libjava/gnu/gcj/jvmti/natExceptionEvent.cc @@ -0,0 +1,59 @@ +// natExceptionEvent.cc - C++ code for JVMTI Exception events + +/* Copyright (C) 2007 Free Software Foundation + + This file is part of libgcj. + +This software is copyrighted work licensed under the terms of the +Libgcj License. Please consult the file "LIBGCJ_LICENSE" for +details. */ + +#include <config.h> +#include <gcj/cni.h> +#include <gcj/method.h> +#include <java-interp.h> +#include <java-insns.h> +#include <java-assert.h> +#include <jvmti.h> +#include <jvmti-int.h> + +#include <gnu/gcj/jvmti/ExceptionEvent.h> + +void +gnu::gcj::jvmti::ExceptionEvent::sendEvent () +{ + // Check if the exception is caught somewhere in the interpreted call stack + if (_catchMeth == 0 || _catchLoc == 0) + checkCatch (); + + JNIEnv *jni = _Jv_GetCurrentJNIEnv (); + + _Jv_JVMTI_PostEvent (JVMTI_EVENT_EXCEPTION, _thread, jni, + reinterpret_cast<jmethodID> (_throwMeth), + static_cast<jlocation> (_throwLoc), _ex, + reinterpret_cast<jmethodID> (_catchMeth), + static_cast<jlocation> (_catchLoc)); +} + +// This method looks up the interpreted call stack to see if the exception will +// eventually be caught by some java method. +void +gnu::gcj::jvmti::ExceptionEvent::checkCatch () +{ + _Jv_InterpFrame *frame + = reinterpret_cast<_Jv_InterpFrame *> (_thread->interp_frame); + + while ((frame = frame->next_interp)) + { + _Jv_InterpMethod *meth + = reinterpret_cast<_Jv_InterpMethod *> (frame->self); + pc_t pc = frame->pc; + + if (meth->check_handler (&pc, meth, _ex)) + { + _catchMeth = reinterpret_cast<jlong> (meth->get_method ()); + _catchLoc = meth->insn_index (pc); + break; + } + } +} |