//===-------- 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; } }