#include <gcj/cni.h>

#include <jvm.h>
#include <jvmti.h>
#include <stdio.h>

#include "jvmti-int.h"
#include "events.h"

void
print_events ()
{
#define DO(X)					\
  do						\
    {						\
      if (JVMTI_REQUESTED_EVENT (X))		\
	printf (#X ",");			\
    }						\
  while (0)

  printf ("RequestedEvents: ");
  DO (VMInit);
  DO (VMDeath);
  DO (ThreadStart);
  DO (ThreadEnd);
  DO (ClassFileLoadHook);
  DO (ClassLoad);
  DO (ClassPrepare);
  DO (VMStart);
  DO (Exception);
  DO (ExceptionCatch);
  DO (SingleStep);
  DO (FramePop);
  DO (Breakpoint);
  DO (FieldAccess);
  DO (FieldModification);
  DO (MethodEntry);
  DO (MethodExit);
  DO (NativeMethodBind);
  DO (CompiledMethodLoad);
  DO (CompiledMethodUnload);
  DO (DynamicCodeGenerated);
  DO (DataDumpRequest);
  DO (MonitorWait);
  DO (MonitorWaited);
  DO (MonitorContendedEnter);
  DO (MonitorContendedEntered);
  DO (GarbageCollectionStart);
  DO (GarbageCollectionFinish);
  DO (ObjectFree);
  DO (VMObjectAlloc);
  printf ("\n");
#undef DO
}

static void
VMInitCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread)
{
  printf ("VMInitCB jni_env=%#llx thread=%#llx\n",
	  (unsigned long long) jni_env, (unsigned long long) thread);
}

static void
VMDeathCB (jvmtiEnv *env, JNIEnv *jni_env)
{
  printf ("VMDeathCB jni_env=%#llx\n", (unsigned long long) jni_env);
}

static void
ThreadStartCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread)
{
  printf ("ThreadStartCB jni_env=%#llx thread=%#llx\n",
	  (unsigned long long) jni_env, (unsigned long long) thread);
}

static void
ThreadEndCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread)
{
  printf ("ThreadEndCB jni_env=%#llx thread=%#llx\n",
	  (unsigned long long) jni_env, (unsigned long long) thread);
}

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)
{
  printf ("ClassFileLoadHookCB jni_env=%#llx class_being_redefined=%#llx"
	  " loader=%#llx", (unsigned long long) jni_env, (unsigned long long)
	  class_being_redefined, (unsigned long long) loader);
  printf (" name=%s protection_domain=%#llx class_data_len=%d class_data=%#llx",
	  name, (unsigned long long) protection_domain, (int) class_data_len,
	  (unsigned long long) class_data);
  printf (" new_class_data_len=%#llx new_class_data=%#llx\n",
	  (unsigned long long) new_class_data_len, (unsigned long long)
	  new_class_data);
}

static void
ClassLoadCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread, jclass klass)
{
  printf ("ClassLoadCB jni_env=%#llx thread=%#llx klass=%#llx\n",
	  (unsigned long long) jni_env, (unsigned long long) thread,
	  (unsigned long long) klass);
}

static void
ClassPrepareCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread, jclass klass)
{
  printf ("ClassPrepareCB jni_env=%#llx thread=%#llx klass=%#llx\n",
	  (unsigned long long)jni_env, (unsigned long long) thread,
	  (unsigned long long) klass);
}

static void
VMStartCB (jvmtiEnv *env, JNIEnv *jni_env)
{
  printf ("VMStartCB jni_env=%#llx\n", (unsigned long long) jni_env);
}

static void
ExceptionCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread, jmethodID method,
	     jlocation location, jobject exception, jmethodID catch_method,
	     jlocation catch_location)
{
  printf ("ExceptionCB jni_env=%#llx thread=%#llx method=%#llx location=%#llx",
	  (unsigned long long) jni_env, (unsigned long long) thread,
	  (unsigned long long) method, (unsigned long long) location);
  printf (" exception=%#llx catch_method=%#llx catch_location=%#llx\n",
	  (unsigned long long) exception, (unsigned long long) catch_method,
	  (unsigned long long) catch_location);
}

static void
ExceptionCatchCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread,
		  jmethodID method, jlocation location, jobject exception)
{
  printf ("ExceptionCatchCB jni_env=%#llx thread=%#llx method=%#llx"
	  " location=%#llx",
	  (unsigned long long) jni_env, (unsigned long long) thread,
	  (unsigned long long) method, (unsigned long long) location);
  printf (" exception=%#llx\n", (unsigned long long) exception);
}

