java-interp.h (breakpoint_at): Declare.
* 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. From-SVN: r124777
This commit is contained in:
parent
c747a42fb4
commit
8faab1f43b
6 changed files with 71 additions and 5 deletions
|
@ -1,3 +1,23 @@
|
|||
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
|
||||
|
|
Binary file not shown.
|
@ -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$;
|
||||
};
|
||||
|
|
|
@ -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 =
|
||||
|
|
|
@ -274,6 +274,9 @@ class _Jv_InterpMethod : public _Jv_MethodBase
|
|||
the insn or NULL if index is invalid. */
|
||||
pc_t set_insn (jlong index, pc_t insn);
|
||||
|
||||
// Is the given location in this method a breakpoint?
|
||||
bool breakpoint_at (jlong index);
|
||||
|
||||
#ifdef DIRECT_THREADED
|
||||
friend void _Jv_CompileMethod (_Jv_InterpMethod*);
|
||||
#endif
|
||||
|
|
|
@ -1580,6 +1580,23 @@ _Jv_InterpMethod::set_insn (jlong index, pc_t insn)
|
|||
return &code[index];
|
||||
}
|
||||
|
||||
bool
|
||||
_Jv_InterpMethod::breakpoint_at (jlong index)
|
||||
{
|
||||
pc_t insn = get_insn (index);
|
||||
if (insn != NULL)
|
||||
{
|
||||
#ifdef DIRECT_THREADED
|
||||
return (insn->insn == breakpoint_insn->insn);
|
||||
#else
|
||||
pc_t code = reinterpret_cast<pc_t> (bytecode ());
|
||||
return (code[index] == breakpoint_insn);
|
||||
#endif
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void *
|
||||
_Jv_JNIMethod::ncode (jclass klass)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue