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

#include <string.h>

#include "types.h"

#include "JavaArray.h"
#include "JavaClass.h"
#include "JavaObject.h"
#include "JavaString.h"
#include "JavaTypes.h"
#include "JavaThread.h"
#include "Jnjvm.h"
#include "LockedMap.h"
#include "NativeUtil.h"

using namespace jnjvm;

extern "C" {

JNIEXPORT jobject JNICALL Java_java_lang_VMClassLoader_getPrimitiveClass(                                                     
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
jchar byteId) {
  
  Jnjvm* vm = JavaThread::get()->isolate;
  UserClassPrimitive* prim = 
    UserClassPrimitive::byteIdToPrimitive(byteId, vm->upcalls);
  if (!prim)
    vm->unknownError("unknown byte primitive %c", byteId);
  
  return (jobject)prim->getClassDelegatee(vm);
  
}

JNIEXPORT jclass JNICALL Java_java_lang_VMClassLoader_findLoadedClass(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
                                                                      jobject loader, 
                                                                      jobject _name) {

  Jnjvm* vm = JavaThread::get()->isolate;
  JavaString* name = (JavaString*)_name;
  const UTF8* utf8 = name->strToUTF8(vm);
  JnjvmClassLoader* JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader, vm);
  UserCommonClass* cl = JCL->lookupClass(utf8);

  if (cl) return (jclass)(cl->getClassDelegatee(vm));
  else return 0;
}

JNIEXPORT jclass JNICALL Java_java_lang_VMClassLoader_loadClass(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
                                                                jobject _str, 
                                                                jboolean doResolve) {
  Jnjvm* vm = JavaThread::get()->isolate;
  JavaString* str = (JavaString*)_str;

  JnjvmClassLoader* JCL = vm->bootstrapLoader;
  UserCommonClass* cl = JCL->lookupClassFromJavaString(str, doResolve, false);

  if (cl != 0) {
    return (jclass)cl->getClassDelegatee(vm);
  } else {
    return 0;
  }
}

JNIEXPORT jclass JNICALL Java_java_lang_VMClassLoader_defineClass(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz, 
#endif
                                                                  jobject loader, 
                                                                  jobject _str, 
                                                                  jobject bytes, 
                                                                  jint off, 
                                                                  jint len, 
                                                                  jobject pd) {
  Jnjvm* vm = JavaThread::get()->isolate;
  JnjvmClassLoader* JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader, vm);
  JavaString* str = (JavaString*)_str;
  const UTF8* name = str->value->javaToInternal(JCL->hashUTF8, str->offset, str->count);
  UserClass* cl = JCL->constructClass(name, (ArrayUInt8*)bytes);

  return (jclass)(cl->getClassDelegatee(vm, (JavaObject*)pd));
}

JNIEXPORT void JNICALL Java_java_lang_VMClassLoader_resolveClass(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
                                                                 jclass Cl) {
  verifyNull(Cl);
  NativeUtil::resolvedImplClass(Cl, false);
}

}
