2 * @(#)jvmdi.h 1.48 03/12/19
\r
4 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
\r
5 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
\r
9 * Java Virtual Machine Debug Interface
\r
11 * Defines debugging functionality that a VM should provide.
\r
13 * Should not overlap functionality in jni.h
\r
16 #ifndef _JAVASOFT_JVMDI_H_
\r
17 #define _JAVASOFT_JVMDI_H_
\r
21 #define JVMDI_VERSION_1 0x20010000
\r
22 #define JVMDI_VERSION_1_1 0x20010001
\r
23 #define JVMDI_VERSION_1_2 0x20010002
\r
24 #define JVMDI_VERSION_1_3 0x20010003
\r
30 typedef jobject jthread;
\r
32 typedef jobject jthreadGroup;
\r
35 typedef struct _jframeID *jframeID;
\r
37 /* specifies program location "pc" - often byte code index */
\r
38 typedef jlong jlocation;
\r
40 /* The jmethodID for methods that have been replaced */
\r
41 /* via RedefineClasses - used when the implementation */
\r
42 /* does not wish to retain replaced jmethodIDs */
\r
43 #define OBSOLETE_METHOD_ID ((jmethodID)(NULL))
\r
49 typedef jint jvmdiError;
\r
52 #define JVMDI_ERROR_NONE ((jvmdiError)0)
\r
55 * Errors on thread operations
\r
58 /* invalid thread */
\r
59 #define JVMDI_ERROR_INVALID_THREAD ((jvmdiError)10)
\r
60 /* invalid thread group */
\r
61 #define JVMDI_ERROR_INVALID_THREAD_GROUP ((jvmdiError)11)
\r
62 /* invalid thread priority */
\r
63 #define JVMDI_ERROR_INVALID_PRIORITY ((jvmdiError)12)
\r
64 /* thread not suspended */
\r
65 #define JVMDI_ERROR_THREAD_NOT_SUSPENDED ((jvmdiError)13)
\r
66 /* thread already suspended */
\r
67 #define JVMDI_ERROR_THREAD_SUSPENDED ((jvmdiError)14)
\r
70 * Errors on object and class operations
\r
73 /* invalid object (implementation not required to gracefully catch) */
\r
74 #define JVMDI_ERROR_INVALID_OBJECT ((jvmdiError)20)
\r
75 /* invalid class (implementation not required to gracefully catch) */
\r
76 #define JVMDI_ERROR_INVALID_CLASS ((jvmdiError)21)
\r
77 /* class not prepared */
\r
78 #define JVMDI_ERROR_CLASS_NOT_PREPARED ((jvmdiError)22)
\r
79 /* invalid methodID (implementation not required to gracefully catch) */
\r
80 #define JVMDI_ERROR_INVALID_METHODID ((jvmdiError)23)
\r
81 /* invalid location */
\r
82 #define JVMDI_ERROR_INVALID_LOCATION ((jvmdiError)24)
\r
83 /* invalid fieldID (implementation not required to gracefully catch) */
\r
84 #define JVMDI_ERROR_INVALID_FIELDID ((jvmdiError)25)
\r
87 * Errors on frame operations
\r
90 /* invalid frameID (implementation not required to gracefully catch) */
\r
91 #define JVMDI_ERROR_INVALID_FRAMEID ((jvmdiError)30)
\r
92 /* there are no more frames on the stack */
\r
93 #define JVMDI_ERROR_NO_MORE_FRAMES ((jvmdiError)31)
\r
94 /* operation cannot be performed on this frame */
\r
95 #define JVMDI_ERROR_OPAQUE_FRAME ((jvmdiError)32)
\r
96 /* operation can only be performed on current frame */
\r
97 #define JVMDI_ERROR_NOT_CURRENT_FRAME ((jvmdiError)33)
\r
98 /* type mismatch (implementation not required to gracefully catch) */
\r
99 #define JVMDI_ERROR_TYPE_MISMATCH ((jvmdiError)34)
\r
101 #define JVMDI_ERROR_INVALID_SLOT ((jvmdiError)35)
\r
104 * Errors on set/clear/find operations
\r
107 /* item already present */
\r
108 #define JVMDI_ERROR_DUPLICATE ((jvmdiError)40)
\r
109 /* item not found */
\r
110 #define JVMDI_ERROR_NOT_FOUND ((jvmdiError)41)
\r
113 * Errors on monitor operations
\r
116 /* invalid monitor */
\r
117 #define JVMDI_ERROR_INVALID_MONITOR ((jvmdiError)50)
\r
118 /* wait, notify, notify all tried without entering monitor */
\r
119 #define JVMDI_ERROR_NOT_MONITOR_OWNER ((jvmdiError)51)
\r
120 /* waiting thread interrupted */
\r
121 #define JVMDI_ERROR_INTERRUPT ((jvmdiError)52)
\r
124 * Class redefinition / operand stack errors
\r
127 /* The equivalent of ClassFormatError */
\r
128 #define JVMDI_ERROR_INVALID_CLASS_FORMAT ((jvmdiError)60)
\r
129 /* The equivalent of ClassCircularityError */
\r
130 #define JVMDI_ERROR_CIRCULAR_CLASS_DEFINITION ((jvmdiError)61)
\r
131 /* The class bytes fail verification */
\r
132 #define JVMDI_ERROR_FAILS_VERIFICATION ((jvmdiError)62)
\r
133 /* The new class version adds new methods */
\r
134 /* and can_add_method is false */
\r
135 #define JVMDI_ERROR_ADD_METHOD_NOT_IMPLEMENTED ((jvmdiError)63)
\r
136 /* The new class version changes fields */
\r
137 /* and can_unrestrictedly_redefine_classes is false */
\r
138 #define JVMDI_ERROR_SCHEMA_CHANGE_NOT_IMPLEMENTED ((jvmdiError)64)
\r
139 /* bci/operand stack/local var combination is not verifiably */
\r
141 #define JVMDI_ERROR_INVALID_TYPESTATE ((jvmdiError)65)
\r
142 /* A direct superclass is different for the new class */
\r
143 /* version, or the set of directly implemented */
\r
144 /* interfaces is different */
\r
145 /* and can_unrestrictedly_redefine_classes is false */
\r
146 #define JVMDI_ERROR_HIERARCHY_CHANGE_NOT_IMPLEMENTED ((jvmdiError)66)
\r
147 /* The new class version does not declare a method */
\r
148 /* declared in the old class version */
\r
149 /* and can_unrestrictedly_redefine_classes is false */
\r
150 #define JVMDI_ERROR_DELETE_METHOD_NOT_IMPLEMENTED ((jvmdiError)67)
\r
151 /* A class file has a version number not supported */
\r
153 #define JVMDI_ERROR_UNSUPPORTED_VERSION ((jvmdiError)68)
\r
154 /* The class name defined in the new class file is */
\r
155 /* different from the name in the old class object */
\r
156 #define JVMDI_ERROR_NAMES_DONT_MATCH ((jvmdiError)69)
\r
157 /* The new class version has different modifiers and */
\r
158 /* can_unrestrictedly_redefine_classes is false */
\r
159 #define JVMDI_ERROR_CLASS_MODIFIERS_CHANGE_NOT_IMPLEMENTED ((jvmdiError)70)
\r
160 /* A method in the new class version has different modifiers */
\r
161 /* than its counterpart in the old class version */
\r
162 /* and can_unrestrictedly_redefine_classes is false */
\r
163 #define JVMDI_ERROR_METHOD_MODIFIERS_CHANGE_NOT_IMPLEMENTED ((jvmdiError)71)
\r
166 * Miscellaneous errors
\r
169 /* Not yet implemented */
\r
170 #define JVMDI_ERROR_NOT_IMPLEMENTED ((jvmdiError)99)
\r
172 #define JVMDI_ERROR_NULL_POINTER ((jvmdiError)100)
\r
173 /* information is absent */
\r
174 #define JVMDI_ERROR_ABSENT_INFORMATION ((jvmdiError)101)
\r
175 /* invalid event type */
\r
176 #define JVMDI_ERROR_INVALID_EVENT_TYPE ((jvmdiError)102)
\r
177 /* invalid argument */
\r
178 #define JVMDI_ERROR_ILLEGAL_ARGUMENT ((jvmdiError)103)
\r
181 * Universal errors. These errors may be returned by
\r
182 * any JVMDI function, not just the ones for which they are listed
\r
186 /* no more memory available for allocation */
\r
187 #define JVMDI_ERROR_OUT_OF_MEMORY ((jvmdiError)110)
\r
188 /* debugging has not been enabled in this VM */
\r
189 #define JVMDI_ERROR_ACCESS_DENIED ((jvmdiError)111)
\r
190 /* VM is dead (implementation not required to gracefully catch) */
\r
191 #define JVMDI_ERROR_VM_DEAD ((jvmdiError)112)
\r
192 /* internal error */
\r
193 #define JVMDI_ERROR_INTERNAL ((jvmdiError)113)
\r
194 /* Thread calling JVMDI function not attached to VM */
\r
195 #define JVMDI_ERROR_UNATTACHED_THREAD ((jvmdiError)115)
\r
202 /* Thread status is unknown */
\r
203 #define JVMDI_THREAD_STATUS_UNKNOWN ((jint)-1)
\r
204 /* Thread is waiting to die */
\r
205 #define JVMDI_THREAD_STATUS_ZOMBIE ((jint)0)
\r
206 /* Thread is runnable */
\r
207 #define JVMDI_THREAD_STATUS_RUNNING ((jint)1)
\r
208 /* Thread is sleeping - Thread.sleep() or JVM_Sleep() was called */
\r
209 #define JVMDI_THREAD_STATUS_SLEEPING ((jint)2)
\r
210 /* Thread is waiting on a java monitor */
\r
211 #define JVMDI_THREAD_STATUS_MONITOR ((jint)3)
\r
212 /* Thread is waiting - Thread.wait() or JVM_MonitorWait() was called */
\r
213 #define JVMDI_THREAD_STATUS_WAIT ((jint)4)
\r
215 /* Thread is suspended - Thread.suspend(), JVM_Suspend() or
\r
216 * JVMDI_Suspend was called */
\r
217 #define JVMDI_SUSPEND_STATUS_SUSPENDED ((jint)0x1)
\r
218 /* Thread is at a breakpoint */
\r
219 #define JVMDI_SUSPEND_STATUS_BREAK ((jint)0x2)
\r
222 /* Thread priority constants */
\r
223 #define JVMDI_THREAD_MIN_PRIORITY ((jint)1)
\r
224 #define JVMDI_THREAD_NORM_PRIORITY ((jint)5)
\r
225 #define JVMDI_THREAD_MAX_PRIORITY ((jint)10)
\r
230 jboolean is_daemon;
\r
231 jthreadGroup thread_group;
\r
232 jobject context_class_loader;
\r
233 } JVMDI_thread_info;
\r
236 jthreadGroup parent;
\r
239 jboolean is_daemon;
\r
240 } JVMDI_thread_group_info;
\r
242 #define JVMDI_DISABLE ((jint) 0)
\r
243 #define JVMDI_ENABLE ((jint) 1)
\r
246 * Initial function for debug threads created through JVMDI
\r
248 typedef void (*JVMDI_StartFunction)(void *);
\r
251 * Type for debug monitors created through JVMDI
\r
253 typedef void *JVMDI_RawMonitor;
\r
255 #define JVMDI_MONITOR_WAIT_FOREVER ((jlong)(-1))
\r
258 * Monitor information
\r
265 } JVMDI_monitor_info;
\r
268 jint owned_monitor_count;
\r
269 jobject *owned_monitors;
\r
270 } JVMDI_owned_monitor_info;
\r
276 /* kind = JVMDI_EVENT_SINGLE_STEP */
\r
281 jlocation location;
\r
282 } JVMDI_single_step_event_data;
\r
284 /* kind = JVMDI_EVENT_BREAKPOINT */
\r
289 jlocation location;
\r
290 } JVMDI_breakpoint_event_data;
\r
292 /* kind = JVMDI_EVENT_FIELD_ACCESS */
\r
297 jlocation location;
\r
298 jclass field_clazz;
\r
301 } JVMDI_field_access_event_data;
\r
303 /* kind = JVMDI_EVENT_FIELD_MODIFICATION */
\r
308 jlocation location;
\r
309 jclass field_clazz;
\r
312 char signature_type;
\r
314 } JVMDI_field_modification_event_data;
\r
316 /* kind = JVMDI_EVENT_FRAME_POP */
\r
317 /* kind = JVMDI_EVENT_METHOD_ENTRY */
\r
318 /* kind = JVMDI_EVENT_METHOD_EXIT */
\r
324 } JVMDI_frame_event_data;
\r
326 /* kind = JVMDI_EVENT_EXCEPTION */
\r
331 jlocation location;
\r
333 jclass catch_clazz;
\r
334 jmethodID catch_method;
\r
335 jlocation catch_location;
\r
336 } JVMDI_exception_event_data;
\r
338 /* kind = JVMDI_EVENT_EXCEPTION_CATCH */
\r
343 jlocation location;
\r
345 } JVMDI_exception_catch_event_data;
\r
347 /* kind = JVMDI_EVENT_USER_DEFINED */
\r
351 } JVMDI_user_event_data;
\r
353 /* kind = JVMDI_EVENT_THREAD_END or */
\r
354 /* JVMDI_EVENT_THREAD_START */
\r
357 } JVMDI_thread_change_event_data;
\r
359 /* kind = JVMDI_EVENT_CLASS_LOAD, */
\r
360 /* JVMDI_EVENT_CLASS_UNLOAD, or */
\r
361 /* JVMDI_EVENT_CLASS_PREPARE */
\r
365 } JVMDI_class_event_data;
\r
367 /* This stucture passes information about the event.
\r
368 * location is the index of the last instruction executed.
\r
371 jint kind; /* the discriminant */
\r
374 /* kind = JVMDI_EVENT_SINGLE_STEP */
\r
375 JVMDI_single_step_event_data single_step;
\r
377 /* kind = JVMDI_EVENT_BREAKPOINT */
\r
378 JVMDI_breakpoint_event_data breakpoint;
\r
380 /* kind = JVMDI_EVENT_FRAME_POP */
\r
381 /* kind = JVMDI_EVENT_METHOD_ENTRY */
\r
382 /* kind = JVMDI_EVENT_METHOD_EXIT */
\r
383 JVMDI_frame_event_data frame;
\r
385 /* kind = JVMDI_EVENT_FIELD_ACCESS */
\r
386 JVMDI_field_access_event_data field_access;
\r
388 /* kind = JVMDI_EVENT_FIELD_MODIFICATION */
\r
389 JVMDI_field_modification_event_data field_modification;
\r
391 /* kind = JVMDI_EVENT_EXCEPTION */
\r
392 JVMDI_exception_event_data exception;
\r
394 /* kind = JVMDI_EVENT_EXCEPTION_CATCH */
\r
395 JVMDI_exception_catch_event_data exception_catch;
\r
397 /* kind = JVMDI_EVENT_USER_DEFINED */
\r
398 JVMDI_user_event_data user;
\r
400 /* kind = JVMDI_EVENT_THREAD_END or */
\r
401 /* JVMDI_EVENT_THREAD_START */
\r
402 JVMDI_thread_change_event_data thread_change;
\r
404 /* kind = JVMDI_EVENT_CLASS_LOAD, */
\r
405 /* JVMDI_EVENT_CLASS_UNLOAD, or */
\r
406 /* JVMDI_EVENT_CLASS_PREPARE */
\r
407 JVMDI_class_event_data class_event;
\r
409 /* kind = JVMDI_EVENT_VM_DEATH, JVMDI_EVENT_VM_INIT */
\r
410 /* no additional fields */
\r
414 /*** event kinds ***/
\r
415 #define JVMDI_EVENT_SINGLE_STEP ((jint)1)
\r
416 #define JVMDI_EVENT_BREAKPOINT ((jint)2)
\r
417 #define JVMDI_EVENT_FRAME_POP ((jint)3)
\r
418 #define JVMDI_EVENT_EXCEPTION ((jint)4)
\r
419 #define JVMDI_EVENT_USER_DEFINED ((jint)5)
\r
420 #define JVMDI_EVENT_THREAD_START ((jint)6)
\r
421 #define JVMDI_EVENT_THREAD_END ((jint)7)
\r
422 #define JVMDI_EVENT_CLASS_PREPARE ((jint)8)
\r
423 #define JVMDI_EVENT_CLASS_UNLOAD ((jint)9)
\r
424 #define JVMDI_EVENT_CLASS_LOAD ((jint)10)
\r
425 #define JVMDI_EVENT_FIELD_ACCESS ((jint)20)
\r
426 #define JVMDI_EVENT_FIELD_MODIFICATION ((jint)21)
\r
427 #define JVMDI_EVENT_EXCEPTION_CATCH ((jint)30)
\r
428 #define JVMDI_EVENT_METHOD_ENTRY ((jint)40)
\r
429 #define JVMDI_EVENT_METHOD_EXIT ((jint)41)
\r
430 #define JVMDI_EVENT_VM_INIT ((jint)90)
\r
431 #define JVMDI_EVENT_VM_DEATH ((jint)99)
\r
433 #define JVMDI_MAX_EVENT_TYPE_VAL ((jint)99)
\r
437 /* event handler hook */
\r
438 typedef void (*JVMDI_EventHook)(JNIEnv *env, JVMDI_Event *event);
\r
440 typedef jvmdiError (*JVMDI_AllocHook) (jlong size, jbyte** memPtr);
\r
441 typedef jvmdiError (*JVMDI_DeallocHook) (jbyte* buffer);
\r
444 * Class states used in JVMDI_GetClassStatus
\r
446 #define JVMDI_CLASS_STATUS_VERIFIED ((jint)0x01)
\r
447 #define JVMDI_CLASS_STATUS_PREPARED ((jint)0x02)
\r
448 #define JVMDI_CLASS_STATUS_INITIALIZED ((jint)0x04)
\r
449 /* Error prevents initialization */
\r
450 #define JVMDI_CLASS_STATUS_ERROR ((jint)0x08)
\r
452 /* structure for returning line number information
\r
455 jlocation start_location;
\r
457 } JVMDI_line_number_entry;
\r
460 /* structure for returning local variable information
\r
463 jlocation start_location; /* variable valid start_location */
\r
464 jint length; /* upto start_location+length */
\r
465 char *name; /* name in UTF8 */
\r
466 char *signature; /* type signature in UTF8 */
\r
467 jint slot; /* variable slot, see JVMDI_GetLocal*() */
\r
468 } JVMDI_local_variable_entry;
\r
470 /* structure for returning exception handler information
\r
473 jlocation start_location;
\r
474 jlocation end_location;
\r
475 jlocation handler_location;
\r
476 jclass exception; /* if null, all exceptions */
\r
477 } JVMDI_exception_handler_entry;
\r
479 #define JVMDI_OPERAND_TYPE_REFERENCE ((jint)1)
\r
480 #define JVMDI_OPERAND_TYPE_INT ((jint)2)
\r
481 #define JVMDI_OPERAND_TYPE_FLOAT ((jint)3)
\r
482 #define JVMDI_OPERAND_TYPE_LONG0 ((jint)4) /* least sig. 32 bits */
\r
483 #define JVMDI_OPERAND_TYPE_LONG1 ((jint)5) /* most sig. 32 bits */
\r
484 #define JVMDI_OPERAND_TYPE_DOUBLE0 ((jint)6) /* least sig. 32 bits */
\r
485 #define JVMDI_OPERAND_TYPE_DOUBLE1 ((jint)7) /* most sig. 32 bits */
\r
486 #define JVMDI_OPERAND_TYPE_RETURN_ADDRESS ((jint)8)
\r
489 jint word; /* 32 bit operand stack quantities */
\r
490 jint type; /* type encoding of the operand word */
\r
491 /* one of JVMDI_OPERAND_TYPE_* */
\r
492 } JVMDI_operand_stack_element;
\r
495 jint instance_field_count; /* number of instance fields referencing obj */
\r
496 struct JVMDI_instance_field {
\r
497 jobject instance; /* instance referencing obj */
\r
498 jfieldID field; /* field holding reference */
\r
499 } *instance_fields; /* instanceField_count of them */
\r
501 jint static_field_count; /* number of static fields referencing obj */
\r
502 struct JVMDI_static_field {
\r
503 jclass clazz; /* class referencing obj */
\r
504 jfieldID static_field; /* field holding reference */
\r
505 } *static_fields; /* static_field_count of them */
\r
507 jint array_element_count; /* number of array elements referencing obj */
\r
508 struct JVMDI_array_element {
\r
509 jobjectArray array; /* array referencing obj */
\r
510 jint index; /* index holding reference */
\r
511 } *array_elements; /* array_element_count of them */
\r
513 jint frame_slot_count; /* number of frame slots referencing obj */
\r
514 struct JVMDI_frame_slot {
\r
515 jthread thread; /* thread of the frame */
\r
516 jframeID frame; /* frame referencing obj */
\r
517 jint slot; /* slot holding reference */
\r
518 } *frame_slots; /* frame_slot_count of them */
\r
519 } JVMDI_object_reference_info;
\r
521 /* structure for defining a class
\r
524 jclass clazz; /* Class object for this class */
\r
525 jint class_byte_count; /* number of bytes defining class (below) */
\r
526 jbyte *class_bytes; /* bytes defining class (in JVM spec */
\r
527 /* Class File Format) */
\r
528 } JVMDI_class_definition;
\r
530 /* For backwards compatibility */
\r
531 #define can_change_schema can_unrestrictedly_redefine_classes
\r
534 unsigned int can_watch_field_modification : 1;
\r
535 unsigned int can_watch_field_access : 1;
\r
536 unsigned int can_get_bytecodes : 1;
\r
537 unsigned int can_get_synthetic_attribute : 1;
\r
538 unsigned int can_get_owned_monitor_info : 1;
\r
539 unsigned int can_get_current_contended_monitor : 1;
\r
540 unsigned int can_get_monitor_info : 1;
\r
541 unsigned int can_get_heap_info : 1;
\r
542 unsigned int can_get_operand_stack : 1;
\r
543 unsigned int can_set_operand_stack : 1;
\r
544 unsigned int can_pop_frame : 1;
\r
545 unsigned int can_get_class_definition : 1;
\r
546 unsigned int can_redefine_classes : 1;
\r
547 unsigned int can_add_method : 1;
\r
548 unsigned int can_unrestrictedly_redefine_classes : 1;
\r
549 unsigned int can_suspend_resume_thread_lists : 1;
\r
550 } JVMDI_capabilities;
\r
552 typedef struct JVMDI_Interface_1_ {
\r
553 jvmdiError (JNICALL *SetEventHook)
\r
554 (JVMDI_EventHook hook);
\r
555 jvmdiError (JNICALL *SetEventNotificationMode)
\r
556 (jint mode, jint eventType, jthread thread, ...);
\r
558 jvmdiError (JNICALL *GetThreadStatus)
\r
560 jint *threadStatusPtr, jint *suspendStatusPtr);
\r
561 jvmdiError (JNICALL *GetAllThreads)
\r
562 (jint *threadsCountPtr, jthread **threadsPtr);
\r
563 jvmdiError (JNICALL *SuspendThread)
\r
565 jvmdiError (JNICALL *ResumeThread)
\r
567 jvmdiError (JNICALL *StopThread)
\r
568 (jthread thread, jobject exception);
\r
569 jvmdiError (JNICALL *InterruptThread)
\r
571 jvmdiError (JNICALL *GetThreadInfo)
\r
572 (jthread thread, JVMDI_thread_info *infoPtr);
\r
573 jvmdiError (JNICALL *GetOwnedMonitorInfo)
\r
574 (jthread thread, JVMDI_owned_monitor_info *infoPtr);
\r
575 jvmdiError (JNICALL *GetCurrentContendedMonitor)
\r
576 (jthread thread, jobject *monitor);
\r
577 jvmdiError (JNICALL *RunDebugThread)
\r
578 (jthread thread, JVMDI_StartFunction proc, void *arg,
\r
581 jvmdiError (JNICALL *GetTopThreadGroups)
\r
582 (jint *groupCountPtr, jthreadGroup **groupsPtr);
\r
583 jvmdiError (JNICALL *GetThreadGroupInfo)
\r
584 (jthreadGroup group, JVMDI_thread_group_info *infoPtr);
\r
585 jvmdiError (JNICALL *GetThreadGroupChildren)
\r
586 (jthreadGroup group,
\r
587 jint *threadCountPtr, jthread **threadsPtr,
\r
588 jint *groupCountPtr, jthreadGroup **groupsPtr);
\r
590 jvmdiError (JNICALL *GetFrameCount)
\r
591 (jthread thread, jint *countPtr);
\r
592 jvmdiError (JNICALL *GetCurrentFrame)
\r
593 (jthread thread, jframeID *framePtr);
\r
594 jvmdiError (JNICALL *GetCallerFrame)
\r
595 (jframeID called, jframeID *framePtr);
\r
596 jvmdiError (JNICALL *GetFrameLocation)
\r
597 (jframeID frame, jclass *classPtr, jmethodID *methodPtr,
\r
598 jlocation *locationPtr);
\r
599 jvmdiError (JNICALL *NotifyFramePop)
\r
601 jvmdiError (JNICALL *GetLocalObject)
\r
602 (jframeID frame, jint slot, jobject *valuePtr);
\r
603 jvmdiError (JNICALL *GetLocalInt)
\r
604 (jframeID frame, jint slot, jint *valuePtr);
\r
605 jvmdiError (JNICALL *GetLocalLong)
\r
606 (jframeID frame, jint slot, jlong *valuePtr);
\r
607 jvmdiError (JNICALL *GetLocalFloat)
\r
608 (jframeID frame, jint slot, jfloat *valuePtr);
\r
609 jvmdiError (JNICALL *GetLocalDouble)
\r
610 (jframeID frame, jint slot, jdouble *valuePtr);
\r
611 jvmdiError (JNICALL *SetLocalObject)
\r
612 (jframeID frame, jint slot, jobject value);
\r
613 jvmdiError (JNICALL *SetLocalInt)
\r
614 (jframeID frame, jint slot, jint value);
\r
615 jvmdiError (JNICALL *SetLocalLong)
\r
616 (jframeID frame, jint slot, jlong value);
\r
617 jvmdiError (JNICALL *SetLocalFloat)
\r
618 (jframeID frame, jint slot, jfloat value);
\r
619 jvmdiError (JNICALL *SetLocalDouble)
\r
620 (jframeID frame, jint slot, jdouble value);
\r
622 jvmdiError (JNICALL *CreateRawMonitor)
\r
623 (char *name, JVMDI_RawMonitor *monitorPtr);
\r
624 jvmdiError (JNICALL *DestroyRawMonitor)
\r
625 (JVMDI_RawMonitor monitor);
\r
626 jvmdiError (JNICALL *RawMonitorEnter)
\r
627 (JVMDI_RawMonitor monitor);
\r
628 jvmdiError (JNICALL *RawMonitorExit)
\r
629 (JVMDI_RawMonitor monitor);
\r
630 jvmdiError (JNICALL *RawMonitorWait)
\r
631 (JVMDI_RawMonitor monitor, jlong millis);
\r
632 jvmdiError (JNICALL *RawMonitorNotify)
\r
633 (JVMDI_RawMonitor monitor);
\r
634 jvmdiError (JNICALL *RawMonitorNotifyAll)
\r
635 (JVMDI_RawMonitor monitor);
\r
637 jvmdiError (JNICALL *SetBreakpoint)
\r
638 (jclass clazz, jmethodID method, jlocation location);
\r
639 jvmdiError (JNICALL *ClearBreakpoint)
\r
640 (jclass clazz, jmethodID method, jlocation location);
\r
641 jvmdiError (JNICALL *ClearAllBreakpoints)
\r
644 jvmdiError (JNICALL *SetFieldAccessWatch)
\r
645 (jclass clazz, jfieldID field);
\r
646 jvmdiError (JNICALL *ClearFieldAccessWatch)
\r
647 (jclass clazz, jfieldID field);
\r
648 jvmdiError (JNICALL *SetFieldModificationWatch)
\r
649 (jclass clazz, jfieldID field);
\r
650 jvmdiError (JNICALL *ClearFieldModificationWatch)
\r
651 (jclass clazz, jfieldID field);
\r
653 jvmdiError (JNICALL *SetAllocationHooks)
\r
654 (JVMDI_AllocHook ahook, JVMDI_DeallocHook dhook);
\r
655 jvmdiError (JNICALL *Allocate)
\r
656 (jlong size, jbyte** memPtr);
\r
657 jvmdiError (JNICALL *Deallocate)
\r
660 jvmdiError (JNICALL *GetClassSignature)
\r
661 (jclass clazz, char **sigPtr);
\r
662 jvmdiError (JNICALL *GetClassStatus)
\r
663 (jclass clazz, jint *statusPtr);
\r
664 jvmdiError (JNICALL *GetSourceFileName)
\r
665 (jclass clazz, char **sourceNamePtr);
\r
666 jvmdiError (JNICALL *GetClassModifiers)
\r
667 (jclass clazz, jint *modifiersPtr);
\r
668 jvmdiError (JNICALL *GetClassMethods)
\r
669 (jclass clazz, jint *methodCountPtr, jmethodID **methodsPtr);
\r
670 jvmdiError (JNICALL *GetClassFields)
\r
671 (jclass clazz, jint *fieldCountPtr, jfieldID **fieldsPtr);
\r
672 jvmdiError (JNICALL *GetImplementedInterfaces)
\r
673 (jclass clazz, jint *interfaceCountPtr, jclass **interfacesPtr);
\r
674 jvmdiError (JNICALL *IsInterface)
\r
675 (jclass clazz, jboolean *isInterfacePtr);
\r
676 jvmdiError (JNICALL *IsArrayClass)
\r
677 (jclass clazz, jboolean *isArrayClassPtr);
\r
678 jvmdiError (JNICALL *GetClassLoader)
\r
679 (jclass clazz, jobject *classloaderPtr);
\r
681 jvmdiError (JNICALL *GetObjectHashCode)
\r
682 (jobject object, jint *hashCodePtr);
\r
683 jvmdiError (JNICALL *GetMonitorInfo)
\r
684 (jobject object, JVMDI_monitor_info *infoPtr);
\r
686 jvmdiError (JNICALL *GetFieldName)
\r
687 (jclass clazz, jfieldID field, char **namePtr, char **signaturePtr);
\r
688 jvmdiError (JNICALL *GetFieldDeclaringClass)
\r
689 (jclass clazz, jfieldID field, jclass *declaringClassPtr);
\r
690 jvmdiError (JNICALL *GetFieldModifiers)
\r
691 (jclass clazz, jfieldID field, jint *modifiersPtr);
\r
692 jvmdiError (JNICALL *IsFieldSynthetic)
\r
693 (jclass clazz, jfieldID field, jboolean *isSyntheticPtr);
\r
695 jvmdiError (JNICALL *GetMethodName)
\r
696 (jclass clazz, jmethodID method,
\r
697 char **namePtr, char **signaturePtr);
\r
698 jvmdiError (JNICALL *GetMethodDeclaringClass)
\r
699 (jclass clazz, jmethodID method, jclass *declaringClassPtr);
\r
700 jvmdiError (JNICALL *GetMethodModifiers)
\r
701 (jclass clazz, jmethodID method, jint *modifiersPtr);
\r
702 jvmdiError (JNICALL *GetMaxStack)
\r
703 (jclass clazz, jmethodID method, jint *maxPtr);
\r
704 jvmdiError (JNICALL *GetMaxLocals)
\r
705 (jclass clazz, jmethodID method, jint *maxPtr);
\r
706 jvmdiError (JNICALL *GetArgumentsSize)
\r
707 (jclass clazz, jmethodID method, jint *sizePtr);
\r
708 jvmdiError (JNICALL *GetLineNumberTable)
\r
709 (jclass clazz, jmethodID method,
\r
710 jint *entryCountPtr, JVMDI_line_number_entry **tablePtr);
\r
711 jvmdiError (JNICALL *GetMethodLocation)
\r
712 (jclass clazz, jmethodID method,
\r
713 jlocation *startLocationPtr, jlocation *endLocationPtr);
\r
714 jvmdiError (JNICALL *GetLocalVariableTable)
\r
715 (jclass clazz, jmethodID method,
\r
716 jint *entryCountPtr, JVMDI_local_variable_entry **tablePtr);
\r
717 jvmdiError (JNICALL *GetExceptionHandlerTable)
\r
718 (jclass clazz, jmethodID method,
\r
719 jint *entryCountPtr, JVMDI_exception_handler_entry **tablePtr);
\r
720 jvmdiError (JNICALL *GetThrownExceptions)
\r
721 (jclass clazz, jmethodID method,
\r
722 jint *exceptionCountPtr, jclass **exceptionsPtr);
\r
723 jvmdiError (JNICALL *GetBytecodes)
\r
724 (jclass clazz, jmethodID method,
\r
725 jint *bytecodeCountPtr, jbyte **bytecodesPtr);
\r
726 jvmdiError (JNICALL *IsMethodNative)
\r
727 (jclass clazz, jmethodID method, jboolean *isNativePtr);
\r
728 jvmdiError (JNICALL *IsMethodSynthetic)
\r
729 (jclass clazz, jmethodID method, jboolean *isSyntheticPtr);
\r
731 jvmdiError (JNICALL *GetLoadedClasses)
\r
732 (jint *classCountPtr, jclass **classesPtr);
\r
733 jvmdiError (JNICALL *GetClassLoaderClasses)
\r
734 (jobject initiatingLoader, jint *classesCountPtr,
\r
735 jclass **classesPtr);
\r
737 jvmdiError (JNICALL *PopFrame)
\r
739 jvmdiError (JNICALL *SetFrameLocation)
\r
740 (jframeID frame, jlocation location);
\r
741 jvmdiError (JNICALL *GetOperandStack)
\r
742 (jframeID frame, jint *operandStackSizePtr,
\r
743 JVMDI_operand_stack_element **operandStackPtr);
\r
744 jvmdiError (JNICALL *SetOperandStack)
\r
745 (jframeID frame, jint operandStackSize,
\r
746 JVMDI_operand_stack_element *operandStack);
\r
747 jvmdiError (JNICALL *AllInstances)
\r
748 (jclass clazz, jint *instanceCountPtr, jobject **instancesPtr);
\r
749 jvmdiError (JNICALL *References)
\r
750 (jobject obj, JVMDI_object_reference_info *refs);
\r
751 jvmdiError (JNICALL *GetClassDefinition)
\r
752 (jclass clazz, JVMDI_class_definition *classDefPtr);
\r
753 jvmdiError (JNICALL *RedefineClasses)
\r
754 (jint classCount, JVMDI_class_definition *classDefs);
\r
756 jvmdiError (JNICALL *GetVersionNumber)
\r
757 (jint *versionPtr);
\r
758 jvmdiError (JNICALL *GetCapabilities)
\r
759 (JVMDI_capabilities *capabilitiesPtr);
\r
761 jvmdiError (JNICALL *GetSourceDebugExtension)
\r
762 (jclass clazz, char **sourceDebugExtension);
\r
763 jvmdiError (JNICALL *IsMethodObsolete)
\r
764 (jclass clazz, jmethodID method, jboolean *isObsoletePtr);
\r
766 jvmdiError (JNICALL *SuspendThreadList)
\r
767 (jint reqCount, jthread *reqList, jvmdiError *results);
\r
768 jvmdiError (JNICALL *ResumeThreadList)
\r
769 (jint reqCount, jthread *reqList, jvmdiError *results);
\r
770 } JVMDI_Interface_1;
\r
772 #ifndef NO_JVMDI_MACROS
\r
774 #define JVMDI_ERROR_DUPLICATE_BREAKPOINT JVMDI_ERROR_DUPLICATE
\r
775 #define JVMDI_ERROR_NO_SUCH_BREAKPOINT JVMDI_ERROR_NOT_FOUND
\r
776 #define JVMDI_ERROR_DUPLICATE_FRAME_POP JVMDI_ERROR_DUPLICATE
\r
779 static JVMDI_Interface_1 *jvmdi_interface = NULL;
\r
780 static JavaVM *j_vm;
\r
783 #define SetJVMDIfromJNIEnv(a_env) ( (jvmdi_interface == NULL)? \
\r
784 ((a_env)->GetJavaVM(&j_vm), \
\r
785 (j_vm)->GetEnv((void **)&jvmdi_interface, \
\r
786 JVMDI_VERSION_1)):0)
\r
788 #define SetJVMDIfromJNIEnv(a_env) ( (jvmdi_interface == NULL)? \
\r
789 ((*a_env)->GetJavaVM(a_env, &j_vm), \
\r
790 (*j_vm)->GetEnv(j_vm, (void **)&jvmdi_interface, \
\r
791 JVMDI_VERSION_1)):0)
\r
794 #define JVMDI_SetEventHook(a_env, a1) ( \
\r
795 SetJVMDIfromJNIEnv(a_env), \
\r
796 jvmdi_interface->SetEventHook(a1) )
\r
797 #define JVMDI_GetThreadStatus(a_env, a1, a2, a3) ( \
\r
798 SetJVMDIfromJNIEnv(a_env), \
\r
799 jvmdi_interface->GetThreadStatus(a1, a2, a3) )
\r
800 #define JVMDI_GetAllThreads(a_env, a1, a2) ( \
\r
801 SetJVMDIfromJNIEnv(a_env), \
\r
802 jvmdi_interface->GetAllThreads(a1, a2) )
\r
803 #define JVMDI_SuspendThread(a_env, a1) ( \
\r
804 SetJVMDIfromJNIEnv(a_env), \
\r
805 jvmdi_interface->SuspendThread(a1) )
\r
806 #define JVMDI_ResumeThread(a_env, a1) ( \
\r
807 SetJVMDIfromJNIEnv(a_env), \
\r
808 jvmdi_interface->ResumeThread(a1) )
\r
809 #define JVMDI_StopThread(a_env, a1, a2) ( \
\r
810 SetJVMDIfromJNIEnv(a_env), \
\r
811 jvmdi_interface->StopThread(a1, a2) )
\r
812 #define JVMDI_InterruptThread(a_env, a1) ( \
\r
813 SetJVMDIfromJNIEnv(a_env), \
\r
814 jvmdi_interface->InterruptThread(a1) )
\r
815 #define JVMDI_SetSingleStep(a_env, a1, a2) ( \
\r
816 SetJVMDIfromJNIEnv(a_env), \
\r
817 jvmdi_interface->SetEventNotificationMode( \
\r
818 (a2) ? JVMDI_ENABLE : JVMDI_DISABLE, \
\r
819 JVMDI_EVENT_SINGLE_STEP, a1) )
\r
820 #define JVMDI_GetThreadInfo(a_env, a1, a2) ( \
\r
821 SetJVMDIfromJNIEnv(a_env), \
\r
822 jvmdi_interface->GetThreadInfo(a1, a2) )
\r
823 #define JVMDI_RunDebugThread(a_env, a1, a2, a3, a4) ( \
\r
824 SetJVMDIfromJNIEnv(a_env), \
\r
825 jvmdi_interface->RunDebugThread(a1, a2, a3, a4) )
\r
826 #define JVMDI_GetTopThreadGroups(a_env, a1, a2) ( \
\r
827 SetJVMDIfromJNIEnv(a_env), \
\r
828 jvmdi_interface->GetTopThreadGroups(a1, a2) )
\r
829 #define JVMDI_GetThreadGroupInfo(a_env, a1, a2) ( \
\r
830 SetJVMDIfromJNIEnv(a_env), \
\r
831 jvmdi_interface->GetThreadGroupInfo(a1, a2) )
\r
832 #define JVMDI_GetThreadGroupChildren(a_env, a1, a2, a3, a4, a5) ( \
\r
833 SetJVMDIfromJNIEnv(a_env), \
\r
834 jvmdi_interface->GetThreadGroupChildren(a1, a2, a3, a4, a5) )
\r
835 #define JVMDI_GetCurrentFrame(a_env, a1, a2) ( \
\r
836 SetJVMDIfromJNIEnv(a_env), \
\r
837 jvmdi_interface->GetCurrentFrame(a1, a2) )
\r
838 #define JVMDI_GetCallerFrame(a_env, a1, a2) ( \
\r
839 SetJVMDIfromJNIEnv(a_env), \
\r
840 jvmdi_interface->GetCallerFrame(a1, a2) )
\r
841 #define JVMDI_GetFrameLocation(a_env, a1, a2, a3, a4) ( \
\r
842 SetJVMDIfromJNIEnv(a_env), \
\r
843 jvmdi_interface->GetFrameLocation(a1, a2, a3, a4) )
\r
844 #define JVMDI_NotifyFramePop(a_env, a1) ( \
\r
845 SetJVMDIfromJNIEnv(a_env), \
\r
846 jvmdi_interface->NotifyFramePop(a1) )
\r
847 #define JVMDI_GetLocalObject(a_env, a1, a2, a3) ( \
\r
848 SetJVMDIfromJNIEnv(a_env), \
\r
849 jvmdi_interface->GetLocalObject(a1, a2, a3) )
\r
850 #define JVMDI_GetLocalInt(a_env, a1, a2, a3) ( \
\r
851 SetJVMDIfromJNIEnv(a_env), \
\r
852 jvmdi_interface->GetLocalInt(a1, a2, a3) )
\r
853 #define JVMDI_GetLocalLong(a_env, a1, a2, a3) ( \
\r
854 SetJVMDIfromJNIEnv(a_env), \
\r
855 jvmdi_interface->GetLocalLong(a1, a2, a3) )
\r
856 #define JVMDI_GetLocalFloat(a_env, a1, a2, a3) ( \
\r
857 SetJVMDIfromJNIEnv(a_env), \
\r
858 jvmdi_interface->GetLocalFloat(a1, a2, a3) )
\r
859 #define JVMDI_GetLocalDouble(a_env, a1, a2, a3) ( \
\r
860 SetJVMDIfromJNIEnv(a_env), \
\r
861 jvmdi_interface->GetLocalDouble(a1, a2, a3) )
\r
862 #define JVMDI_SetLocalObject(a_env, a1, a2, a3) ( \
\r
863 SetJVMDIfromJNIEnv(a_env), \
\r
864 jvmdi_interface->SetLocalObject(a1, a2, a3) )
\r
865 #define JVMDI_SetLocalInt(a_env, a1, a2, a3) ( \
\r
866 SetJVMDIfromJNIEnv(a_env), \
\r
867 jvmdi_interface->SetLocalInt(a1, a2, a3) )
\r
868 #define JVMDI_SetLocalLong(a_env, a1, a2, a3) ( \
\r
869 SetJVMDIfromJNIEnv(a_env), \
\r
870 jvmdi_interface->SetLocalLong(a1, a2, a3) )
\r
871 #define JVMDI_SetLocalFloat(a_env, a1, a2, a3) ( \
\r
872 SetJVMDIfromJNIEnv(a_env), \
\r
873 jvmdi_interface->SetLocalFloat(a1, a2, a3) )
\r
874 #define JVMDI_SetLocalDouble(a_env, a1, a2, a3) ( \
\r
875 SetJVMDIfromJNIEnv(a_env), \
\r
876 jvmdi_interface->SetLocalDouble(a1, a2, a3) )
\r
877 #define JVMDI_CreateRawMonitor(a_env, a1, a2) ( \
\r
878 SetJVMDIfromJNIEnv(a_env), \
\r
879 jvmdi_interface->CreateRawMonitor(a1, a2) )
\r
880 #define JVMDI_DestroyRawMonitor(a_env, a1) ( \
\r
881 SetJVMDIfromJNIEnv(a_env), \
\r
882 jvmdi_interface->DestroyRawMonitor(a1) )
\r
883 #define JVMDI_RawMonitorEnter(a_env, a1) ( \
\r
884 SetJVMDIfromJNIEnv(a_env), \
\r
885 jvmdi_interface->RawMonitorEnter(a1) )
\r
886 #define JVMDI_RawMonitorExit(a_env, a1) ( \
\r
887 SetJVMDIfromJNIEnv(a_env), \
\r
888 jvmdi_interface->RawMonitorExit(a1) )
\r
889 #define JVMDI_RawMonitorWait(a_env, a1, a2) ( \
\r
890 SetJVMDIfromJNIEnv(a_env), \
\r
891 jvmdi_interface->RawMonitorWait(a1, a2) )
\r
892 #define JVMDI_RawMonitorNotify(a_env, a1) ( \
\r
893 SetJVMDIfromJNIEnv(a_env), \
\r
894 jvmdi_interface->RawMonitorNotify(a1) )
\r
895 #define JVMDI_RawMonitorNotifyAll(a_env, a1) ( \
\r
896 SetJVMDIfromJNIEnv(a_env), \
\r
897 jvmdi_interface->RawMonitorNotifyAll(a1) )
\r
898 #define JVMDI_SetBreakpoint(a_env, a1, a2, a3) ( \
\r
899 SetJVMDIfromJNIEnv(a_env), \
\r
900 jvmdi_interface->SetBreakpoint(a1, a2, a3) )
\r
901 #define JVMDI_ClearBreakpoint(a_env, a1, a2, a3) ( \
\r
902 SetJVMDIfromJNIEnv(a_env), \
\r
903 jvmdi_interface->ClearBreakpoint(a1, a2, a3) )
\r
904 #define JVMDI_ClearAllBreakpoints(a_env) ( \
\r
905 SetJVMDIfromJNIEnv(a_env), \
\r
906 jvmdi_interface->ClearAllBreakpoints() )
\r
907 #define JVMDI_SetAllocationHooks(a_env, a1, a2) ( \
\r
908 SetJVMDIfromJNIEnv(a_env), \
\r
909 jvmdi_interface->SetAllocationHooks(a1, a2) )
\r
910 #define JVMDI_Allocate(a_env, a1, a2) ( \
\r
911 SetJVMDIfromJNIEnv(a_env), \
\r
912 jvmdi_interface->Allocate(a1, a2) )
\r
913 #define JVMDI_Deallocate(a_env, a1) ( \
\r
914 SetJVMDIfromJNIEnv(a_env), \
\r
915 jvmdi_interface->Deallocate(a1) )
\r
916 #define JVMDI_GetClassSignature(a_env, a1, a2) ( \
\r
917 SetJVMDIfromJNIEnv(a_env), \
\r
918 jvmdi_interface->GetClassSignature(a1, a2) )
\r
919 #define JVMDI_GetClassStatus(a_env, a1, a2) ( \
\r
920 SetJVMDIfromJNIEnv(a_env), \
\r
921 jvmdi_interface->GetClassStatus(a1, a2) )
\r
922 #define JVMDI_GetSourceFileName(a_env, a1, a2) ( \
\r
923 SetJVMDIfromJNIEnv(a_env), \
\r
924 jvmdi_interface->GetSourceFileName(a1, a2) )
\r
925 #define JVMDI_GetClassModifiers(a_env, a1, a2) ( \
\r
926 SetJVMDIfromJNIEnv(a_env), \
\r
927 jvmdi_interface->GetClassModifiers(a1, a2) )
\r
928 #define JVMDI_GetClassMethods(a_env, a1, a2, a3) ( \
\r
929 SetJVMDIfromJNIEnv(a_env), \
\r
930 jvmdi_interface->GetClassMethods(a1, a2, a3) )
\r
931 #define JVMDI_GetClassFields(a_env, a1, a2, a3) ( \
\r
932 SetJVMDIfromJNIEnv(a_env), \
\r
933 jvmdi_interface->GetClassFields(a1, a2, a3) )
\r
934 #define JVMDI_GetImplementedInterfaces(a_env, a1, a2, a3) ( \
\r
935 SetJVMDIfromJNIEnv(a_env), \
\r
936 jvmdi_interface->GetImplementedInterfaces(a1, a2, a3) )
\r
937 #define JVMDI_IsInterface(a_env, a1, a2) ( \
\r
938 SetJVMDIfromJNIEnv(a_env), \
\r
939 jvmdi_interface->IsInterface(a1, a2) )
\r
940 #define JVMDI_IsArrayClass(a_env, a1, a2) ( \
\r
941 SetJVMDIfromJNIEnv(a_env), \
\r
942 jvmdi_interface->IsArrayClass(a1, a2) )
\r
943 #define JVMDI_ClassLoader(a_env, a1, a2) ( \
\r
944 SetJVMDIfromJNIEnv(a_env), \
\r
945 jvmdi_interface->GetClassLoader(a1, a2) )
\r
946 #define JVMDI_GetFieldName(a_env, a1, a2, a3, a4) ( \
\r
947 SetJVMDIfromJNIEnv(a_env), \
\r
948 jvmdi_interface->GetFieldName(a1, a2, a3, a4) )
\r
949 #define JVMDI_GetFieldDeclaringClass(a_env, a1, a2, a3) ( \
\r
950 SetJVMDIfromJNIEnv(a_env), \
\r
951 jvmdi_interface->GetFieldDeclaringClass(a1, a2, a3) )
\r
952 #define JVMDI_GetFieldModifiers(a_env, a1, a2, a3) ( \
\r
953 SetJVMDIfromJNIEnv(a_env), \
\r
954 jvmdi_interface->GetFieldModifiers(a1, a2, a3) )
\r
955 #define JVMDI_GetMethodName(a_env, a1, a2, a3, a4) ( \
\r
956 SetJVMDIfromJNIEnv(a_env), \
\r
957 jvmdi_interface->GetMethodName(a1, a2, a3, a4) )
\r
958 #define JVMDI_GetMethodDeclaringClass(a_env, a1, a2, a3) ( \
\r
959 SetJVMDIfromJNIEnv(a_env), \
\r
960 jvmdi_interface->GetMethodDeclaringClass(a1, a2, a3) )
\r
961 #define JVMDI_GetMethodModifiers(a_env, a1, a2, a3) ( \
\r
962 SetJVMDIfromJNIEnv(a_env), \
\r
963 jvmdi_interface->GetMethodModifiers(a1, a2, a3) )
\r
964 #define JVMDI_GetMaxStack(a_env, a1, a2, a3) ( \
\r
965 SetJVMDIfromJNIEnv(a_env), \
\r
966 jvmdi_interface->GetMaxStack(a1, a2, a3) )
\r
967 #define JVMDI_GetMaxLocals(a_env, a1, a2, a3) ( \
\r
968 SetJVMDIfromJNIEnv(a_env), \
\r
969 jvmdi_interface->GetMaxLocals(a1, a2, a3) )
\r
970 #define JVMDI_GetArgumentsSize(a_env, a1, a2, a3) ( \
\r
971 SetJVMDIfromJNIEnv(a_env), \
\r
972 jvmdi_interface->GetArgumentsSize(a1, a2, a3) )
\r
973 #define JVMDI_GetLineNumberTable(a_env, a1, a2, a3, a4) ( \
\r
974 SetJVMDIfromJNIEnv(a_env), \
\r
975 jvmdi_interface->GetLineNumberTable(a1, a2, a3, a4) )
\r
976 #define JVMDI_GetMethodLocation(a_env, a1, a2, a3, a4) ( \
\r
977 SetJVMDIfromJNIEnv(a_env), \
\r
978 jvmdi_interface->GetMethodLocation(a1, a2, a3, a4) )
\r
979 #define JVMDI_GetLocalVariableTable(a_env, a1, a2, a3, a4) ( \
\r
980 SetJVMDIfromJNIEnv(a_env), \
\r
981 jvmdi_interface->GetLocalVariableTable(a1, a2, a3, a4) )
\r
982 #define JVMDI_GetExceptionHandlerTable(a_env, a1, a2, a3, a4) ( \
\r
983 SetJVMDIfromJNIEnv(a_env), \
\r
984 jvmdi_interface->GetExceptionHandlerTable(a1, a2, a3, a4) )
\r
985 #define JVMDI_GetThrownExceptions(a_env, a1, a2, a3, a4) ( \
\r
986 SetJVMDIfromJNIEnv(a_env), \
\r
987 jvmdi_interface->GetThrownExceptions(a1, a2, a3, a4) )
\r
988 #define JVMDI_GetBytecodes(a_env, a1, a2, a3, a4) ( \
\r
989 SetJVMDIfromJNIEnv(a_env), \
\r
990 jvmdi_interface->GetBytecodes(a1, a2, a3, a4) )
\r
991 #define JVMDI_IsMethodNative(a_env, a1, a2, a3) ( \
\r
992 SetJVMDIfromJNIEnv(a_env), \
\r
993 jvmdi_interface->IsMethodNative(a1, a2, a3) )
\r
994 #define JVMDI_GetLoadedClasses(a_env, a1, a2) ( \
\r
995 SetJVMDIfromJNIEnv(a_env), \
\r
996 jvmdi_interface->GetLoadedClasses(a1, a2) )
\r
997 #define JVMDI_GetClassLoaderClasses(a_env, a1, a2, a3) ( \
\r
998 SetJVMDIfromJNIEnv(a_env), \
\r
999 jvmdi_interface->GetClassLoaderClasses(a1, a2, a3) )
\r
1000 #define JVMDI_GetVersionNumber(a_env, a1) ( \
\r
1001 SetJVMDIfromJNIEnv(a_env), \
\r
1002 jvmdi_interface->GetVersionNumber(a1) )
\r
1004 #endif /* !NO_JVMDI_MACROS */
\r
1006 #ifdef __cplusplus
\r
1007 } /* extern "C" */
\r
1008 #endif /* __cplusplus */
\r
1010 #endif /* !_JAVASOFT_JVMDI_H_ */
\r