static void
SingleStepCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread, jmethodID method,
	      jlocation location)
{
  printf ("SingleStepCB jni_env=%#llx thread=%#llx method=%#llx"
	  " location=%#llx\n",
	  (unsigned long long) jni_env, (unsigned long long) thread,
	  (unsigned long long) method, (unsigned long long) location);
}

static void
FramePopCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread, jmethodID method,
	    jboolean was_popped_by_exception)
{
  printf ("FramePopCB jni_env=%#llx thread=%#llx method=%#llx",
	  (unsigned long long) jni_env, (unsigned long long) thread,
	  (unsigned long long) method);
  printf (" was_pooped_by_exception=%d\n", (was_popped_by_exception ?
					    1 : 0));
}

static void
BreakpointCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread, jmethodID method,
	      jlocation location)
{
  printf ("BreakpointCB  jni_env=%#llx thread=%#llx method=%#llx"
	  " location=%#llx\n", (unsigned long long) jni_env,
	  (unsigned long long) thread, (unsigned long long) method,
	  (unsigned long long) location);
}

static void
FieldAccessCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread,
	       jmethodID method, jlocation location, jclass field_klass,
	       jobject object, jfieldID field)
{
  printf ("FieldAccessCB jni_env=%#llx thread=%#llx method=%#llx"
	  " location=%#llx", (unsigned long long) jni_env, (unsigned long long)
	  thread, (unsigned long long) method, (unsigned long long) location);
  printf (" field_klass=%#llx object=%#llx field=%#llx\n", (unsigned long long)
	  field_klass, (unsigned long long) object, (unsigned long long) field);
}

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)

{
  printf ("FieldModificationCB  jni_env=%#llx thread=%#llx method=%#llx"
	  " location=%#llx", (unsigned long long) jni_env, (unsigned long long)
	  thread, (unsigned long long) method, (unsigned long long) location);
  printf (" field_klass=%#llx object=%#llx field=%#llx signature_type=%c",
	  (unsigned long long) field_klass, (unsigned long long) object,
	  (unsigned long long) field, signature_type);
  printf (" new_value=%d\n", (int) new_value.i);
}

static void
MethodEntryCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread,
	       jmethodID method)
{
  printf ("MethodEntryCB jni_env=%#llx thread=%#llx method=%#llx\n",
	  (unsigned long long) jni_env, (unsigned long long) thread,
	  (unsigned long long) method);
}

static void
MethodExitCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread,
	      jmethodID method, jboolean was_popped_by_exception,
	      jvalue return_value)
{
  printf ("MethodExitCB jni_env=%#llx thread=%#llx method=%#llx",
	  (unsigned long long) jni_env, (unsigned long long) thread,
	  (unsigned long long) method);
  printf (" was_popped_by_exception=%d return_value=%d\n",
	  (was_popped_by_exception) ? 1 : 0, (int) return_value.i);
}

static void
NativeMethodBindCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread,
		    jmethodID method, void *address, void **new_address_ptr)
{
  printf ("NativeMethodBindCB jni_env=%#llx thread=%#llx method=%#llx",
	  (unsigned long long) jni_env, (unsigned long long) thread,
	  (unsigned long long) method);
  printf (" address=%#llx new_address_ptr=%#llx\n", (unsigned long long)
	  address, (unsigned long long) new_address_ptr);
}

static void
CompiledMethodLoadCB (jvmtiEnv *env, jmethodID method, jint code_size,
		      const void *code_addr, jint map_length,
		      const jvmtiAddrLocationMap *map,
		      const void *compile_info)
{
  printf ("CompiledMethodLoadCB method=%#llx code_size=%#llx code_addr=%#llx",
	  (unsigned long long) method, (unsigned long long) code_size,
	  (unsigned long long) code_addr);
  printf (" map_length=%d map=%#llx compile_info=%#llx\n", (int) map_length,
	  (unsigned long long) map, (unsigned long long) compile_info);
}

static void
CompiledMethodUnloadCB (jvmtiEnv *env, jmethodID method, const void *code_addr)
{
  printf ("CompiledMethodUnloadCB method=%#llx code_addr=%#llx\n",
	  (unsigned long long) method, (unsigned long long) code_addr);
}

static void
DynamicCodeGeneratedCB (jvmtiEnv *env, const char *name, const void *address,
			jint length)
{
  printf ("DynamicCodeGeneratedCB name=%s address=%#llx length=%d\n", name,
	  (unsigned long long) address, (int) length);
}

