blob: e363293cd0640e7b02d9bc815fa445fc37f74fa3 [file] [log] [blame]
//===- 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;
}
}