1013 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1013 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * @(#)jvmdi.h	1.48 03/12/19
 | |
|  *
 | |
|  * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
 | |
|  * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 | |
|  */
 | |
| 
 | |
| /*
 | |
|  *   Java Virtual Machine Debug Interface
 | |
|  *
 | |
|  *   Defines debugging functionality that a VM should provide.  
 | |
|  *
 | |
|  *   Should not overlap functionality in jni.h
 | |
|  */
 | |
| 
 | |
| #ifndef _JAVASOFT_JVMDI_H_
 | |
| #define _JAVASOFT_JVMDI_H_
 | |
| 
 | |
| #include "jni.h"
 | |
| 
 | |
| #define JVMDI_VERSION_1    0x20010000
 | |
| #define JVMDI_VERSION_1_1  0x20010001
 | |
| #define JVMDI_VERSION_1_2  0x20010002
 | |
| #define JVMDI_VERSION_1_3  0x20010003
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| typedef jobject jthread;
 | |
| 
 | |
| typedef jobject jthreadGroup;
 | |
| 
 | |
| struct _jframeID;
 | |
| typedef struct _jframeID *jframeID;
 | |
| 
 | |
|   /* specifies program location "pc" - often byte code index */
 | |
| typedef jlong jlocation;
 | |
| 
 | |
|   /* The jmethodID for methods that have been replaced */
 | |
|   /* via RedefineClasses - used when the implementation */
 | |
|   /* does not wish to retain replaced jmethodIDs */
 | |
| #define OBSOLETE_METHOD_ID ((jmethodID)(NULL))
 | |
| 
 | |
|   /*
 | |
|    *  Errors
 | |
|    */
 | |
| 
 | |
| typedef jint jvmdiError;
 | |
| 
 | |
|   /* no error */
 | |
| #define JVMDI_ERROR_NONE                 ((jvmdiError)0)
 | |
| 
 | |
|   /*
 | |
|    * Errors on thread operations
 | |
|    */
 | |
| 
 | |
|   /* invalid thread */
 | |
| #define JVMDI_ERROR_INVALID_THREAD       ((jvmdiError)10)
 | |
|   /* invalid thread group */
 | |
| #define JVMDI_ERROR_INVALID_THREAD_GROUP ((jvmdiError)11)
 | |
|   /* invalid thread priority */
 | |
| #define JVMDI_ERROR_INVALID_PRIORITY     ((jvmdiError)12)
 | |
|   /* thread not suspended */
 | |
| #define JVMDI_ERROR_THREAD_NOT_SUSPENDED ((jvmdiError)13)
 | |
|   /* thread already suspended */
 | |
| #define JVMDI_ERROR_THREAD_SUSPENDED     ((jvmdiError)14)
 | |
| 
 | |
|   /* 
 | |
|    * Errors on object and class operations
 | |
|    */
 | |
| 
 | |
|   /* invalid object (implementation not required to gracefully catch) */
 | |
| #define JVMDI_ERROR_INVALID_OBJECT       ((jvmdiError)20)
 | |
|   /* invalid class (implementation not required to gracefully catch) */
 | |
| #define JVMDI_ERROR_INVALID_CLASS        ((jvmdiError)21)
 | |
|   /* class not prepared */
 | |
| #define JVMDI_ERROR_CLASS_NOT_PREPARED   ((jvmdiError)22)
 | |
|   /* invalid methodID (implementation not required to gracefully catch) */
 | |
| #define JVMDI_ERROR_INVALID_METHODID     ((jvmdiError)23)
 | |
|   /* invalid location */
 | |
| #define JVMDI_ERROR_INVALID_LOCATION     ((jvmdiError)24)
 | |
|   /* invalid fieldID (implementation not required to gracefully catch) */
 | |
| #define JVMDI_ERROR_INVALID_FIELDID      ((jvmdiError)25)
 | |
| 
 | |
|   /*
 | |
|    * Errors on frame operations
 | |
|    */
 | |
| 
 | |
|   /* invalid frameID (implementation not required to gracefully catch) */
 | |
| #define JVMDI_ERROR_INVALID_FRAMEID      ((jvmdiError)30)
 | |
|   /* there are no more frames on the stack */
 | |
| #define JVMDI_ERROR_NO_MORE_FRAMES       ((jvmdiError)31)
 | |
|   /* operation cannot be performed on this frame */
 | |
| #define JVMDI_ERROR_OPAQUE_FRAME         ((jvmdiError)32)
 | |
|   /* operation can only be performed on current frame */
 | |
| #define JVMDI_ERROR_NOT_CURRENT_FRAME    ((jvmdiError)33)
 | |
|   /* type mismatch (implementation not required to gracefully catch) */
 | |
| #define JVMDI_ERROR_TYPE_MISMATCH        ((jvmdiError)34)
 | |
|   /* invalid slot */
 | |
| #define JVMDI_ERROR_INVALID_SLOT         ((jvmdiError)35)
 | |
| 
 | |
|   /*
 | |
|    * Errors on set/clear/find operations
 | |
|    */
 | |
| 
 | |
|   /* item already present */
 | |
| #define JVMDI_ERROR_DUPLICATE            ((jvmdiError)40)
 | |
|   /* item not found */
 | |
| #define JVMDI_ERROR_NOT_FOUND            ((jvmdiError)41)
 | |
| 
 | |
|   /*
 | |
|    * Errors on monitor operations
 | |
|    */
 | |
| 
 | |
|   /* invalid monitor */
 | |
| #define JVMDI_ERROR_INVALID_MONITOR      ((jvmdiError)50)
 | |
|   /* wait, notify, notify all tried without entering monitor  */
 | |
| #define JVMDI_ERROR_NOT_MONITOR_OWNER    ((jvmdiError)51)
 | |
|   /* waiting thread interrupted */
 | |
| #define JVMDI_ERROR_INTERRUPT            ((jvmdiError)52)
 | |
|   
 | |
|   /*
 | |
|    * Class redefinition / operand stack errors
 | |
|    */
 | |
| 
 | |
|   /* The equivalent of ClassFormatError */
 | |
| #define JVMDI_ERROR_INVALID_CLASS_FORMAT          ((jvmdiError)60)
 | |
|   /* The equivalent of ClassCircularityError */
 | |
| #define JVMDI_ERROR_CIRCULAR_CLASS_DEFINITION     ((jvmdiError)61)
 | |
|   /* The class bytes fail verification */
 | |
| #define JVMDI_ERROR_FAILS_VERIFICATION            ((jvmdiError)62)
 | |
|   /* The new class version adds new methods */
 | |
|   /* and can_add_method is false */
 | |
| #define JVMDI_ERROR_ADD_METHOD_NOT_IMPLEMENTED    ((jvmdiError)63)
 | |
|   /* The new class version changes fields */ 
 | |
|   /* and can_unrestrictedly_redefine_classes is false */
 | |
| #define JVMDI_ERROR_SCHEMA_CHANGE_NOT_IMPLEMENTED ((jvmdiError)64)
 | |
|   /* bci/operand stack/local var combination is not verifiably */
 | |
|   /* type safe */
 | |
| #define JVMDI_ERROR_INVALID_TYPESTATE             ((jvmdiError)65)
 | |
|   /* A direct superclass is different for the new class */
 | |
|   /* version, or the set of directly implemented */
 | |
|   /* interfaces is different */
 | |
|   /* and can_unrestrictedly_redefine_classes is false */
 | |
| #define JVMDI_ERROR_HIERARCHY_CHANGE_NOT_IMPLEMENTED ((jvmdiError)66)
 | |
|   /* The new class version does not declare a method */
 | |
|   /* declared in the old class version */
 | |
|   /* and can_unrestrictedly_redefine_classes is false */
 | |
| #define JVMDI_ERROR_DELETE_METHOD_NOT_IMPLEMENTED ((jvmdiError)67)
 | |
|   /* A class file has a version number not supported */
 | |
|   /* by this VM. */
 | |
| #define JVMDI_ERROR_UNSUPPORTED_VERSION           ((jvmdiError)68)
 | |
|   /* The class name defined in the new class file is */
 | |
|   /* different from the name in the old class object */
 | |
| #define JVMDI_ERROR_NAMES_DONT_MATCH              ((jvmdiError)69)
 | |
|   /* The new class version has different modifiers and */
 | |
|   /* can_unrestrictedly_redefine_classes is false */
 | |
| #define JVMDI_ERROR_CLASS_MODIFIERS_CHANGE_NOT_IMPLEMENTED   ((jvmdiError)70)
 | |
|   /* A method in the new class version has different modifiers */
 | |
|   /* than its counterpart in the old class version */
 | |
|   /* and can_unrestrictedly_redefine_classes is false */
 | |
| #define JVMDI_ERROR_METHOD_MODIFIERS_CHANGE_NOT_IMPLEMENTED  ((jvmdiError)71)
 | |
| 
 | |
|   /*
 | |
|    * Miscellaneous errors
 | |
|    */
 | |
| 
 | |
|   /* Not yet implemented */
 | |
| #define JVMDI_ERROR_NOT_IMPLEMENTED      ((jvmdiError)99)
 | |
|   /* null pointer */
 | |
| #define JVMDI_ERROR_NULL_POINTER         ((jvmdiError)100)
 | |
|   /* information is absent */
 | |
| #define JVMDI_ERROR_ABSENT_INFORMATION   ((jvmdiError)101)
 | |
|   /* invalid event type  */
 | |
| #define JVMDI_ERROR_INVALID_EVENT_TYPE   ((jvmdiError)102)
 | |
|   /* invalid argument  */
 | |
| #define JVMDI_ERROR_ILLEGAL_ARGUMENT     ((jvmdiError)103)
 | |
| 
 | |
|   /*
 | |
|    * Universal errors. These errors may be returned by
 | |
|    * any JVMDI function, not just the ones for which they are listed
 | |
|    * below.
 | |
|    */
 | |
| 
 | |
|   /* no more memory available for allocation */
 | |
| #define JVMDI_ERROR_OUT_OF_MEMORY        ((jvmdiError)110)
 | |
|   /* debugging has not been enabled in this VM */
 | |
| #define JVMDI_ERROR_ACCESS_DENIED        ((jvmdiError)111)
 | |
|   /* VM is dead (implementation not required to gracefully catch) */
 | |
| #define JVMDI_ERROR_VM_DEAD              ((jvmdiError)112)
 | |
|   /* internal error  */
 | |
| #define JVMDI_ERROR_INTERNAL             ((jvmdiError)113)
 | |
|   /* Thread calling JVMDI function not attached to VM */
 | |
| #define JVMDI_ERROR_UNATTACHED_THREAD    ((jvmdiError)115)
 | |
| 
 | |
| 
 | |
|   /*
 | |
|    *  Threads
 | |
|    */
 | |
| 
 | |
|   /* Thread status is unknown */
 | |
| #define JVMDI_THREAD_STATUS_UNKNOWN      ((jint)-1)
 | |
|   /* Thread is waiting to die */
 | |
| #define JVMDI_THREAD_STATUS_ZOMBIE       ((jint)0)
 | |
|   /* Thread is runnable */
 | |
| #define JVMDI_THREAD_STATUS_RUNNING      ((jint)1)
 | |
|   /* Thread is sleeping - Thread.sleep() or JVM_Sleep() was called */
 | |
| #define JVMDI_THREAD_STATUS_SLEEPING     ((jint)2)
 | |
|   /* Thread is waiting on a java monitor */
 | |
| #define JVMDI_THREAD_STATUS_MONITOR      ((jint)3)
 | |
|   /* Thread is waiting - Thread.wait() or JVM_MonitorWait() was called */
 | |
| #define JVMDI_THREAD_STATUS_WAIT         ((jint)4)
 | |
| 
 | |
|   /* Thread is suspended - Thread.suspend(), JVM_Suspend() or
 | |
|    * JVMDI_Suspend was called */
 | |
| #define JVMDI_SUSPEND_STATUS_SUSPENDED   ((jint)0x1)
 | |
|   /* Thread is at a breakpoint */
 | |
| #define JVMDI_SUSPEND_STATUS_BREAK       ((jint)0x2)
 | |
| 
 | |
| 
 | |
|   /* Thread priority constants */
 | |
| #define JVMDI_THREAD_MIN_PRIORITY   ((jint)1)
 | |
| #define JVMDI_THREAD_NORM_PRIORITY  ((jint)5)
 | |
| #define JVMDI_THREAD_MAX_PRIORITY   ((jint)10)
 | |
| 
 | |
| typedef struct {
 | |
|     char *name;
 | |
|     jint  priority;
 | |
|     jboolean is_daemon;
 | |
|     jthreadGroup thread_group;
 | |
|     jobject context_class_loader;
 | |
| } JVMDI_thread_info;
 | |
| 
 | |
| typedef struct {
 | |
|     jthreadGroup parent;
 | |
|     char *name;
 | |
|     jint  max_priority;
 | |
|     jboolean is_daemon;
 | |
| } JVMDI_thread_group_info;
 | |
| 
 | |
| #define JVMDI_DISABLE ((jint) 0)
 | |
| #define JVMDI_ENABLE  ((jint) 1)
 | |
| 
 | |
| /*
 | |
|  * Initial function for debug threads created through JVMDI
 | |
|  */
 | |
| typedef void (*JVMDI_StartFunction)(void *);
 | |
| 
 | |
| /*
 | |
|  * Type for debug monitors created through JVMDI
 | |
|  */
 | |
| typedef void *JVMDI_RawMonitor;
 | |
| 
 | |
| #define JVMDI_MONITOR_WAIT_FOREVER ((jlong)(-1))
 | |
| 
 | |
| /*
 | |
|  * Monitor information
 | |
|  */
 | |
| typedef struct {
 | |
|     jthread owner;
 | |
|     jint entry_count;
 | |
|     jint waiter_count;
 | |
|     jthread *waiters;
 | |
| } JVMDI_monitor_info;
 | |
| 
 | |
| typedef struct {
 | |
|     jint owned_monitor_count;
 | |
|     jobject *owned_monitors;
 | |
| } JVMDI_owned_monitor_info;
 | |
| 
 | |
|   /*
 | |
|    *  Events
 | |
|    */
 | |
| 
 | |
|     /* kind = JVMDI_EVENT_SINGLE_STEP */
 | |
|     typedef struct { 
 | |
|         jthread thread;
 | |
|         jclass clazz;
 | |
|         jmethodID method;
 | |
|         jlocation location;
 | |
|     } JVMDI_single_step_event_data;
 | |
| 			
 | |
|     /* kind = JVMDI_EVENT_BREAKPOINT */
 | |
|     typedef struct { 
 | |
|         jthread thread;
 | |
|         jclass clazz;
 | |
|         jmethodID method;
 | |
|         jlocation location;
 | |
|     } JVMDI_breakpoint_event_data;
 | |
|     
 | |
|     /* kind = JVMDI_EVENT_FIELD_ACCESS */
 | |
|     typedef struct { 
 | |
|         jthread thread;
 | |
|         jclass clazz;
 | |
|         jmethodID method;
 | |
|         jlocation location;
 | |
|         jclass field_clazz;
 | |
|         jobject object;
 | |
|         jfieldID field;
 | |
|     } JVMDI_field_access_event_data;
 | |
|     
 | |
|     /* kind = JVMDI_EVENT_FIELD_MODIFICATION */
 | |
|     typedef struct { 
 | |
|         jthread thread;
 | |
|         jclass clazz;
 | |
|         jmethodID method;
 | |
|         jlocation location;
 | |
|         jclass field_clazz;
 | |
|         jobject object;
 | |
|         jfieldID field;
 | |
|         char signature_type;
 | |
|         jvalue new_value;
 | |
|     } JVMDI_field_modification_event_data;
 | |
|     
 | |
|     /* kind = JVMDI_EVENT_FRAME_POP */
 | |
|     /* kind = JVMDI_EVENT_METHOD_ENTRY */
 | |
|     /* kind = JVMDI_EVENT_METHOD_EXIT */
 | |
|     typedef struct { 
 | |
|         jthread thread;
 | |
|         jclass clazz;
 | |
|         jmethodID method;
 | |
|         jframeID frame;
 | |
|     } JVMDI_frame_event_data;
 | |
|     
 | |
|     /* kind = JVMDI_EVENT_EXCEPTION */
 | |
|     typedef struct { 
 | |
|         jthread thread;
 | |
|         jclass clazz;
 | |
|         jmethodID method;
 | |
|         jlocation location;
 | |
|         jobject exception;
 | |
|         jclass catch_clazz;
 | |
|         jmethodID catch_method;
 | |
|         jlocation catch_location;
 | |
|     } JVMDI_exception_event_data;
 | |
|     
 | |
|     /* kind = JVMDI_EVENT_EXCEPTION_CATCH */
 | |
|     typedef struct { 
 | |
|         jthread thread;
 | |
|         jclass clazz;
 | |
|         jmethodID method;
 | |
|         jlocation location;
 | |
|         jobject exception;
 | |
|     } JVMDI_exception_catch_event_data;
 | |
|     
 | |
|     /* kind = JVMDI_EVENT_USER_DEFINED */
 | |
|     typedef struct { 
 | |
|         jobject object;
 | |
|         jint key;
 | |
|     } JVMDI_user_event_data;
 | |
|     
 | |
|     /* kind = JVMDI_EVENT_THREAD_END or */
 | |
|     /* JVMDI_EVENT_THREAD_START */
 | |
|     typedef struct { 
 | |
|         jthread thread;
 | |
|     } JVMDI_thread_change_event_data;
 | |
|     
 | |
|     /* kind = JVMDI_EVENT_CLASS_LOAD, */
 | |
|     /* JVMDI_EVENT_CLASS_UNLOAD, or */
 | |
|     /* JVMDI_EVENT_CLASS_PREPARE */
 | |
|     typedef struct { 
 | |
|         jthread thread;
 | |
|         jclass clazz;
 | |
|     } JVMDI_class_event_data;
 | |
|     
 | |
| /* This stucture passes information about the event.
 | |
|  * location is the index of the last instruction executed. 
 | |
|  */
 | |
| typedef struct {
 | |
|     jint kind;		/* the discriminant */
 | |
| 
 | |
|     union {
 | |
| 	/* kind = JVMDI_EVENT_SINGLE_STEP */
 | |
|         JVMDI_single_step_event_data single_step;
 | |
| 			
 | |
|         /* kind = JVMDI_EVENT_BREAKPOINT */
 | |
|         JVMDI_breakpoint_event_data breakpoint;
 | |
| 
 | |
|         /* kind = JVMDI_EVENT_FRAME_POP */
 | |
|         /* kind = JVMDI_EVENT_METHOD_ENTRY */
 | |
|         /* kind = JVMDI_EVENT_METHOD_EXIT */
 | |
|         JVMDI_frame_event_data frame;
 | |
| 
 | |
|         /* kind = JVMDI_EVENT_FIELD_ACCESS */
 | |
|         JVMDI_field_access_event_data field_access;
 | |
| 
 | |
|         /* kind = JVMDI_EVENT_FIELD_MODIFICATION */
 | |
|         JVMDI_field_modification_event_data field_modification;
 | |
| 
 | |
|         /* kind = JVMDI_EVENT_EXCEPTION */
 | |
|         JVMDI_exception_event_data exception;
 | |
| 
 | |
|         /* kind = JVMDI_EVENT_EXCEPTION_CATCH */
 | |
|         JVMDI_exception_catch_event_data exception_catch;
 | |
| 
 | |
|         /* kind = JVMDI_EVENT_USER_DEFINED */
 | |
|         JVMDI_user_event_data user;
 | |
| 			
 | |
|         /* kind = JVMDI_EVENT_THREAD_END or */
 | |
|         /* JVMDI_EVENT_THREAD_START */
 | |
|         JVMDI_thread_change_event_data thread_change;
 | |
| 			
 | |
|         /* kind = JVMDI_EVENT_CLASS_LOAD, */
 | |
|         /* JVMDI_EVENT_CLASS_UNLOAD, or */
 | |
|         /* JVMDI_EVENT_CLASS_PREPARE */
 | |
|         JVMDI_class_event_data class_event;
 | |
| 			
 | |
|         /* kind = JVMDI_EVENT_VM_DEATH, JVMDI_EVENT_VM_INIT */
 | |
|         /* no additional fields */		
 | |
|     } u;
 | |
| } JVMDI_Event;
 | |
| 
 | |
| 	/*** event kinds ***/
 | |
| #define JVMDI_EVENT_SINGLE_STEP   ((jint)1)
 | |
| #define JVMDI_EVENT_BREAKPOINT    ((jint)2)
 | |
| #define JVMDI_EVENT_FRAME_POP     ((jint)3)
 | |
| #define JVMDI_EVENT_EXCEPTION     ((jint)4)
 | |
| #define JVMDI_EVENT_USER_DEFINED  ((jint)5)
 | |
| #define JVMDI_EVENT_THREAD_START  ((jint)6)
 | |
| #define JVMDI_EVENT_THREAD_END    ((jint)7)
 | |
| #define JVMDI_EVENT_CLASS_PREPARE ((jint)8)
 | |
| #define JVMDI_EVENT_CLASS_UNLOAD  ((jint)9)
 | |
| #define JVMDI_EVENT_CLASS_LOAD    ((jint)10)
 | |
| #define JVMDI_EVENT_FIELD_ACCESS       ((jint)20)
 | |
| #define JVMDI_EVENT_FIELD_MODIFICATION ((jint)21)
 | |
| #define JVMDI_EVENT_EXCEPTION_CATCH    ((jint)30)
 | |
| #define JVMDI_EVENT_METHOD_ENTRY       ((jint)40)
 | |
| #define JVMDI_EVENT_METHOD_EXIT        ((jint)41)
 | |
| #define JVMDI_EVENT_VM_INIT            ((jint)90)
 | |
| #define JVMDI_EVENT_VM_DEATH           ((jint)99)
 | |
| 
 | |
| #define JVMDI_MAX_EVENT_TYPE_VAL       ((jint)99)
 | |
| 
 | |
| 
 | |
| 
 | |
| /* event handler hook */
 | |
| typedef void (*JVMDI_EventHook)(JNIEnv *env, JVMDI_Event *event);
 | |
| 
 | |
| typedef jvmdiError (*JVMDI_AllocHook) (jlong size, jbyte** memPtr);
 | |
| typedef jvmdiError (*JVMDI_DeallocHook) (jbyte* buffer);
 | |
| 
 | |
| /*
 | |
|  * Class states used in JVMDI_GetClassStatus
 | |
|  */
 | |
| #define JVMDI_CLASS_STATUS_VERIFIED          ((jint)0x01)
 | |
| #define JVMDI_CLASS_STATUS_PREPARED          ((jint)0x02)
 | |
| #define JVMDI_CLASS_STATUS_INITIALIZED       ((jint)0x04)
 | |
|  /* Error prevents initialization */
 | |
| #define JVMDI_CLASS_STATUS_ERROR             ((jint)0x08) 
 | |
| 
 | |
| /* structure for returning line number information 
 | |
|  */
 | |
| typedef struct {
 | |
|     jlocation start_location;
 | |
|     jint line_number;
 | |
| } JVMDI_line_number_entry;
 | |
| 
 | |
| 
 | |
| /* structure for returning local variable information 
 | |
|  */
 | |
| typedef struct {
 | |
|     jlocation start_location;   /* variable valid start_location */
 | |
|     jint length;                /* upto start_location+length */ 
 | |
|     char *name;                 /* name in UTF8 */
 | |
|     char *signature;            /* type signature in UTF8 */
 | |
|     jint slot;                  /* variable slot, see JVMDI_GetLocal*()  */
 | |
| } JVMDI_local_variable_entry;
 | |
| 
 | |
| /* structure for returning exception handler information 
 | |
|  */
 | |
| typedef struct {
 | |
|     jlocation start_location;
 | |
|     jlocation end_location;
 | |
|     jlocation handler_location;
 | |
|     jclass exception;           /* if null, all exceptions */
 | |
| } JVMDI_exception_handler_entry;
 | |
| 
 | |
| #define JVMDI_OPERAND_TYPE_REFERENCE      ((jint)1)
 | |
| #define JVMDI_OPERAND_TYPE_INT            ((jint)2)
 | |
| #define JVMDI_OPERAND_TYPE_FLOAT          ((jint)3)
 | |
| #define JVMDI_OPERAND_TYPE_LONG0          ((jint)4) /* least sig. 32 bits */
 | |
| #define JVMDI_OPERAND_TYPE_LONG1          ((jint)5) /* most sig. 32 bits */
 | |
| #define JVMDI_OPERAND_TYPE_DOUBLE0        ((jint)6) /* least sig. 32 bits */
 | |
| #define JVMDI_OPERAND_TYPE_DOUBLE1        ((jint)7) /* most sig. 32 bits */
 | |
| #define JVMDI_OPERAND_TYPE_RETURN_ADDRESS ((jint)8)
 | |
| 
 | |
| typedef struct {
 | |
|     jint word;                 /* 32 bit operand stack quantities */
 | |
|     jint type;                 /* type encoding of the operand word */
 | |
|                                /* one of JVMDI_OPERAND_TYPE_* */
 | |
| } JVMDI_operand_stack_element;
 | |
| 
 | |
| typedef struct { 
 | |
|     jint instance_field_count; /* number of instance fields referencing obj */
 | |
|     struct JVMDI_instance_field {
 | |
|         jobject instance;      /* instance referencing obj */
 | |
|         jfieldID field;        /* field holding reference */
 | |
|     } *instance_fields;        /* instanceField_count of them */
 | |
|      
 | |
|     jint static_field_count;   /* number of static fields referencing obj */
 | |
|     struct JVMDI_static_field {
 | |
|         jclass clazz;          /* class referencing obj */
 | |
|         jfieldID static_field; /* field holding reference */
 | |
|     } *static_fields;          /* static_field_count of them */
 | |
|     
 | |
|     jint array_element_count;  /* number of array elements referencing obj */
 | |
|     struct JVMDI_array_element {
 | |
|         jobjectArray array;    /* array referencing obj */
 | |
|         jint index;            /* index holding reference */
 | |
|     } *array_elements;         /* array_element_count of them */
 | |
|     
 | |
|     jint frame_slot_count;     /* number of frame slots referencing obj */
 | |
|     struct JVMDI_frame_slot {
 | |
|         jthread thread;        /* thread of the frame */
 | |
|         jframeID frame;        /* frame referencing obj */
 | |
|         jint slot;             /* slot holding reference */
 | |
|     } *frame_slots;            /* frame_slot_count of them */
 | |
| } JVMDI_object_reference_info;
 | |
| 
 | |
| /* structure for defining a class
 | |
| */
 | |
| typedef struct {
 | |
|     jclass clazz;              /* Class object for this class */
 | |
|     jint class_byte_count;     /* number of bytes defining class (below) */
 | |
|     jbyte *class_bytes;        /* bytes defining class (in JVM spec */
 | |
|                                /* Class File Format) */
 | |
| } JVMDI_class_definition;
 | |
| 
 | |
|   /* For backwards compatibility */
 | |
| #define can_change_schema can_unrestrictedly_redefine_classes
 | |
| 
 | |
| typedef struct {
 | |
|     unsigned int can_watch_field_modification      : 1;
 | |
|     unsigned int can_watch_field_access            : 1;
 | |
|     unsigned int can_get_bytecodes                 : 1;
 | |
|     unsigned int can_get_synthetic_attribute       : 1;
 | |
|     unsigned int can_get_owned_monitor_info        : 1;
 | |
|     unsigned int can_get_current_contended_monitor : 1;
 | |
|     unsigned int can_get_monitor_info              : 1;
 | |
|     unsigned int can_get_heap_info                 : 1;
 | |
|     unsigned int can_get_operand_stack             : 1;
 | |
|     unsigned int can_set_operand_stack             : 1;
 | |
|     unsigned int can_pop_frame                     : 1;
 | |
|     unsigned int can_get_class_definition          : 1;
 | |
|     unsigned int can_redefine_classes              : 1; 
 | |
|     unsigned int can_add_method                    : 1;
 | |
|     unsigned int can_unrestrictedly_redefine_classes : 1;
 | |
|     unsigned int can_suspend_resume_thread_lists   : 1;
 | |
| } JVMDI_capabilities;
 | |
| 
 | |
| typedef struct JVMDI_Interface_1_ {
 | |
|     jvmdiError (JNICALL *SetEventHook)
 | |
|       (JVMDI_EventHook hook);
 | |
|     jvmdiError (JNICALL *SetEventNotificationMode)
 | |
|       (jint mode, jint eventType, jthread thread, ...);
 | |
| 
 | |
|     jvmdiError (JNICALL *GetThreadStatus)
 | |
|       (jthread thread,
 | |
|        jint *threadStatusPtr, jint *suspendStatusPtr);
 | |
|     jvmdiError (JNICALL *GetAllThreads)
 | |
|       (jint *threadsCountPtr, jthread **threadsPtr);
 | |
|     jvmdiError (JNICALL *SuspendThread)
 | |
|       (jthread thread); 
 | |
|     jvmdiError (JNICALL *ResumeThread)
 | |
|       (jthread thread);
 | |
|     jvmdiError (JNICALL *StopThread)
 | |
|       (jthread thread, jobject exception);
 | |
|     jvmdiError (JNICALL *InterruptThread)
 | |
|       (jthread thread);
 | |
|     jvmdiError (JNICALL *GetThreadInfo)
 | |
|       (jthread thread, JVMDI_thread_info *infoPtr);
 | |
|     jvmdiError (JNICALL *GetOwnedMonitorInfo)
 | |
|       (jthread thread, JVMDI_owned_monitor_info *infoPtr);
 | |
|     jvmdiError (JNICALL *GetCurrentContendedMonitor)
 | |
|       (jthread thread, jobject *monitor);
 | |
|     jvmdiError (JNICALL *RunDebugThread)
 | |
|       (jthread thread, JVMDI_StartFunction proc, void *arg,
 | |
|        int priority);
 | |
| 
 | |
|     jvmdiError (JNICALL *GetTopThreadGroups)
 | |
|       (jint *groupCountPtr, jthreadGroup **groupsPtr);
 | |
|     jvmdiError (JNICALL *GetThreadGroupInfo)
 | |
|       (jthreadGroup group, JVMDI_thread_group_info *infoPtr);
 | |
|     jvmdiError (JNICALL *GetThreadGroupChildren)
 | |
|       (jthreadGroup group, 
 | |
|        jint *threadCountPtr, jthread **threadsPtr,
 | |
|        jint *groupCountPtr, jthreadGroup **groupsPtr);
 | |
| 
 | |
|     jvmdiError (JNICALL *GetFrameCount)
 | |
|       (jthread thread, jint *countPtr);
 | |
|     jvmdiError (JNICALL *GetCurrentFrame)
 | |
|       (jthread thread, jframeID *framePtr);
 | |
|     jvmdiError (JNICALL *GetCallerFrame)
 | |
|       (jframeID called, jframeID *framePtr);
 | |
|     jvmdiError (JNICALL *GetFrameLocation)
 | |
|       (jframeID frame, jclass *classPtr, jmethodID *methodPtr,
 | |
|        jlocation *locationPtr);
 | |
|     jvmdiError (JNICALL *NotifyFramePop)
 | |
|       (jframeID frame); 
 | |
|     jvmdiError (JNICALL *GetLocalObject)
 | |
|       (jframeID frame, jint slot, jobject *valuePtr);
 | |
|     jvmdiError (JNICALL *GetLocalInt)
 | |
|       (jframeID frame, jint slot, jint *valuePtr);
 | |
|     jvmdiError (JNICALL *GetLocalLong)
 | |
|       (jframeID frame, jint slot, jlong *valuePtr);
 | |
|     jvmdiError (JNICALL *GetLocalFloat)
 | |
|       (jframeID frame, jint slot, jfloat *valuePtr);
 | |
|     jvmdiError (JNICALL *GetLocalDouble)
 | |
|       (jframeID frame, jint slot, jdouble *valuePtr);
 | |
|     jvmdiError (JNICALL *SetLocalObject)
 | |
|       (jframeID frame, jint slot, jobject value);
 | |
|     jvmdiError (JNICALL *SetLocalInt)
 | |
|       (jframeID frame, jint slot, jint value);
 | |
|     jvmdiError (JNICALL *SetLocalLong)
 | |
|       (jframeID frame, jint slot, jlong value);
 | |
|     jvmdiError (JNICALL *SetLocalFloat)
 | |
|       (jframeID frame, jint slot, jfloat value);
 | |
|     jvmdiError (JNICALL *SetLocalDouble)
 | |
|       (jframeID frame, jint slot, jdouble value);
 | |
| 
 | |
|     jvmdiError (JNICALL *CreateRawMonitor)
 | |
|       (char *name, JVMDI_RawMonitor *monitorPtr);
 | |
|     jvmdiError (JNICALL *DestroyRawMonitor)
 | |
|       (JVMDI_RawMonitor monitor);
 | |
|     jvmdiError (JNICALL *RawMonitorEnter)
 | |
|       (JVMDI_RawMonitor monitor);
 | |
|     jvmdiError (JNICALL *RawMonitorExit)
 | |
|       (JVMDI_RawMonitor monitor);
 | |
|     jvmdiError (JNICALL *RawMonitorWait)
 | |
|       (JVMDI_RawMonitor monitor, jlong millis);
 | |
|     jvmdiError (JNICALL *RawMonitorNotify)
 | |
|       (JVMDI_RawMonitor monitor);
 | |
|     jvmdiError (JNICALL *RawMonitorNotifyAll)
 | |
|       (JVMDI_RawMonitor monitor);
 | |
| 
 | |
|     jvmdiError (JNICALL *SetBreakpoint)
 | |
|       (jclass clazz, jmethodID method, jlocation location);
 | |
|     jvmdiError (JNICALL *ClearBreakpoint)
 | |
|       (jclass clazz, jmethodID method, jlocation location);
 | |
|     jvmdiError (JNICALL *ClearAllBreakpoints)
 | |
|       ();
 | |
| 
 | |
|     jvmdiError (JNICALL *SetFieldAccessWatch)
 | |
|       (jclass clazz, jfieldID field);
 | |
|     jvmdiError (JNICALL *ClearFieldAccessWatch)
 | |
|       (jclass clazz, jfieldID field);
 | |
|     jvmdiError (JNICALL *SetFieldModificationWatch)
 | |
|       (jclass clazz, jfieldID field);
 | |
|     jvmdiError (JNICALL *ClearFieldModificationWatch)
 | |
|       (jclass clazz, jfieldID field);
 | |
| 
 | |
|     jvmdiError (JNICALL *SetAllocationHooks)
 | |
|       (JVMDI_AllocHook ahook, JVMDI_DeallocHook dhook);
 | |
|     jvmdiError (JNICALL *Allocate)
 | |
|       (jlong size, jbyte** memPtr);
 | |
|     jvmdiError (JNICALL *Deallocate)
 | |
|       (jbyte* mem);
 | |
| 
 | |
|     jvmdiError (JNICALL *GetClassSignature)
 | |
|       (jclass clazz, char **sigPtr);
 | |
|     jvmdiError (JNICALL *GetClassStatus)
 | |
|       (jclass clazz, jint *statusPtr);
 | |
|     jvmdiError (JNICALL *GetSourceFileName)
 | |
|       (jclass clazz, char **sourceNamePtr);
 | |
|     jvmdiError (JNICALL *GetClassModifiers)
 | |
|       (jclass clazz, jint *modifiersPtr);
 | |
|     jvmdiError (JNICALL *GetClassMethods)
 | |
|       (jclass clazz, jint *methodCountPtr, jmethodID **methodsPtr);
 | |
|     jvmdiError (JNICALL *GetClassFields)
 | |
|        (jclass clazz, jint *fieldCountPtr, jfieldID **fieldsPtr);
 | |
|     jvmdiError (JNICALL *GetImplementedInterfaces)
 | |
|       (jclass clazz, jint *interfaceCountPtr, jclass **interfacesPtr);
 | |
|     jvmdiError (JNICALL *IsInterface)
 | |
|       (jclass clazz, jboolean *isInterfacePtr);
 | |
|     jvmdiError (JNICALL *IsArrayClass)
 | |
|       (jclass clazz, jboolean *isArrayClassPtr);
 | |
|     jvmdiError (JNICALL *GetClassLoader)
 | |
|       (jclass clazz, jobject *classloaderPtr);
 | |
| 
 | |
|     jvmdiError (JNICALL *GetObjectHashCode)
 | |
|       (jobject object, jint *hashCodePtr);
 | |
|     jvmdiError (JNICALL *GetMonitorInfo)
 | |
|       (jobject object, JVMDI_monitor_info *infoPtr);
 | |
| 
 | |
|     jvmdiError (JNICALL *GetFieldName)
 | |
|       (jclass clazz, jfieldID field, char **namePtr, char **signaturePtr);
 | |
|     jvmdiError (JNICALL *GetFieldDeclaringClass)
 | |
|       (jclass clazz, jfieldID field, jclass *declaringClassPtr);
 | |
|     jvmdiError (JNICALL *GetFieldModifiers)
 | |
|       (jclass clazz, jfieldID field, jint *modifiersPtr);
 | |
|     jvmdiError (JNICALL *IsFieldSynthetic)
 | |
|       (jclass clazz, jfieldID field, jboolean *isSyntheticPtr);
 | |
| 
 | |
|     jvmdiError (JNICALL *GetMethodName)
 | |
|       (jclass clazz, jmethodID method, 
 | |
|        char **namePtr, char **signaturePtr);
 | |
|     jvmdiError (JNICALL *GetMethodDeclaringClass)
 | |
|       (jclass clazz, jmethodID method, jclass *declaringClassPtr);
 | |
|     jvmdiError (JNICALL *GetMethodModifiers)
 | |
|       (jclass clazz, jmethodID method, jint *modifiersPtr);
 | |
|     jvmdiError (JNICALL *GetMaxStack)
 | |
|       (jclass clazz, jmethodID method, jint *maxPtr);
 | |
|     jvmdiError (JNICALL *GetMaxLocals)
 | |
|       (jclass clazz, jmethodID method, jint *maxPtr);
 | |
|     jvmdiError (JNICALL *GetArgumentsSize)
 | |
|       (jclass clazz, jmethodID method, jint *sizePtr);
 | |
|     jvmdiError (JNICALL *GetLineNumberTable)
 | |
|       (jclass clazz, jmethodID method,
 | |
|        jint *entryCountPtr, JVMDI_line_number_entry **tablePtr);
 | |
|     jvmdiError (JNICALL *GetMethodLocation)
 | |
|       (jclass clazz, jmethodID method,
 | |
|        jlocation *startLocationPtr, jlocation *endLocationPtr);
 | |
|     jvmdiError (JNICALL *GetLocalVariableTable)
 | |
|       (jclass clazz, jmethodID method,
 | |
|        jint *entryCountPtr, JVMDI_local_variable_entry **tablePtr);
 | |
|     jvmdiError (JNICALL *GetExceptionHandlerTable)
 | |
|       (jclass clazz, jmethodID method,
 | |
|        jint *entryCountPtr, JVMDI_exception_handler_entry **tablePtr);
 | |
|     jvmdiError (JNICALL *GetThrownExceptions)
 | |
|       (jclass clazz, jmethodID method,
 | |
|        jint *exceptionCountPtr, jclass **exceptionsPtr);
 | |
|     jvmdiError (JNICALL *GetBytecodes)
 | |
|       (jclass clazz, jmethodID method,
 | |
|        jint *bytecodeCountPtr, jbyte **bytecodesPtr);
 | |
|     jvmdiError (JNICALL *IsMethodNative)
 | |
|       (jclass clazz, jmethodID method, jboolean *isNativePtr);
 | |
|     jvmdiError (JNICALL *IsMethodSynthetic)
 | |
|       (jclass clazz, jmethodID method, jboolean *isSyntheticPtr);
 | |
| 
 | |
|     jvmdiError (JNICALL *GetLoadedClasses)
 | |
|       (jint *classCountPtr, jclass **classesPtr);
 | |
|     jvmdiError (JNICALL *GetClassLoaderClasses)
 | |
|       (jobject initiatingLoader, jint *classesCountPtr, 
 | |
|        jclass **classesPtr);
 | |
| 
 | |
|     jvmdiError (JNICALL *PopFrame)
 | |
|       (jthread thread);
 | |
|     jvmdiError (JNICALL *SetFrameLocation)
 | |
|       (jframeID frame, jlocation location);
 | |
|     jvmdiError (JNICALL *GetOperandStack)
 | |
|       (jframeID frame, jint *operandStackSizePtr, 
 | |
|        JVMDI_operand_stack_element **operandStackPtr);
 | |
|     jvmdiError (JNICALL *SetOperandStack)
 | |
|       (jframeID frame, jint operandStackSize, 
 | |
|        JVMDI_operand_stack_element *operandStack);
 | |
|     jvmdiError (JNICALL *AllInstances)
 | |
|       (jclass clazz, jint *instanceCountPtr, jobject **instancesPtr);
 | |
|     jvmdiError (JNICALL *References)
 | |
|       (jobject obj, JVMDI_object_reference_info *refs);
 | |
|     jvmdiError (JNICALL *GetClassDefinition)
 | |
|       (jclass clazz, JVMDI_class_definition *classDefPtr);
 | |
|     jvmdiError (JNICALL *RedefineClasses)
 | |
|       (jint classCount, JVMDI_class_definition *classDefs);
 | |
| 
 | |
|     jvmdiError (JNICALL *GetVersionNumber)
 | |
|       (jint *versionPtr);
 | |
|     jvmdiError (JNICALL *GetCapabilities)
 | |
|       (JVMDI_capabilities *capabilitiesPtr);
 | |
| 
 | |
|     jvmdiError (JNICALL *GetSourceDebugExtension)
 | |
|       (jclass clazz, char **sourceDebugExtension);
 | |
|     jvmdiError (JNICALL *IsMethodObsolete)
 | |
|       (jclass clazz, jmethodID method, jboolean *isObsoletePtr);
 | |
| 
 | |
|     jvmdiError (JNICALL *SuspendThreadList)
 | |
|       (jint reqCount, jthread *reqList, jvmdiError *results); 
 | |
|     jvmdiError (JNICALL *ResumeThreadList)
 | |
|       (jint reqCount, jthread *reqList, jvmdiError *results); 
 | |
| } JVMDI_Interface_1;
 | |
|   
 | |
| #ifndef NO_JVMDI_MACROS
 | |
| 
 | |
| #define JVMDI_ERROR_DUPLICATE_BREAKPOINT JVMDI_ERROR_DUPLICATE
 | |
| #define JVMDI_ERROR_NO_SUCH_BREAKPOINT   JVMDI_ERROR_NOT_FOUND
 | |
| #define JVMDI_ERROR_DUPLICATE_FRAME_POP  JVMDI_ERROR_DUPLICATE
 | |
| 
 | |
| 
 | |
| static JVMDI_Interface_1 *jvmdi_interface = NULL;
 | |
| static JavaVM *j_vm;
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| #define SetJVMDIfromJNIEnv(a_env) ( (jvmdi_interface == NULL)?  \
 | |
|               ((a_env)->GetJavaVM(&j_vm),  \
 | |
|                (j_vm)->GetEnv((void **)&jvmdi_interface,  \
 | |
|                                JVMDI_VERSION_1)):0)
 | |
