From 721a9630e2f08aeb4f20dd1c133f9ac9a1081d13 Mon Sep 17 00:00:00 2001 From: kgallowa Date: Fri, 16 Feb 2007 00:05:39 +0000 Subject: 2007-02-15 Kyle Galloway * interpret.cc (_Jv_InterpMethod::check_handler): New method. * interpret-run.cc: Change the catch section to report exception events and to use the new check_handler method. * include/java-interp.h (_Jv_InterpMethod): Add check_handler. * gnu/gcj/jvmti/ExceptionEvent.java: New file. * gnu/gcj/jvmti/ExceptionEvent.h: New file. * gnu/gcj/jvmti/natExceptionEvent.cc: New file. * libjava/classpath/lib/gnu/gcj/jvmti/ExceptionEvent.class: New file. * sources.am: Added ExceptionEvent.java. * Makefile.am: Added natExceptionEvent.cc * Makefile.in: Regenerated. * include/Makefile.in: Regenerated. * gcj/Makefile.in: Regenerated. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@122019 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/interpret-run.cc | 67 ++++++++++++++++++++++-------------------------- 1 file changed, 31 insertions(+), 36 deletions(-) (limited to 'libjava/interpret-run.cc') diff --git a/libjava/interpret-run.cc b/libjava/interpret-run.cc index 8a4d204090f..b98092efb1a 100644 --- a/libjava/interpret-run.cc +++ b/libjava/interpret-run.cc @@ -2540,43 +2540,38 @@ details. */ } catch (java::lang::Throwable *ex) { -#ifdef DIRECT_THREADED - void *logical_pc = (void *) ((insn_slot *) pc - 1); -#else - int logical_pc = pc - 1 - meth->bytecode (); +#ifdef DEBUG + // This needs to be done before the pc is changed. + jlong throw_loc = meth->insn_index (pc); +#endif + // Check if the exception is handled and, if so, set the pc to the start + // of the appropriate catch block. + if (meth->check_handler (&pc, meth, ex)) + { + sp = stack; + sp++->o = ex; // Push exception. +#ifdef DEBUG + if (JVMTI_REQUESTED_EVENT (Exception)) + { + using namespace gnu::gcj::jvmti; + jlong throw_meth = reinterpret_cast (meth->get_method ()); + jlong catch_loc = meth->insn_index (pc); + ExceptionEvent::postExceptionEvent (thread, throw_meth, + throw_loc, ex, throw_meth, + catch_loc); + } +#endif + NEXT_INSN; + } +#ifdef DEBUG + if (JVMTI_REQUESTED_EVENT (Exception)) + { + using namespace gnu::gcj::jvmti; + jlong throw_meth = reinterpret_cast (meth->get_method ()); + ExceptionEvent::postExceptionEvent (thread, throw_meth, throw_loc, + ex, NULL, NULL); + } #endif - _Jv_InterpException *exc = meth->exceptions (); - jclass exc_class = ex->getClass (); - - for (int i = 0; i < meth->exc_count; i++) - { - if (PCVAL (exc[i].start_pc) <= logical_pc - && logical_pc < PCVAL (exc[i].end_pc)) - { -#ifdef DIRECT_THREADED - jclass handler = (jclass) exc[i].handler_type.p; -#else - jclass handler = NULL; - if (exc[i].handler_type.i != 0) - handler = (_Jv_Linker::resolve_pool_entry (meth->defining_class, - exc[i].handler_type.i)).clazz; -#endif /* DIRECT_THREADED */ - - if (handler == NULL || handler->isAssignableFrom (exc_class)) - { - -#ifdef DIRECT_THREADED - pc = (insn_slot *) exc[i].handler_pc.p; -#else - pc = meth->bytecode () + exc[i].handler_pc.i; -#endif /* DIRECT_THREADED */ - sp = stack; - sp++->o = ex; // Push exception. - NEXT_INSN; - } - } - } - // No handler, so re-throw. throw ex; } -- cgit v1.2.1