From 54a9e35cd0e1d924b64f58396fc2fc1ea667f107 Mon Sep 17 00:00:00 2001 From: kseitz Date: Wed, 16 May 2007 20:12:33 +0000 Subject: * include/java-interp.h (breakpoint_at): Declare. * interpret.cc (breakpoint_at): New function. * gnu/classpath/jdwp/VMVirtualMachine.java (_event_list): New member. * gnu/classpath/jdwp/natVMVirtualMachine.cc (initialize): Initialize _event_list. (handle_single_step): If there is a breakpoint at the location at which we are stopping, do not send the notification. Instead add the event to a list of events that occur at this location. (jdwpBreakpointCB): If the event list is not empty, send whatever events are in it and the breakpoint event in a single notification. Mark parameter jni_env as MAYBE_UNUSED. * classpath/lib/gnu/classpath/jdwp/VMVirtualMachine.class: Regenerated. * gnu/classpath/jdwp/VMVirtualMachine.h: Regenerated. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@124777 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/gnu/classpath/jdwp/VMVirtualMachine.h | 1 + libjava/gnu/classpath/jdwp/natVMVirtualMachine.cc | 35 +++++++++++++++++++---- 2 files changed, 31 insertions(+), 5 deletions(-) (limited to 'libjava/gnu') diff --git a/libjava/gnu/classpath/jdwp/VMVirtualMachine.h b/libjava/gnu/classpath/jdwp/VMVirtualMachine.h index dd316940996..f4ff5e8620d 100644 --- a/libjava/gnu/classpath/jdwp/VMVirtualMachine.h +++ b/libjava/gnu/classpath/jdwp/VMVirtualMachine.h @@ -86,6 +86,7 @@ private: static ::java::util::Hashtable * _jdwp_suspend_counts; public: // actually package-private static ::java::util::Hashtable * _stepping_threads; + static ::java::util::ArrayList * _event_list; public: static ::java::lang::Class class$; }; diff --git a/libjava/gnu/classpath/jdwp/natVMVirtualMachine.cc b/libjava/gnu/classpath/jdwp/natVMVirtualMachine.cc index 3c89b9863ec..7fee49bee4c 100644 --- a/libjava/gnu/classpath/jdwp/natVMVirtualMachine.cc +++ b/libjava/gnu/classpath/jdwp/natVMVirtualMachine.cc @@ -116,6 +116,7 @@ gnu::classpath::jdwp::VMVirtualMachine::initialize () { _jdwp_suspend_counts = new ::java::util::Hashtable (); _stepping_threads = new ::java::util::Hashtable (); + _event_list = new ::java::util::ArrayList (); JavaVM *vm = _Jv_GetJavaVM (); union @@ -895,7 +896,23 @@ handle_single_step (jvmtiEnv *env, struct step_info *sinfo, jthread thread, jobject instance = iframe->get_this_ptr (); event::SingleStepEvent *event = new event::SingleStepEvent (thread, loc, instance); - Jdwp::notify (event); + + // We only want to send the notification (and consequently + // suspend) if we are not about to execute a breakpoint. + _Jv_InterpMethod *im = reinterpret_cast<_Jv_InterpMethod *> (iframe->self); + if (im->breakpoint_at (location)) + { + // Next insn is a breakpoint -- record event and + // wait for the JVMTI breakpoint notification to + // enforce a suspension policy. + VMVirtualMachine::_event_list->add (event); + } + else + { + // Next insn is not a breakpoint, so send notification + // and enforce the suspend policy. + Jdwp::notify (event); + } } static void @@ -925,6 +942,7 @@ jdwpBreakpointCB (jvmtiEnv *env, MAYBE_UNUSED JNIEnv *jni_env, JvAssert (err == JVMTI_ERROR_NONE); using namespace gnu::classpath::jdwp; + using namespace gnu::classpath::jdwp::event; jlong methodId = reinterpret_cast (method); VMMethod *meth = VMVirtualMachine::getClassMethod (klass, methodId); @@ -933,9 +951,16 @@ jdwpBreakpointCB (jvmtiEnv *env, MAYBE_UNUSED JNIEnv *jni_env, _Jv_InterpFrame *iframe = reinterpret_cast<_Jv_InterpFrame *> (thread->interp_frame); jobject instance = iframe->get_this_ptr (); - event::BreakpointEvent *event - = new event::BreakpointEvent (thread, loc, instance); - Jdwp::notify (event); + BreakpointEvent *event = new BreakpointEvent (thread, loc, instance); + + VMVirtualMachine::_event_list->add (event); + JArray *events + = ((JArray *) + JvNewObjectArray (VMVirtualMachine::_event_list->size (), + &Event::class$, NULL)); + VMVirtualMachine::_event_list->toArray ((jobjectArray) events); + VMVirtualMachine::_event_list->clear (); + Jdwp::notify (events); } static void JNICALL @@ -1001,7 +1026,7 @@ jdwpExceptionCB (jvmtiEnv *env, MAYBE_UNUSED JNIEnv *jni_env, jthread thread, } static void JNICALL -jdwpSingleStepCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread, +jdwpSingleStepCB (jvmtiEnv *env, MAYBE_UNUSED JNIEnv *jni_env, jthread thread, jmethodID method, jlocation location) { jobject si = -- cgit v1.2.1