| #else
 | |
| #define SetJVMDIfromJNIEnv(a_env) ( (jvmdi_interface == NULL)?  \
 | |
|               ((*a_env)->GetJavaVM(a_env, &j_vm), \
 | |
|                (*j_vm)->GetEnv(j_vm, (void **)&jvmdi_interface, \
 | |
|                                JVMDI_VERSION_1)):0)
 | |
| #endif
 | |
| 
 | |
| #define JVMDI_SetEventHook(a_env, a1) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->SetEventHook(a1) )
 | |
| #define JVMDI_GetThreadStatus(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetThreadStatus(a1, a2, a3) )
 | |
| #define JVMDI_GetAllThreads(a_env, a1, a2) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetAllThreads(a1, a2) )
 | |
| #define JVMDI_SuspendThread(a_env, a1) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->SuspendThread(a1) )
 | |
| #define JVMDI_ResumeThread(a_env, a1) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->ResumeThread(a1) )
 | |
| #define JVMDI_StopThread(a_env, a1, a2) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->StopThread(a1, a2) )
 | |
| #define JVMDI_InterruptThread(a_env, a1) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->InterruptThread(a1) )
 | |
| #define JVMDI_SetSingleStep(a_env, a1, a2) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->SetEventNotificationMode( \
 | |
