diff options
author | Tom Tromey <tromey@redhat.com> | 2002-08-29 17:53:28 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2002-08-29 17:53:28 +0000 |
commit | 3308c46e47a0b17d37b4c29a130e6519c424a737 (patch) | |
tree | 538202560a3a2f376b6fb55ee3b836b195f01e73 /libjava/gnu | |
parent | ce4e997039ab374d5d1719b02aae3ded0a2a8ec4 (diff) | |
download | gcc-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/gnu')
-rw-r--r-- | libjava/gnu/gcj/runtime/NameFinder.java | 11 | ||||
-rw-r--r-- | libjava/gnu/gcj/runtime/natNameFinder.cc | 40 |
2 files changed, 44 insertions, 7 deletions
diff --git a/libjava/gnu/gcj/runtime/NameFinder.java b/libjava/gnu/gcj/runtime/NameFinder.java index 60f47ac..f32ebe0 100644 --- a/libjava/gnu/gcj/runtime/NameFinder.java +++ b/libjava/gnu/gcj/runtime/NameFinder.java @@ -173,17 +173,26 @@ public class NameFinder native private String getAddrAsString(RawData addrs, int n); /** + * If nth element of stack is an interpreted frame, return the + * element representing the method being interpreted. + */ + native private StackTraceElement lookupInterp(RawData addrs, int n); + + /** * Creates the nth StackTraceElement from the given native stacktrace. */ private StackTraceElement lookup(RawData addrs, int n) { StackTraceElement result; - result = dladdrLookup(addrs, n); + result = lookupInterp(addrs, n); + if (result == null) + result = dladdrLookup(addrs, n); if (result == null) { String name = null; String file = null; + String hex = getAddrAsString(addrs, n); if (addr2line != null) diff --git a/libjava/gnu/gcj/runtime/natNameFinder.cc b/libjava/gnu/gcj/runtime/natNameFinder.cc index 42cc164..29488ed 100644 --- a/libjava/gnu/gcj/runtime/natNameFinder.cc +++ b/libjava/gnu/gcj/runtime/natNameFinder.cc @@ -1,4 +1,4 @@ -// natNameFinder.cc - native helper methods for NameFiner.java +// natNameFinder.cc - native helper methods for NameFinder.java /* Copyright (C) 2002 Free Software Foundation, Inc @@ -19,6 +19,8 @@ details. */ #include <jvm.h> #include <java/lang/String.h> #include <java/lang/StackTraceElement.h> +#include <java/lang/StringBuffer.h> +#include <java-interp.h> #include <gnu/gcj/runtime/NameFinder.h> @@ -29,15 +31,15 @@ details. */ java::lang::String* gnu::gcj::runtime::NameFinder::getExecutable (void) { - return JvNewStringLatin1 (_Jv_ThisExecutable ()); + return JvNewStringLatin1 (_Jv_ThisExecutable ()); } java::lang::String* gnu::gcj::runtime::NameFinder::getAddrAsString(RawData* addrs, jint n) { - void **p = (void **) addrs; + _Jv_frame_info *p = (_Jv_frame_info *) addrs; typedef unsigned word_t __attribute ((mode (word))); - word_t w = (word_t) p[n]; + word_t w = (word_t) p[n].addr; int digits = sizeof (void *) * 2; char hex[digits+5]; @@ -61,8 +63,8 @@ gnu::gcj::runtime::NameFinder::dladdrLookup(RawData* addrs, jint n) extern char **_Jv_argv; char name[1024]; char file_name[1024]; - void **stack = (void **) addrs; - void* p = stack[n]; + _Jv_frame_info *stack = (_Jv_frame_info *) addrs; + void* p = stack[n].addr; Dl_info dl_info; if (dladdr (p, &dl_info)) @@ -82,3 +84,29 @@ gnu::gcj::runtime::NameFinder::dladdrLookup(RawData* addrs, jint n) #endif return NULL; } + +java::lang::StackTraceElement * +gnu::gcj::runtime::NameFinder::lookupInterp(RawData* addrs, jint n) +{ +#ifdef INTERPRETER + _Jv_frame_info *stack = (_Jv_frame_info *) addrs; + if (stack[n].interp == NULL) + return NULL; + + _Jv_InterpMethod *meth + = reinterpret_cast<_Jv_InterpMethod *> (stack[n].interp); + // FIXME: demangle. + java::lang::StringBuffer *sb = new java::lang::StringBuffer(); + sb->append(_Jv_NewStringUtf8Const(meth->self->name)); + sb->append(_Jv_NewStringUtf8Const(meth->self->signature)); + // FIXME: source file name and line number can be found from + // bytecode debug information. But currently we don't keep that + // around. + // FIXME: is using the defining class correct here? + return new java::lang::StackTraceElement(NULL, -1, + meth->defining_class->getName(), + sb->toString(), false); +#else // INTERPRETER + return NULL; +#endif // INTERPRETER +} |