#include <llvm/Java/jni.h>

/* For now we cast a java/lang/Class reference to a class record. When
 * we get proper java/lang/Class representation this will be a field
 * access. */
#define GET_CLASS_RECORD(clazz) ((struct llvm_java_class_record*) clazz)
#define GET_CLASS(classRecord) ((jclass) classRecord)

const JNIEnv llvm_java_JNIEnv;

struct llvm_java_object_base;
struct llvm_java_object_header;
struct llvm_java_class_record;
struct llvm_java_typeinfo;

struct llvm_java_object_header {
  /* gc info, hash info, locking */
    int dummy;
};

struct llvm_java_object_base {
  struct llvm_java_object_header header;
  struct llvm_java_class_record* classRecord;
};

struct llvm_java_typeinfo {
  /* The name of this class */
  const char* name;

  /* The number of super classes to java.lang.Object. */
  jint depth;

  /* The super class records up to java.lang.Object. */
  struct llvm_java_class_record** superclasses;

  /* If an interface its interface index, otherwise the last interface
   * index implemented by this class. */
  jint interfaceIndex;

  /* The interface class records this class implements. */
  struct llvm_java_class_record** interfaces;

  /* The component class record if this is an array class, null
   * otherwise. */
  struct llvm_java_class_record* component;

  /* If an array the size of its elements, otherwise 0 for classes, -1
   * for interfaces and -2 for primitive classes. */
  jint elementSize;

  /* A null terminated array of strings describing the member fields
   * of this class. A field description is the concatenation of its
   * name with its descriptor. */
  const char** fieldDescriptors;

  /* An array of offsets to fields. This is indexed the same way as
   * the field descriptor array. */
  unsigned* fieldOffsets;

  /* A null terminated array of strings describing the static fields
   * of this class. A field description is the concatenation of its
   * name with its descriptor. */
  const char** staticFieldDescriptors;

  /* An array of pointers to static fields. This is indexed the
   * same way as the static field descriptor array. */
  void** staticFields;

  /* A null terminated array of strings describing the dynamic methods
     of this class. A method descriptor is the concatenation of its
     name with its descriptor. */
  const char** methodDescriptors;

  /* An array of pointers to bridge functions. This is indexed the
   * same way as the dynamic method descriptor array. */
  void** methodBridges;

  /* A null terminated array of strings describing the static methods
     of this class. A method descriptor is the concatenation of its
     name with its descriptor. */
  const char** staticMethodDescriptors;

  /* An array of pointers to bridge functions. This is indexed the
   * same way as the static method descriptor array. */
  void** staticMethodBridges;
};

struct llvm_java_class_record {
  struct llvm_java_typeinfo typeinfo;
};

#define HANDLE_TYPE(TYPE) \
  struct llvm_java_##TYPE##array { \
    struct llvm_java_object_base object_base; \
    jint length; \
    j##TYPE data[0]; \
  };
#include "types.def"

struct llvm_java_class_record* llvm_java_find_class_record(const char* name);
struct llvm_java_class_record* llvm_java_get_class_record(jobject obj);
void llvm_java_set_class_record(jobject obj, struct llvm_java_class_record* cr);
jboolean llvm_java_is_instance_of(jobject obj,
                                  struct llvm_java_class_record* cr);
struct llvm_java_class_record* llvm_java_get_superclass_record(
  struct llvm_java_class_record* cr);
jboolean llvm_java_is_assignable_from(struct llvm_java_class_record* cr,
                                      struct llvm_java_class_record* from);
jint llvm_java_throw(jthrowable obj);
