java-interp.h (_Jv_InterpFrame): Add pointer to the interpreter PC.

2007-04-23  Kyle Galloway  <kgallowa@redhat.com>

	* include/java-interp.h (_Jv_InterpFrame): Add pointer to the
	interpreter PC.
	(<init>): 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
This commit is contained in:
Kyle Galloway 2007-04-23 17:30:29 +00:00 committed by Kyle Galloway
parent 34a7526e36
commit d76473618c
4 changed files with 40 additions and 5 deletions

View File

@ -1,3 +1,15 @@
2007-04-23 Kyle Galloway <kgallowa@redhat.com>
* include/java-interp.h (_Jv_InterpFrame): Add pointer to the
interpreter PC.
(<init>): 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 <kgallowa@redhat.com> 2007-04-23 Kyle Galloway <kgallowa@redhat.com>
* gnu/classpath/jdwp/natVMVirtualMachine.cc (getSourceFile): Check * gnu/classpath/jdwp/natVMVirtualMachine.cc (getSourceFile): Check

View File

@ -423,6 +423,9 @@ public:
jclass proxyClass; jclass proxyClass;
}; };
// Pointer to the actual pc value.
pc_t *pc_ptr;
//Debug info for local variables. //Debug info for local variables.
_Jv_word *locals; _Jv_word *locals;
char *locals_type; char *locals_type;
@ -430,7 +433,8 @@ public:
// Object pointer for this frame ("this") // Object pointer for this frame ("this")
jobject obj_ptr; 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, : _Jv_Frame (reinterpret_cast<_Jv_MethodBase *> (meth), thr,
frame_interpreter) frame_interpreter)
{ {
@ -438,6 +442,7 @@ public:
proxyClass = proxyCls; proxyClass = proxyCls;
thr->interp_frame = (gnu::gcj::RawData *) this; thr->interp_frame = (gnu::gcj::RawData *) this;
obj_ptr = NULL; obj_ptr = NULL;
pc_ptr = pc;
} }
~_Jv_InterpFrame () ~_Jv_InterpFrame ()
@ -449,6 +454,19 @@ public:
{ {
return obj_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 // A native frame in the call stack really just a placeholder

View File

@ -13,6 +13,8 @@ details. */
using namespace java::lang::reflect; using namespace java::lang::reflect;
pc_t pc = NULL;
// FRAME_DESC registers this particular invocation as the top-most // FRAME_DESC registers this particular invocation as the top-most
// interpreter frame. This lets the stack tracing code (for // interpreter frame. This lets the stack tracing code (for
// Throwable) print information about the method being interpreted // Throwable) print information about the method being interpreted
@ -20,7 +22,12 @@ details. */
// destructor so it cleans up automatically when the interpreter // destructor so it cleans up automatically when the interpreter
// returns. // returns.
java::lang::Thread *thread = java::lang::Thread::currentThread(); 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); _Jv_InterpFrame frame_desc (meth, thread);
#endif
_Jv_word stack[meth->max_stack]; _Jv_word stack[meth->max_stack];
_Jv_word *sp = stack; _Jv_word *sp = stack;
@ -334,8 +341,6 @@ details. */
#endif #endif
}; };
pc_t pc;
#ifdef DIRECT_THREADED #ifdef DIRECT_THREADED
#ifdef DEBUG #ifdef DEBUG

View File

@ -1245,7 +1245,7 @@ _Jv_JVMTI_GetStackTrace (MAYBE_UNUSED jvmtiEnv *env, jthread thread,
= static_cast<_Jv_InterpMethod *> (frame->self); = static_cast<_Jv_InterpMethod *> (frame->self);
_Jv_InterpFrame *interp_frame _Jv_InterpFrame *interp_frame
= static_cast<_Jv_InterpFrame *> (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 else
frames[i].location = -1; frames[i].location = -1;