aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorAndrew Haley <aph@redhat.com>2004-10-18 14:07:42 +0000
committerAndrew Haley <aph@gcc.gnu.org>2004-10-18 14:07:42 +0000
commit963ebe78d43b3be5e27f99c0fa2d2a3819689541 (patch)
treeeaafd833fc31fd9d7f0d109af91a4ef8d47ae4af /libjava
parente5871096f0c6581c35819a5c84ddacd02681d372 (diff)
downloadgcc-963ebe78d43b3be5e27f99c0fa2d2a3819689541.zip
gcc-963ebe78d43b3be5e27f99c0fa2d2a3819689541.tar.gz
gcc-963ebe78d43b3be5e27f99c0fa2d2a3819689541.tar.bz2
re PR libgcj/18036 (Bad interaction between interpreter and Class.forName())
2004-10-18 Andrew Haley <aph@redhat.com> PR java/18036: * gnu/gcj/runtime/natStackTrace.cc (fillInStackTrace): Reorganize and correct logic used to find interpreter. From-SVN: r89221
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog6
-rw-r--r--libjava/gnu/gcj/runtime/natStackTrace.cc31
2 files changed, 23 insertions, 14 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 70a79e0..2844e16 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,9 @@
+2004-10-18 Andrew Haley <aph@redhat.com>
+
+ PR java/18036:
+ * gnu/gcj/runtime/natStackTrace.cc (fillInStackTrace): Reorganize
+ and correct logic used to find interpreter.
+
2004-10-18 Jeroen Frijters <jeroen@frijters.net>
* java/util/logging/LogManager.java
diff --git a/libjava/gnu/gcj/runtime/natStackTrace.cc b/libjava/gnu/gcj/runtime/natStackTrace.cc
index fbe403a..d9f3355 100644
--- a/libjava/gnu/gcj/runtime/natStackTrace.cc
+++ b/libjava/gnu/gcj/runtime/natStackTrace.cc
@@ -65,7 +65,7 @@ gnu::gcj::runtime::StackTrace::fillInStackTrace (jint maxlen, jint offset)
#ifdef INTERPRETER
extern void *const _Jv_StartOfInterpreter;
extern void * _Jv_EndOfInterpreter;
-
+
java::lang::Thread *thread = java::lang::Thread::currentThread();
_Jv_MethodChain *interp_frame
= (thread ? reinterpret_cast<_Jv_MethodChain *> (thread->interp_frame)
@@ -92,20 +92,23 @@ gnu::gcj::runtime::StackTrace::fillInStackTrace (jint maxlen, jint offset)
// less than _Jv_EndOfInterpreter it might be in the
// interpreter: we call _Unwind_FindEnclosingFunction to
// find out.
- if ((_Jv_EndOfInterpreter == NULL || pc < _Jv_EndOfInterpreter)
- && (_Unwind_FindEnclosingFunction (pc)
- == _Jv_StartOfInterpreter))
- {
- frame[n].interp = (void *) interp_frame->self;
- interp_frame = interp_frame->next;
- }
- else
+ if (pc >= _Jv_StartOfInterpreter
+ && (pc < _Jv_EndOfInterpreter
+ || _Jv_EndOfInterpreter == NULL))
{
- // We've found an address that we know is not within
- // the interpreter. We use that to refine our upper
- // bound on where the interpreter ends.
- if (_Jv_EndOfInterpreter == NULL || pc < _Jv_EndOfInterpreter)
- _Jv_EndOfInterpreter = pc;
+ if (_Unwind_FindEnclosingFunction (pc)
+ == _Jv_StartOfInterpreter)
+ {
+ frame[n].interp = (void *) interp_frame->self;
+ interp_frame = interp_frame->next;
+ }
+ else
+ {
+ // We've found an address that we know is not within
+ // the interpreter. We use that to refine our upper
+ // bound on where the interpreter ends.
+ _Jv_EndOfInterpreter = pc;
+ }
}
}
#endif // INTERPRETER