|                                        (a2) ? JVMDI_ENABLE : JVMDI_DISABLE, \
 | |
|                                         JVMDI_EVENT_SINGLE_STEP, a1) )
 | |
| #define JVMDI_GetThreadInfo(a_env, a1, a2) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetThreadInfo(a1, a2) )
 | |
| #define JVMDI_RunDebugThread(a_env, a1, a2, a3, a4) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->RunDebugThread(a1, a2, a3, a4) )
 | |
| #define JVMDI_GetTopThreadGroups(a_env, a1, a2) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetTopThreadGroups(a1, a2) )
 | |
| #define JVMDI_GetThreadGroupInfo(a_env, a1, a2) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetThreadGroupInfo(a1, a2) )
 | |
| #define JVMDI_GetThreadGroupChildren(a_env, a1, a2, a3, a4, a5) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetThreadGroupChildren(a1, a2, a3, a4, a5) )
 | |
| #define JVMDI_GetCurrentFrame(a_env, a1, a2) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetCurrentFrame(a1, a2) )
 | |
| #define JVMDI_GetCallerFrame(a_env, a1, a2) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetCallerFrame(a1, a2) )
 | |
| #define JVMDI_GetFrameLocation(a_env, a1, a2, a3, a4) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetFrameLocation(a1, a2, a3, a4) )
 | |
