-2007-02-07 Kyle Galloway <kgallowa@redhat.com>
+2007-02-08 Kyle Galloway <kgallowa@redhat.com>
+
+ * 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 <kgallowa@redhat.com>
* include/java-interp.h (_Jv_InterpFrame): obj_ptr field added
to hold "this" pointer for frame.
/* 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.
// 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++)
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++)
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);
{
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 *);
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:
/* 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.
*/
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
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.
*/
public Location getLocation()
* @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,
-
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-
#ifndef __gnu_classpath_jdwp_VMVirtualMachine__
{
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__ */
/* 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.
* @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;
/**
--- /dev/null
+
+// 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 <gnu/classpath/jdwp/exception/JdwpException.h>
+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__
#include <jvm.h>
#include <jvmti.h>
+#include <java-interp.h>
+
#include <java/lang/Class.h>
#include <java/lang/ClassLoader.h>
#include <java/lang/Integer.h>
#include <java/lang/StringBuilder.h>
#include <java/lang/Thread.h>
#include <java/nio/ByteBuffer.h>
+#include <java/nio/ByteBufferImpl.h>
#include <java/util/ArrayList.h>
#include <java/util/Collection.h>
#include <java/util/Hashtable.h>
#include <gnu/classpath/jdwp/event/VmInitEvent.h>
#include <gnu/classpath/jdwp/event/filters/IEventFilter.h>
#include <gnu/classpath/jdwp/event/filters/LocationOnlyFilter.h>
+#include <gnu/classpath/jdwp/exception/InvalidFrameException.h>
#include <gnu/classpath/jdwp/exception/InvalidLocationException.h>
#include <gnu/classpath/jdwp/exception/InvalidMethodException.h>
#include <gnu/classpath/jdwp/exception/JdwpInternalErrorException.h>
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<jlong> (info.method));
+
+ if (info.location == -1)
+ loc = new Location (meth, 0);
+ else
+ loc = new Location (meth, info.location);
+
+ return new VMFrame (thread, reinterpret_cast<jlong> (vm_frame), loc);
}
jint