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
This commit is contained in:
Kyle Galloway 2007-02-08 18:21:00 +00:00 committed by Kyle Galloway
parent e9105edd8c
commit 0588f8c8db
12 changed files with 177 additions and 51 deletions

View File

@ -1,4 +1,28 @@
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.

View File

@ -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);

View File

@ -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:

View File

@ -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,

View File

@ -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__ */

View File

@ -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;
/**

View File

@ -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 <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__

View File

@ -14,6 +14,8 @@ details. */
#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>
@ -21,6 +23,7 @@ details. */
#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>
@ -39,6 +42,7 @@ details. */
#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>
@ -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<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