From: kgallowa Date: Thu, 8 Feb 2007 18:21:00 +0000 (+0000) Subject: 2007-02-08 Kyle Galloway X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=11507823642303fec2c415c49d20e761781e5d8e;p=thirdparty%2Fgcc.git 2007-02-08 Kyle Galloway * classpath/gnu/classpath/jdwp/processor/ StackFrameCommandSet.java (executeGetValues): Pass jlong instead of ByteBuffer. (executeSetValues): Ditto. (executeThisObject): Ditto. * classpath/gnu/classpath/jdwp/processor/ StackFrameCommandSet.class: Rebuilt. * classpath/lib/gnu/classpath/jdwp/VMVirtualMachine.class: Rebuilt. * classpath/lib/gnu/classpath/jdwp/VMFrame.class: Rebuilt. * classpath/lib/gnu/classpath/jdwp/exception/ InvalidFrameException.java: New file. * gnu/classpath/jdwp/VMFrame.java: Added field for thread of frame. (Constructor): New method. * gnu/classpath/jdwp/VMFrame.h: Regenerated. * gnu/classpath/jdwp/VMVirtualMachine.java (getFrame): Changed ByteBuffer to jlong. * gnu/classpath/jdwp/natVMVirtualMachine.cc (getFrame): Implement. * gnu/classpath/jdwp/VMVirtualMachine.h: Regenerated. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@121719 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/libjava/ChangeLog b/libjava/ChangeLog index e3fc13254958..315912da9116 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,4 +1,28 @@ -2007-02-07 Kyle Galloway +2007-02-08 Kyle Galloway + + * classpath/gnu/classpath/jdwp/processor/ + StackFrameCommandSet.java (executeGetValues): Pass jlong instead + of ByteBuffer. + (executeSetValues): Ditto. + (executeThisObject): Ditto. + * classpath/gnu/classpath/jdwp/processor/ + StackFrameCommandSet.class: Rebuilt. + * classpath/lib/gnu/classpath/jdwp/VMVirtualMachine.class: + Rebuilt. + * classpath/lib/gnu/classpath/jdwp/VMFrame.class: Rebuilt. + * classpath/lib/gnu/classpath/jdwp/exception/ + InvalidFrameException.java: New file. + * gnu/classpath/jdwp/VMFrame.java: Added field for thread of + frame. + (Constructor): New method. + * gnu/classpath/jdwp/VMFrame.h: Regenerated. + * gnu/classpath/jdwp/VMVirtualMachine.java + (getFrame): Changed ByteBuffer to jlong. + * gnu/classpath/jdwp/natVMVirtualMachine.cc + (getFrame): Implement. + * gnu/classpath/jdwp/VMVirtualMachine.h: Regenerated. + +2007-02-08 Kyle Galloway * include/java-interp.h (_Jv_InterpFrame): obj_ptr field added to hold "this" pointer for frame. diff --git a/libjava/classpath/gnu/classpath/jdwp/processor/StackFrameCommandSet.java b/libjava/classpath/gnu/classpath/jdwp/processor/StackFrameCommandSet.java index 7890a8e4b1bc..cf1e8c272dab 100644 --- a/libjava/classpath/gnu/classpath/jdwp/processor/StackFrameCommandSet.java +++ b/libjava/classpath/gnu/classpath/jdwp/processor/StackFrameCommandSet.java @@ -1,5 +1,5 @@ /* StackFrameCommandSet.java -- class to implement the StackFrame Command Set - Copyright (C) 2005 Free Software Foundation + Copyright (C) 2005, 2007 Free Software Foundation This file is part of GNU Classpath. @@ -107,7 +107,8 @@ public class StackFrameCommandSet // has a reference to them. Furthermore they are not ReferenceTypeIds since // these are held permanently and we want these to be held only as long as // the Thread is suspended. - VMFrame frame = VMVirtualMachine.getFrame(thread, bb); + long frameID = bb.getLong(); + VMFrame frame = VMVirtualMachine.getFrame(thread, frameID); int slots = bb.getInt(); os.writeInt(slots); // Looks pointless but this is the protocol for (int i = 0; i < slots; i++) @@ -125,7 +126,8 @@ public class StackFrameCommandSet ObjectId tId = idMan.readObjectId(bb); Thread thread = (Thread) tId.getObject(); - VMFrame frame = VMVirtualMachine.getFrame(thread, bb); + long frameID = bb.getLong(); + VMFrame frame = VMVirtualMachine.getFrame(thread, frameID); int slots = bb.getInt(); for (int i = 0; i < slots; i++) @@ -142,7 +144,8 @@ public class StackFrameCommandSet ObjectId tId = idMan.readObjectId(bb); Thread thread = (Thread) tId.getObject(); - VMFrame frame = VMVirtualMachine.getFrame(thread, bb); + long frameID = bb.getLong(); + VMFrame frame = VMVirtualMachine.getFrame(thread, frameID); Object thisObject = frame.getObject(); Value.writeTaggedValue(os, thisObject); diff --git a/libjava/classpath/lib/gnu/classpath/jdwp/VMFrame.class b/libjava/classpath/lib/gnu/classpath/jdwp/VMFrame.class index 40c8c2da7c26..10e284132fa3 100644 Binary files a/libjava/classpath/lib/gnu/classpath/jdwp/VMFrame.class and b/libjava/classpath/lib/gnu/classpath/jdwp/VMFrame.class differ diff --git a/libjava/classpath/lib/gnu/classpath/jdwp/VMVirtualMachine.class b/libjava/classpath/lib/gnu/classpath/jdwp/VMVirtualMachine.class index 7b7be23febcc..526d30b221bf 100644 Binary files a/libjava/classpath/lib/gnu/classpath/jdwp/VMVirtualMachine.class and b/libjava/classpath/lib/gnu/classpath/jdwp/VMVirtualMachine.class differ diff --git a/libjava/classpath/lib/gnu/classpath/jdwp/exception/InvalidFrameException.class b/libjava/classpath/lib/gnu/classpath/jdwp/exception/InvalidFrameException.class new file mode 100644 index 000000000000..9bdf0783cf37 Binary files /dev/null and b/libjava/classpath/lib/gnu/classpath/jdwp/exception/InvalidFrameException.class differ diff --git a/libjava/classpath/lib/gnu/classpath/jdwp/processor/StackFrameCommandSet.class b/libjava/classpath/lib/gnu/classpath/jdwp/processor/StackFrameCommandSet.class index 9e8d2a02bc4d..5b8fa18bafab 100644 Binary files a/libjava/classpath/lib/gnu/classpath/jdwp/processor/StackFrameCommandSet.class and b/libjava/classpath/lib/gnu/classpath/jdwp/processor/StackFrameCommandSet.class differ diff --git a/libjava/gnu/classpath/jdwp/VMFrame.h b/libjava/gnu/classpath/jdwp/VMFrame.h index 5278a192c6a0..8181f86a2c02 100644 --- a/libjava/gnu/classpath/jdwp/VMFrame.h +++ b/libjava/gnu/classpath/jdwp/VMFrame.h @@ -29,7 +29,7 @@ class gnu::classpath::jdwp::VMFrame : public ::java::lang::Object { public: - VMFrame(); + VMFrame(::java::lang::Thread *, jlong, ::gnu::classpath::jdwp::util::Location *); virtual ::gnu::classpath::jdwp::util::Location * getLocation(); virtual ::java::lang::Object * getValue(jint); virtual void setValue(jint, ::java::lang::Object *); @@ -37,7 +37,8 @@ public: virtual jlong getId(); static const jint SIZE = 8; private: - ::java::lang::Object * __attribute__((aligned(__alignof__( ::java::lang::Object)))) obj; + ::java::lang::Thread * __attribute__((aligned(__alignof__( ::java::lang::Object)))) thread; + ::java::lang::Object * obj; ::gnu::classpath::jdwp::util::Location * loc; jlong id; public: diff --git a/libjava/gnu/classpath/jdwp/VMFrame.java b/libjava/gnu/classpath/jdwp/VMFrame.java index cd213025a724..e0f093fd6859 100644 --- a/libjava/gnu/classpath/jdwp/VMFrame.java +++ b/libjava/gnu/classpath/jdwp/VMFrame.java @@ -1,5 +1,5 @@ /* VMFrame.java -- Reference implementation of VM hooks for JDWP Frame access. - Copyright (C) 2005, 2006 Free Software Foundation + Copyright (C) 2005, 2006, 2007 Free Software Foundation This file is part of GNU Classpath. @@ -54,7 +54,10 @@ public class VMFrame */ public static final int SIZE = 8; - // The object this frame resides in + // The thread this frame resides in + private Thread thread; + + //The object of this frame private Object obj; // The current location of this frame @@ -63,6 +66,20 @@ public class VMFrame // id of this frame private long id; + /** + * Create a new VMFrame object. + * + * @param thr a Thread, the thread this frame is in + * @param frame_id a long, the jframeID of this frame + * @param frame_loc a Location, the location of this frame + */ + public VMFrame(Thread thr, long frame_id, Location frame_loc) + { + thread = thr; + id = frame_id; + loc = frame_loc; + } + /** * Gets the current location of the frame. */ @@ -84,6 +101,14 @@ public class VMFrame * @param value The value to assign the variable to */ public native void setValue(int slot, Object value); + + /** + * Get the thread this frame is in. + */ + public Thread getThread() + { + return thread; + } /** * Get the object which is represented by 'this' in the context of the frame, diff --git a/libjava/gnu/classpath/jdwp/VMVirtualMachine.h b/libjava/gnu/classpath/jdwp/VMVirtualMachine.h index a9a3b6df8e15..b90b476c04bc 100644 --- a/libjava/gnu/classpath/jdwp/VMVirtualMachine.h +++ b/libjava/gnu/classpath/jdwp/VMVirtualMachine.h @@ -1,4 +1,3 @@ - // DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*- #ifndef __gnu_classpath_jdwp_VMVirtualMachine__ @@ -17,59 +16,52 @@ extern "Java" { namespace jdwp { - class VMFrame; - class VMMethod; - class VMVirtualMachine; + class VMVirtualMachine; namespace event { - class EventRequest; + class EventRequest; } namespace util { - class MethodResult; + class MethodResult; } + class VMFrame; + class VMMethod; } } } - namespace java - { - namespace nio - { - class ByteBuffer; - } - } } class gnu::classpath::jdwp::VMVirtualMachine : public ::java::lang::Object { - public: - VMVirtualMachine(); - static void initialize(); - static void suspendThread(::java::lang::Thread *); - static void suspendAllThreads(); - static void resumeThread(::java::lang::Thread *); - static void resumeAllThreads(); - static jint getSuspendCount(::java::lang::Thread *); - static jint getAllLoadedClassesCount(); - static ::java::util::Iterator * getAllLoadedClasses(); - static jint getClassStatus(::java::lang::Class *); - static JArray< ::gnu::classpath::jdwp::VMMethod * > * getAllClassMethods(::java::lang::Class *); - static ::gnu::classpath::jdwp::VMMethod * getClassMethod(::java::lang::Class *, jlong); - static ::java::util::ArrayList * getFrames(::java::lang::Thread *, jint, jint); - static ::gnu::classpath::jdwp::VMFrame * getFrame(::java::lang::Thread *, ::java::nio::ByteBuffer *); - static jint getFrameCount(::java::lang::Thread *); - static jint getThreadStatus(::java::lang::Thread *); - static ::java::util::ArrayList * getLoadRequests(::java::lang::ClassLoader *); - static ::gnu::classpath::jdwp::util::MethodResult * executeMethod(::java::lang::Object *, ::java::lang::Thread *, ::java::lang::Class *, ::java::lang::reflect::Method *, JArray< ::java::lang::Object * > *, jboolean); - static ::java::lang::String * getSourceFile(::java::lang::Class *); - static void registerEvent(::gnu::classpath::jdwp::event::EventRequest *); - static void unregisterEvent(::gnu::classpath::jdwp::event::EventRequest *); - static void clearEvents(jbyte); + VMVirtualMachine (); + static void initialize (); + static void suspendThread (::java::lang::Thread *); + static void suspendAllThreads (); + static void resumeThread (::java::lang::Thread *); + static void resumeAllThreads (); + static jint getSuspendCount (::java::lang::Thread *); + static jint getAllLoadedClassesCount (); + static ::java::util::Iterator *getAllLoadedClasses (); + static jint getClassStatus (::java::lang::Class *); + static JArray< ::gnu::classpath::jdwp::VMMethod *> *getAllClassMethods (::java::lang::Class *); + static ::gnu::classpath::jdwp::VMMethod *getClassMethod (::java::lang::Class *, jlong); + static ::java::util::ArrayList *getFrames (::java::lang::Thread *, jint, jint); + static ::gnu::classpath::jdwp::VMFrame *getFrame (::java::lang::Thread *, jlong); + static jint getFrameCount (::java::lang::Thread *); + static jint getThreadStatus (::java::lang::Thread *); + static ::java::util::ArrayList *getLoadRequests (::java::lang::ClassLoader *); + static ::gnu::classpath::jdwp::util::MethodResult *executeMethod (::java::lang::Object *, ::java::lang::Thread *, ::java::lang::Class *, ::java::lang::reflect::Method *, JArray< ::java::lang::Object *> *, jboolean); + static ::java::lang::String *getSourceFile (::java::lang::Class *); + static void registerEvent (::gnu::classpath::jdwp::event::EventRequest *); + static void unregisterEvent (::gnu::classpath::jdwp::event::EventRequest *); + static void clearEvents (jbyte); private: - static ::java::util::Hashtable * _jdwp_suspend_counts; + static ::java::util::Hashtable *_jdwp_suspend_counts; public: + static ::java::lang::Class class$; }; -#endif // __gnu_classpath_jdwp_VMVirtualMachine__ +#endif /* __gnu_classpath_jdwp_VMVirtualMachine__ */ diff --git a/libjava/gnu/classpath/jdwp/VMVirtualMachine.java b/libjava/gnu/classpath/jdwp/VMVirtualMachine.java index 5c4018fce131..1b0f7f6fa3c4 100644 --- a/libjava/gnu/classpath/jdwp/VMVirtualMachine.java +++ b/libjava/gnu/classpath/jdwp/VMVirtualMachine.java @@ -1,7 +1,7 @@ /* VMVirtualMachine.java -- A reference implementation of a JDWP virtual machine - Copyright (C) 2005, 2006 Free Software Foundation + Copyright (C) 2005, 2006, 2007 Free Software Foundation This file is part of GNU Classpath. @@ -243,7 +243,7 @@ public class VMVirtualMachine * @param bb buffer containing the frame's ID * @return the desired frame */ - public static native VMFrame getFrame (Thread thread, ByteBuffer bb) + public static native VMFrame getFrame (Thread thread, long frameID) throws JdwpException; /** diff --git a/libjava/gnu/classpath/jdwp/exception/InvalidFrameException.h b/libjava/gnu/classpath/jdwp/exception/InvalidFrameException.h new file mode 100644 index 000000000000..abe84e0e4e02 --- /dev/null +++ b/libjava/gnu/classpath/jdwp/exception/InvalidFrameException.h @@ -0,0 +1,36 @@ + +// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*- + +#ifndef __gnu_classpath_jdwp_exception_InvalidFrameException__ +#define __gnu_classpath_jdwp_exception_InvalidFrameException__ + +#pragma interface + +#include +extern "Java" +{ + namespace gnu + { + namespace classpath + { + namespace jdwp + { + namespace exception + { + class InvalidFrameException; + } + } + } + } +} + +class gnu::classpath::jdwp::exception::InvalidFrameException : public ::gnu::classpath::jdwp::exception::JdwpException +{ + +public: + InvalidFrameException(jlong); + InvalidFrameException(::java::lang::String *); + static ::java::lang::Class class$; +}; + +#endif // __gnu_classpath_jdwp_exception_InvalidFrameException__ diff --git a/libjava/gnu/classpath/jdwp/natVMVirtualMachine.cc b/libjava/gnu/classpath/jdwp/natVMVirtualMachine.cc index 208e689b79d5..ab11b3ed299b 100644 --- a/libjava/gnu/classpath/jdwp/natVMVirtualMachine.cc +++ b/libjava/gnu/classpath/jdwp/natVMVirtualMachine.cc @@ -14,6 +14,8 @@ details. */ #include #include +#include + #include #include #include @@ -21,6 +23,7 @@ details. */ #include #include #include +#include #include #include #include @@ -39,6 +42,7 @@ details. */ #include #include #include +#include #include #include #include @@ -432,9 +436,50 @@ gnu::classpath::jdwp::VMVirtualMachine::getFrames (MAYBE_UNUSED Thread *thread, gnu::classpath::jdwp::VMFrame * gnu::classpath::jdwp::VMVirtualMachine:: -getFrame (MAYBE_UNUSED Thread *thread, MAYBE_UNUSED::java::nio::ByteBuffer *bb) +getFrame (Thread *thread, jlong frameID) { - return NULL; + using namespace gnu::classpath::jdwp::exception; + + _Jv_Frame *vm_frame = (_Jv_Frame *) thread->frame; + jint depth = 0; + _Jv_Frame *frame = reinterpret_cast<_Jv_Frame *> (frameID); + + // We need to find the stack depth of the frame, so search through the call + // stack to find it. This also checks for a valid frameID. + while (vm_frame != frame) + { + vm_frame = vm_frame->next; + depth++; + if (vm_frame == NULL) + throw new InvalidFrameException (frameID); + } + + Location *loc = NULL; + jvmtiFrameInfo info; + jvmtiError jerr; + jint num_frames; + jclass klass; + + // Get the info for the frame of interest + jerr = _jdwp_jvmtiEnv->GetStackTrace (thread, depth, 1, &info, &num_frames); + + if (jerr != JVMTI_ERROR_NONE) + throw_jvmti_error (jerr); + + jerr = _jdwp_jvmtiEnv->GetMethodDeclaringClass (info.method, &klass); + + if (jerr != JVMTI_ERROR_NONE) + throw_jvmti_error (jerr); + + VMMethod *meth + = getClassMethod (klass, reinterpret_cast (info.method)); + + if (info.location == -1) + loc = new Location (meth, 0); + else + loc = new Location (meth, info.location); + + return new VMFrame (thread, reinterpret_cast (vm_frame), loc); } jint