2007-02-08 Kyle Galloway <kgallowa@redhat.com>
authorkgallowa <kgallowa@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 8 Feb 2007 18:21:00 +0000 (18:21 +0000)
committerkgallowa <kgallowa@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 8 Feb 2007 18:21:00 +0000 (18:21 +0000)
    * 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

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 e3fc132..315912d 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 7890a8e..cf1e8c2 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 40c8c2d..10e2841 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 7b7be23..526d30b 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 9e8d2a0..5b8fa18 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 5278a19..8181f86 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 cd21302..e0f093f 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
@@ -64,6 +67,20 @@ public class VMFrame
   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()
@@ -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 a9a3b6d..b90b476 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 5c4018f..1b0f7f6 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 208e689..ab11b3e 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