//===------ ClasspathVMObject.cpp - GNU classpath java/lang/VMObject ------===//
//
//                              JnJVM
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "types.h"

#include "Classpath.h"
#include "JavaArray.h"
#include "JavaClass.h"
#include "JavaObject.h"
#include "JavaThread.h"
#include "Jnjvm.h"

using namespace jnjvm;

extern "C" {

JNIEXPORT JavaObject* JNICALL Java_java_lang_VMObject_clone(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz, 
#endif
JavaObject* src) {
  
  JavaObject* res = 0;
  llvm_gcroot(res, 0);
  llvm_gcroot(src, 0);

  BEGIN_NATIVE_EXCEPTION(0)

  UserCommonClass* cl = src->getClass();
  size_t size = 0;
  if (cl->isArray()) {
    UserClassArray* array = cl->asArrayClass();
    UserCommonClass* base = array->baseClass();
    uint32 logSize = base->isPrimitive() ? 
      base->asPrimitiveClass()->logSize : (sizeof(JavaObject*) == 8 ? 3 : 2);

    size = sizeof(JavaObject) + sizeof(ssize_t) + 
                            (((JavaArray*)src)->size << logSize);
  } else {
    assert(cl->isClass() && "Not a class!");
    size = cl->asClass()->getVirtualSize();
  }
  res = (JavaObject*)gc::operator new(size, src->getVirtualTable());
  memcpy((void*)((uintptr_t)res + 2 * sizeof(void*)),
         (void*)((uintptr_t)src + 2 * sizeof(void*)),
         size - 2 * sizeof(void*));

  END_NATIVE_EXCEPTION

  return res;
} 

JNIEXPORT JavaObject* JNICALL Java_java_lang_VMObject_getClass(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObject* obj) {
  
  JavaObject* res = 0;
  llvm_gcroot(res, 0);
  llvm_gcroot(obj, 0);

  BEGIN_NATIVE_EXCEPTION(0)

  Jnjvm* vm = JavaThread::get()->getJVM();
  res = obj->getClass()->getClassDelegatee(vm);

  END_NATIVE_EXCEPTION

  return res;
}

JNIEXPORT void JNICALL Java_java_lang_VMObject_notifyAll(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObject* obj) {

  llvm_gcroot(obj, 0);

  BEGIN_NATIVE_EXCEPTION(0)

  obj->notifyAll();

  END_NATIVE_EXCEPTION
}


JNIEXPORT void JNICALL Java_java_lang_VMObject_wait(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObject* obj, jlong ms, jint ns) {

  llvm_gcroot(obj, 0);

  BEGIN_NATIVE_EXCEPTION(0)

  uint32 sec = (uint32) (ms / 1000);
  uint32 usec = (ns / 1000) + 1000 * (ms % 1000);
  if (ns && !usec) usec = 1;
  if (sec || usec) {
    struct timeval t;
    t.tv_sec = sec;
    t.tv_usec = usec;
    obj->timedWait(t);
  } else {
    obj->wait();
  }

  END_NATIVE_EXCEPTION
}

JNIEXPORT void JNICALL Java_java_lang_VMObject_notify(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObject* obj) {

  llvm_gcroot(obj, 0);

  BEGIN_NATIVE_EXCEPTION(0)

  obj->notify();

  END_NATIVE_EXCEPTION
}

}
