diff options
Diffstat (limited to 'libjava')
| -rw-r--r-- | libjava/include/jvmti-int.h | 4 | ||||
| -rw-r--r-- | libjava/interpret-run.cc | 35 | ||||
| -rw-r--r-- | libjava/interpret.cc | 41 | ||||
| -rw-r--r-- | libjava/jvmti.cc | 8 | 
4 files changed, 70 insertions, 18 deletions
diff --git a/libjava/include/jvmti-int.h b/libjava/include/jvmti-int.h index 822163afa0d..f868655734a 100644 --- a/libjava/include/jvmti-int.h +++ b/libjava/include/jvmti-int.h @@ -37,6 +37,10 @@ executable file might be covered by the GNU General Public License. */     False means no JVMTI environment requested that event type. */  namespace JVMTI  { +  // Is JVMTI enabled? (i.e., any jvmtiEnv created?) +  extern bool enabled; + +  // Event notifications    extern bool VMInit;    extern bool VMDeath;    extern bool ThreadStart; diff --git a/libjava/interpret-run.cc b/libjava/interpret-run.cc index f3687459cb4..12d0b9a5683 100644 --- a/libjava/interpret-run.cc +++ b/libjava/interpret-run.cc @@ -248,7 +248,27 @@ details.  */  #ifdef DIRECT_THREADED +#ifdef DEBUG +#undef NEXT_INSN +#define NEXT_INSN							\ +  do									\ +    {									\ +      if (JVMTI_REQUESTED_EVENT (SingleStep))				\ +	{								\ +	  JNIEnv *env = _Jv_GetCurrentJNIEnv ();			\ +	  jmethodID method = meth->self;				\ +	  jlocation loc = meth->insn_index (pc);			\ +	  _Jv_JVMTI_PostEvent (JVMTI_EVENT_SINGLE_STEP, thread,		\ +			       env, method, loc);			\ +	}								\ +      goto *((pc++)->insn);						\ +    }									\ +  while (0) +#else +#undef NEXT_INSN  #define NEXT_INSN goto *((pc++)->insn) +#endif +  #define INTVAL() ((pc++)->int_val)  #define AVAL() ((pc++)->datum) @@ -281,7 +301,22 @@ details.  */  #else +#ifdef DEBUG +#define NEXT_INSN							\ +  do									\ +    {									\ +      if (JVMTI_REQUESTED_EVENT (SingleStep))				\ +	{								\ +	  JNIEnv *env = _Jv_GetCurrentJNIEnv ();			\ +	  jmethodID method = meth->self;				\ +	  jlocation loc = meth->insn_index (pc);			\ +	  _Jv_JVMTI_PostEvent (JVMTI_EVENT_SINGLE_STEP, thread,		\ +			       env, method, loc);			\ +	}								\ +      goto *(insn_target[*pc++]) +#else  #define NEXT_INSN goto *(insn_target[*pc++]) +#endif  #define GET1S() get1s (pc++)  #define GET2S() (pc += 2, get2s (pc- 2)) diff --git a/libjava/interpret.cc b/libjava/interpret.cc index 7e694a392a1..7e7d36d4e01 100644 --- a/libjava/interpret.cc +++ b/libjava/interpret.cc @@ -1297,34 +1297,34 @@ _Jv_InterpMethod::ncode ()      {        if (staticp)          { -        if (::gnu::classpath::jdwp::Jdwp::isDebugging) -		  fun = (ffi_closure_fun)&_Jv_InterpMethod::run_synch_class_debug; -		else -		  fun = (ffi_closure_fun)&_Jv_InterpMethod::run_synch_class; +	  if (JVMTI::enabled) +	    fun = (ffi_closure_fun)&_Jv_InterpMethod::run_synch_class_debug; +	  else +	    fun = (ffi_closure_fun)&_Jv_InterpMethod::run_synch_class;          }        else          { -	      if (::gnu::classpath::jdwp::Jdwp::isDebugging) -		    fun = (ffi_closure_fun)&_Jv_InterpMethod::run_synch_object_debug; -		  else -		  	fun = (ffi_closure_fun)&_Jv_InterpMethod::run_synch_object; -        }  +	  if (JVMTI::enabled) +	    fun = (ffi_closure_fun)&_Jv_InterpMethod::run_synch_object_debug; +	  else +	    fun = (ffi_closure_fun)&_Jv_InterpMethod::run_synch_object; +        }      }    else      {        if (staticp)          { -	      if (::gnu::classpath::jdwp::Jdwp::isDebugging) -		    fun = (ffi_closure_fun)&_Jv_InterpMethod::run_class_debug; -		  else -		    fun = (ffi_closure_fun)&_Jv_InterpMethod::run_class; +	  if (JVMTI::enabled) +	    fun = (ffi_closure_fun)&_Jv_InterpMethod::run_class_debug; +	  else +	    fun = (ffi_closure_fun)&_Jv_InterpMethod::run_class;          }        else          { -	      if (::gnu::classpath::jdwp::Jdwp::isDebugging) -		    fun = (ffi_closure_fun)&_Jv_InterpMethod::run_normal_debug; -		  else -		    fun = (ffi_closure_fun)&_Jv_InterpMethod::run_normal; +	  if (JVMTI::enabled) +	    fun = (ffi_closure_fun)&_Jv_InterpMethod::run_normal_debug; +	  else +	    fun = (ffi_closure_fun)&_Jv_InterpMethod::run_normal;          }      } @@ -1680,7 +1680,12 @@ void  _Jv_CompileMethod (_Jv_InterpMethod* method)  {    if (method->prepared == NULL) -    _Jv_InterpMethod::run (NULL, NULL, method); +    { +      if (JVMTI::enabled) +	_Jv_InterpMethod::run_debug (NULL, NULL, method); +      else +      _Jv_InterpMethod::run (NULL, NULL, method); +    }  }  #endif // DIRECT_THREADED diff --git a/libjava/jvmti.cc b/libjava/jvmti.cc index c9c7e7ba731..2e32634b202 100644 --- a/libjava/jvmti.cc +++ b/libjava/jvmti.cc @@ -44,6 +44,10 @@ static void check_enabled_event (jvmtiEvent);  namespace JVMTI  { +  // Is JVMTI enabled? (i.e., any jvmtiEnv created?) +  bool enabled; + +  // Event notifications    bool VMInit = false;    bool VMDeath = false;    bool ThreadStart = false; @@ -1754,6 +1758,10 @@ _Jv_GetJVMTIEnv (void)        }    } +  /* Mark JVMTI active. This is used to force the interpreter +     to use either debugging or non-debugging code. Once JVMTI +     has been enabled, the non-debug interpreter cannot be used. */ +  JVMTI::enabled = true;    return env;  }  | 

