From 6f1e93c7f179d40a03ce718a09331d584ff6a021 Mon Sep 17 00:00:00 2001 From: kgallowa Date: Mon, 29 Jan 2007 22:05:56 +0000 Subject: 2007-01-29 Kyle Galloway * include/java-interp.h: Added _Jv_Frame class and its two subclasses _Jv_InterpFrame and _Jv_NativeFrame. Also moved _Jv_FrameType from java-stack.h. * include/java-stack.h: Removed _Jv_FrameType. * java/lang/Thread.java: Added frame member to hold new composite frame stack. * java/lang/Thread.h: Regenerated. * java/lang/Thread.class: Rebuilt. * jni.cc (_Jv_JNIMethod::call): Push a frame onto the stack when calling a JNI method. * jvmti.cc (_Jv_JVMTI_GetStackTrace): New Method. (_Jv_JVMTI_GetFrameCount): New method. * stacktrace.cc (UnwindTraceFn): Modified to use new _Jv_Frame classes. * testsuite/libjava.jvmti/interp/getstacktrace.jar: New test. * testsuite/libjava.jvmti/interp/natgetstacktrace.cc: New test. * testsuite/libjava.jvmti/interp/getstacktrace.h: New test. * testsuite/libjava.jvmti/interp/getstacktrace.jar: New test. * testsuite/libjava.jvmti/interp/getstacktrace.out: Output file for test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@121314 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/include/java-interp.h | 79 +++++++++++++++++++++++++++++++++++-------- libjava/include/java-stack.h | 7 ---- 2 files changed, 65 insertions(+), 21 deletions(-) (limited to 'libjava/include') diff --git a/libjava/include/java-interp.h b/libjava/include/java-interp.h index 3b15b5cb222..3a43977747f 100644 --- a/libjava/include/java-interp.h +++ b/libjava/include/java-interp.h @@ -205,11 +205,11 @@ class _Jv_InterpMethod : public _Jv_MethodBase // number info is unavailable. int get_source_line(pc_t mpc); + public: + // Convenience function for indexing bytecode PC/insn slots in // line tables for JDWP jlong insn_index (pc_t pc); - - public: /* Get the line table for this method. * start is the lowest index in the method @@ -315,35 +315,86 @@ public: } }; -// The interpreted call stack, represented by a linked list of frames. -struct _Jv_InterpFrame +enum _Jv_FrameType { + frame_native, + frame_interpreter, + frame_proxy +}; + +// The composite call stack as represented by a linked list of frames +class _Jv_Frame +{ +public: + java::lang::Thread *thread; + union { + _Jv_MethodBase *self; void *meth; - _Jv_InterpMethod *self; _Jv_Method *proxyMethod; }; - java::lang::Thread *thread; - _Jv_InterpFrame *next; + + //The full list of frames, JNI and interpreted + _Jv_Frame *next; + _Jv_FrameType frame_type; + + _Jv_Frame (_Jv_MethodBase *s, java::lang::Thread *thr, _Jv_FrameType type) + { + self = s; + frame_type = type; + next = (_Jv_Frame *) thr->frame; + thr->frame = (gnu::gcj::RawData *) this; + thread = thr; + } + + ~_Jv_Frame () + { + thread->frame = (gnu::gcj::RawData *) next; + } +}; + +// An interpreted frame in the call stack +class _Jv_InterpFrame : public _Jv_Frame +{ +public: + + // Keep the purely interpreted list around so as not to break backtraces + _Jv_InterpFrame *next_interp; + union { pc_t pc; jclass proxyClass; }; - - _Jv_InterpFrame (void *meth, java::lang::Thread *thr, jclass proxyClass = NULL) + + //Debug info for local variables. + _Jv_word *locals; + char *locals_type; + + _Jv_InterpFrame (void *meth, java::lang::Thread *thr, jclass proxyCls = NULL) + : _Jv_Frame (reinterpret_cast<_Jv_MethodBase *> (meth), thr, + frame_interpreter) { - this->meth = meth; - thread = thr; - next = (_Jv_InterpFrame *) thr->interp_frame; + next_interp = (_Jv_InterpFrame *) thr->interp_frame; + proxyClass = proxyCls; thr->interp_frame = (gnu::gcj::RawData *) this; - this->proxyClass = proxyClass; } ~_Jv_InterpFrame () { - thread->interp_frame = (gnu::gcj::RawData *) next; + thread->interp_frame = (gnu::gcj::RawData *) next_interp; + } +}; + +// A native frame in the call stack really just a placeholder +class _Jv_NativeFrame : public _Jv_Frame +{ +public: + + _Jv_NativeFrame (_Jv_JNIMethod *s, java::lang::Thread *thr) + : _Jv_Frame (s, thr, frame_native) + { } }; diff --git a/libjava/include/java-stack.h b/libjava/include/java-stack.h index d4d63d74342..49e68412be6 100644 --- a/libjava/include/java-stack.h +++ b/libjava/include/java-stack.h @@ -41,13 +41,6 @@ extern "Java" } } -enum _Jv_FrameType -{ - frame_native, - frame_interpreter, - frame_proxy -}; - #ifdef INTERPRETER struct _Jv_InterpFrameInfo { -- cgit v1.2.1