1 #include <gcj/cni.h>
2 
3 #include <jvm.h>
4 #include <jvmti.h>
5 #include <stdio.h>
6 
7 #include "jvmti-int.h"
8 #include "events.h"
9 
10 void
print_events()11 print_events ()
12 {
13 #define DO(X)					\
14   do						\
15     {						\
16       if (JVMTI_REQUESTED_EVENT (X))		\
17 	printf (#X ",");			\
18     }						\
19   while (0)
20 
21   printf ("RequestedEvents: ");
22   DO (VMInit);
23   DO (VMDeath);
24   DO (ThreadStart);
25   DO (ThreadEnd);
26   DO (ClassFileLoadHook);
27   DO (ClassLoad);
28   DO (ClassPrepare);
29   DO (VMStart);
30   DO (Exception);
31   DO (ExceptionCatch);
32   DO (SingleStep);
33   DO (FramePop);
34   DO (Breakpoint);
35   DO (FieldAccess);
36   DO (FieldModification);
37   DO (MethodEntry);
38   DO (MethodExit);
39   DO (NativeMethodBind);
40   DO (CompiledMethodLoad);
41   DO (CompiledMethodUnload);
42   DO (DynamicCodeGenerated);
43   DO (DataDumpRequest);
44   DO (MonitorWait);
45   DO (MonitorWaited);
46   DO (MonitorContendedEnter);
47   DO (MonitorContendedEntered);
48   DO (GarbageCollectionStart);
49   DO (GarbageCollectionFinish);
50   DO (ObjectFree);
51   DO (VMObjectAlloc);
52   printf ("\n");
53 #undef DO
54 }
55 
56 static void
VMInitCB(jvmtiEnv * env,JNIEnv * jni_env,jthread thread)57 VMInitCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread)
58 {
59   printf ("VMInitCB jni_env=%#llx thread=%#llx\n",
60 	  (unsigned long long) jni_env, (unsigned long long) thread);
61 }
62 
63 static void
VMDeathCB(jvmtiEnv * env,JNIEnv * jni_env)64 VMDeathCB (jvmtiEnv *env, JNIEnv *jni_env)
65 {
66   printf ("VMDeathCB jni_env=%#llx\n", (unsigned long long) jni_env);
67 }
68 
69 static void
ThreadStartCB(jvmtiEnv * env,JNIEnv * jni_env,jthread thread)70 ThreadStartCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread)
71 {
72   printf ("ThreadStartCB jni_env=%#llx thread=%#llx\n",
73 	  (unsigned long long) jni_env, (unsigned long long) thread);
74 }
75 
76 static void
ThreadEndCB(jvmtiEnv * env,JNIEnv * jni_env,jthread thread)77 ThreadEndCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread)
78 {
79   printf ("ThreadEndCB jni_env=%#llx thread=%#llx\n",
80 	  (unsigned long long) jni_env, (unsigned long long) thread);
81 }
82 
83 static void
ClassFileLoadHookCB(jvmtiEnv * env,JNIEnv * jni_env,jclass class_being_redefined,jobject loader,const char * name,jobject protection_domain,jint class_data_len,const unsigned char * class_data,jint * new_class_data_len,unsigned char ** new_class_data)84 ClassFileLoadHookCB (jvmtiEnv *env, JNIEnv *jni_env,
85 		     jclass class_being_redefined, jobject loader,
86 		     const char *name, jobject protection_domain,
87 		     jint class_data_len, const unsigned char *class_data,
88 		     jint *new_class_data_len, unsigned char **new_class_data)
89 {
90   printf ("ClassFileLoadHookCB jni_env=%#llx class_being_redefined=%#llx"
91 	  " loader=%#llx", (unsigned long long) jni_env, (unsigned long long)
92 	  class_being_redefined, (unsigned long long) loader);
93   printf (" name=%s protection_domain=%#llx class_data_len=%d class_data=%#llx",
94 	  name, (unsigned long long) protection_domain, (int) class_data_len,
95 	  (unsigned long long) class_data);
96   printf (" new_class_data_len=%#llx new_class_data=%#llx\n",
97 	  (unsigned long long) new_class_data_len, (unsigned long long)
98 	  new_class_data);
99 }
100 
101 static void
ClassLoadCB(jvmtiEnv * env,JNIEnv * jni_env,jthread thread,jclass klass)102 ClassLoadCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread, jclass klass)
103 {
104   printf ("ClassLoadCB jni_env=%#llx thread=%#llx klass=%#llx\n",
105 	  (unsigned long long) jni_env, (unsigned long long) thread,
106 	  (unsigned long long) klass);
107 }
108 
109 static void
ClassPrepareCB(jvmtiEnv * env,JNIEnv * jni_env,jthread thread,jclass klass)110 ClassPrepareCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread, jclass klass)
111 {
112   printf ("ClassPrepareCB jni_env=%#llx thread=%#llx klass=%#llx\n",
113 	  (unsigned long long)jni_env, (unsigned long long) thread,
114 	  (unsigned long long) klass);
115 }
116 
117 static void
VMStartCB(jvmtiEnv * env,JNIEnv * jni_env)118 VMStartCB (jvmtiEnv *env, JNIEnv *jni_env)
119 {
120   printf ("VMStartCB jni_env=%#llx\n", (unsigned long long) jni_env);
121 }
122 
123 static void
ExceptionCB(jvmtiEnv * env,JNIEnv * jni_env,jthread thread,jmethodID method,jlocation location,jobject exception,jmethodID catch_method,jlocation catch_location)124 ExceptionCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread, jmethodID method,
125 	     jlocation location, jobject exception, jmethodID catch_method,
126 	     jlocation catch_location)
127 {
128   printf ("ExceptionCB jni_env=%#llx thread=%#llx method=%#llx location=%#llx",
129 	  (unsigned long long) jni_env, (unsigned long long) thread,
130 	  (unsigned long long) method, (unsigned long long) location);
131   printf (" exception=%#llx catch_method=%#llx catch_location=%#llx\n",
132 	  (unsigned long long) exception, (unsigned long long) catch_method,
133 	  (unsigned long long) catch_location);
134 }
135 
136 static void
ExceptionCatchCB(jvmtiEnv * env,JNIEnv * jni_env,jthread thread,jmethodID method,jlocation location,jobject exception)137 ExceptionCatchCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread,
138 		  jmethodID method, jlocation location, jobject exception)
139 {
140   printf ("ExceptionCatchCB jni_env=%#llx thread=%#llx method=%#llx"
141 	  " location=%#llx",
142 	  (unsigned long long) jni_env, (unsigned long long) thread,
143 	  (unsigned long long) method, (unsigned long long) location);
144   printf (" exception=%#llx\n", (unsigned long long) exception);
145 }
146 
147 static void
SingleStepCB(jvmtiEnv * env,JNIEnv * jni_env,jthread thread,jmethodID method,jlocation location)148 SingleStepCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread, jmethodID method,
149 	      jlocation location)
150 {
151   printf ("SingleStepCB jni_env=%#llx thread=%#llx method=%#llx"
152 	  " location=%#llx\n",
153 	  (unsigned long long) jni_env, (unsigned long long) thread,
154 	  (unsigned long long) method, (unsigned long long) location);
155 }
156 
157 static void
FramePopCB(jvmtiEnv * env,JNIEnv * jni_env,jthread thread,jmethodID method,jboolean was_popped_by_exception)158 FramePopCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread, jmethodID method,
159 	    jboolean was_popped_by_exception)
160 {
161   printf ("FramePopCB jni_env=%#llx thread=%#llx method=%#llx",
162 	  (unsigned long long) jni_env, (unsigned long long) thread,
163 	  (unsigned long long) method);
164   printf (" was_pooped_by_exception=%d\n", (was_popped_by_exception ?
165 					    1 : 0));
166 }
167 
168 static void
BreakpointCB(jvmtiEnv * env,JNIEnv * jni_env,jthread thread,jmethodID method,jlocation location)169 BreakpointCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread, jmethodID method,
170 	      jlocation location)
171 {
172   printf ("BreakpointCB  jni_env=%#llx thread=%#llx method=%#llx"
173 	  " location=%#llx\n", (unsigned long long) jni_env,
174 	  (unsigned long long) thread, (unsigned long long) method,
175 	  (unsigned long long) location);
176 }
177 
178 static void
FieldAccessCB(jvmtiEnv * env,JNIEnv * jni_env,jthread thread,jmethodID method,jlocation location,jclass field_klass,jobject object,jfieldID field)179 FieldAccessCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread,
180 	       jmethodID method, jlocation location, jclass field_klass,
181 	       jobject object, jfieldID field)
182 {
183   printf ("FieldAccessCB jni_env=%#llx thread=%#llx method=%#llx"
184 	  " location=%#llx", (unsigned long long) jni_env, (unsigned long long)
185 	  thread, (unsigned long long) method, (unsigned long long) location);
186   printf (" field_klass=%#llx object=%#llx field=%#llx\n", (unsigned long long)
187 	  field_klass, (unsigned long long) object, (unsigned long long) field);
188 }
189 
190 static void
FieldModificationCB(jvmtiEnv * env,JNIEnv * jni_env,jthread thread,jmethodID method,jlocation location,jclass field_klass,jobject object,jfieldID field,char signature_type,jvalue new_value)191 FieldModificationCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread,
192 		     jmethodID method, jlocation location, jclass field_klass,
193 		     jobject object, jfieldID field, char signature_type,
194 		     jvalue new_value)
195 
196 {
197   printf ("FieldModificationCB  jni_env=%#llx thread=%#llx method=%#llx"
198 	  " location=%#llx", (unsigned long long) jni_env, (unsigned long long)
199 	  thread, (unsigned long long) method, (unsigned long long) location);
200   printf (" field_klass=%#llx object=%#llx field=%#llx signature_type=%c",
201 	  (unsigned long long) field_klass, (unsigned long long) object,
202 	  (unsigned long long) field, signature_type);
203   printf (" new_value=%#llx\n", (unsigned long long) new_value.l);
204 }
205 
206 static void
MethodEntryCB(jvmtiEnv * env,JNIEnv * jni_env,jthread thread,jmethodID method)207 MethodEntryCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread,
208 	       jmethodID method)
209 {
210   printf ("MethodEntryCB jni_env=%#llx thread=%#llx method=%#llx\n",
211 	  (unsigned long long) jni_env, (unsigned long long) thread,
212 	  (unsigned long long) method);
213 }
214 
215 static void
MethodExitCB(jvmtiEnv * env,JNIEnv * jni_env,jthread thread,jmethodID method,jboolean was_popped_by_exception,jvalue return_value)216 MethodExitCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread,
217 	      jmethodID method, jboolean was_popped_by_exception,
218 	      jvalue return_value)
219 {
220   printf ("MethodExitCB jni_env=%#llx thread=%#llx method=%#llx",
221 	  (unsigned long long) jni_env, (unsigned long long) thread,
222 	  (unsigned long long) method);
223   printf (" was_popped_by_exception=%d return_value=%d\n",
224 	  (was_popped_by_exception) ? 1 : 0, (int) return_value.i);
225 }
226 
227 static void
NativeMethodBindCB(jvmtiEnv * env,JNIEnv * jni_env,jthread thread,jmethodID method,void * address,void ** new_address_ptr)228 NativeMethodBindCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread,
229 		    jmethodID method, void *address, void **new_address_ptr)
230 {
231   printf ("NativeMethodBindCB jni_env=%#llx thread=%#llx method=%#llx",
232 	  (unsigned long long) jni_env, (unsigned long long) thread,
233 	  (unsigned long long) method);
234   printf (" address=%#llx new_address_ptr=%#llx\n", (unsigned long long)
235 	  address, (unsigned long long) new_address_ptr);
236 }
237 
238 static void
CompiledMethodLoadCB(jvmtiEnv * env,jmethodID method,jint code_size,const void * code_addr,jint map_length,const jvmtiAddrLocationMap * map,const void * compile_info)239 CompiledMethodLoadCB (jvmtiEnv *env, jmethodID method, jint code_size,
240 		      const void *code_addr, jint map_length,
241 		      const jvmtiAddrLocationMap *map,
242 		      const void *compile_info)
243 {
244   printf ("CompiledMethodLoadCB method=%#llx code_size=%#llx code_addr=%#llx",
245 	  (unsigned long long) method, (unsigned long long) code_size,
246 	  (unsigned long long) code_addr);
247   printf (" map_length=%d map=%#llx compile_info=%#llx\n", (int) map_length,
248 	  (unsigned long long) map, (unsigned long long) compile_info);
249 }
250 
251 static void
CompiledMethodUnloadCB(jvmtiEnv * env,jmethodID method,const void * code_addr)252 CompiledMethodUnloadCB (jvmtiEnv *env, jmethodID method, const void *code_addr)
253 {
254   printf ("CompiledMethodUnloadCB method=%#llx code_addr=%#llx\n",
255 	  (unsigned long long) method, (unsigned long long) code_addr);
256 }
257 
258 static void
DynamicCodeGeneratedCB(jvmtiEnv * env,const char * name,const void * address,jint length)259 DynamicCodeGeneratedCB (jvmtiEnv *env, const char *name, const void *address,
260 			jint length)
261 {
262   printf ("DynamicCodeGeneratedCB name=%s address=%#llx length=%d\n", name,
263 	  (unsigned long long) address, (int) length);
264 }
265 
266 static void
DataDumpRequestCB(jvmtiEnv * env)267 DataDumpRequestCB (jvmtiEnv *env)
268 {
269   printf ("DataDumpRequestCB\n");
270 }
271 
272 static void
MonitorWaitCB(jvmtiEnv * env,JNIEnv * jni_env,jthread thread,jobject object,jlong timeout)273 MonitorWaitCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread, jobject object,
274 	       jlong timeout)
275 {
276   printf ("MonitorWaitCB jni_env=%#llx thread=%#llx object=%#llx timeout=%ld\n",
277 	  (unsigned long long) jni_env, (unsigned long long) thread,
278 	  (unsigned long long) object, (long) timeout);
279 }
280 
281 static void
MonitorWaitedCB(jvmtiEnv * env,JNIEnv * jni_env,jthread thread,jobject object,jboolean timed_out)282 MonitorWaitedCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread,
283 		 jobject object, jboolean timed_out)
284 {
285   printf ("MonitorWaitedCB jni_env=%#llx thread=%#llx object=%#llx"
286 	  " timed_out=%d\n", (unsigned long long) jni_env, (unsigned long long)
287 	  thread, (unsigned long long) object, (timed_out) ? 1 : 0);
288 }
289 
290 static void
MonitorContendedEnterCB(jvmtiEnv * env,JNIEnv * jni_env,jthread thread,jobject object)291 MonitorContendedEnterCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread,
292 			 jobject object)
293 {
294   printf ("MonitorContendedEnterCB jni_env=%#llx thread=%#llx object=%#llx\n",
295 	  (unsigned long long) jni_env, (unsigned long long) thread,
296 	  (unsigned long long) object);
297 }
298 
299 static void
MonitorContendedEnteredCB(jvmtiEnv * env,JNIEnv * jni_env,jthread thread,jobject object)300 MonitorContendedEnteredCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread,
301 			   jobject object)
302 {
303   printf ("MonitorContendedEnteredCB jni_env=%#llx thread=%#llx object=%#llx\n",
304 	  (unsigned long long) jni_env, (unsigned long long) thread,
305 	  (unsigned long long) object);
306 }
307 
308 static void
GarbageCollectionStartCB(jvmtiEnv * env)309 GarbageCollectionStartCB (jvmtiEnv *env)
310 {
311   printf ("GarbageCollectionStartCB\n");
312 }
313 
314 static void
GarbageCollectionFinishCB(jvmtiEnv * env)315 GarbageCollectionFinishCB (jvmtiEnv *env)
316 {
317   printf ("GarbageCollectionFinishCB\n");
318 }
319 
320 static void
ObjectFreeCB(jvmtiEnv * env,jlong tag)321 ObjectFreeCB (jvmtiEnv *env, jlong tag)
322 {
323   printf ("ObjectFreeCB tag=%ld\n", (long) tag);
324 }
325 
326 static void
VMObjectAllocCB(jvmtiEnv * env,JNIEnv * jni_env,jthread thread,jobject object,jclass object_klass,jlong size)327 VMObjectAllocCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread,
328 		 jobject object, jclass object_klass, jlong size)
329 {
330   printf ("VMObjectAllocCB jni_env=%#llx thread=%#llx object=%#llx",
331 	  (unsigned long long) jni_env, (unsigned long long) thread,
332 	  (unsigned long long) object);
333   printf (" object_klass=%#llx size=%ld\n", (unsigned long long) object_klass,
334 	  (long) size);
335 }
336 
337 static void
do_enable_tests()338 do_enable_tests ()
339 {
340   printf ("- enable tests -\n");
341   JavaVM *vm = _Jv_GetJavaVM ();
342   jvmtiEnv *env[3];
343   int i;
344   for (i = 0; i < 3; ++i)
345     {
346       vm->GetEnv (reinterpret_cast<void **> (&env[i]), JVMTI_VERSION_1_0);
347       printf ("created JVMTI environment #%d\n", i);
348     }
349 
350   jvmtiEventCallbacks callbacks;
351   memset (&callbacks, 0, sizeof (jvmtiEventCallbacks));
352 
353   printf ("setting callbacks for envs\n");
354   callbacks.VMInit = VMInitCB;
355   env[0]->SetEventCallbacks (&callbacks, sizeof (callbacks));
356   callbacks.VMDeath = VMDeathCB;
357   env[1]->SetEventCallbacks (&callbacks, sizeof (callbacks));
358   callbacks.ThreadEnd = ThreadEndCB;
359   env[2]->SetEventCallbacks (&callbacks, sizeof (callbacks));
360   print_events ();
361 
362   printf ("enable VM_INIT for env0, env1, env2\n");
363   env[0]->SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_VM_INIT, NULL);
364   env[1]->SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_VM_INIT, NULL);
365   env[2]->SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_VM_INIT, NULL);
366   print_events ();
367 
368   printf ("enable VM_DEATH for env1,env2\n");
369   env[1]->SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_VM_DEATH, NULL);
370   env[2]->SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_VM_DEATH, NULL);
371   print_events ();
372 
373   /* Used to use a non-NULL event thread, but that causes problems
374      when SetEventNotificationMode tries to validate the thread. */
375   printf ("enable THREAD_END for env2\n");
376   env[2]->SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_THREAD_END,
377 				    NULL);
378   print_events ();
379 
380   printf ("disposing of env1\n");
381   env[1]->DisposeEnvironment ();
382   print_events ();
383 
384   printf ("disposing of env0\n");
385   env[0]->DisposeEnvironment ();
386   print_events ();
387 
388   printf ("disable VMInit in env2\n");
389   env[2]->SetEventNotificationMode (JVMTI_DISABLE, JVMTI_EVENT_VM_INIT, NULL);
390   print_events ();
391 
392   printf ("clear VMDeath callback in env2\n");
393   callbacks.VMDeath = NULL;
394   env[2]->SetEventCallbacks (&callbacks, sizeof (callbacks));
395   print_events ();
396 
397   printf ("sending VMInit\n");
398   _Jv_JVMTI_PostEvent (JVMTI_EVENT_VM_INIT, (jthread) 0x1234,
399 		       (JNIEnv *) 0x5678);
400 
401   printf ("sending ThreadEnd\n");
402   _Jv_JVMTI_PostEvent (JVMTI_EVENT_THREAD_END, (jthread) 0x1234,
403 		       (JNIEnv *) 0x5678);
404 
405   /* See comment above re: SetEventNotificationMode and validity
406      checking
407   printf ("sending ThreadEnd (no match)\n");
408   _Jv_JVMTI_PostEvent (JVMTI_EVENT_THREAD_END, (jthread) 0x4321,
409 		       (JNIEnv *) 0x5678);
410   */
411 
412   printf ("sending VMDeath\n");
413   _Jv_JVMTI_PostEvent (JVMTI_EVENT_VM_DEATH, (jthread) NULL,
414 		       (JNIEnv *) 0x5678);
415 
416   printf ("disposing of env2\n");
417   env[2]->DisposeEnvironment ();
418   print_events ();
419 }
420 
421 static void
do_callback_arg_tests()422 do_callback_arg_tests ()
423 {
424   printf ("- callback arg tests -\n");
425   JavaVM *vm = _Jv_GetJavaVM ();
426   jvmtiEnv *env;
427   vm->GetEnv (reinterpret_cast<void **> (&env), JVMTI_VERSION_1_0);
428 
429   // Define all the callbacks
430 #define DEFINE(Event) callbacks.Event = Event ## CB;
431   jvmtiEventCallbacks callbacks;
432   DEFINE(VMInit);
433   DEFINE(VMDeath);
434   DEFINE(ThreadStart);
435   DEFINE(ThreadEnd);
436   DEFINE(ClassFileLoadHook);
437   DEFINE(ClassLoad);
438   DEFINE(ClassPrepare);
439   DEFINE(VMStart);
440   DEFINE(Exception);
441   DEFINE(ExceptionCatch);
442   DEFINE(SingleStep);
443   DEFINE(FramePop);
444   DEFINE(Breakpoint);
445   DEFINE(FieldAccess);
446   DEFINE(FieldModification);
447   DEFINE(MethodEntry);
448   DEFINE(MethodExit);
449   DEFINE(NativeMethodBind);
450   DEFINE(CompiledMethodLoad);
451   DEFINE(CompiledMethodUnload);
452   DEFINE(DynamicCodeGenerated);
453   DEFINE(DataDumpRequest);
454   DEFINE(MonitorWait);
455   DEFINE(MonitorWaited);
456   DEFINE(MonitorContendedEnter);
457   DEFINE(MonitorContendedEntered);
458   DEFINE(GarbageCollectionStart);
459   DEFINE(GarbageCollectionFinish);
460   DEFINE(ObjectFree);
461   DEFINE(VMObjectAlloc);
462 #undef DEFINE
463   env->SetEventCallbacks (&callbacks, sizeof (callbacks));
464 
465   // Enable all the callbacks
466 #define ENABLE(Event)							\
467   env->SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_ ## Event, NULL)
468   ENABLE (VM_INIT);
469   ENABLE (VM_DEATH);
470   ENABLE (THREAD_START);
471   ENABLE (THREAD_END);
472   ENABLE (CLASS_FILE_LOAD_HOOK);
473   ENABLE (CLASS_LOAD);
474   ENABLE (CLASS_PREPARE);
475   ENABLE (VM_START);
476   ENABLE (EXCEPTION);
477   ENABLE (EXCEPTION_CATCH);
478   ENABLE (SINGLE_STEP);
479   ENABLE (FRAME_POP);
480   ENABLE (BREAKPOINT);
481   ENABLE (FIELD_ACCESS);
482   ENABLE (FIELD_MODIFICATION);
483   ENABLE (METHOD_ENTRY);
484   ENABLE (METHOD_EXIT);
485   ENABLE (NATIVE_METHOD_BIND);
486   ENABLE (COMPILED_METHOD_LOAD);
487   ENABLE (COMPILED_METHOD_UNLOAD);
488   ENABLE (DYNAMIC_CODE_GENERATED);
489   ENABLE (DATA_DUMP_REQUEST);
490   ENABLE (MONITOR_WAIT);
491   ENABLE (MONITOR_WAITED);
492   ENABLE (MONITOR_CONTENDED_ENTER);
493   ENABLE (MONITOR_CONTENDED_ENTERED);
494   ENABLE (GARBAGE_COLLECTION_START);
495   ENABLE (GARBAGE_COLLECTION_FINISH);
496   ENABLE (OBJECT_FREE);
497   ENABLE (VM_OBJECT_ALLOC);
498 
499   // All events should now be enabled.
500   print_events ();
501 
502   _Jv_JVMTI_PostEvent (JVMTI_EVENT_VM_INIT, (jthread) 0x2, (JNIEnv *) 0x1);
503   _Jv_JVMTI_PostEvent (JVMTI_EVENT_VM_DEATH, (jthread) 0x2, (JNIEnv *) 0x1);
504   _Jv_JVMTI_PostEvent (JVMTI_EVENT_THREAD_START, (jthread) 0x2,
505 		       (JNIEnv *) 0x1);
506   _Jv_JVMTI_PostEvent (JVMTI_EVENT_THREAD_END, (jthread) 0x2,
507 		       (JNIEnv *) 0x1);
508   _Jv_JVMTI_PostEvent (JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, (jthread) 0xb00,
509 		       (JNIEnv *) 0x1, (jclass) 0x2, (jobject) 0x3,
510 		       "4", (jobject) 0x5, (jint) 6,
511 		       (const unsigned char *) 0x7, (jint *) 0x8,
512 		       (unsigned char **) 0x9);
513   _Jv_JVMTI_PostEvent (JVMTI_EVENT_CLASS_LOAD, (jthread) 0x2, (JNIEnv *) 0x1,
514 		       (jclass) 0x3);
515   _Jv_JVMTI_PostEvent (JVMTI_EVENT_CLASS_PREPARE, (jthread) 0x2,
516 		       (JNIEnv *) 0x1, (jclass) 0x3);
517   _Jv_JVMTI_PostEvent (JVMTI_EVENT_VM_START, (jthread) 0xb00, (JNIEnv *) 0x1);
518   _Jv_JVMTI_PostEvent (JVMTI_EVENT_EXCEPTION, (jthread) 0x2, (JNIEnv *) 0x1,
519 		       (jmethodID) 0x3, (jlocation) 0x4, (jobject) 0x5,
520 		       (jmethodID) 0x6, (jlocation) 0x7);
521   _Jv_JVMTI_PostEvent (JVMTI_EVENT_EXCEPTION_CATCH, (jthread) 0x2,
522 		       (JNIEnv *) 0x1, (jmethodID) 0x3, (jlocation) 0x4,
523 		       (jobject) 0x5);
524   _Jv_JVMTI_PostEvent (JVMTI_EVENT_SINGLE_STEP, (jthread) 0x2, (JNIEnv *) 0x1,
525 		       (jmethodID) 0x3, (jlocation) 0x4);
526   _Jv_JVMTI_PostEvent (JVMTI_EVENT_FRAME_POP, (jthread) 0x2, (JNIEnv *) 0x1,
527 		       (jmethodID) 0x3, 4);
528   _Jv_JVMTI_PostEvent (JVMTI_EVENT_BREAKPOINT, (jthread) 0x2, (JNIEnv *) 0x1,
529 		       (jmethodID) 0x3, (jlocation) 0x4);
530   _Jv_JVMTI_PostEvent (JVMTI_EVENT_FIELD_ACCESS, (jthread) 0x2,
531 		       (JNIEnv *) 0x1, (jmethodID) 0x3, (jlocation) 0x4,
532 		       (jclass) 0x5, (jobject) 0x6, (jfieldID) 0x7);
533   jvalue value;
534   value.l = (jobject) 0x9;
535   _Jv_JVMTI_PostEvent (JVMTI_EVENT_FIELD_MODIFICATION, (jthread) 0x2,
536 		       (JNIEnv *) 0x1, (jmethodID) 0x3, (jlocation) 0x4,
537 		       (jclass) 0x5, (jobject) 0x6, (jfieldID) 0x7,
538 		       (int) '8', value);
539   _Jv_JVMTI_PostEvent (JVMTI_EVENT_METHOD_ENTRY, (jthread) 0x2,
540 		       (JNIEnv *) 0x1, (jmethodID) 0x3);
541   jvalue value2;
542   value2.i = 5;
543   _Jv_JVMTI_PostEvent (JVMTI_EVENT_METHOD_EXIT, (jthread) 0x2,
544 		       (JNIEnv *) 0x1, (jmethodID) 0x3, 4, value2);
545   _Jv_JVMTI_PostEvent (JVMTI_EVENT_NATIVE_METHOD_BIND, (jthread) 0x2,
546 		       (JNIEnv *) 0x1, (jmethodID) 0x3, (void *) 0x4,
547 		       (void **) 0x5);
548   _Jv_JVMTI_PostEvent (JVMTI_EVENT_COMPILED_METHOD_LOAD, (jthread) 0xb00,
549 		       (jmethodID) 0x1, (jint) 2, (const void *) 0x3,
550 		       (jint) 4, (const jvmtiAddrLocationMap *) 0x5,
551 		       (const void *) 0x6);
552   _Jv_JVMTI_PostEvent (JVMTI_EVENT_COMPILED_METHOD_UNLOAD, (jthread) 0xb00,
553 		       (jmethodID) 0x1, (const void *) 0x2);
554   _Jv_JVMTI_PostEvent (JVMTI_EVENT_DYNAMIC_CODE_GENERATED, (jthread) 0xb00,
555 		       "1", (const void *) 0x2, (jint) 3);
556   _Jv_JVMTI_PostEvent (JVMTI_EVENT_DATA_DUMP_REQUEST, (jthread) 0xb00);
557   _Jv_JVMTI_PostEvent (JVMTI_EVENT_MONITOR_WAIT, (jthread) 0x2,
558 		       (JNIEnv *) 0x1, (jobject) 0x3, (jlong) 4);
559   _Jv_JVMTI_PostEvent (JVMTI_EVENT_MONITOR_WAITED, (jthread) 0x2,
560 		       (JNIEnv *) 0x1, (jobject) 0x3, (int) 4);
561   _Jv_JVMTI_PostEvent (JVMTI_EVENT_MONITOR_CONTENDED_ENTER, (jthread) 0x2,
562 		       (JNIEnv *) 0x1, (jobject) 0x3);
563   _Jv_JVMTI_PostEvent (JVMTI_EVENT_MONITOR_CONTENDED_ENTERED, (jthread) 0x2,
564 		       (JNIEnv *) 0x1, (jobject) 0x3);
565   _Jv_JVMTI_PostEvent (JVMTI_EVENT_GARBAGE_COLLECTION_START, (jthread) 0xb00);
566   _Jv_JVMTI_PostEvent (JVMTI_EVENT_GARBAGE_COLLECTION_FINISH, (jthread) 0xb00);
567   _Jv_JVMTI_PostEvent (JVMTI_EVENT_OBJECT_FREE, (jthread) 0xb00, (jlong) 1);
568   _Jv_JVMTI_PostEvent (JVMTI_EVENT_VM_OBJECT_ALLOC, (jthread) 0x2,
569 		       (JNIEnv *) 0x1, (jobject) 0x3, (jclass) 0x4,
570 		       (jlong) 5);
571 }
572 
573 void
do_events_tests()574 events::do_events_tests ()
575 {
576   do_enable_tests ();
577   do_callback_arg_tests ();
578 }
579