| #define JVMDI_NotifyFramePop(a_env, a1) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->NotifyFramePop(a1) )
 | |
| #define JVMDI_GetLocalObject(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetLocalObject(a1, a2, a3) )
 | |
| #define JVMDI_GetLocalInt(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetLocalInt(a1, a2, a3) )
 | |
| #define JVMDI_GetLocalLong(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetLocalLong(a1, a2, a3) )
 | |
| #define JVMDI_GetLocalFloat(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetLocalFloat(a1, a2, a3) )
 | |
| #define JVMDI_GetLocalDouble(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetLocalDouble(a1, a2, a3) )
 | |
| #define JVMDI_SetLocalObject(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->SetLocalObject(a1, a2, a3) )
 | |
| #define JVMDI_SetLocalInt(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->SetLocalInt(a1, a2, a3) )
 | |
| #define JVMDI_SetLocalLong(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->SetLocalLong(a1, a2, a3) )
 | |
| #define JVMDI_SetLocalFloat(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->SetLocalFloat(a1, a2, a3) )
 | |
| #define JVMDI_SetLocalDouble(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->SetLocalDouble(a1, a2, a3) )
 | |
| #define JVMDI_CreateRawMonitor(a_env, a1, a2) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->CreateRawMonitor(a1, a2) )
 | |
