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
This commit is contained in:
Andrew Haley 2004-10-18 14:07:42 +00:00 committed by Andrew Haley
parent e5871096f0
commit 963ebe78d4
2 changed files with 23 additions and 14 deletions

View File

@ -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

View File

@ -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))
if (pc >= _Jv_StartOfInterpreter
&& (pc < _Jv_EndOfInterpreter
|| _Jv_EndOfInterpreter == NULL))
{
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.
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