diff options
author | kseitz <kseitz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-05-16 20:12:33 +0000 |
---|---|---|
committer | kseitz <kseitz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-05-16 20:12:33 +0000 |
commit | 54a9e35cd0e1d924b64f58396fc2fc1ea667f107 (patch) | |
tree | 488fc8a0b082ccaaae84342b96cdeb39d5b5ac8e /libjava/gnu | |
parent | 1f14446adb1e15a05bbb5c5baaef3d7c41c34a0f (diff) | |
download | gcc-54a9e35cd0e1d924b64f58396fc2fc1ea667f107.tar.gz |
* 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
Diffstat (limited to 'libjava/gnu')
-rw-r--r-- | libjava/gnu/classpath/jdwp/VMVirtualMachine.h | 1 | ||||
-rw-r--r-- | libjava/gnu/classpath/jdwp/natVMVirtualMachine.cc | 35 |
2 files changed, 31 insertions, 5 deletions
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<jlong> (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<Event *> *events + = ((JArray<Event *> *) + 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 = |