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; }