summaryrefslogtreecommitdiff
path: root/libjava/gnu
diff options
context:
space:
mode:
authorkseitz <kseitz@138bc75d-0d04-0410-961f-82ee72b054a4>2007-05-16 20:12:33 +0000
committerkseitz <kseitz@138bc75d-0d04-0410-961f-82ee72b054a4>2007-05-16 20:12:33 +0000
commit54a9e35cd0e1d924b64f58396fc2fc1ea667f107 (patch)
tree488fc8a0b082ccaaae84342b96cdeb39d5b5ac8e /libjava/gnu
parent1f14446adb1e15a05bbb5c5baaef3d7c41c34a0f (diff)
downloadgcc-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.h1
-rw-r--r--libjava/gnu/classpath/jdwp/natVMVirtualMachine.cc35
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 =