| //===- ClasspathVMField.cpp - GNU classpath java/lang/reflect/Field -------===// |
| // |
| // JnJVM |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| |
| #include "JavaClass.h" |
| #include "JavaThread.h" |
| #include "JavaTypes.h" |
| #include "JavaUpcalls.h" |
| #include "Jnjvm.h" |
| #include "NativeUtil.h" |
| |
| using namespace jnjvm; |
| |
| extern "C" { |
| |
| |
| static UserClass* internalGetClass(Jnjvm* vm, JavaField* field, jobject Field) { |
| #ifdef MULTIPLE_VM |
| jclass Cl = (jclass)vm->upcalls->fieldClass->getInt32Field((JavaObject*)Field); |
| UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(Cl, false); |
| return cl; |
| #else |
| return field->classDef; |
| #endif |
| } |
| |
| JNIEXPORT jint JNICALL Java_java_lang_reflect_Field_getModifiersInternal( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| #endif |
| jobject obj) { |
| Jnjvm* vm = JavaThread::get()->isolate; |
| JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)obj); |
| return field->access; |
| } |
| |
| JNIEXPORT jclass JNICALL Java_java_lang_reflect_Field_getType( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| #endif |
| jobject obj) { |
| Jnjvm* vm = JavaThread::get()->isolate; |
| JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)obj); |
| #ifdef MULTIPLE_VM |
| jclass Cl = (jclass)vm->upcalls->fieldClass->getInt32Field((JavaObject*)obj); |
| UserClass* fieldCl = (UserClass*)NativeUtil::resolvedImplClass(Cl, false); |
| JnjvmClassLoader* loader = fieldCl->classLoader; |
| #else |
| JnjvmClassLoader* loader = field->classDef->classLoader; |
| #endif |
| UserCommonClass* cl = field->getSignature()->assocClass(loader); |
| return (jclass)cl->getClassDelegatee(vm); |
| } |
| |
| JNIEXPORT jint JNICALL Java_java_lang_reflect_Field_getInt( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| #endif |
| jobject Field, jobject obj) { |
| Jnjvm* vm = JavaThread::get()->isolate; |
| JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); |
| const Typedef* type = field->getSignature(); |
| |
| JavaObject* Obj = (JavaObject*)obj; |
| |
| if (isStatic(field->access)) { |
| UserClass* cl = internalGetClass(vm, field, Field); |
| cl->initialiseClass(vm); |
| Obj = cl->getStaticInstance(); |
| } |
| |
| if (type->isPrimitive()) { |
| const PrimitiveTypedef* prim = (PrimitiveTypedef*)type; |
| |
| if (prim->isInt()) |
| return (sint32)field->getInt32Field(Obj); |
| if (prim->isChar()) |
| return (uint32)field->getInt16Field(Obj); |
| if (prim->isByte()) |
| return (sint32)field->getInt8Field(Obj); |
| if (prim->isShort()) |
| return (sint32)field->getInt16Field(Obj); |
| } |
| |
| JavaThread::get()->isolate->illegalArgumentException(""); |
| return 0; |
| |
| } |
| |
| JNIEXPORT jlong JNICALL Java_java_lang_reflect_Field_getLong( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| #endif |
| jobject Field, jobject obj) { |
| Jnjvm* vm = JavaThread::get()->isolate; |
| JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); |
| |
| JavaObject* Obj = (JavaObject*)obj; |
| |
| if (isStatic(field->access)) { |
| UserClass* cl = internalGetClass(vm, field, Field); |
| cl->initialiseClass(vm); |
| Obj = cl->getStaticInstance(); |
| } |
| |
| const Typedef* type = field->getSignature(); |
| if (type->isPrimitive()) { |
| const PrimitiveTypedef* prim = (PrimitiveTypedef*)type; |
| |
| if (prim->isInt()) |
| return (sint64)field->getInt32Field(Obj); |
| if (prim->isChar()) |
| return (uint64)field->getInt16Field(Obj); |
| if (prim->isByte()) |
| return (sint64)field->getInt8Field(Obj); |
| if (prim->isShort()) |
| return (sint64)field->getInt16Field(Obj); |
| if (prim->isLong()) |
| return (sint64)field->getLongField(Obj); |
| } |
| |
| JavaThread::get()->isolate->illegalArgumentException(""); |
| return 0; |
| } |
| |
| JNIEXPORT jboolean JNICALL Java_java_lang_reflect_Field_getBoolean( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| #endif |
| jobject Field, jobject obj) { |
| Jnjvm* vm = JavaThread::get()->isolate; |
| JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); |
| |
| JavaObject* Obj = (JavaObject*)obj; |
| |
| if (isStatic(field->access)) { |
| UserClass* cl = internalGetClass(vm, field, Field); |
| cl->initialiseClass(vm); |
| Obj = cl->getStaticInstance(); |
| } |
| |
| const Typedef* type = field->getSignature(); |
| if (type->isPrimitive()) { |
| const PrimitiveTypedef* prim = (PrimitiveTypedef*)type; |
| if (prim->isBool()) |
| return (uint8)field->getInt8Field(Obj); |
| } |
| |
| JavaThread::get()->isolate->illegalArgumentException(""); |
| |
| return 0; |
| |
| } |
| |
| JNIEXPORT jfloat JNICALL Java_java_lang_reflect_Field_getFloat( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| #endif |
| jobject Field, jobject obj) { |
| Jnjvm* vm = JavaThread::get()->isolate; |
| JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); |
| |
| JavaObject* Obj = (JavaObject*)obj; |
| |
| if (isStatic(field->access)) { |
| UserClass* cl = internalGetClass(vm, field, Field); |
| cl->initialiseClass(vm); |
| Obj = cl->getStaticInstance(); |
| } |
| |
| const Typedef* type = field->getSignature(); |
| if (type->isPrimitive()) { |
| const PrimitiveTypedef* prim = (PrimitiveTypedef*)type; |
| if (prim->isByte()) |
| return (jfloat)field->getInt8Field(Obj); |
| if (prim->isInt()) |
| return (jfloat)field->getInt32Field((JavaObject*)obj); |
| if (prim->isShort()) |
| return (jfloat)field->getInt16Field((JavaObject*)obj); |
| if (prim->isLong()) |
| return (jfloat)field->getLongField((JavaObject*)obj); |
| if (prim->isChar()) |
| return (jfloat)(uint32)field->getInt16Field((JavaObject*)obj); |
| if (prim->isFloat()) |
| return (jfloat)field->getFloatField((JavaObject*)obj); |
| } |
| JavaThread::get()->isolate->illegalArgumentException(""); |
| return 0.0; |
| } |
| |
| JNIEXPORT jbyte JNICALL Java_java_lang_reflect_Field_getByte( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| #endif |
| jobject Field, jobject obj) { |
| Jnjvm* vm = JavaThread::get()->isolate; |
| JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); |
| |
| JavaObject* Obj = (JavaObject*)obj; |
| |
| if (isStatic(field->access)) { |
| UserClass* cl = internalGetClass(vm, field, Field); |
| cl->initialiseClass(vm); |
| Obj = cl->getStaticInstance(); |
| } |
| |
| const Typedef* type = field->getSignature(); |
| if (type->isPrimitive()) { |
| const PrimitiveTypedef* prim = (PrimitiveTypedef*)type; |
| if (prim->isByte()) |
| return (sint8)field->getInt8Field(Obj); |
| } |
| JavaThread::get()->isolate->illegalArgumentException(""); |
| |
| return 0; |
| } |
| |
| JNIEXPORT jchar JNICALL Java_java_lang_reflect_Field_getChar( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| #endif |
| jobject Field, jobject obj) { |
| Jnjvm* vm = JavaThread::get()->isolate; |
| JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); |
| |
| JavaObject* Obj = (JavaObject*)obj; |
| |
| if (isStatic(field->access)) { |
| UserClass* cl = internalGetClass(vm, field, Field); |
| cl->initialiseClass(vm); |
| Obj = cl->getStaticInstance(); |
| } |
| |
| const Typedef* type = field->getSignature(); |
| if (type->isPrimitive()) { |
| const PrimitiveTypedef* prim = (PrimitiveTypedef*)type; |
| if (prim->isChar()) |
| return (uint16)field->getInt16Field((JavaObject*)obj); |
| } |
| JavaThread::get()->isolate->illegalArgumentException(""); |
| |
| return 0; |
| |
| } |
| |
| JNIEXPORT jshort JNICALL Java_java_lang_reflect_Field_getShort( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| #endif |
| jobject Field, jobject obj) { |
| Jnjvm* vm = JavaThread::get()->isolate; |
| JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); |
| |
| JavaObject* Obj = (JavaObject*)obj; |
| |
| if (isStatic(field->access)) { |
| UserClass* cl = internalGetClass(vm, field, Field); |
| cl->initialiseClass(vm); |
| Obj = cl->getStaticInstance(); |
| } |
| |
| const Typedef* type = field->getSignature(); |
| if (type->isPrimitive()) { |
| const PrimitiveTypedef* prim = (PrimitiveTypedef*)type; |
| if (prim->isShort()) |
| return (sint16)field->getInt16Field(Obj); |
| if (prim->isByte()) |
| return (sint16)field->getInt8Field(Obj); |
| } |
| JavaThread::get()->isolate->illegalArgumentException(""); |
| |
| return 0; |
| } |
| |
| JNIEXPORT jdouble JNICALL Java_java_lang_reflect_Field_getDouble( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| #endif |
| jobject Field, jobject obj) { |
| Jnjvm* vm = JavaThread::get()->isolate; |
| JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); |
| |
| JavaObject* Obj = (JavaObject*)obj; |
| |
| if (isStatic(field->access)) { |
| UserClass* cl = internalGetClass(vm, field, Field); |
| cl->initialiseClass(vm); |
| Obj = cl->getStaticInstance(); |
| } |
| |
| const Typedef* type = field->getSignature(); |
| if (type->isPrimitive()) { |
| const PrimitiveTypedef* prim = (PrimitiveTypedef*)type; |
| if (prim->isByte()) |
| return (jdouble)(sint64)field->getInt8Field(Obj); |
| if (prim->isInt()) |
| return (jdouble)(sint64)field->getInt32Field(Obj); |
| if (prim->isShort()) |
| return (jdouble)(sint64)field->getInt16Field(Obj); |
| if (prim->isLong()) |
| return (jdouble)(sint64)field->getLongField(Obj); |
| if (prim->isChar()) |
| return (jdouble)(uint64)field->getInt16Field(Obj); |
| if (prim->isFloat()) |
| return (jdouble)field->getFloatField(Obj); |
| if (prim->isDouble()) |
| return (jdouble)field->getDoubleField(Obj); |
| } |
| JavaThread::get()->isolate->illegalArgumentException(""); |
| return 0.0; |
| } |
| |
| JNIEXPORT jobject JNICALL Java_java_lang_reflect_Field_get( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| #endif |
| jobject Field, jobject _obj) { |
| Jnjvm* vm = JavaThread::get()->isolate; |
| JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); |
| |
| JavaObject* Obj = (JavaObject*)_obj; |
| |
| if (isStatic(field->access)) { |
| UserClass* cl = internalGetClass(vm, field, Field); |
| cl->initialiseClass(vm); |
| Obj = cl->getStaticInstance(); |
| } |
| |
| JavaObject* res = 0; |
| const Typedef* type = field->getSignature(); |
| if (type->isPrimitive()) { |
| const PrimitiveTypedef* prim = (PrimitiveTypedef*)type; |
| if (prim->isBool()) { |
| uint8 val = field->getInt8Field(Obj); |
| res = vm->upcalls->boolClass->doNew(vm); |
| vm->upcalls->boolValue->setInt8Field(res, val); |
| } |
| else if (prim->isByte()) { |
| sint8 val = field->getInt8Field(Obj); |
| res = vm->upcalls->byteClass->doNew(vm); |
| vm->upcalls->byteValue->setInt8Field(res, val); |
| } |
| else if (prim->isChar()) { |
| uint16 val = field->getInt16Field(Obj); |
| res = vm->upcalls->charClass->doNew(vm); |
| vm->upcalls->charValue->setInt16Field(res, val); |
| } |
| else if (prim->isShort()) { |
| sint16 val = field->getInt16Field(Obj); |
| res = vm->upcalls->shortClass->doNew(vm); |
| vm->upcalls->shortValue->setInt16Field(res, val); |
| } |
| else if (prim->isInt()) { |
| sint32 val = field->getInt32Field(Obj); |
| res = vm->upcalls->intClass->doNew(vm); |
| vm->upcalls->intValue->setInt32Field(res, val); |
| } |
| else if (prim->isLong()) { |
| sint64 val = field->getLongField(Obj); |
| res = vm->upcalls->longClass->doNew(vm); |
| vm->upcalls->longValue->setLongField(res, val); |
| } |
| else if (prim->isFloat()) { |
| float val = field->getFloatField(Obj); |
| res = vm->upcalls->floatClass->doNew(vm); |
| vm->upcalls->floatValue->setFloatField(res, val); |
| } |
| else if (prim->isDouble()) { |
| double val = field->getDoubleField(Obj); |
| res = vm->upcalls->doubleClass->doNew(vm); |
| vm->upcalls->doubleValue->setDoubleField(res, val); |
| } |
| } else { |
| res = field->getObjectField(Obj); |
| } |
| return (jobject)res; |
| } |
| |
| JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| #endif |
| jobject Field, jobject obj, jobject val) { |
| Jnjvm* vm = JavaThread::get()->isolate; |
| JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); |
| void** buf = (void**)alloca(sizeof(uint64)); |
| void* _buf = (void*)buf; |
| NativeUtil::decapsulePrimitive(JavaThread::get()->isolate, buf, (JavaObject*)val, field->getSignature()); |
| |
| |
| JavaObject* Obj = (JavaObject*)obj; |
| |
| if (isStatic(field->access)) { |
| UserClass* cl = internalGetClass(vm, field, Field); |
| cl->initialiseClass(vm); |
| Obj = cl->getStaticInstance(); |
| } |
| |
| const Typedef* type = field->getSignature(); |
| if (type->isPrimitive()) { |
| const PrimitiveTypedef* prim = (PrimitiveTypedef*)type; |
| if (prim->isBool()) |
| return field->setInt8Field(Obj, ((uint8*)_buf)[0]); |
| if (prim->isByte()) |
| return field->setInt8Field(Obj, ((sint8*)_buf)[0]); |
| if (prim->isChar()) |
| return field->setInt16Field(Obj, ((uint16*)_buf)[0]); |
| if (prim->isShort()) |
| return field->setInt16Field(Obj, ((sint16*)_buf)[0]); |
| if (prim->isInt()) |
| return field->setInt32Field(Obj, ((sint32*)_buf)[0]); |
| if (prim->isLong()) |
| return field->setLongField(Obj, ((sint64*)_buf)[0]); |
| if (prim->isFloat()) |
| return field->setFloatField(Obj, ((float*)_buf)[0]); |
| if (prim->isDouble()) |
| return field->setDoubleField(Obj, ((double*)_buf)[0]); |
| } else { |
| return field->setObjectField(Obj, ((JavaObject**)_buf)[0]); |
| } |
| } |
| |
| JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setBoolean( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| #endif |
| jobject Field, jobject obj, jboolean val) { |
| Jnjvm* vm = JavaThread::get()->isolate; |
| JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); |
| JavaObject* Obj = (JavaObject*)obj; |
| |
| if (isStatic(field->access)) { |
| UserClass* cl = internalGetClass(vm, field, Field); |
| cl->initialiseClass(vm); |
| Obj = cl->getStaticInstance(); |
| } |
| |
| const Typedef* type = field->getSignature(); |
| if (type->isPrimitive()) { |
| const PrimitiveTypedef* prim = (PrimitiveTypedef*)type; |
| if (prim->isBool()) |
| return field->setInt8Field(Obj, (uint8)val); |
| } |
| JavaThread::get()->isolate->illegalArgumentException(""); |
| |
| } |
| |
| JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setByte( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| #endif |
| jobject Field, jobject obj, jbyte val) { |
| Jnjvm* vm = JavaThread::get()->isolate; |
| JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); |
| JavaObject* Obj = (JavaObject*)obj; |
| |
| if (isStatic(field->access)) { |
| UserClass* cl = internalGetClass(vm, field, Field); |
| cl->initialiseClass(vm); |
| Obj = cl->getStaticInstance(); |
| } |
| |
| const Typedef* type = field->getSignature(); |
| if (type->isPrimitive()) { |
| const PrimitiveTypedef* prim = (PrimitiveTypedef*)type; |
| if (prim->isByte()) |
| return field->setInt8Field(Obj, (sint8)val); |
| if (prim->isShort()) |
| return field->setInt16Field(Obj, (sint16)val); |
| if (prim->isInt()) |
| return field->setInt32Field(Obj, (sint32)val); |
| if (prim->isLong()) |
| return field->setLongField(Obj, (sint64)val); |
| if (prim->isFloat()) |
| return field->setFloatField(Obj, (float)val); |
| if (prim->isDouble()) |
| return field->setDoubleField(Obj, (double)val); |
| } |
| JavaThread::get()->isolate->illegalArgumentException(""); |
| } |
| |
| JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setChar( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| #endif |
| jobject Field, jobject obj, jchar val) { |
| Jnjvm* vm = JavaThread::get()->isolate; |
| JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); |
| |
| JavaObject* Obj = (JavaObject*)obj; |
| |
| if (isStatic(field->access)) { |
| UserClass* cl = internalGetClass(vm, field, Field); |
| cl->initialiseClass(vm); |
| Obj = cl->getStaticInstance(); |
| } |
| |
| const Typedef* type = field->getSignature(); |
| if (type->isPrimitive()) { |
| const PrimitiveTypedef* prim = (PrimitiveTypedef*)type; |
| if (prim->isChar()) |
| return field->setInt16Field(Obj, (uint16)val); |
| if (prim->isInt()) |
| return field->setInt32Field(Obj, (uint32)val); |
| if (prim->isLong()) |
| return field->setLongField(Obj, (uint64)val); |
| if (prim->isFloat()) |
| return field->setFloatField(Obj, (float)(uint32)val); |
| if (prim->isDouble()) |
| return field->setDoubleField(Obj, (double)(uint64)val); |
| } |
| JavaThread::get()->isolate->illegalArgumentException(""); |
| } |
| |
| JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setShort( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| #endif |
| jobject Field, jobject obj, jshort val) { |
| Jnjvm* vm = JavaThread::get()->isolate; |
| JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); |
| |
| JavaObject* Obj = (JavaObject*)obj; |
| |
| if (isStatic(field->access)) { |
| UserClass* cl = internalGetClass(vm, field, Field); |
| cl->initialiseClass(vm); |
| Obj = cl->getStaticInstance(); |
| } |
| |
| const Typedef* type = field->getSignature(); |
| if (type->isPrimitive()) { |
| const PrimitiveTypedef* prim = (PrimitiveTypedef*)type; |
| if (prim->isShort()) |
| return field->setInt16Field(Obj, (sint16)val); |
| if (prim->isInt()) |
| return field->setInt32Field(Obj, (sint32)val); |
| if (prim->isLong()) |
| return field->setLongField(Obj, (sint64)val); |
| if (prim->isFloat()) |
| return field->setFloatField(Obj, (float)val); |
| if (prim->isDouble()) |
| return field->setDoubleField(Obj, (double)val); |
| } |
| JavaThread::get()->isolate->illegalArgumentException(""); |
| } |
| |
| JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setInt( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| #endif |
| jobject Field, jobject obj, jint val) { |
| Jnjvm* vm = JavaThread::get()->isolate; |
| JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); |
| JavaObject* Obj = (JavaObject*)obj; |
| |
| if (isStatic(field->access)) { |
| UserClass* cl = internalGetClass(vm, field, Field); |
| cl->initialiseClass(vm); |
| Obj = cl->getStaticInstance(); |
| } |
| |
| const Typedef* type = field->getSignature(); |
| if (type->isPrimitive()) { |
| const PrimitiveTypedef* prim = (PrimitiveTypedef*)type; |
| if (prim->isInt()) |
| return field->setInt32Field(Obj, (sint32)val); |
| if (prim->isLong()) |
| return field->setLongField(Obj, (sint64)val); |
| if (prim->isFloat()) |
| return field->setFloatField(Obj, (float)val); |
| if (prim->isDouble()) |
| return field->setDoubleField(Obj, (double)val); |
| } |
| JavaThread::get()->isolate->illegalArgumentException(""); |
| } |
| |
| JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setLong( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| #endif |
| jobject Field, jobject obj, jlong val) { |
| Jnjvm* vm = JavaThread::get()->isolate; |
| JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); |
| JavaObject* Obj = (JavaObject*)obj; |
| |
| if (isStatic(field->access)) { |
| UserClass* cl = internalGetClass(vm, field, Field); |
| cl->initialiseClass(vm); |
| Obj = cl->getStaticInstance(); |
| } |
| |
| const Typedef* type = field->getSignature(); |
| if (type->isPrimitive()) { |
| const PrimitiveTypedef* prim = (PrimitiveTypedef*)type; |
| if (prim->isLong()) |
| return field->setLongField(Obj, (sint64)val); |
| if (prim->isFloat()) |
| return field->setFloatField(Obj, (float)val); |
| if (prim->isDouble()) |
| return field->setDoubleField(Obj, (double)val); |
| } |
| JavaThread::get()->isolate->illegalArgumentException(""); |
| } |
| |
| JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setFloat( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| #endif |
| jobject Field, jobject obj, jfloat val) { |
| Jnjvm* vm = JavaThread::get()->isolate; |
| JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); |
| JavaObject* Obj = (JavaObject*)obj; |
| |
| if (isStatic(field->access)) { |
| UserClass* cl = internalGetClass(vm, field, Field); |
| cl->initialiseClass(vm); |
| Obj = cl->getStaticInstance(); |
| } |
| |
| const Typedef* type = field->getSignature(); |
| if (type->isPrimitive()) { |
| const PrimitiveTypedef* prim = (PrimitiveTypedef*)type; |
| if (prim->isFloat()) |
| return field->setFloatField(Obj, (float)val); |
| if (prim->isDouble()) |
| return field->setDoubleField(Obj, (double)val); |
| } |
| JavaThread::get()->isolate->illegalArgumentException(""); |
| } |
| |
| JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setDouble( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| #endif |
| jobject Field, jobject obj, jdouble val) { |
| Jnjvm* vm = JavaThread::get()->isolate; |
| JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); |
| JavaObject* Obj = (JavaObject*)obj; |
| |
| if (isStatic(field->access)) { |
| UserClass* cl = internalGetClass(vm, field, Field); |
| cl->initialiseClass(vm); |
| Obj = cl->getStaticInstance(); |
| } |
| |
| const Typedef* type = field->getSignature(); |
| if (type->isPrimitive()) { |
| const PrimitiveTypedef* prim = (PrimitiveTypedef*)type; |
| if (prim->isDouble()) |
| return field->setDoubleField(Obj, (double)val); |
| } |
| JavaThread::get()->isolate->illegalArgumentException(""); |
| } |
| |
| JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_objectFieldOffset( |
| #ifdef NATIVE_JNI |
| JNIEnv *env, |
| #endif |
| JavaObject* Unsafe, |
| JavaObject* Field) { |
| Jnjvm* vm = JavaThread::get()->isolate; |
| JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); |
| return (jlong)field->ptrOffset; |
| } |
| |
| } |