diff options
author | Andrew Haley <aph@redhat.com> | 2004-10-18 14:07:42 +0000 |
---|---|---|
committer | Andrew Haley <aph@gcc.gnu.org> | 2004-10-18 14:07:42 +0000 |
commit | 963ebe78d43b3be5e27f99c0fa2d2a3819689541 (patch) | |
tree | eaafd833fc31fd9d7f0d109af91a4ef8d47ae4af /libjava/gnu/gcj | |
parent | e5871096f0c6581c35819a5c84ddacd02681d372 (diff) | |
download | gcc-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/gnu/gcj')
-rw-r--r-- | libjava/gnu/gcj/runtime/natStackTrace.cc | 31 |
1 files changed, 17 insertions, 14 deletions
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 |