blob: caf361bfc12d9c1eed11fed7425b7bf7e1bacee0 [file] [log] [blame]
//===- 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 "llvm/Type.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) {
AssessorDesc* ass = AssessorDesc::byteIdToPrimitive(byteId);
Jnjvm* vm = JavaThread::get()->isolate;
if (!ass)
vm->unknownError("unknown byte primitive %c", byteId);
return (jobject)ass->classType->getClassDelegatee();
}
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);
CommonClass* cl = vm->lookupClass(utf8, (JavaObject*)loader);
if (cl) return (jclass)(cl->getClassDelegatee());
else return 0;
}
JNIEXPORT jclass JNICALL Java_java_lang_VMClassLoader_loadClass(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
jobject _str,
jboolean doResolve) {
JavaString* str = (JavaString*)_str;
Jnjvm* vm = JavaThread::get()->isolate;
CommonClass* cl = vm->lookupClassFromJavaString(str, 0, doResolve, false, false);
if (cl != 0) {
return (jclass)cl->getClassDelegatee();
} 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;
JavaString* str = (JavaString*)_str;
const UTF8* name = str->value->javaToInternal(vm, str->offset, str->count);
Class* cl = vm->constructClass(name, (JavaObject*)loader);
if (cl->status == hashed) {
cl->aquire();
if (cl->status == hashed) {
cl->bytes = (ArrayUInt8*)bytes;
cl->status = loaded;
#ifdef SINGLE_VM
cl->delegatee = (JavaObject*)pd;
#else
vm->delegatees->hash(cl, (JavaObject*)pd);
#endif
}
cl->release();
}
return (jclass)(cl->getClassDelegatee());
}
JNIEXPORT void JNICALL Java_java_lang_VMClassLoader_resolveClass(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
jclass Cl) {
verifyNull(Cl);
NativeUtil::resolvedImplClass(Cl, false);
}
}