Commit 0588f8c8 by Kyle Galloway Committed by Kyle Galloway

StackFrameCommandSet.java (executeGetValues): Pass jlong instead of ByteBuffer.

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.

From-SVN: r121719
parent e9105edd
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 * include/java-interp.h (_Jv_InterpFrame): obj_ptr field added
to hold "this" pointer for frame. to hold "this" pointer for frame.
......
/* StackFrameCommandSet.java -- class to implement the StackFrame Command Set /* 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. This file is part of GNU Classpath.
...@@ -107,7 +107,8 @@ public class StackFrameCommandSet ...@@ -107,7 +107,8 @@ public class StackFrameCommandSet
// has a reference to them. Furthermore they are not ReferenceTypeIds since // 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 // these are held permanently and we want these to be held only as long as
// the Thread is suspended. // the Thread is suspended.
VMFrame frame = VMVirtualMachine.getFrame(thread, bb); long frameID = bb.getLong();
VMFrame frame = VMVirtualMachine.getFrame(thread, frameID);
int slots = bb.getInt(); int slots = bb.getInt();
os.writeInt(slots); // Looks pointless but this is the protocol os.writeInt(slots); // Looks pointless but this is the protocol
for (int i = 0; i < slots; i++) for (int i = 0; i < slots; i++)
...@@ -125,7 +126,8 @@ public class StackFrameCommandSet ...@@ -125,7 +126,8 @@ public class StackFrameCommandSet
ObjectId tId = idMan.readObjectId(bb); ObjectId tId = idMan.readObjectId(bb);
Thread thread = (Thread) tId.getObject(); 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(); int slots = bb.getInt();
for (int i = 0; i < slots; i++) for (int i = 0; i < slots; i++)
...@@ -142,7 +144,8 @@ public class StackFrameCommandSet ...@@ -142,7 +144,8 @@ public class StackFrameCommandSet
ObjectId tId = idMan.readObjectId(bb); ObjectId tId = idMan.readObjectId(bb);
Thread thread = (Thread) tId.getObject(); 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(); Object thisObject = frame.getObject();
Value.writeTaggedValue(os, thisObject); Value.writeTaggedValue(os, thisObject);
......
...@@ -29,7 +29,7 @@ class gnu::classpath::jdwp::VMFrame : public ::java::lang::Object ...@@ -29,7 +29,7 @@ class gnu::classpath::jdwp::VMFrame : public ::java::lang::Object
{ {
public: public:
VMFrame(); VMFrame(::java::lang::Thread *, jlong, ::gnu::classpath::jdwp::util::Location *);
virtual ::gnu::classpath::jdwp::util::Location * getLocation(); virtual ::gnu::classpath::jdwp::util::Location * getLocation();
virtual ::java::lang::Object * getValue(jint); virtual ::java::lang::Object * getValue(jint);
virtual void setValue(jint, ::java::lang::Object *); virtual void setValue(jint, ::java::lang::Object *);
...@@ -37,7 +37,8 @@ public: ...@@ -37,7 +37,8 @@ public:
virtual jlong getId(); virtual jlong getId();
static const jint SIZE = 8; static const jint SIZE = 8;
private: 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; ::gnu::classpath::jdwp::util::Location * loc;
jlong id; jlong id;
public: public:
......
/* VMFrame.java -- Reference implementation of VM hooks for JDWP Frame access. /* 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. This file is part of GNU Classpath.
...@@ -54,7 +54,10 @@ public class VMFrame ...@@ -54,7 +54,10 @@ public class VMFrame
*/ */
public static final int SIZE = 8; 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; private Object obj;
// The current location of this frame // The current location of this frame
...@@ -64,6 +67,20 @@ public class VMFrame ...@@ -64,6 +67,20 @@ public class VMFrame
private long id; 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. * Gets the current location of the frame.
*/ */
public Location getLocation() public Location getLocation()
...@@ -84,6 +101,14 @@ public class VMFrame ...@@ -84,6 +101,14 @@ public class VMFrame
* @param value The value to assign the variable to * @param value The value to assign the variable to
*/ */
public native void setValue(int slot, Object value); 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, * Get the object which is represented by 'this' in the context of the frame,
......
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*- // DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-
#ifndef __gnu_classpath_jdwp_VMVirtualMachine__ #ifndef __gnu_classpath_jdwp_VMVirtualMachine__
...@@ -17,59 +16,52 @@ extern "Java" ...@@ -17,59 +16,52 @@ extern "Java"
{ {
namespace jdwp namespace jdwp
{ {
class VMFrame; class VMVirtualMachine;
class VMMethod;
class VMVirtualMachine;
namespace event namespace event
{ {
class EventRequest; class EventRequest;
} }
namespace util 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 class gnu::classpath::jdwp::VMVirtualMachine : public ::java::lang::Object
{ {
public: public:
VMVirtualMachine(); VMVirtualMachine ();
static void initialize(); static void initialize ();
static void suspendThread(::java::lang::Thread *); static void suspendThread (::java::lang::Thread *);
static void suspendAllThreads(); static void suspendAllThreads ();
static void resumeThread(::java::lang::Thread *); static void resumeThread (::java::lang::Thread *);
static void resumeAllThreads(); static void resumeAllThreads ();
static jint getSuspendCount(::java::lang::Thread *); static jint getSuspendCount (::java::lang::Thread *);
static jint getAllLoadedClassesCount(); static jint getAllLoadedClassesCount ();
static ::java::util::Iterator * getAllLoadedClasses(); static ::java::util::Iterator *getAllLoadedClasses ();
static jint getClassStatus(::java::lang::Class *); static jint getClassStatus (::java::lang::Class *);
static JArray< ::gnu::classpath::jdwp::VMMethod * > * getAllClassMethods(::java::lang::Class *); static JArray< ::gnu::classpath::jdwp::VMMethod *> *getAllClassMethods (::java::lang::Class *);
static ::gnu::classpath::jdwp::VMMethod * getClassMethod(::java::lang::Class *, jlong); static ::gnu::classpath::jdwp::VMMethod *getClassMethod (::java::lang::Class *, jlong);
static ::java::util::ArrayList * getFrames(::java::lang::Thread *, jint, jint); static ::java::util::ArrayList *getFrames (::java::lang::Thread *, jint, jint);
static ::gnu::classpath::jdwp::VMFrame * getFrame(::java::lang::Thread *, ::java::nio::ByteBuffer *); static ::gnu::classpath::jdwp::VMFrame *getFrame (::java::lang::Thread *, jlong);
static jint getFrameCount(::java::lang::Thread *); static jint getFrameCount (::java::lang::Thread *);
static jint getThreadStatus(::java::lang::Thread *); static jint getThreadStatus (::java::lang::Thread *);
static ::java::util::ArrayList * getLoadRequests(::java::lang::ClassLoader *); 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 ::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 ::java::lang::String *getSourceFile (::java::lang::Class *);
static void registerEvent(::gnu::classpath::jdwp::event::EventRequest *); static void registerEvent (::gnu::classpath::jdwp::event::EventRequest *);
static void unregisterEvent(::gnu::classpath::jdwp::event::EventRequest *); static void unregisterEvent (::gnu::classpath::jdwp::event::EventRequest *);
static void clearEvents(jbyte); static void clearEvents (jbyte);
private: private:
static ::java::util::Hashtable * _jdwp_suspend_counts; static ::java::util::Hashtable *_jdwp_suspend_counts;
public: public:
static ::java::lang::Class class$; static ::java::lang::Class class$;
}; };
#endif // __gnu_classpath_jdwp_VMVirtualMachine__ #endif /* __gnu_classpath_jdwp_VMVirtualMachine__ */
/* VMVirtualMachine.java -- A reference implementation of a JDWP virtual /* VMVirtualMachine.java -- A reference implementation of a JDWP virtual
machine machine
Copyright (C) 2005, 2006 Free Software Foundation Copyright (C) 2005, 2006, 2007 Free Software Foundation
This file is part of GNU Classpath. This file is part of GNU Classpath.
...@@ -243,7 +243,7 @@ public class VMVirtualMachine ...@@ -243,7 +243,7 @@ public class VMVirtualMachine
* @param bb buffer containing the frame's ID * @param bb buffer containing the frame's ID
* @return the desired frame * @return the desired frame
*/ */
public static native VMFrame getFrame (Thread thread, ByteBuffer bb) public static native VMFrame getFrame (Thread thread, long frameID)
throws JdwpException; throws JdwpException;
/** /**
......
// 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__
...@@ -14,6 +14,8 @@ details. */ ...@@ -14,6 +14,8 @@ details. */
#include <jvm.h> #include <jvm.h>
#include <jvmti.h> #include <jvmti.h>
#include <java-interp.h>
#include <java/lang/Class.h> #include <java/lang/Class.h>
#include <java/lang/ClassLoader.h> #include <java/lang/ClassLoader.h>
#include <java/lang/Integer.h> #include <java/lang/Integer.h>
...@@ -21,6 +23,7 @@ details. */ ...@@ -21,6 +23,7 @@ details. */
#include <java/lang/StringBuilder.h> #include <java/lang/StringBuilder.h>
#include <java/lang/Thread.h> #include <java/lang/Thread.h>
#include <java/nio/ByteBuffer.h> #include <java/nio/ByteBuffer.h>
#include <java/nio/ByteBufferImpl.h>
#include <java/util/ArrayList.h> #include <java/util/ArrayList.h>
#include <java/util/Collection.h> #include <java/util/Collection.h>
#include <java/util/Hashtable.h> #include <java/util/Hashtable.h>
...@@ -39,6 +42,7 @@ details. */ ...@@ -39,6 +42,7 @@ details. */
#include <gnu/classpath/jdwp/event/VmInitEvent.h> #include <gnu/classpath/jdwp/event/VmInitEvent.h>
#include <gnu/classpath/jdwp/event/filters/IEventFilter.h> #include <gnu/classpath/jdwp/event/filters/IEventFilter.h>
#include <gnu/classpath/jdwp/event/filters/LocationOnlyFilter.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/InvalidLocationException.h>
#include <gnu/classpath/jdwp/exception/InvalidMethodException.h> #include <gnu/classpath/jdwp/exception/InvalidMethodException.h>
#include <gnu/classpath/jdwp/exception/JdwpInternalErrorException.h> #include <gnu/classpath/jdwp/exception/JdwpInternalErrorException.h>
...@@ -432,9 +436,50 @@ gnu::classpath::jdwp::VMVirtualMachine::getFrames (MAYBE_UNUSED Thread *thread, ...@@ -432,9 +436,50 @@ gnu::classpath::jdwp::VMVirtualMachine::getFrames (MAYBE_UNUSED Thread *thread,
gnu::classpath::jdwp::VMFrame * gnu::classpath::jdwp::VMFrame *
gnu::classpath::jdwp::VMVirtualMachine:: 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 jint
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment