From 5a946db2fb999fa67b204302e2f69bf406b2519c Mon Sep 17 00:00:00 2001 From: kseitz Date: Fri, 9 Feb 2007 18:43:21 +0000 Subject: [PATCH] * gnu/classpath/jdwp/VMVirtualMachine.java (_stepping_threads): New member. * classpath/lib/gnu/classpath/jdwp/VMVirtualMachine.class: Regenerated. * gnu/classpath/jdwp/VMVirtualMachine.h: Regenerated. * gnu/claspath/jdwp/natVMVirtualMachine.cc (get_request_step_filter): New function. (DISABLE_EVENT): New macro. (initialize): Initialize _stepping_threads. (registerEvent): Implement EVENT_SINGLE_STEP. (unregisterEvent): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@121769 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/ChangeLog | 15 ++++ .../gnu/classpath/jdwp/VMVirtualMachine.class | Bin 2863 -> 2891 bytes libjava/gnu/classpath/jdwp/VMVirtualMachine.h | 2 + .../gnu/classpath/jdwp/VMVirtualMachine.java | 3 + .../gnu/classpath/jdwp/natVMVirtualMachine.cc | 80 +++++++++++++++++- 5 files changed, 99 insertions(+), 1 deletion(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 5c228fb9073e..c403efbb7a87 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,18 @@ +2007-02-09 Keith Seitz + + * gnu/classpath/jdwp/VMVirtualMachine.java + (_stepping_threads): New member. + * classpath/lib/gnu/classpath/jdwp/VMVirtualMachine.class: + Regenerated. + * gnu/classpath/jdwp/VMVirtualMachine.h: + Regenerated. + * gnu/claspath/jdwp/natVMVirtualMachine.cc + (get_request_step_filter): New function. + (DISABLE_EVENT): New macro. + (initialize): Initialize _stepping_threads. + (registerEvent): Implement EVENT_SINGLE_STEP. + (unregisterEvent): Likewise. + 2007-02-08 Keith Seitz * sources.am: Regenerate. diff --git a/libjava/classpath/lib/gnu/classpath/jdwp/VMVirtualMachine.class b/libjava/classpath/lib/gnu/classpath/jdwp/VMVirtualMachine.class index 526d30b221bf829075c7ce6745eeab2fa424dbf7..f48b6eb890ad060e4b41d8b0cbef1ab7dafd0ad8 100644 GIT binary patch literal 2891 zc-pO1U31h_7=F@jH|;j1EoFfPL=dXmEoA}uvPBRIg@tWFT8gw{O|z%F>7=`BJ_>s6 z9nL7D7wR}V%&5$G=S^jt(Mz522l!jO5}%V~+iW)-z3?K*$@6|a?{nUq{PFkCzXCXp zii$P`hssqiZ&u(2DCk?(SM|K5SIhaEi_5}r z73^4$?hB6R)J3(lVAQ;->nKPUeOJ#lt^76Jskr*0CB_u=FF3BK*Uf5q!L8UrFVQ!7 z&a9g5c?Ip+p;-lq@mfiw&<;&QC%P2$7FmDFTUiwLj7+0od$DHd)~s%u@;w9-ZpCD_ z!Qy}DhD=hjsHt1#2aN3r`Oo;ANIzTLXf*)GB)8O+hlZ%TX07U|*r^~FQ%f{l^4Iyg z9>CtiA{Q+yNa>`I!Cn=6nv@M}8usA@5;Hv87FD-FY)5vem01ce;-HEH3U3ZZA`9;qGS~)bKK1q1X(PU{LI;UGwS+GBG@S6GMkEtRhDdV;wXc zky*Q#^_DJMlL1FHmEbFq#4)PkVf99+u{C77;xwjm}=c`6Ua3_%2$c5VI(WSlL^>`&NNR{d`&myN3^ zq%rTigbMn{a<5n26y9xELJwZ3aUy%kKfR;G(wqMYM`Hp zwg|!k%1I)fMBHcCed8JSuifbbmA9eMmvsVI@WOf zZu{xvQw(J~(#aE}YDWDHdot=8P7QyD{*0RY9<+95)Mq&RVNyva(}^d~|I7t;HAi%# zpINd2X2|Ofy73mVd*nYy^lh@f&!5yB4nXIhVi6-Sa1sKeDB~h3Jhhe?wZf=6Jq1w@ zHLSwH17Dxp>@PvvDD?ufn>dHp*?$i`&vVtrN{hI_RXg)f;SFX@u*y|j!Z>w3gJZZ% zEXivht}u&AbthWXy&9wL{!rZ|sjh7O|JU}~hPE4ePLUn(h)g~rtB=|BC!CJQL_a07 z&#;H<{rDV*@dbwQB~IWgoW<8v;T!h)1k?DId-4?X#07qc=(rf_*hQ@a9lPlj=-9`Y zK*z(>F3@q9-hqy%)^)rP(eXNNM0F%mq+c^K$$pxVo4B$T{B{|ASJ3Dohk)O{+^cq0jL(QY5)KL literal 2863 zc-pO1+jA3D9R5z5W@);mIe+~9^REDo zpr)ZqU~jGN!y6Xs}i@vGnnpXa@;VimF*^*-d$unl%bk7QOXNOAyiSb5N zrqGQ(9U3+W3=|n_+FLG5`-Y+jY%Vq`hE+0bQ_Vv#;VzntvcLErGH2A33Thgb`5w9b zVXik8ZD~}QYPPsqRsfEv+)@({DzfRCjk=>DEs%?eC0i!>E1W(f2y6<2oVTpNrIW&T z?9h;DQ!!Z6u@k$PSjDq#S$A8BZOsmMW|qQk?9uSNz)(y+DhnMi;6iV0adH zX(wH+WA1z0r(-`3P;8PE7zDdyH@v1mCMFMmiPS7|8ipxitbvXZ<+YbyuN$f~MHtm_ z2zh}%qvD$P<+$n?zaI)}^@xt6c$pko_m-t?xZJUA*}0f4Dkw#d>o}o8Y-ET?;1mQ- z>DYwL0$M1mYNZY@45X9@D;-*=PJy0UV3BMZfv;|+Cm;&+?* zCT(L`l{ONiQK1km_q=Tz?-otRC38cIxh8N(TraXuA-%sv57i!c)`2bk6r#kRk#Bp_ zQK#aejspG7vB%cSv0pxr70;C|g+7Wp2#(;f&eS_pi~zP=u*k}X0?u{%yAxZupIShg zVdGkED8X#Qvnz7aRHyR(m?nrIv#xE{Yl>&f8taqx#C`u;%4OpsO0}5xO+p3zV|l=< zuc7x| zup^_b;MmCb*p$(7KY*(nGTIZId_O7D$#mk;(?4^;x|SolT2BdSK3`{EGw8z`tgFQA zZxX$YA>6?(j`!d$4qzUmxQAmX<20%`4~a?C$XLQHEaNTWHP~pt;m`H;nPGhiH1P@< zpm&qHonig`w0xDLE=DTjEJxk+KaF#EjrOCsMDG`<>q#8OII$$>yKs?SG^#t%q3&di zy1PSl7nHiH^#5PmORL(h>N)M_@c}dWka>K}svoj1J|X%kHT?`bINpuVu@7JHe*BX6 z-B&n;uUY#ytngdR;t_Y?JIoQ6cpTBO9O~FhtpgqVXcg!pNDa+jUjj@*N>1}S$S74~$rs|3|od%Exs@j<5c diff --git a/libjava/gnu/classpath/jdwp/VMVirtualMachine.h b/libjava/gnu/classpath/jdwp/VMVirtualMachine.h index b90b476c04bc..456053a6565f 100644 --- a/libjava/gnu/classpath/jdwp/VMVirtualMachine.h +++ b/libjava/gnu/classpath/jdwp/VMVirtualMachine.h @@ -59,6 +59,8 @@ public: static void clearEvents (jbyte); private: static ::java::util::Hashtable *_jdwp_suspend_counts; +public: // actually package-private + static ::java::util::Hashtable * _stepping_threads; public: static ::java::lang::Class class$; diff --git a/libjava/gnu/classpath/jdwp/VMVirtualMachine.java b/libjava/gnu/classpath/jdwp/VMVirtualMachine.java index 1b0f7f6fa3c4..da0fef28c102 100644 --- a/libjava/gnu/classpath/jdwp/VMVirtualMachine.java +++ b/libjava/gnu/classpath/jdwp/VMVirtualMachine.java @@ -61,6 +61,9 @@ public class VMVirtualMachine // Thread suspension table. Maps Thread to suspend count (Integer) private static Hashtable _jdwp_suspend_counts; + // List of stepping threads: maps Thread -> stepping info + static Hashtable _stepping_threads; + public static native void initialize (); /** diff --git a/libjava/gnu/classpath/jdwp/natVMVirtualMachine.cc b/libjava/gnu/classpath/jdwp/natVMVirtualMachine.cc index ab11b3ed299b..e06daa7bb242 100644 --- a/libjava/gnu/classpath/jdwp/natVMVirtualMachine.cc +++ b/libjava/gnu/classpath/jdwp/natVMVirtualMachine.cc @@ -11,6 +11,7 @@ details. */ #include #include #include +#include #include #include @@ -42,10 +43,12 @@ details. */ #include #include #include +#include #include #include #include #include +#include #include #include #include @@ -55,8 +58,19 @@ using namespace java::lang; using namespace gnu::classpath::jdwp::event; using namespace gnu::classpath::jdwp::util; +// Stepping information +struct step_info +{ + jint size; // See gnu.classpath.jdwp.JdwpConstants.StepSize + jint depth; // See gnu.classpath.jdwp.JdwpConstants.StepDepth + int stack_depth; // stack depth at start of stepping + jmethodID method; // method in which we are stepping +}; + // Forward declarations static Location *get_request_location (EventRequest *); +static gnu::classpath::jdwp::event::filters::StepFilter * +get_request_step_filter (EventRequest *); static void JNICALL jdwpClassPrepareCB (jvmtiEnv *, JNIEnv *, jthread, jclass); static void JNICALL jdwpThreadEndCB (jvmtiEnv *, JNIEnv *, jthread); static void JNICALL jdwpThreadStartCB (jvmtiEnv *, JNIEnv *, jthread); @@ -65,6 +79,9 @@ static void JNICALL jdwpVMInitCB (jvmtiEnv *, JNIEnv *, jthread); static void throw_jvmti_error (jvmtiError); #define DEFINE_CALLBACK(Cb,Event) Cb.Event = jdwp ## Event ## CB +#define DISABLE_EVENT(Event,Thread) \ + _jdwp_jvmtiEnv->SetEventNotificationMode (JVMTI_DISABLE, \ + JVMTI_EVENT_ ## Event, Thread) #define ENABLE_EVENT(Event,Thread) \ _jdwp_jvmtiEnv->SetEventNotificationMode (JVMTI_ENABLE, \ JVMTI_EVENT_ ## Event, Thread) @@ -81,6 +98,8 @@ void gnu::classpath::jdwp::VMVirtualMachine::initialize () { _jdwp_suspend_counts = new ::java::util::Hashtable (); + _stepping_threads = new ::java::util::Hashtable (); + JavaVM *vm = _Jv_GetJavaVM (); vm->GetEnv (reinterpret_cast (&_jdwp_jvmtiEnv), JVMTI_VERSION_1_0); @@ -200,6 +219,32 @@ gnu::classpath::jdwp::VMVirtualMachine::registerEvent (EventRequest *request) switch (request->getEventKind ()) { case EventRequest::EVENT_SINGLE_STEP: + { + Thread *thread; + filters::StepFilter *filter = get_request_step_filter (request); + if (filter == NULL) + { + // No filter specified: report every step in every + // thread. + thread = NULL; + } + else + { + // Add stepping information to list of stepping threads + thread = filter->getThread ()->getThread (); + _Jv_InterpFrame *frame + = reinterpret_cast<_Jv_InterpFrame *> (thread->interp_frame); + struct step_info *sinfo + = (struct step_info *) JvAllocBytes (sizeof (struct step_info)); + sinfo->size = filter->getSize (); + sinfo->depth = filter->getDepth (); + sinfo->stack_depth = frame->depth (); + sinfo->method = frame->self->get_method (); + _stepping_threads->put (thread, (jobject) sinfo); + } + + ENABLE_EVENT (SINGLE_STEP, thread); + } break; case EventRequest::EVENT_BREAKPOINT: @@ -225,7 +270,7 @@ gnu::classpath::jdwp::VMVirtualMachine::registerEvent (EventRequest *request) // Ignore the duplicate } } - break; + break; case EventRequest::EVENT_FRAME_POP: break; @@ -277,6 +322,19 @@ gnu::classpath::jdwp::VMVirtualMachine::unregisterEvent (EventRequest *request) switch (request->getEventKind ()) { case EventRequest::EVENT_SINGLE_STEP: + { + Thread *thread; + filters::StepFilter *filter = get_request_step_filter (request); + if (filter == NULL) + thread = NULL; + else + { + thread = filter->getThread ()->getThread (); + _stepping_threads->remove (thread); + } + + DISABLE_EVENT (SINGLE_STEP, thread); + } break; case EventRequest::EVENT_BREAKPOINT: @@ -527,6 +585,26 @@ getSourceFile (MAYBE_UNUSED jclass clazz) return NULL; } +static gnu::classpath::jdwp::event::filters::StepFilter * +get_request_step_filter (EventRequest *request) +{ + ::java::util::Collection *filters = request->getFilters (); + ::java::util::Iterator *iter = filters->iterator (); + filters::StepFilter *filter = NULL; + while (iter->hasNext ()) + { + using namespace gnu::classpath::jdwp::event::filters; + IEventFilter *next = (IEventFilter *) iter->next (); + if (next->getClass () == &StepFilter::class$) + { + filter = reinterpret_cast (next); + break; + } + } + + return filter; +} + static Location * get_request_location (EventRequest *request) { -- 2.47.3