static void
DataDumpRequestCB (jvmtiEnv *env)
{
  printf ("DataDumpRequestCB\n");
}

static void
MonitorWaitCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread, jobject object,
	       jlong timeout)
{
  printf ("MonitorWaitCB jni_env=%#llx thread=%#llx object=%#llx timeout=%ld\n",
	  (unsigned long long) jni_env, (unsigned long long) thread,
	  (unsigned long long) object, (long) timeout);
}

static void
MonitorWaitedCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread,
		 jobject object, jboolean timed_out)
{
  printf ("MonitorWaitedCB jni_env=%#llx thread=%#llx object=%#llx"
	  " timed_out=%d\n", (unsigned long long) jni_env, (unsigned long long)
	  thread, (unsigned long long) object, (timed_out) ? 1 : 0);
}

static void
MonitorContendedEnterCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread,
			 jobject object)
{
  printf ("MonitorContendedEnterCB jni_env=%#llx thread=%#llx object=%#llx\n",
	  (unsigned long long) jni_env, (unsigned long long) thread,
	  (unsigned long long) object);
}

static void
MonitorContendedEnteredCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread,
			   jobject object)
{
  printf ("MonitorContendedEnteredCB jni_env=%#llx thread=%#llx object=%#llx\n",
	  (unsigned long long) jni_env, (unsigned long long) thread,
	  (unsigned long long) object);
}

static void
GarbageCollectionStartCB (jvmtiEnv *env)
{
  printf ("GarbageCollectionStartCB\n");
}

static void
GarbageCollectionFinishCB (jvmtiEnv *env)
{
  printf ("GarbageCollectionFinishCB\n");
}

static void
ObjectFreeCB (jvmtiEnv *env, jlong tag)
{
  printf ("ObjectFreeCB tag=%ld\n", (long) tag);
}

static void
VMObjectAllocCB (jvmtiEnv *env, JNIEnv *jni_env, jthread thread,
		 jobject object, jclass object_klass, jlong size)
{
  printf ("VMObjectAllocCB jni_env=%#llx thread=%#llx object=%#llx",
	  (unsigned long long) jni_env, (unsigned long long) thread,
	  (unsigned long long) object);
  printf (" object_klass=%#llx size=%ld\n", (unsigned long long) object_klass,
	  (long) size);
}

static void
do_enable_tests ()
{
  printf ("- enable tests -\n");
  JavaVM *vm = _Jv_GetJavaVM ();
  jvmtiEnv *env[3];
  int i;
  for (i = 0; i < 3; ++i)
    {
      vm->GetEnv (reinterpret_cast<void **> (&env[i]), JVMTI_VERSION_1_0);
      printf ("created JVMTI environment #%d\n", i);
    }

  jvmtiEventCallbacks callbacks;
  memset (&callbacks, 0, sizeof (jvmtiEventCallbacks));

  printf ("setting callbacks for envs\n");
  callbacks.VMInit = VMInitCB;
  env[0]->SetEventCallbacks (&callbacks, sizeof (callbacks));
  callbacks.VMDeath = VMDeathCB;
  env[1]->SetEventCallbacks (&callbacks, sizeof (callbacks));
  callbacks.ThreadEnd = ThreadEndCB;
  env[2]->SetEventCallbacks (&callbacks, sizeof (callbacks));
  print_events ();

  printf ("enable VM_INIT for env0, env1, env2\n");
  env[0]->SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_VM_INIT, NULL);
  env[1]->SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_VM_INIT, NULL);
  env[2]->SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_VM_INIT, NULL);
  print_events ();

  printf ("enable VM_DEATH for env1,env2\n");
  env[1]->SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_VM_DEATH, NULL);
  env[2]->SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_VM_DEATH, NULL);
  print_events ();

  /* Used to use a non-NULL event thread, but that causes problems
     when SetEventNotificationMode tries to validate the thread. */
  printf ("enable THREAD_END for env2\n");
  env[2]->SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_THREAD_END,
				    NULL);
  print_events ();

  printf ("disposing of env1\n");
  env[1]->DisposeEnvironment ();
  print_events ();

  printf ("disposing of env0\n");
  env[0]->DisposeEnvironment ();
  print_events ();

  printf ("disable VMInit in env2\n");
  env[2]->SetEventNotificationMode (JVMTI_DISABLE, JVMTI_EVENT_VM_INIT, NULL);
  print_events ();

  printf ("clear VMDeath callback in env2\n");
  callbacks.VMDeath = NULL;
  env[2]->SetEventCallbacks (&callbacks, sizeof (callbacks));
  print_events ();

  printf ("sending VMInit\n");
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_VM_INIT, (jthread) 0x1234,
		       (JNIEnv *) 0x5678);

  printf ("sending ThreadEnd\n");
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_THREAD_END, (jthread) 0x1234,
		       (JNIEnv *) 0x5678);

  /* See comment above re: SetEventNotificationMode and validity
     checking
  printf ("sending ThreadEnd (no match)\n");
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_THREAD_END, (jthread) 0x4321,
		       (JNIEnv *) 0x5678);
  */

  printf ("sending VMDeath\n");
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_VM_DEATH, (jthread) NULL,
		       (JNIEnv *) 0x5678);

  printf ("disposing of env2\n");
  env[2]->DisposeEnvironment ();
  print_events ();
}