| #define JVMDI_DestroyRawMonitor(a_env, a1) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->DestroyRawMonitor(a1) )
 | |
| #define JVMDI_RawMonitorEnter(a_env, a1) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->RawMonitorEnter(a1) )
 | |
| #define JVMDI_RawMonitorExit(a_env, a1) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->RawMonitorExit(a1) )
 | |
| #define JVMDI_RawMonitorWait(a_env, a1, a2) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->RawMonitorWait(a1, a2) )
 | |
| #define JVMDI_RawMonitorNotify(a_env, a1) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->RawMonitorNotify(a1) )
 | |
| #define JVMDI_RawMonitorNotifyAll(a_env, a1) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->RawMonitorNotifyAll(a1) )
 | |
| #define JVMDI_SetBreakpoint(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->SetBreakpoint(a1, a2, a3) )
 | |
| #define JVMDI_ClearBreakpoint(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->ClearBreakpoint(a1, a2, a3) )
 | |
| #define JVMDI_ClearAllBreakpoints(a_env) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->ClearAllBreakpoints() )
 | |
| #define JVMDI_SetAllocationHooks(a_env, a1, a2) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->SetAllocationHooks(a1, a2) )
 | |
| #define JVMDI_Allocate(a_env, a1, a2) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->Allocate(a1, a2) )
 | |
