diff options
author | kseitz <kseitz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-01-31 23:25:39 +0000 |
---|---|---|
committer | kseitz <kseitz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-01-31 23:25:39 +0000 |
commit | 3853513aa6e0061ac98e3fc71221e0b1d348b21f (patch) | |
tree | eb4277ca347ad0027cd2c3b4f8f751b457bc9b47 /libjava | |
parent | 44db1fbc779ee764c76e46212057aef21725d72c (diff) | |
download | gcc-3853513aa6e0061ac98e3fc71221e0b1d348b21f.tar.gz |
* include/jvmti-int.h (JVMTI): Declare member "enabled".
* jvmti.cc (JVMTI): Add member "enabled".
(_Jv_GetJVMTIEnv): Mark JVMTI enabled.
* interpret.cc (_Jv_InterpMethod::ncode): Use JVMTI::enabled
instead of gnu::classpath::jdwp::Jdwp::isDebugging.
(_Jv_CompileMethod): If JVMTI is enabled, use run_debug
instead of run to compile the method.
* interpret-run.cc [DEBUG] (NEXT_INSN): Add JVMTI single step
notification.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@121442 138bc75d-0d04-0410-961f-82ee72b054a4
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; } |