aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/lang
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2002-08-29 17:53:28 +0000
committerTom Tromey <tromey@gcc.gnu.org>2002-08-29 17:53:28 +0000
commit3308c46e47a0b17d37b4c29a130e6519c424a737 (patch)
tree538202560a3a2f376b6fb55ee3b836b195f01e73 /libjava/java/lang
parentce4e997039ab374d5d1719b02aae3ded0a2a8ec4 (diff)
downloadgcc-3308c46e47a0b17d37b4c29a130e6519c424a737.zip
gcc-3308c46e47a0b17d37b4c29a130e6519c424a737.tar.gz
gcc-3308c46e47a0b17d37b4c29a130e6519c424a737.tar.bz2
jvm.h (struct _Jv_frame_info): New structure.
* include/jvm.h (struct _Jv_frame_info): New structure. * gnu/gcj/runtime/natNameFinder.cc: Include StringBuffer.h, java-interp.h. (lookupInterp): New method. (getAddrAsString): Use _Jv_frame_info. (dladdrLookup): Likewise. * gnu/gcj/runtime/NameFinder.java (lookup): Try to look up interpreted frame. (lookupInterp): Declare. * java/lang/natVMThrowable.cc: Include Thread.h, java-interp.h. (fillInStackTrace): Collect information on interpreted frames. Use _Jv_frame_info. * interpret.cc: Include Thread.h. (run): Create and push _Jv_MethodChain object. (_Jv_EndOfInterpreter): New global. * java/lang/Thread.java (interp_frame): New field. * include/java-interp.h (struct _Jv_MethodChain): New structure. Include NameFinder.h. From-SVN: r56657
Diffstat (limited to 'libjava/java/lang')
-rw-r--r--libjava/java/lang/Thread.java5
-rw-r--r--libjava/java/lang/natVMThrowable.cc30
2 files changed, 32 insertions, 3 deletions
diff --git a/libjava/java/lang/Thread.java b/libjava/java/lang/Thread.java
index af5b95f..64d58dd 100644
--- a/libjava/java/lang/Thread.java
+++ b/libjava/java/lang/Thread.java
@@ -10,6 +10,8 @@ details. */
package java.lang;
+import gnu.gcj.RawData;
+
/**
* @author Tom Tromey <tromey@cygnus.com>
* @date August 24, 1998
@@ -311,6 +313,9 @@ public class Thread implements Runnable
private boolean startable_flag;
private ClassLoader context_class_loader;
+ // This describes the top-most interpreter frame for this thread.
+ RawData interp_frame;
+
// Our native data - points to an instance of struct natThread.
private Object data;
}
diff --git a/libjava/java/lang/natVMThrowable.cc b/libjava/java/lang/natVMThrowable.cc
index 358bab7..f5c56c7 100644
--- a/libjava/java/lang/natVMThrowable.cc
+++ b/libjava/java/lang/natVMThrowable.cc
@@ -26,6 +26,8 @@ details. */
#include <java-threads.h>
#include <java/lang/Throwable.h>
#include <java/lang/VMThrowable.h>
+#include <java/lang/Thread.h>
+#include <java-interp.h>
#include <sys/types.h>
@@ -54,13 +56,35 @@ java::lang::VMThrowable::fillInStackTrace (java::lang::Throwable* t)
// to include the calls to fillInStackTrace in the trace.
int n = backtrace (p, 128) - 1;
- void **addrs;
+ _Jv_frame_info *addrs;
if (n > 0)
{
+#ifdef INTERPRETER
+ extern void _Jv_StartOfInterpreter (void);
+ extern void _Jv_EndOfInterpreter (void);
+
+ java::lang::Thread *thread = java::lang::Thread::currentThread();
+ _Jv_MethodChain *interp_frame
+ = (thread ? reinterpret_cast<_Jv_MethodChain *> (thread->interp_frame)
+ : NULL);
+#endif // INTERPRETER
+
state->length = n;
- addrs = (void **) _Jv_Malloc (n * sizeof p[0]);
+ int len = n;
+ addrs = (_Jv_frame_info *) _Jv_Malloc (n * sizeof (_Jv_frame_info));
while (n--)
- addrs[n] = p[n];
+ {
+ addrs[n].addr = p[n];
+#ifdef INTERPRETER
+ if (p[n] >= &_Jv_StartOfInterpreter && p[n] <= &_Jv_EndOfInterpreter)
+ {
+ addrs[n].interp = (void *) interp_frame->self;
+ interp_frame = interp_frame->next;
+ }
+ else
+ addrs[n].interp = 0;
+#endif // INTERPRETER
+ }
}
else
addrs = NULL;