| #define JVMDI_Deallocate(a_env, a1) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->Deallocate(a1) )
 | |
| #define JVMDI_GetClassSignature(a_env, a1, a2) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetClassSignature(a1, a2) )
 | |
| #define JVMDI_GetClassStatus(a_env, a1, a2) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetClassStatus(a1, a2) )
 | |
| #define JVMDI_GetSourceFileName(a_env, a1, a2) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetSourceFileName(a1, a2) )
 | |
| #define JVMDI_GetClassModifiers(a_env, a1, a2) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetClassModifiers(a1, a2) )
 | |
| #define JVMDI_GetClassMethods(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetClassMethods(a1, a2, a3) )
 | |
| #define JVMDI_GetClassFields(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetClassFields(a1, a2, a3) )
 | |
| #define JVMDI_GetImplementedInterfaces(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetImplementedInterfaces(a1, a2, a3) )
 | |
| #define JVMDI_IsInterface(a_env, a1, a2) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->IsInterface(a1, a2) )
 | |
| #define JVMDI_IsArrayClass(a_env, a1, a2) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->IsArrayClass(a1, a2) )
 | |
| #define JVMDI_ClassLoader(a_env, a1, a2) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetClassLoader(a1, a2) )
 | |
| #define JVMDI_GetFieldName(a_env, a1, a2, a3, a4) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetFieldName(a1, a2, a3, a4) )
 | |
