+2007-05-16 Keith Seitz <keiths@redhat.com>
+
+ * 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.
+
2007-05-15 David Daney <ddaney@avtrex.com>
* classpath/lib/javax/swing/text/html/HTMLEditorKit.class: Regenerate
{
_jdwp_suspend_counts = new ::java::util::Hashtable ();
_stepping_threads = new ::java::util::Hashtable ();
+ _event_list = new ::java::util::ArrayList ();
JavaVM *vm = _Jv_GetJavaVM ();
union
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
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);
_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
}
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 =