static void
do_callback_arg_tests ()
{
  printf ("- callback arg tests -\n");
  JavaVM *vm = _Jv_GetJavaVM ();
  jvmtiEnv *env;
  vm->GetEnv (reinterpret_cast<void **> (&env), JVMTI_VERSION_1_0);

  // Define all the callbacks
#define DEFINE(Event) callbacks.Event = Event ## CB;
  jvmtiEventCallbacks callbacks;
  DEFINE(VMInit);
  DEFINE(VMDeath);
  DEFINE(ThreadStart);
  DEFINE(ThreadEnd);
  DEFINE(ClassFileLoadHook);
  DEFINE(ClassLoad);
  DEFINE(ClassPrepare);
  DEFINE(VMStart);
  DEFINE(Exception);
  DEFINE(ExceptionCatch);
  DEFINE(SingleStep);
  DEFINE(FramePop);
  DEFINE(Breakpoint);
  DEFINE(FieldAccess);
  DEFINE(FieldModification);
  DEFINE(MethodEntry);
  DEFINE(MethodExit);
  DEFINE(NativeMethodBind);
  DEFINE(CompiledMethodLoad);
  DEFINE(CompiledMethodUnload);
  DEFINE(DynamicCodeGenerated);
  DEFINE(DataDumpRequest);
  DEFINE(MonitorWait);
  DEFINE(MonitorWaited);
  DEFINE(MonitorContendedEnter);
  DEFINE(MonitorContendedEntered);
  DEFINE(GarbageCollectionStart);
  DEFINE(GarbageCollectionFinish);
  DEFINE(ObjectFree);
  DEFINE(VMObjectAlloc);
#undef DEFINE
  env->SetEventCallbacks (&callbacks, sizeof (callbacks));

  // Enable all the callbacks
#define ENABLE(Event)							\
  env->SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_ ## Event, NULL)
  ENABLE (VM_INIT);
  ENABLE (VM_DEATH);
  ENABLE (THREAD_START);
  ENABLE (THREAD_END);
  ENABLE (CLASS_FILE_LOAD_HOOK);
  ENABLE (CLASS_LOAD);
  ENABLE (CLASS_PREPARE);
  ENABLE (VM_START);
  ENABLE (EXCEPTION);
  ENABLE (EXCEPTION_CATCH);
  ENABLE (SINGLE_STEP);
  ENABLE (FRAME_POP);
  ENABLE (BREAKPOINT);
  ENABLE (FIELD_ACCESS);
  ENABLE (FIELD_MODIFICATION);
  ENABLE (METHOD_ENTRY);
  ENABLE (METHOD_EXIT);
  ENABLE (NATIVE_METHOD_BIND);
  ENABLE (COMPILED_METHOD_LOAD);
  ENABLE (COMPILED_METHOD_UNLOAD);
  ENABLE (DYNAMIC_CODE_GENERATED);
  ENABLE (DATA_DUMP_REQUEST);
  ENABLE (MONITOR_WAIT);
  ENABLE (MONITOR_WAITED);
  ENABLE (MONITOR_CONTENDED_ENTER);
  ENABLE (MONITOR_CONTENDED_ENTERED);
  ENABLE (GARBAGE_COLLECTION_START);
  ENABLE (GARBAGE_COLLECTION_FINISH);
  ENABLE (OBJECT_FREE);
  ENABLE (VM_OBJECT_ALLOC);

  // All events should now be enabled.
  print_events ();

  _Jv_JVMTI_PostEvent (JVMTI_EVENT_VM_INIT, (jthread) 0x2, (JNIEnv *) 0x1);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_VM_DEATH, (jthread) 0x2, (JNIEnv *) 0x1);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_THREAD_START, (jthread) 0x2,
		       (JNIEnv *) 0x1);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_THREAD_END, (jthread) 0x2,
		       (JNIEnv *) 0x1);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, (jthread) 0xb00,
		       (JNIEnv *) 0x1, (jclass) 0x2, (jobject) 0x3,
		       "4", (jobject) 0x5, (jint) 6,
		       (const unsigned char *) 0x7, (jint *) 0x8,
		       (unsigned char **) 0x9);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_CLASS_LOAD, (jthread) 0x2, (JNIEnv *) 0x1,
		       (jclass) 0x3);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_CLASS_PREPARE, (jthread) 0x2,
		       (JNIEnv *) 0x1, (jclass) 0x3);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_VM_START, (jthread) 0xb00, (JNIEnv *) 0x1);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_EXCEPTION, (jthread) 0x2, (JNIEnv *) 0x1,
		       (jmethodID) 0x3, (jlocation) 0x4, (jobject) 0x5,
		       (jmethodID) 0x6, (jlocation) 0x7);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_EXCEPTION_CATCH, (jthread) 0x2,
		       (JNIEnv *) 0x1, (jmethodID) 0x3, (jlocation) 0x4,
		       (jobject) 0x5);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_SINGLE_STEP, (jthread) 0x2, (JNIEnv *) 0x1,
		       (jmethodID) 0x3, (jlocation) 0x4);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_FRAME_POP, (jthread) 0x2, (JNIEnv *) 0x1,
		       (jmethodID) 0x3, 4);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_BREAKPOINT, (jthread) 0x2, (JNIEnv *) 0x1,
		       (jmethodID) 0x3, (jlocation) 0x4);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_FIELD_ACCESS, (jthread) 0x2,
		       (JNIEnv *) 0x1, (jmethodID) 0x3, (jlocation) 0x4,
		       (jclass) 0x5, (jobject) 0x6, (jfieldID) 0x7);
  jvalue value;
  value.l = (jobject) 0x9;
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_FIELD_MODIFICATION, (jthread) 0x2,
		       (JNIEnv *) 0x1, (jmethodID) 0x3, (jlocation) 0x4,
		       (jclass) 0x5, (jobject) 0x6, (jfieldID) 0x7,
		       (int) '8', value);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_METHOD_ENTRY, (jthread) 0x2,
		       (JNIEnv *) 0x1, (jmethodID) 0x3);
  jvalue value2;
  value2.i = 5;
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_METHOD_EXIT, (jthread) 0x2,
		       (JNIEnv *) 0x1, (jmethodID) 0x3, 4, value2);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_NATIVE_METHOD_BIND, (jthread) 0x2,
		       (JNIEnv *) 0x1, (jmethodID) 0x3, (void *) 0x4,
		       (void **) 0x5);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_COMPILED_METHOD_LOAD, (jthread) 0xb00,
		       (jmethodID) 0x1, (jint) 2, (const void *) 0x3,
		       (jint) 4, (const jvmtiAddrLocationMap *) 0x5,
		       (const void *) 0x6);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_COMPILED_METHOD_UNLOAD, (jthread) 0xb00,
		       (jmethodID) 0x1, (const void *) 0x2);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_DYNAMIC_CODE_GENERATED, (jthread) 0xb00,
		       "1", (const void *) 0x2, (jint) 3);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_DATA_DUMP_REQUEST, (jthread) 0xb00);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_MONITOR_WAIT, (jthread) 0x2,
		       (JNIEnv *) 0x1, (jobject) 0x3, (jlong) 4);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_MONITOR_WAITED, (jthread) 0x2,
		       (JNIEnv *) 0x1, (jobject) 0x3, (int) 4);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_MONITOR_CONTENDED_ENTER, (jthread) 0x2,
		       (JNIEnv *) 0x1, (jobject) 0x3);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_MONITOR_CONTENDED_ENTERED, (jthread) 0x2,
		       (JNIEnv *) 0x1, (jobject) 0x3);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_GARBAGE_COLLECTION_START, (jthread) 0xb00);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_GARBAGE_COLLECTION_FINISH, (jthread) 0xb00);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_OBJECT_FREE, (jthread) 0xb00, (jlong) 1);
  _Jv_JVMTI_PostEvent (JVMTI_EVENT_VM_OBJECT_ALLOC, (jthread) 0x2,
		       (JNIEnv *) 0x1, (jobject) 0x3, (jclass) 0x4,
		       (jlong) 5);
}

void
events::do_events_tests ()
{
  do_enable_tests ();
  do_callback_arg_tests ();
}