| #define JVMDI_GetFieldDeclaringClass(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetFieldDeclaringClass(a1, a2, a3) )
 | |
| #define JVMDI_GetFieldModifiers(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetFieldModifiers(a1, a2, a3) )
 | |
| #define JVMDI_GetMethodName(a_env, a1, a2, a3, a4) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetMethodName(a1, a2, a3, a4) )
 | |
| #define JVMDI_GetMethodDeclaringClass(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetMethodDeclaringClass(a1, a2, a3) )
 | |
| #define JVMDI_GetMethodModifiers(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetMethodModifiers(a1, a2, a3) )
 | |
| #define JVMDI_GetMaxStack(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetMaxStack(a1, a2, a3) )
 | |
| #define JVMDI_GetMaxLocals(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetMaxLocals(a1, a2, a3) )
 | |
| #define JVMDI_GetArgumentsSize(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetArgumentsSize(a1, a2, a3) )
 | |
| #define JVMDI_GetLineNumberTable(a_env, a1, a2, a3, a4) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetLineNumberTable(a1, a2, a3, a4) )
 | |
| #define JVMDI_GetMethodLocation(a_env, a1, a2, a3, a4) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetMethodLocation(a1, a2, a3, a4) )
 | |
| #define JVMDI_GetLocalVariableTable(a_env, a1, a2, a3, a4) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetLocalVariableTable(a1, a2, a3, a4) )
 | |
