This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
PR java/18036: Bad interaction between interpreter and Class.forName()
Sorry, wrong patch.
Andrew.
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.
Index: gnu/gcj/runtime/natStackTrace.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/gcj/runtime/natStackTrace.cc,v
retrieving revision 1.7
diff -p -2 -c -r1.7 natStackTrace.cc
*** gnu/gcj/runtime/natStackTrace.cc 14 Oct 2004 15:20:51 -0000 1.7
--- gnu/gcj/runtime/natStackTrace.cc 18 Oct 2004 13:56:23 -0000
*************** gnu::gcj::runtime::StackTrace::fillInSta
*** 66,70 ****
extern void *const _Jv_StartOfInterpreter;
extern void * _Jv_EndOfInterpreter;
!
java::lang::Thread *thread = java::lang::Thread::currentThread();
_Jv_MethodChain *interp_frame
--- 66,70 ----
extern void *const _Jv_StartOfInterpreter;
extern void * _Jv_EndOfInterpreter;
!
java::lang::Thread *thread = java::lang::Thread::currentThread();
_Jv_MethodChain *interp_frame
*************** gnu::gcj::runtime::StackTrace::fillInSta
*** 93,110 ****
// 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
{
! // 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;
}
}
--- 93,113 ----
// interpreter: we call _Unwind_FindEnclosingFunction to
// find out.
! if (pc >= _Jv_StartOfInterpreter
! && (pc < _Jv_EndOfInterpreter
! || _Jv_EndOfInterpreter == NULL))
{
! 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;
! }
}
}