StackFrameCommandSet.java (executeGetValues): Pass jlong instead of ByteBuffer.
authorKyle Galloway <kgallowa@redhat.com>
Thu, 8 Feb 2007 18:21:00 +0000 (18:21 +0000)
committerKyle Galloway <kgallowa@gcc.gnu.org>
Thu, 8 Feb 2007 18:21:00 +0000 (18:21 +0000)
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

12 files changed:
libjava/ChangeLog
libjava/classpath/gnu/classpath/jdwp/processor/StackFrameCommandSet.java
libjava/classpath/lib/gnu/classpath/jdwp/VMFrame.class
libjava/classpath/lib/gnu/classpath/jdwp/VMVirtualMachine.class
libjava/classpath/lib/gnu/classpath/jdwp/exception/InvalidFrameException.class [new file with mode: 0644]
libjava/classpath/lib/gnu/classpath/jdwp/processor/StackFrameCommandSet.class
libjava/gnu/classpath/jdwp/VMFrame.h
libjava/gnu/classpath/jdwp/VMFrame.java
libjava/gnu/classpath/jdwp/VMVirtualMachine.h
libjava/gnu/classpath/jdwp/VMVirtualMachine.java
libjava/gnu/classpath/jdwp/exception/InvalidFrameException.h [new file with mode: 0644]
libjava/gnu/classpath/jdwp/natVMVirtualMachine.cc

index e3fc13254958bc4478d84ef5b3195a6544a7f35a..315912da9116106d0a32f0515da972810205ec4f 100644 (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.
index 7890a8e4b1bc39b0a9d434d1ee4018d40ba1a611..cf1e8c272dab43c911e66eed3aed67a9c3648443 100644 (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);
index 40c8c2da7c26af2f47bed32531f5185585b3a02d..10e284132fa3b6b6b9c5ddc84f8425b1eef20978 100644 (file)
Binary files a/libjava/classpath/lib/gnu/classpath/jdwp/VMFrame.class and b/libjava/classpath/lib/gnu/classpath/jdwp/VMFrame.class differ
index 7b7be23febccabf21a738845cd25e97105ae275f..526d30b221bf829075c7ce6745eeab2fa424dbf7 100644 (file)
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 (file)
index 0000000..9bdf078
Binary files /dev/null and b/libjava/classpath/lib/gnu/classpath/jdwp/exception/InvalidFrameException.class differ
index 9e8d2a02bc4d24be9f8c99829e7190a05df5539f..5b8fa18bafab2b36dac8ac5497234c5a472ba2fc 100644 (file)
Binary files a/libjava/classpath/lib/gnu/classpath/jdwp/processor/StackFrameCommandSet.class and b/libjava/classpath/lib/gnu/classpath/jdwp/processor/StackFrameCommandSet.class differ
index 5278a192c6a06d53842a9b90474d1f88e446e844..8181f86a2c02e425a8d49dc6049cf74524683d3f 100644 (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:
index cd213025a72477073c33714beef9079655cd4bab..e0f093fd68597c85f0a77d313880c7958223ba52 100644 (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,
index a9a3b6df8e159f1c183585de634659835cae787b..b90b476c04bc673867851266cc1a75def2d9e41d 100644 (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__ */
index 5c4018fce131bfd43bd7b2a6140c63476e51a4ff..1b0f7f6fa3c4d67fe7496937f21094441d71a8f2 100644 (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;
 
   /**
diff --git a/libjava/gnu/classpath/jdwp/exception/InvalidFrameException.h b/libjava/gnu/classpath/jdwp/exception/InvalidFrameException.h
new file mode 100644 (file)
index 0000000..abe84e0
--- /dev/null
@@ -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__
index 208e689b79d50120a0fd4e9aa77c387c7b45512d..ab11b3ed299bfb916ea6f86460a2274aa1cc19b9 100644 (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