| #define JVMDI_GetExceptionHandlerTable(a_env, a1, a2, a3, a4) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetExceptionHandlerTable(a1, a2, a3, a4) )
 | |
| #define JVMDI_GetThrownExceptions(a_env, a1, a2, a3, a4) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetThrownExceptions(a1, a2, a3, a4) )
 | |
| #define JVMDI_GetBytecodes(a_env, a1, a2, a3, a4) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetBytecodes(a1, a2, a3, a4) )
 | |
| #define JVMDI_IsMethodNative(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->IsMethodNative(a1, a2, a3) )
 | |
| #define JVMDI_GetLoadedClasses(a_env, a1, a2) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetLoadedClasses(a1, a2) )
 | |
| #define JVMDI_GetClassLoaderClasses(a_env, a1, a2, a3) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetClassLoaderClasses(a1, a2, a3) )
 | |
| #define JVMDI_GetVersionNumber(a_env, a1) ( \
 | |
|               SetJVMDIfromJNIEnv(a_env), \
 | |
|               jvmdi_interface->GetVersionNumber(a1) )
 | |
| 
 | |
| #endif /* !NO_JVMDI_MACROS */
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| } /* extern "C" */
 | |
| #endif /* __cplusplus */
 | |
| 
 | |
| #endif /* !_JAVASOFT_JVMDI_H_ */
 | |
| 
 | |
| 
 | 
