summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkgallowa <kgallowa@138bc75d-0d04-0410-961f-82ee72b054a4>2007-04-23 17:30:29 +0000
committerkgallowa <kgallowa@138bc75d-0d04-0410-961f-82ee72b054a4>2007-04-23 17:30:29 +0000
commitca42112c32f3a96e8ef382fdfac01aae8f9a102e (patch)
tree81048b7fa6e216d50f6149770c8a5fe429e8072d
parent5be46544c62f8b3bfc70a6689ccf58a37deaef39 (diff)
downloadgcc-ca42112c32f3a96e8ef382fdfac01aae8f9a102e.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@124076 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--libjava/ChangeLog12
-rw-r--r--libjava/include/java-interp.h22
-rw-r--r--libjava/interpret-run.cc9
-rw-r--r--libjava/jvmti.cc2
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,5 +1,17 @@
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>
+
* gnu/classpath/jdwp/natVMVirtualMachine.cc (getSourceFile): Check
for null source file and throw an exception indicating this.
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;