From d76473618c43c7a073359a300113fa5cf21fd999 Mon Sep 17 00:00:00 2001 From: Kyle Galloway Date: Mon, 23 Apr 2007 17:30:29 +0000 Subject: [PATCH] java-interp.h (_Jv_InterpFrame): Add pointer to the interpreter PC. 2007-04-23 Kyle Galloway * include/java-interp.h (_Jv_InterpFrame): Add pointer to the interpreter PC. (): Add a pointer to the interpreter PC as a parameter with default value NULL. (get_pc): New method. * interpret-run.cc: If debugging, pass a pointer to the PC when creating the stack frame. * jvmti.cc (_Jv_JVMTI_GetStackTrace): Call _Jv_InterpFrame::get_pc to get the PC. From-SVN: r124076 --- libjava/ChangeLog | 12 ++++++++++++ libjava/include/java-interp.h | 22 ++++++++++++++++++++-- libjava/interpret-run.cc | 9 +++++++-- libjava/jvmti.cc | 2 +- 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 5d51892301e..b93bb3cd0a4 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,15 @@ +2007-04-23 Kyle Galloway + + * include/java-interp.h (_Jv_InterpFrame): Add pointer to the + interpreter PC. + (): Add a pointer to the interpreter PC as a parameter with + default value NULL. + (get_pc): New method. + * interpret-run.cc: If debugging, pass a pointer to the PC when + creating the stack frame. + * jvmti.cc (_Jv_JVMTI_GetStackTrace): Call _Jv_InterpFrame::get_pc + to get the PC. + 2007-04-23 Kyle Galloway * gnu/classpath/jdwp/natVMVirtualMachine.cc (getSourceFile): Check diff --git a/libjava/include/java-interp.h b/libjava/include/java-interp.h index ee45faa18d8..8da0584af8e 100644 --- a/libjava/include/java-interp.h +++ b/libjava/include/java-interp.h @@ -422,6 +422,9 @@ public: pc_t pc; jclass proxyClass; }; + + // Pointer to the actual pc value. + pc_t *pc_ptr; //Debug info for local variables. _Jv_word *locals; @@ -430,7 +433,8 @@ public: // Object pointer for this frame ("this") jobject obj_ptr; - _Jv_InterpFrame (void *meth, java::lang::Thread *thr, jclass proxyCls = NULL) + _Jv_InterpFrame (void *meth, java::lang::Thread *thr, jclass proxyCls = NULL, + pc_t *pc = NULL) : _Jv_Frame (reinterpret_cast<_Jv_MethodBase *> (meth), thr, frame_interpreter) { @@ -438,6 +442,7 @@ public: proxyClass = proxyCls; thr->interp_frame = (gnu::gcj::RawData *) this; obj_ptr = NULL; + pc_ptr = pc; } ~_Jv_InterpFrame () @@ -448,7 +453,20 @@ public: jobject get_this_ptr () { return obj_ptr; - } + } + + pc_t get_pc () + { + pc_t pc; + + // If the PC_PTR is NULL, we are not debugging. + if (pc_ptr == NULL) + pc = 0; + else + pc = *pc_ptr; + + return pc; + } }; // A native frame in the call stack really just a placeholder diff --git a/libjava/interpret-run.cc b/libjava/interpret-run.cc index 649b1bd2486..9e1ed2e9c4e 100644 --- a/libjava/interpret-run.cc +++ b/libjava/interpret-run.cc @@ -12,6 +12,8 @@ details. */ * compiled directly. */ using namespace java::lang::reflect; + + pc_t pc = NULL; // FRAME_DESC registers this particular invocation as the top-most // interpreter frame. This lets the stack tracing code (for @@ -20,7 +22,12 @@ details. */ // destructor so it cleans up automatically when the interpreter // returns. java::lang::Thread *thread = java::lang::Thread::currentThread(); + +#ifdef DEBUG + _Jv_InterpFrame frame_desc (meth, thread, NULL, &pc); +#else _Jv_InterpFrame frame_desc (meth, thread); +#endif _Jv_word stack[meth->max_stack]; _Jv_word *sp = stack; @@ -334,8 +341,6 @@ details. */ #endif }; - pc_t pc; - #ifdef DIRECT_THREADED #ifdef DEBUG diff --git a/libjava/jvmti.cc b/libjava/jvmti.cc index 716e96ae682..c13bb5aa397 100644 --- a/libjava/jvmti.cc +++ b/libjava/jvmti.cc @@ -1245,7 +1245,7 @@ _Jv_JVMTI_GetStackTrace (MAYBE_UNUSED jvmtiEnv *env, jthread thread, = static_cast<_Jv_InterpMethod *> (frame->self); _Jv_InterpFrame *interp_frame = static_cast<_Jv_InterpFrame *> (frame); - frames[i].location = imeth->insn_index (interp_frame->pc); + frames[i].location = imeth->insn_index (interp_frame->get_pc ()); } else frames[i].location = -1;