blob: 3354774c8ba11e4db2951cc7f7239e7d11a3fa36 [file] [log] [blame]
//===-------- Classpath.cpp - Configuration for classpath -------------------===//
//
// The VMKit project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "Classpath.h"
#include "ClasspathReflect.h"
#include "JavaClass.h"
#include "JavaThread.h"
#include "JavaUpcalls.h"
#include "Jnjvm.h"
#include "Reader.h"
using namespace j3;
extern "C" {
// Define hasClassInitializer because of a buggy implementation in Classpath.
JNIEXPORT bool JNICALL Java_java_io_VMObjectStreamClass_hasClassInitializer(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObject* Cl) {
llvm_gcroot(Cl, 0);
bool res = false;
BEGIN_NATIVE_EXCEPTION(0)
verifyNull(Cl);
Jnjvm* vm = JavaThread::get()->getJVM();
UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, true);
if (cl->isClass() &&
cl->asClass()->lookupMethodDontThrow(vm->bootstrapLoader->clinitName,
vm->bootstrapLoader->clinitType,
true, false, 0))
res = true;
END_NATIVE_EXCEPTION
return res;
}
// Redefine some VMObjectStreamClass functions because of a slow implementation
// in Classpath.
JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setBooleanNative(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObjectField* Field, JavaObject* obj, jboolean val) {
llvm_gcroot(Field, 0);
llvm_gcroot(obj, 0);
BEGIN_NATIVE_EXCEPTION(0)
verifyNull(obj);
JavaField* field = JavaObjectField::getInternalField(Field);
field->setInstanceInt8Field(obj, (uint8)val);
END_NATIVE_EXCEPTION
}
JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setByteNative(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObjectField* Field, JavaObject* obj, jbyte val) {
llvm_gcroot(Field, 0);
llvm_gcroot(obj, 0);
BEGIN_NATIVE_EXCEPTION(0)
verifyNull(obj);
JavaField* field = JavaObjectField::getInternalField(Field);
field->setInstanceInt8Field(obj, (uint8)val);
END_NATIVE_EXCEPTION
}
JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setCharNative(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObjectField* Field, JavaObject* obj, jchar val) {
llvm_gcroot(Field, 0);
llvm_gcroot(obj, 0);
BEGIN_NATIVE_EXCEPTION(0)
verifyNull(obj);
JavaField* field = JavaObjectField::getInternalField(Field);
field->setInstanceInt16Field((JavaObject*)obj, (uint16)val);
END_NATIVE_EXCEPTION
}
JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setShortNative(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObjectField* Field, JavaObject* obj, jshort val) {
llvm_gcroot(Field, 0);
llvm_gcroot(obj, 0);
BEGIN_NATIVE_EXCEPTION(0)
verifyNull(obj);
JavaField* field = JavaObjectField::getInternalField(Field);
field->setInstanceInt16Field(obj, (sint16)val);
END_NATIVE_EXCEPTION
}
JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setIntNative(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObjectField* Field, JavaObject* obj, jint val) {
llvm_gcroot(Field, 0);
llvm_gcroot(obj, 0);
BEGIN_NATIVE_EXCEPTION(0)
verifyNull(obj);
JavaField* field = JavaObjectField::getInternalField(Field);
field->setInstanceInt32Field(obj, (sint32)val);
END_NATIVE_EXCEPTION
}
JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setLongNative(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObjectField* Field, JavaObject* obj, jlong val) {
llvm_gcroot(Field, 0);
llvm_gcroot(obj, 0);
BEGIN_NATIVE_EXCEPTION(0)
verifyNull(obj);
JavaField* field = JavaObjectField::getInternalField(Field);
field->setInstanceLongField(obj, (sint64)val);
END_NATIVE_EXCEPTION
}
JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setFloatNative(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObjectField* Field, JavaObject* obj, jfloat val) {
llvm_gcroot(Field, 0);
llvm_gcroot(obj, 0);
BEGIN_NATIVE_EXCEPTION(0)
verifyNull(obj);
JavaField* field = JavaObjectField::getInternalField(Field);
field->setInstanceFloatField(obj, (float)val);
END_NATIVE_EXCEPTION
}
JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setDoubleNative(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObjectField* Field, JavaObject* obj, jdouble val) {
llvm_gcroot(Field, 0);
llvm_gcroot(obj, 0);
BEGIN_NATIVE_EXCEPTION(0)
verifyNull(obj);
JavaField* field = JavaObjectField::getInternalField(Field);
field->setInstanceDoubleField(obj, (double)val);
END_NATIVE_EXCEPTION
}
JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setObjectNative(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObjectField* Field, JavaObject* obj, JavaObject* val) {
llvm_gcroot(Field, 0);
llvm_gcroot(obj, 0);
llvm_gcroot(val, 0);
BEGIN_NATIVE_EXCEPTION(0)
verifyNull(obj);
JavaField* field = JavaObjectField::getInternalField(Field);
field->setInstanceObjectField(obj, val);
END_NATIVE_EXCEPTION
}
JNIEXPORT JavaObject* JNICALL Java_java_io_VMObjectInputStream_allocateObject(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObject* target, JavaObject* constr, JavaObjectConstructor* cons) {
JavaObject* res = 0;
llvm_gcroot(res, 0);
llvm_gcroot(target, 0);
llvm_gcroot(constr, 0);
llvm_gcroot(cons, 0);
BEGIN_NATIVE_EXCEPTION(0)
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl =
(UserClass*)UserCommonClass::resolvedImplClass(vm, target, true);
res = cl->doNew(vm);
JavaMethod* meth = JavaObjectConstructor::getInternalMethod(cons);
meth->invokeIntSpecial(vm, cl, res);
END_NATIVE_EXCEPTION
return res;
}
JNIEXPORT JavaObject* JNICALL Java_java_lang_reflect_VMArray_createObjectArray(
#ifdef NATIVE_JNI
JNIEnv * env,
jclass thisClass,
#endif
JavaObject* arrayType, jint arrayLength) {
JavaObject* res = 0;
llvm_gcroot(arrayType, 0);
llvm_gcroot(res, 0);
BEGIN_NATIVE_EXCEPTION(0)
Jnjvm* vm = JavaThread::get()->getJVM();
UserCommonClass* base =
UserCommonClass::resolvedImplClass(vm, arrayType, true);
JnjvmClassLoader* loader = base->classLoader;
const UTF8* name = base->getName();
// -1 because we're adding a new dimension in this method.
const int kLimit = 255 - 1;
const uint16* elements = name->elements;
if (name->size > kLimit && elements[kLimit] == '[') {
vm->illegalArgumentException("Too many dimensions for array");
}
const UTF8* arrayName = loader->constructArrayName(1, name);
UserClassArray* array = loader->constructArray(arrayName, base);
res = array->doNew(arrayLength, vm);
END_NATIVE_EXCEPTION
return res;
}
// Never throws.
JNIEXPORT
bool JNICALL Java_java_util_concurrent_atomic_AtomicLong_VMSupportsCS8(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
) {
return false;
}
}