//===--------------------- LinkJavaRuntime.h ------------------------------===//
//=== ------------- Reference all runtime functions -----------------------===//
//
//                            The VMKit project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef JNJVM_LINK_JAVA_RUNTIME_H
#define JNJVM_LINK_JAVA_RUNTIME_H


namespace j3 {
  class JavaObject;
  class UserClass;
  class UserClassArray;
  class UserCommonClass;
  class UserConstantPool;
  class JavaVirtualTable;
  class JavaMethod;
  class Jnjvm;
}

namespace vmkit {
  class KnownFrame;
}

using namespace j3;

extern "C" void* j3InterfaceLookup(UserClass* caller, uint32 index);
extern "C" void* j3VirtualFieldLookup(UserClass* caller, uint32 index);
extern "C" void* j3StaticFieldLookup(UserClass* caller, uint32 index);
extern "C" void* j3VirtualTableLookup(UserClass* caller, uint32 index, ...);
extern "C" void* j3StringLookup(UserClass* cl, uint32 index);
extern "C" void* j3ClassLookup(UserClass* caller, uint32 index);
extern "C" UserCommonClass* j3RuntimeInitialiseClass(UserClass* cl);
extern "C" JavaObject* j3RuntimeDelegatee(UserCommonClass* cl);
extern "C" JavaArray* j3MultiCallNew(UserClassArray* cl, uint32 len, ...);
extern "C" UserClassArray* j3GetArrayClass(UserCommonClass*,
                                              UserClassArray**);
extern "C" void j3EndJNI(uint32**);
extern "C" void* j3StartJNI(uint32*, uint32**, vmkit::KnownFrame*);
extern "C" void j3JavaObjectAquire(JavaObject* obj);
extern "C" void j3JavaObjectRelease(JavaObject* obj);
extern "C" void j3ThrowException(JavaObject* obj);
extern "C" JavaObject* j3NullPointerException();
extern "C" JavaObject* j3NegativeArraySizeException(sint32 val);
extern "C" JavaObject* j3OutOfMemoryError(sint32 val);
extern "C" JavaObject* j3StackOverflowError();
extern "C" JavaObject* j3ArithmeticException();
extern "C" JavaObject* j3ClassCastException(JavaObject* obj,
                                               UserCommonClass* cl);
extern "C" JavaObject* j3IndexOutOfBoundsException(JavaObject* obj,
                                                      sint32 index);
extern "C" JavaObject* j3ArrayStoreException(JavaVirtualTable* VT);
extern "C" void j3ThrowExceptionFromJIT();
extern "C" void j3PrintMethodStart(JavaMethod* meth);
extern "C" void j3PrintMethodEnd(JavaMethod* meth);
extern "C" void j3PrintExecution(uint32 opcode, uint32 index,
                                    JavaMethod* meth);

namespace force_linker {
  struct ForceRuntimeLinking {
    ForceRuntimeLinking() {
      // We must reference the methods in such a way that compilers will not
      // delete it all as dead code, even with whole program optimization,
      // yet is effectively a NO-OP. As the compiler isn't smart enough
      // to know that getenv() never returns -1, this will do the job.
      if (std::getenv("bar") != (char*) -1) 
        return;
      
      (void) j3InterfaceLookup(0, 0);
      (void) j3VirtualFieldLookup(0, 0);
      (void) j3StaticFieldLookup(0, 0);
      (void) j3VirtualTableLookup(0, 0);
      (void) j3ClassLookup(0, 0);
      (void) j3RuntimeInitialiseClass(0);
      (void) j3RuntimeDelegatee(0);
      (void) j3MultiCallNew(0, 0);
      (void) j3GetArrayClass(0, 0);
      (void) j3EndJNI(0);
      (void) j3StartJNI(0, 0, 0);
      (void) j3JavaObjectAquire(0);
      (void) j3JavaObjectRelease(0);
      (void) j3ThrowException(0);
      (void) j3NullPointerException();
      (void) j3NegativeArraySizeException(0);
      (void) j3OutOfMemoryError(0);
      (void) j3StackOverflowError();
      (void) j3ArithmeticException();
      (void) j3ClassCastException(0, 0);
      (void) j3IndexOutOfBoundsException(0, 0);
      (void) j3ArrayStoreException(0);
      (void) j3ThrowExceptionFromJIT();
      (void) j3PrintMethodStart(0);
      (void) j3PrintMethodEnd(0);
      (void) j3PrintExecution(0, 0, 0);
      (void) j3StringLookup(0, 0);
    }
  } ForcePassLinking; // Force link by creating a global definition.
}
  


#endif //JNJVM_LINK_JAVA_RUNTIME_H
