blob: 2277ddd604043294d6d5cf6b936d71421d0002f0 [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 "ClasspathVMField.h"
#include "JavaClass.h"
#include "JavaThread.h"
#include "JavaTypes.h"
#include "JavaUpcalls.h"
#include "Jnjvm.h"
#include "NativeUtil.h"
using namespace jnjvm;
extern "C" {
JNIEXPORT jint JNICALL Java_java_lang_reflect_Field_getModifiersInternal(
#ifdef NATIVE_JNI
JNIEnv *env,
#endif
jobject obj) {
JavaField* field = (JavaField*)((*Classpath::fieldSlot)((JavaObject*)obj).IntVal.getZExtValue());
return field->access;
}
JNIEXPORT jclass JNICALL Java_java_lang_reflect_Field_getType(
#ifdef NATIVE_JNI
JNIEnv *env,
#endif
jobject obj) {
JavaField* field = (JavaField*)((*Classpath::fieldSlot)((JavaObject*)obj).IntVal.getZExtValue());
JavaObject* loader = field->classDef->classLoader;
CommonClass* cl = field->signature->assocClass(loader);
return (jclass)cl->getClassDelegatee();
}
JNIEXPORT jint JNICALL Java_java_lang_reflect_Field_getInt(
#ifdef NATIVE_JNI
JNIEnv *env,
#endif
jobject Field, jobject obj) {
JavaField* field = (JavaField*)((*Classpath::fieldSlot)((JavaObject*)Field).IntVal.getZExtValue());
const AssessorDesc* ass = field->signature->funcs;
if (ass != AssessorDesc::dInt && ass != AssessorDesc::dChar && ass != AssessorDesc::dByte && ass != AssessorDesc::dShort)
JavaThread::get()->isolate->illegalArgumentException("");
return (sint32)(*field)((JavaObject*)obj).IntVal.getZExtValue();
}
JNIEXPORT jlong JNICALL Java_java_lang_reflect_Field_getLong(
#ifdef NATIVE_JNI
JNIEnv *env,
#endif
jobject Field, jobject obj) {
JavaField* field = (JavaField*)((*Classpath::fieldSlot)((JavaObject*)Field).IntVal.getZExtValue());
const AssessorDesc* ass = field->signature->funcs;
if (ass != AssessorDesc::dInt && ass != AssessorDesc::dChar && ass != AssessorDesc::dByte && ass != AssessorDesc::dShort &&
ass != AssessorDesc::dLong)
JavaThread::get()->isolate->illegalArgumentException("");
return (sint64)(*field)((JavaObject*)obj).IntVal.getZExtValue();
}
JNIEXPORT jboolean JNICALL Java_java_lang_reflect_Field_getBoolean(
#ifdef NATIVE_JNI
JNIEnv *env,
#endif
jobject Field, jobject obj) {
JavaField* field = (JavaField*)((*Classpath::fieldSlot)((JavaObject*)Field).IntVal.getZExtValue());
const AssessorDesc* ass = field->signature->funcs;
if (ass != AssessorDesc::dBool)
JavaThread::get()->isolate->illegalArgumentException("");
return (uint8)(*field)((JavaObject*)obj).IntVal.getZExtValue();
}
JNIEXPORT jfloat JNICALL Java_java_lang_reflect_Field_getFloat(
#ifdef NATIVE_JNI
JNIEnv *env,
#endif
jobject Field, jobject obj) {
JavaField* field = (JavaField*)((*Classpath::fieldSlot)((JavaObject*)Field).IntVal.getZExtValue());
const AssessorDesc* ass = field->signature->funcs;
if (ass == AssessorDesc::dByte || ass == AssessorDesc::dInt || ass == AssessorDesc::dShort || ass == AssessorDesc::dLong) {
return (jfloat)(*field)((JavaObject*)obj).IntVal.getSExtValue();
} else if (ass == AssessorDesc::dChar) {
return (jfloat)(*field)((JavaObject*)obj).IntVal.getZExtValue();
} else if (ass == AssessorDesc::dFloat) {
return (jfloat)(*field)((JavaObject*)obj).FloatVal;
}
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) {
JavaField* field = (JavaField*)((*Classpath::fieldSlot)((JavaObject*)Field).IntVal.getZExtValue());
const AssessorDesc* ass = field->signature->funcs;
if (ass != AssessorDesc::dByte)
JavaThread::get()->isolate->illegalArgumentException("");
return (sint8)(*field)((JavaObject*)obj).IntVal.getSExtValue();
}
JNIEXPORT jchar JNICALL Java_java_lang_reflect_Field_getChar(
#ifdef NATIVE_JNI
JNIEnv *env,
#endif
jobject Field, jobject obj) {
JavaField* field = (JavaField*)((*Classpath::fieldSlot)((JavaObject*)Field).IntVal.getZExtValue());
const AssessorDesc* ass = field->signature->funcs;
if (ass != AssessorDesc::dChar)
JavaThread::get()->isolate->illegalArgumentException("");
return (uint16)(*field)((JavaObject*)obj).IntVal.getZExtValue();
}
JNIEXPORT jshort JNICALL Java_java_lang_reflect_Field_getShort(
#ifdef NATIVE_JNI
JNIEnv *env,
#endif
jobject Field, jobject obj) {
JavaField* field = (JavaField*)((*Classpath::fieldSlot)((JavaObject*)Field).IntVal.getZExtValue());
const AssessorDesc* ass = field->signature->funcs;
if (ass != AssessorDesc::dShort && ass != AssessorDesc::dByte)
JavaThread::get()->isolate->illegalArgumentException("");
return (sint16)(*field)((JavaObject*)obj).IntVal.getSExtValue();
}
JNIEXPORT jdouble JNICALL Java_java_lang_reflect_Field_getDouble(
#ifdef NATIVE_JNI
JNIEnv *env,
#endif
jobject Field, jobject obj) {
JavaField* field = (JavaField*)((*Classpath::fieldSlot)((JavaObject*)Field).IntVal.getZExtValue());
const AssessorDesc* ass = field->signature->funcs;
if (ass == AssessorDesc::dByte || ass == AssessorDesc::dInt || ass == AssessorDesc::dShort || ass == AssessorDesc::dLong) {
return (jdouble)(*field)((JavaObject*)obj).IntVal.getSExtValue();
} else if (ass == AssessorDesc::dChar) {
return (jdouble)(*field)((JavaObject*)obj).IntVal.getZExtValue();
} else if (ass == AssessorDesc::dFloat) {
return (jdouble)(*field)((JavaObject*)obj).FloatVal;
} else if (ass == AssessorDesc::dDouble) {
return (jdouble)(*field)((JavaObject*)obj).DoubleVal;
}
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) {
JavaField* field = (JavaField*)((*Classpath::fieldSlot)((JavaObject*)Field).IntVal.getZExtValue());
Typedef* type = field->signature;
const AssessorDesc* ass = type->funcs;
JavaObject* obj = (JavaObject*)_obj;
llvm::GenericValue gv = (*field)(obj);
JavaObject* res = 0;
if (ass == AssessorDesc::dBool) {
res = (*Classpath::boolClass)();
(*Classpath::boolValue)(res, (uint32)gv.IntVal.getBoolValue());
} else if (ass == AssessorDesc::dByte) {
res = (*Classpath::byteClass)();
(*Classpath::byteValue)(res, (uint32)gv.IntVal.getSExtValue());
} else if (ass == AssessorDesc::dChar) {
res = (*Classpath::charClass)();
(*Classpath::charValue)(res, (uint32)gv.IntVal.getZExtValue());
} else if (ass == AssessorDesc::dShort) {
res = (*Classpath::shortClass)();
(*Classpath::shortValue)(res, (uint32)gv.IntVal.getSExtValue());
} else if (ass == AssessorDesc::dInt) {
res = (*Classpath::intClass)();
(*Classpath::intValue)(res, (uint32)gv.IntVal.getSExtValue());
} else if (ass == AssessorDesc::dLong) {
res = (*Classpath::longClass)();
(*Classpath::longValue)(res, (sint64)gv.IntVal.getSExtValue());
} else if (ass == AssessorDesc::dFloat) {
res = (*Classpath::floatClass)();
(*Classpath::floatValue)(res, gv.FloatVal);
} else if (ass == AssessorDesc::dDouble) {
res = (*Classpath::doubleClass)();
(*Classpath::doubleValue)(res, gv.DoubleVal);
} else if (ass == AssessorDesc::dTab || ass == AssessorDesc::dRef) {
res = (JavaObject*)gv.PointerVal;
} else {
JavaThread::get()->isolate->unknownError("should not be here");
}
return (jobject)res;
}
JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(
#ifdef NATIVE_JNI
JNIEnv *env,
#endif
jobject Field, jobject obj, jobject val) {
JavaField* field = (JavaField*)((*Classpath::fieldSlot)((JavaObject*)Field).IntVal.getZExtValue());
void** buf = (void**)alloca(sizeof(uint64));
void* _buf = (void*)buf;
NativeUtil::decapsulePrimitive(JavaThread::get()->isolate, buf, (JavaObject*)val, field->signature);
const AssessorDesc* ass = field->signature->funcs;
if (ass == AssessorDesc::dBool) {
(*field)((JavaObject*)obj, ((uint32*)_buf)[0]);
} else if (ass == AssessorDesc::dByte) {
(*field)((JavaObject*)obj, ((uint32*)_buf)[0]);
} else if (ass == AssessorDesc::dChar) {
(*field)((JavaObject*)obj, ((uint32*)_buf)[0]);
} else if (ass == AssessorDesc::dShort) {
(*field)((JavaObject*)obj, ((uint32*)_buf)[0]);
} else if (ass == AssessorDesc::dInt) {
(*field)((JavaObject*)obj, ((uint32*)_buf)[0]);
} else if (ass == AssessorDesc::dLong) {
(*field)((JavaObject*)obj, ((sint64*)_buf)[0]);
} else if (ass == AssessorDesc::dFloat) {
(*field)((JavaObject*)obj, ((float*)_buf)[0]);
} else if (ass == AssessorDesc::dDouble) {
(*field)((JavaObject*)obj, ((double*)_buf)[0]);
} else if (ass == AssessorDesc::dTab || ass == AssessorDesc::dRef) {
(*field)((JavaObject*)obj, ((JavaObject**)_buf)[0]);
} else {
JavaThread::get()->isolate->unknownError("should not be here");
}
}
JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setBoolean(
#ifdef NATIVE_JNI
JNIEnv *env,
#endif
jobject Field, jobject obj, jboolean val) {
JavaField* field = (JavaField*)((*Classpath::fieldSlot)((JavaObject*)Field).IntVal.getZExtValue());
const AssessorDesc* ass = field->signature->funcs;
if (ass != AssessorDesc::dBool)
JavaThread::get()->isolate->illegalArgumentException("");
(*field)((JavaObject*)obj, (uint32)val);
}
JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setByte(
#ifdef NATIVE_JNI
JNIEnv *env,
#endif
jobject Field, jobject obj, jbyte val) {
JavaField* field = (JavaField*)((*Classpath::fieldSlot)((JavaObject*)Field).IntVal.getZExtValue());
const AssessorDesc* ass = field->signature->funcs;
if (ass == AssessorDesc::dByte || ass == AssessorDesc::dShort || ass == AssessorDesc::dInt) {
(*field)((JavaObject*)obj, (uint32)val);
} else if (ass == AssessorDesc::dLong) {
(*field)((JavaObject*)obj, (sint64)val);
} else if (ass == AssessorDesc::dFloat) {
(*field)((JavaObject*)obj, (float)val);
} else if (ass == AssessorDesc::dDouble) {
(*field)((JavaObject*)obj, (double)val);
} else {
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) {
JavaField* field = (JavaField*)((*Classpath::fieldSlot)((JavaObject*)Field).IntVal.getZExtValue());
const AssessorDesc* ass = field->signature->funcs;
if (ass == AssessorDesc::dChar || ass == AssessorDesc::dInt) {
(*field)((JavaObject*)obj, (uint32)val);
} else if (ass == AssessorDesc::dLong) {
(*field)((JavaObject*)obj, (sint64)val);
} else if (ass == AssessorDesc::dFloat) {
(*field)((JavaObject*)obj, (float)val);
} else if (ass == AssessorDesc::dDouble) {
(*field)((JavaObject*)obj, (double)val);
} else {
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) {
JavaField* field = (JavaField*)((*Classpath::fieldSlot)((JavaObject*)Field).IntVal.getZExtValue());
const AssessorDesc* ass = field->signature->funcs;
if (ass == AssessorDesc::dShort || ass == AssessorDesc::dInt) {
(*field)((JavaObject*)obj, (uint32)val);
} else if (ass == AssessorDesc::dLong) {
(*field)((JavaObject*)obj, (sint64)val);
} else if (ass == AssessorDesc::dFloat) {
(*field)((JavaObject*)obj, (float)val);
} else if (ass == AssessorDesc::dDouble) {
(*field)((JavaObject*)obj, (double)val);
} else {
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) {
JavaField* field = (JavaField*)((*Classpath::fieldSlot)((JavaObject*)Field).IntVal.getZExtValue());
const AssessorDesc* ass = field->signature->funcs;
if (ass == AssessorDesc::dInt) {
(*field)((JavaObject*)obj, (uint32)val);
} else if (ass == AssessorDesc::dLong) {
(*field)((JavaObject*)obj, (sint64)val);
} else if (ass == AssessorDesc::dFloat) {
(*field)((JavaObject*)obj, (float)val);
} else if (ass == AssessorDesc::dDouble) {
(*field)((JavaObject*)obj, (double)val);
} else {
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) {
JavaField* field = (JavaField*)((*Classpath::fieldSlot)((JavaObject*)Field).IntVal.getZExtValue());
const AssessorDesc* ass = field->signature->funcs;
if (ass == AssessorDesc::dLong) {
(*field)((JavaObject*)obj, (sint64)val);
} else if (ass == AssessorDesc::dFloat) {
(*field)((JavaObject*)obj, (float)val);
} else if (ass == AssessorDesc::dDouble) {
(*field)((JavaObject*)obj, (double)val);
} else {
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) {
JavaField* field = (JavaField*)((*Classpath::fieldSlot)((JavaObject*)Field).IntVal.getZExtValue());
const AssessorDesc* ass = field->signature->funcs;
if (ass == AssessorDesc::dFloat) {
(*field)((JavaObject*)obj, (float)val);
} else if (ass == AssessorDesc::dDouble) {
(*field)((JavaObject*)obj, (double)val);
} else {
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) {
JavaField* field = (JavaField*)((*Classpath::fieldSlot)((JavaObject*)Field).IntVal.getZExtValue());
const AssessorDesc* ass = field->signature->funcs;
if (ass == AssessorDesc::dDouble) {
(*field)((JavaObject*)obj, (double)val);
} else {
JavaThread::get()->isolate->illegalArgumentException("");
}
}
}