
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __gnu_classpath_jdwp_VMVirtualMachine__
#define __gnu_classpath_jdwp_VMVirtualMachine__

#pragma interface

#include <java/lang/Object.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace classpath
    {
      namespace jdwp
      {
          class VMFrame;
          class VMMethod;
          class VMVirtualMachine;
        namespace event
        {
            class EventRequest;
        }
        namespace util
        {
            class MethodResult;
            class MonitorInfo;
        }
        namespace value
        {
            class Value;
        }
      }
    }
  }
}

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 ::java::util::Collection * 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 *, ::gnu::classpath::jdwp::VMMethod *, JArray< ::gnu::classpath::jdwp::value::Value * > *, jint);
  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);
  static void redefineClasses(JArray< ::java::lang::Class * > *, JArray< JArray< jbyte > * > *);
  static void setDefaultStratum(::java::lang::String *);
  static ::java::lang::String * getSourceDebugExtension(::java::lang::Class *);
  static JArray< jbyte > * getBytecodes(::gnu::classpath::jdwp::VMMethod *);
  static ::gnu::classpath::jdwp::util::MonitorInfo * getMonitorInfo(::java::lang::Object *);
  static JArray< ::java::lang::Object * > * getOwnedMonitors(::java::lang::Thread *);
  static ::java::lang::Object * getCurrentContendedMonitor(::java::lang::Thread *);
  static void popFrames(::java::lang::Thread *, jlong);
  static const jboolean canWatchFieldModification = 0;
  static const jboolean canWatchFieldAccess = 0;
  static const jboolean canGetBytecodes = 0;
  static const jboolean canGetSyntheticAttribute = 0;
  static const jboolean canGetOwnedMonitorInfo = 0;
  static const jboolean canGetCurrentContendedMonitor = 0;
  static const jboolean canGetMonitorInfo = 0;
  static const jboolean canRedefineClasses = 0;
  static const jboolean canAddMethod = 0;
  static const jboolean canUnrestrictedlyRedefineClasses = 0;
  static const jboolean canPopFrames = 0;
  static const jboolean canUseInstanceFilters = 0;
  static const jboolean canGetSourceDebugExtension = 0;
  static const jboolean canRequestVMDeathEvent = 0;
  static const jboolean canSetDefaultStratum = 0;
private:
  static ::java::util::Hashtable * _jdwp_suspend_counts;
public: // actually package-private
  static ::java::util::Hashtable * _stepping_threads;
  static ::java::util::ArrayList * _event_list;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_classpath_jdwp_VMVirtualMachine__
