X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fnative%2Fvm%2Fgnu%2Fjava_lang_reflect_Field.c;h=261fbfb03ff737c8b6424946c2bad3ebb82fe9ee;hb=9f859ad50d3d5d98c185d40b86b2179bc4dc9aeb;hp=b150381b4b9ff1d10ecf2a5fa1bd71d40fbacbef;hpb=3dc4427008d0961d0b0a0a010f98a265cd697035;p=cacao.git diff --git a/src/native/vm/gnu/java_lang_reflect_Field.c b/src/native/vm/gnu/java_lang_reflect_Field.c index b150381b4..261fbfb03 100644 --- a/src/native/vm/gnu/java_lang_reflect_Field.c +++ b/src/native/vm/gnu/java_lang_reflect_Field.c @@ -22,18 +22,16 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - $Id: java_lang_reflect_Field.c 7910 2007-05-16 08:02:52Z twisti $ - */ #include "config.h" #include - -#include "vm/types.h" +#include #include "native/jni.h" +#include "native/llni.h" #include "native/native.h" #include "native/include/java_lang_Boolean.h" @@ -50,44 +48,53 @@ #include "native/include/java_lang_reflect_Field.h" +#if defined(ENABLE_ANNOTATIONS) +#include "native/include/sun_reflect_ConstantPool.h" +#include "native/vm/reflect.h" +#endif + #include "vm/access.h" #include "vm/builtin.h" #include "vm/exceptions.h" #include "vm/global.h" #include "vm/initialize.h" +#include "vm/primitive.h" +#include "vm/resolve.h" #include "vm/stringlocal.h" #include "vm/jit/stacktrace.h" #include "vmcore/loader.h" -#include "vm/resolve.h" #include "vmcore/utf8.h" /* native methods implemented by this file ************************************/ static JNINativeMethod methods[] = { - { "getModifiersInternal", "()I", (void *) (ptrint) &Java_java_lang_reflect_Field_getModifiersInternal }, - { "getType", "()Ljava/lang/Class;", (void *) (ptrint) &Java_java_lang_reflect_Field_getType }, - { "get", "(Ljava/lang/Object;)Ljava/lang/Object;", (void *) (ptrint) &Java_java_lang_reflect_Field_get }, - { "getBoolean", "(Ljava/lang/Object;)Z", (void *) (ptrint) &Java_java_lang_reflect_Field_getBoolean }, - { "getByte", "(Ljava/lang/Object;)B", (void *) (ptrint) &Java_java_lang_reflect_Field_getByte }, - { "getChar", "(Ljava/lang/Object;)C", (void *) (ptrint) &Java_java_lang_reflect_Field_getChar }, - { "getShort", "(Ljava/lang/Object;)S", (void *) (ptrint) &Java_java_lang_reflect_Field_getShort }, - { "getInt", "(Ljava/lang/Object;)I", (void *) (ptrint) &Java_java_lang_reflect_Field_getInt }, - { "getLong", "(Ljava/lang/Object;)J", (void *) (ptrint) &Java_java_lang_reflect_Field_getLong }, - { "getFloat", "(Ljava/lang/Object;)F", (void *) (ptrint) &Java_java_lang_reflect_Field_getFloat }, - { "getDouble", "(Ljava/lang/Object;)D", (void *) (ptrint) &Java_java_lang_reflect_Field_getDouble }, - { "set", "(Ljava/lang/Object;Ljava/lang/Object;)V", (void *) (ptrint) &Java_java_lang_reflect_Field_set }, - { "setBoolean", "(Ljava/lang/Object;Z)V", (void *) (ptrint) &Java_java_lang_reflect_Field_setBoolean }, - { "setByte", "(Ljava/lang/Object;B)V", (void *) (ptrint) &Java_java_lang_reflect_Field_setByte }, - { "setChar", "(Ljava/lang/Object;C)V", (void *) (ptrint) &Java_java_lang_reflect_Field_setChar }, - { "setShort", "(Ljava/lang/Object;S)V", (void *) (ptrint) &Java_java_lang_reflect_Field_setShort }, - { "setInt", "(Ljava/lang/Object;I)V", (void *) (ptrint) &Java_java_lang_reflect_Field_setInt }, - { "setLong", "(Ljava/lang/Object;J)V", (void *) (ptrint) &Java_java_lang_reflect_Field_setLong }, - { "setFloat", "(Ljava/lang/Object;F)V", (void *) (ptrint) &Java_java_lang_reflect_Field_setFloat }, - { "setDouble", "(Ljava/lang/Object;D)V", (void *) (ptrint) &Java_java_lang_reflect_Field_setDouble }, - { "getSignature", "()Ljava/lang/String;", (void *) (ptrint) &Java_java_lang_reflect_Field_getSignature }, + { "getModifiersInternal", "()I", (void *) (intptr_t) &Java_java_lang_reflect_Field_getModifiersInternal }, + { "getType", "()Ljava/lang/Class;", (void *) (intptr_t) &Java_java_lang_reflect_Field_getType }, + { "get", "(Ljava/lang/Object;)Ljava/lang/Object;", (void *) (intptr_t) &Java_java_lang_reflect_Field_get }, + { "getBoolean", "(Ljava/lang/Object;)Z", (void *) (intptr_t) &Java_java_lang_reflect_Field_getBoolean }, + { "getByte", "(Ljava/lang/Object;)B", (void *) (intptr_t) &Java_java_lang_reflect_Field_getByte }, + { "getChar", "(Ljava/lang/Object;)C", (void *) (intptr_t) &Java_java_lang_reflect_Field_getChar }, + { "getShort", "(Ljava/lang/Object;)S", (void *) (intptr_t) &Java_java_lang_reflect_Field_getShort }, + { "getInt", "(Ljava/lang/Object;)I", (void *) (intptr_t) &Java_java_lang_reflect_Field_getInt }, + { "getLong", "(Ljava/lang/Object;)J", (void *) (intptr_t) &Java_java_lang_reflect_Field_getLong }, + { "getFloat", "(Ljava/lang/Object;)F", (void *) (intptr_t) &Java_java_lang_reflect_Field_getFloat }, + { "getDouble", "(Ljava/lang/Object;)D", (void *) (intptr_t) &Java_java_lang_reflect_Field_getDouble }, + { "set", "(Ljava/lang/Object;Ljava/lang/Object;)V", (void *) (intptr_t) &Java_java_lang_reflect_Field_set }, + { "setBoolean", "(Ljava/lang/Object;Z)V", (void *) (intptr_t) &Java_java_lang_reflect_Field_setBoolean }, + { "setByte", "(Ljava/lang/Object;B)V", (void *) (intptr_t) &Java_java_lang_reflect_Field_setByte }, + { "setChar", "(Ljava/lang/Object;C)V", (void *) (intptr_t) &Java_java_lang_reflect_Field_setChar }, + { "setShort", "(Ljava/lang/Object;S)V", (void *) (intptr_t) &Java_java_lang_reflect_Field_setShort }, + { "setInt", "(Ljava/lang/Object;I)V", (void *) (intptr_t) &Java_java_lang_reflect_Field_setInt }, + { "setLong", "(Ljava/lang/Object;J)V", (void *) (intptr_t) &Java_java_lang_reflect_Field_setLong }, + { "setFloat", "(Ljava/lang/Object;F)V", (void *) (intptr_t) &Java_java_lang_reflect_Field_setFloat }, + { "setDouble", "(Ljava/lang/Object;D)V", (void *) (intptr_t) &Java_java_lang_reflect_Field_setDouble }, + { "getSignature", "()Ljava/lang/String;", (void *) (intptr_t) &Java_java_lang_reflect_Field_getSignature }, +#if defined(ENABLE_ANNOTATIONS) + { "declaredAnnotations", "()Ljava/util/Map;", (void *) (intptr_t) &Java_java_lang_reflect_Field_declaredAnnotations }, +#endif }; @@ -124,22 +131,26 @@ void _Jv_java_lang_reflect_Field_init(void) static void *cacao_get_field_address(java_lang_reflect_Field *this, java_lang_Object *o) { - classinfo *c; - fieldinfo *f; + classinfo *c; + fieldinfo *f; + int32_t slot; + int32_t flag; - c = (classinfo *) this->declaringClass; - f = &c->fields[this->slot]; + LLNI_field_get_cls(this, clazz, c); + LLNI_field_get_val(this, slot , slot); + f = &c->fields[slot]; /* check field access */ /* check if we should bypass security checks (AccessibleObject) */ - if (this->flag == false) { + LLNI_field_get_val(this, flag, flag); + if (flag == false) { /* this function is always called like this: java.lang.reflect.Field.xxx (Native Method) [0] */ - if (!access_check_member(c, f->flags, 0)) + if (!access_check_field(f, 0)) return NULL; } @@ -152,9 +163,9 @@ static void *cacao_get_field_address(java_lang_reflect_Field *this, if (!initialize_class(c)) return NULL; - /* return value address */ + /* return value pointer */ - return &(f->value); + return f->value; } else { /* obj is required for not-static fields */ @@ -164,8 +175,8 @@ static void *cacao_get_field_address(java_lang_reflect_Field *this, return NULL; } - if (builtin_instanceof((java_objectheader *) o, c)) - return (void *) ((ptrint) o + f->offset); + if (builtin_instanceof((java_handle_t *) o, c)) + return (void *) (((intptr_t) o) + f->offset); } /* exception path */ @@ -181,13 +192,15 @@ static void *cacao_get_field_address(java_lang_reflect_Field *this, * Method: getModifiersInternal * Signature: ()I */ -JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getModifiersInternal(JNIEnv *env, java_lang_reflect_Field *this) +JNIEXPORT int32_t JNICALL Java_java_lang_reflect_Field_getModifiersInternal(JNIEnv *env, java_lang_reflect_Field *this) { classinfo *c; fieldinfo *f; + int32_t slot; - c = (classinfo *) this->declaringClass; - f = &(c->fields[this->slot]); + LLNI_field_get_cls(this, clazz, c); + LLNI_field_get_val(this, slot , slot); + f = &(c->fields[slot]); return f->flags; } @@ -203,9 +216,11 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_reflect_Field_getType(JNIEnv * classinfo *c; typedesc *desc; classinfo *ret; + int32_t slot; - c = (classinfo *) this->declaringClass; - desc = c->fields[this->slot].parseddesc; + LLNI_field_get_cls(this, clazz, c); + LLNI_field_get_val(this, slot , slot); + desc = c->fields[slot].parseddesc; if (desc == NULL) return NULL; @@ -213,7 +228,7 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_reflect_Field_getType(JNIEnv * if (!resolve_class_from_typedesc(desc, true, false, &ret)) return NULL; - return (java_lang_Class *) ret; + return LLNI_classinfo_wrap(ret); } @@ -222,126 +237,55 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_reflect_Field_getType(JNIEnv * * Method: get * Signature: (Ljava/lang/Object;)Ljava/lang/Object; */ -JNIEXPORT java_lang_Object* JNICALL Java_java_lang_reflect_Field_get(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o) +JNIEXPORT java_lang_Object* JNICALL Java_java_lang_reflect_Field_get(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *object) { classinfo *c; fieldinfo *f; void *addr; + int32_t slot; + imm_union value; + java_handle_t *o; - c = (classinfo *) this->declaringClass; - f = &c->fields[this->slot]; + LLNI_field_get_cls(this, clazz, c); + LLNI_field_get_val(this, slot , slot); + f = &c->fields[slot]; /* get address of the source field value */ - if ((addr = cacao_get_field_address(this, o)) == NULL) + if ((addr = cacao_get_field_address(this, object)) == NULL) return NULL; switch (f->parseddesc->decltype) { - case PRIMITIVETYPE_BOOLEAN: { - java_lang_Boolean *bo; - - /* create wrapping class */ - - if (!(bo = (java_lang_Boolean *) builtin_new(class_java_lang_Boolean))) - return NULL; - - /* set the object value */ - - bo->value = *((s4 *) addr); - - /* return the wrapped object */ - - return (java_lang_Object *) bo; - } - - case PRIMITIVETYPE_BYTE: { - java_lang_Byte *bo; - - if (!(bo = (java_lang_Byte *) builtin_new(class_java_lang_Byte))) - return NULL; - - bo->value = *((s4 *) addr); - - return (java_lang_Object *) bo; - } - - case PRIMITIVETYPE_CHAR: { - java_lang_Character *co; - - if (!(co = (java_lang_Character *) builtin_new(class_java_lang_Character))) - return NULL; - - co->value = *((s4 *) addr); - - return (java_lang_Object *) co; - } - - case PRIMITIVETYPE_SHORT: { - java_lang_Short *so; - - if (!(so = (java_lang_Short *) builtin_new(class_java_lang_Short))) - return NULL; - - so->value = (s4) *((s4 *) addr); - - return (java_lang_Object *) so; - } - - case PRIMITIVETYPE_INT: { - java_lang_Integer *io; - - if (!(io = (java_lang_Integer *) builtin_new(class_java_lang_Integer))) - return NULL; - - io->value = *((s4 *) addr); - - return (java_lang_Object *) io; - } - - case PRIMITIVETYPE_LONG: { - java_lang_Long *lo; - - if (!(lo = (java_lang_Long *) builtin_new(class_java_lang_Long))) - return NULL; - - lo->value = *((s8 *) addr); - - return (java_lang_Object *) lo; - } - - case PRIMITIVETYPE_FLOAT: { - java_lang_Float *fo; - - if (!(fo = (java_lang_Float *) builtin_new(class_java_lang_Float))) - return NULL; - - fo->value = *((float *) addr); - - return (java_lang_Object *) fo; - } - - case PRIMITIVETYPE_DOUBLE: { - java_lang_Double *_do; + case PRIMITIVETYPE_BOOLEAN: + case PRIMITIVETYPE_BYTE: + case PRIMITIVETYPE_CHAR: + case PRIMITIVETYPE_SHORT: + case PRIMITIVETYPE_INT: + value.i = *((int32_t *) addr); + break; - if (!(_do = (java_lang_Double *) builtin_new(class_java_lang_Double))) - return NULL; + case PRIMITIVETYPE_LONG: + value.l = *((int64_t *) addr); + break; - _do->value = *((double *) addr); + case PRIMITIVETYPE_FLOAT: + value.f = *((float *) addr); + break; - return (java_lang_Object *) _do; - } + case PRIMITIVETYPE_DOUBLE: + value.d = *((double *) addr); + break; case TYPE_ADR: - return (java_lang_Object *) *((java_objectheader **) addr); +#warning this whole thing needs to be inside a critical section! + return (java_lang_Object *) *((java_handle_t **) addr); } - /* this must not happen */ - - assert(0); + /* Now box the primitive types. */ - /* keep compiler happy */ + o = primitive_box(f->parseddesc->decltype, value); - return NULL; + return (java_lang_Object *) o; } @@ -350,16 +294,18 @@ JNIEXPORT java_lang_Object* JNICALL Java_java_lang_reflect_Field_get(JNIEnv *env * Method: getBoolean * Signature: (Ljava/lang/Object;)Z */ -JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getBoolean(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o) +JNIEXPORT int32_t JNICALL Java_java_lang_reflect_Field_getBoolean(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o) { classinfo *c; fieldinfo *f; void *addr; + int32_t slot; /* get the class and the field */ - c = (classinfo *) this->declaringClass; - f = &c->fields[this->slot]; + LLNI_field_get_cls(this, clazz, c); + LLNI_field_get_val(this, slot , slot); + f = &c->fields[slot]; /* get the address of the field with an internal helper */ @@ -370,7 +316,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getBoolean(JNIEnv *env, java_l switch (f->parseddesc->decltype) { case PRIMITIVETYPE_BOOLEAN: - return (s4) *((s4 *) addr); + return (int32_t) *((int32_t *) addr); default: exceptions_throw_illegalargumentexception(); return 0; @@ -383,16 +329,18 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getBoolean(JNIEnv *env, java_l * Method: getByte * Signature: (Ljava/lang/Object;)B */ -JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getByte(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o) +JNIEXPORT int32_t JNICALL Java_java_lang_reflect_Field_getByte(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o) { classinfo *c; fieldinfo *f; void *addr; + int32_t slot; /* get the class and the field */ - c = (classinfo *) this->declaringClass; - f = &c->fields[this->slot]; + LLNI_field_get_cls(this, clazz, c); + LLNI_field_get_val(this, slot , slot); + f = &c->fields[slot]; /* get the address of the field with an internal helper */ @@ -403,7 +351,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getByte(JNIEnv *env, java_lang switch (f->parseddesc->decltype) { case PRIMITIVETYPE_BYTE: - return (s4) *((s4 *) addr); + return (int32_t) *((int32_t *) addr); default: exceptions_throw_illegalargumentexception(); return 0; @@ -416,16 +364,18 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getByte(JNIEnv *env, java_lang * Method: getChar * Signature: (Ljava/lang/Object;)C */ -JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getChar(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o) +JNIEXPORT int32_t JNICALL Java_java_lang_reflect_Field_getChar(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o) { classinfo *c; fieldinfo *f; void *addr; + int32_t slot; /* get the class and the field */ - c = (classinfo *) this->declaringClass; - f = &c->fields[this->slot]; + LLNI_field_get_cls(this, clazz, c); + LLNI_field_get_val(this, slot , slot); + f = &c->fields[slot]; /* get the address of the field with an internal helper */ @@ -436,7 +386,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getChar(JNIEnv *env, java_lang switch (f->parseddesc->decltype) { case PRIMITIVETYPE_CHAR: - return (s4) *((s4 *) addr); + return (int32_t) *((int32_t *) addr); default: exceptions_throw_illegalargumentexception(); return 0; @@ -449,16 +399,18 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getChar(JNIEnv *env, java_lang * Method: getShort * Signature: (Ljava/lang/Object;)S */ -JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getShort(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o) +JNIEXPORT int32_t JNICALL Java_java_lang_reflect_Field_getShort(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o) { classinfo *c; fieldinfo *f; void *addr; + int32_t slot; /* get the class and the field */ - c = (classinfo *) this->declaringClass; - f = &c->fields[this->slot]; + LLNI_field_get_cls(this, clazz, c); + LLNI_field_get_val(this, slot , slot); + f = &c->fields[slot]; /* get the address of the field with an internal helper */ @@ -470,7 +422,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getShort(JNIEnv *env, java_lan switch (f->parseddesc->decltype) { case PRIMITIVETYPE_BYTE: case PRIMITIVETYPE_SHORT: - return (s4) *((s4 *) addr); + return (int32_t) *((int32_t *) addr); default: exceptions_throw_illegalargumentexception(); return 0; @@ -483,16 +435,18 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getShort(JNIEnv *env, java_lan * Method: getInt * Signature: (Ljava/lang/Object;)I */ -JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getInt(JNIEnv *env , java_lang_reflect_Field *this, java_lang_Object *o) +JNIEXPORT int32_t JNICALL Java_java_lang_reflect_Field_getInt(JNIEnv *env , java_lang_reflect_Field *this, java_lang_Object *o) { classinfo *c; fieldinfo *f; void *addr; + int32_t slot; /* get the class and the field */ - c = (classinfo *) this->declaringClass; - f = &c->fields[this->slot]; + LLNI_field_get_cls(this, clazz, c); + LLNI_field_get_val(this, slot , slot); + f = &c->fields[slot]; /* get the address of the field with an internal helper */ @@ -506,7 +460,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getInt(JNIEnv *env , java_lang case PRIMITIVETYPE_CHAR: case PRIMITIVETYPE_SHORT: case PRIMITIVETYPE_INT: - return (s4) *((s4 *) addr); + return (int32_t) *((int32_t *) addr); default: exceptions_throw_illegalargumentexception(); return 0; @@ -519,16 +473,18 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getInt(JNIEnv *env , java_lang * Method: getLong * Signature: (Ljava/lang/Object;)J */ -JNIEXPORT s8 JNICALL Java_java_lang_reflect_Field_getLong(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o) +JNIEXPORT int64_t JNICALL Java_java_lang_reflect_Field_getLong(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o) { classinfo *c; fieldinfo *f; void *addr; + int32_t slot; /* get the class and the field */ - c = (classinfo *) this->declaringClass; - f = &c->fields[this->slot]; + LLNI_field_get_cls(this, clazz, c); + LLNI_field_get_val(this, slot , slot); + f = &c->fields[slot]; /* get the address of the field with an internal helper */ @@ -542,9 +498,9 @@ JNIEXPORT s8 JNICALL Java_java_lang_reflect_Field_getLong(JNIEnv *env, java_lang case PRIMITIVETYPE_CHAR: case PRIMITIVETYPE_SHORT: case PRIMITIVETYPE_INT: - return (s8) *((s4 *) addr); + return (int64_t) *((int32_t *) addr); case PRIMITIVETYPE_LONG: - return (s8) *((s8 *) addr); + return (int64_t) *((int64_t *) addr); default: exceptions_throw_illegalargumentexception(); return 0; @@ -562,11 +518,13 @@ JNIEXPORT float JNICALL Java_java_lang_reflect_Field_getFloat(JNIEnv *env, java_ classinfo *c; fieldinfo *f; void *addr; + int32_t slot; /* get the class and the field */ - c = (classinfo *) this->declaringClass; - f = &c->fields[this->slot]; + LLNI_field_get_cls(this, clazz, c); + LLNI_field_get_val(this, slot , slot); + f = &c->fields[slot]; /* get the address of the field with an internal helper */ @@ -580,9 +538,9 @@ JNIEXPORT float JNICALL Java_java_lang_reflect_Field_getFloat(JNIEnv *env, java_ case PRIMITIVETYPE_CHAR: case PRIMITIVETYPE_SHORT: case PRIMITIVETYPE_INT: - return (float) *((s4 *) addr); + return (float) *((int32_t *) addr); case PRIMITIVETYPE_LONG: - return (float) *((s8 *) addr); + return (float) *((int64_t *) addr); case PRIMITIVETYPE_FLOAT: return (float) *((float *) addr); default: @@ -602,11 +560,13 @@ JNIEXPORT double JNICALL Java_java_lang_reflect_Field_getDouble(JNIEnv *env , ja classinfo *c; fieldinfo *f; void *addr; + int32_t slot; /* get the class and the field */ - c = (classinfo *) this->declaringClass; - f = &c->fields[this->slot]; + LLNI_field_get_cls(this, clazz, c); + LLNI_field_get_val(this, slot , slot); + f = &c->fields[slot]; /* get the address of the field with an internal helper */ @@ -620,9 +580,9 @@ JNIEXPORT double JNICALL Java_java_lang_reflect_Field_getDouble(JNIEnv *env , ja case PRIMITIVETYPE_CHAR: case PRIMITIVETYPE_SHORT: case PRIMITIVETYPE_INT: - return (double) *((s4 *) addr); + return (double) *((int32_t *) addr); case PRIMITIVETYPE_LONG: - return (double) *((s8 *) addr); + return (double) *((int64_t *) addr); case PRIMITIVETYPE_FLOAT: return (double) *((float *) addr); case PRIMITIVETYPE_DOUBLE: @@ -646,11 +606,13 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(JNIEnv *env, java_lang_r fieldinfo *sf; fieldinfo *df; void *faddr; + int32_t slot; /* get the class and the field */ - dc = (classinfo *) this->declaringClass; - df = &dc->fields[this->slot]; + LLNI_field_get_cls(this, clazz, dc); + LLNI_field_get_val(this, slot , slot); + df = &dc->fields[slot]; /* get the address of the destination field */ @@ -662,7 +624,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(JNIEnv *env, java_lang_r if (value == NULL) sc = NULL; else - sc = value->header.vftbl->class; + LLNI_class_get(value, sc); /* The fieldid is used to set the new value, for primitive types the value has to be retrieved from the wrapping @@ -670,7 +632,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(JNIEnv *env, java_lang_r switch (df->parseddesc->decltype) { case PRIMITIVETYPE_BOOLEAN: { - s4 val; + int32_t val; /* determine the field to read the value */ @@ -679,57 +641,57 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(JNIEnv *env, java_lang_r switch (sf->parseddesc->decltype) { case PRIMITIVETYPE_BOOLEAN: - val = ((java_lang_Boolean *) value)->value; + LLNI_field_get_val((java_lang_Boolean *) value, value, val); break; default: exceptions_throw_illegalargumentexception(); return; } - *((s4 *) faddr) = val; + *((int32_t *) faddr) = val; return; } case PRIMITIVETYPE_BYTE: { - s4 val; + int32_t val; if ((sc == NULL) || !(sf = class_findfield(sc, utf_value, utf_B))) break; switch (sf->parseddesc->decltype) { case PRIMITIVETYPE_BYTE: - val = ((java_lang_Byte *) value)->value; + LLNI_field_get_val((java_lang_Byte *) value, value, val); break; default: exceptions_throw_illegalargumentexception(); return; } - *((s4 *) faddr) = val; + *((int32_t *) faddr) = val; return; } case PRIMITIVETYPE_CHAR: { - s4 val; + int32_t val; if ((sc == NULL) || !(sf = class_findfield(sc, utf_value, utf_C))) break; switch (sf->parseddesc->decltype) { case PRIMITIVETYPE_CHAR: - val = ((java_lang_Character *) value)->value; + LLNI_field_get_val((java_lang_Character *) value, value, val); break; default: exceptions_throw_illegalargumentexception(); return; } - *((s4 *) faddr) = val; + *((int32_t *) faddr) = val; return; } case PRIMITIVETYPE_SHORT: { - s4 val; + int32_t val; /* get field only by name, it can be one of B, S */ @@ -738,22 +700,22 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(JNIEnv *env, java_lang_r switch (sf->parseddesc->decltype) { case PRIMITIVETYPE_BYTE: - val = ((java_lang_Byte *) value)->value; + LLNI_field_get_val((java_lang_Byte *) value, value, val); break; case PRIMITIVETYPE_SHORT: - val = ((java_lang_Short *) value)->value; + LLNI_field_get_val((java_lang_Short *) value, value, val); break; default: exceptions_throw_illegalargumentexception(); return; } - *((s4 *) faddr) = val; + *((int32_t *) faddr) = val; return; } case PRIMITIVETYPE_INT: { - s4 val; + int32_t val; /* get field only by name, it can be one of B, S, C, I */ @@ -762,28 +724,28 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(JNIEnv *env, java_lang_r switch (sf->parseddesc->decltype) { case PRIMITIVETYPE_BYTE: - val = ((java_lang_Byte *) value)->value; + LLNI_field_get_val((java_lang_Byte *) value, value, val); break; case PRIMITIVETYPE_CHAR: - val = ((java_lang_Character *) value)->value; + LLNI_field_get_val((java_lang_Character *) value, value, val); break; case PRIMITIVETYPE_SHORT: - val = ((java_lang_Short *) value)->value; + LLNI_field_get_val((java_lang_Short *) value, value, val); break; case PRIMITIVETYPE_INT: - val = ((java_lang_Integer *) value)->value; + LLNI_field_get_val((java_lang_Integer *) value, value, val); break; default: exceptions_throw_illegalargumentexception(); return; } - *((s4 *) faddr) = val; + *((int32_t *) faddr) = val; return; } case PRIMITIVETYPE_LONG: { - s8 val; + int64_t val; /* get field only by name, it can be one of B, S, C, I, J */ @@ -792,26 +754,26 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(JNIEnv *env, java_lang_r switch (sf->parseddesc->decltype) { case PRIMITIVETYPE_BYTE: - val = ((java_lang_Byte *) value)->value; + LLNI_field_get_val((java_lang_Byte *) value, value, val); break; case PRIMITIVETYPE_CHAR: - val = ((java_lang_Character *) value)->value; + LLNI_field_get_val((java_lang_Character *) value, value, val); break; case PRIMITIVETYPE_SHORT: - val = ((java_lang_Short *) value)->value; + LLNI_field_get_val((java_lang_Short *) value, value, val); break; case PRIMITIVETYPE_INT: - val = ((java_lang_Integer *) value)->value; + LLNI_field_get_val((java_lang_Integer *) value, value, val); break; case PRIMITIVETYPE_LONG: - val = ((java_lang_Long *) value)->value; + LLNI_field_get_val((java_lang_Long *) value, value, val); break; default: exceptions_throw_illegalargumentexception(); return; } - *((s8 *) faddr) = val; + *((int64_t *) faddr) = val; return; } @@ -825,22 +787,22 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(JNIEnv *env, java_lang_r switch (sf->parseddesc->decltype) { case PRIMITIVETYPE_BYTE: - val = ((java_lang_Byte *) value)->value; + LLNI_field_get_val((java_lang_Byte *) value, value, val); break; case PRIMITIVETYPE_CHAR: - val = ((java_lang_Character *) value)->value; + LLNI_field_get_val((java_lang_Character *) value, value, val); break; case PRIMITIVETYPE_SHORT: - val = ((java_lang_Short *) value)->value; + LLNI_field_get_val((java_lang_Short *) value, value, val); break; case PRIMITIVETYPE_INT: - val = ((java_lang_Integer *) value)->value; + LLNI_field_get_val((java_lang_Integer *) value, value, val); break; case PRIMITIVETYPE_LONG: - val = ((java_lang_Long *) value)->value; + LLNI_field_get_val((java_lang_Long *) value, value, val); break; case PRIMITIVETYPE_FLOAT: - val = ((java_lang_Float *) value)->value; + LLNI_field_get_val((java_lang_Float *) value, value, val); break; default: exceptions_throw_illegalargumentexception(); @@ -861,25 +823,25 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(JNIEnv *env, java_lang_r switch (sf->parseddesc->decltype) { case PRIMITIVETYPE_BYTE: - val = ((java_lang_Byte *) value)->value; + LLNI_field_get_val((java_lang_Byte *) value, value, val); break; case PRIMITIVETYPE_CHAR: - val = ((java_lang_Character *) value)->value; + LLNI_field_get_val((java_lang_Character *) value, value, val); break; case PRIMITIVETYPE_SHORT: - val = ((java_lang_Short *) value)->value; + LLNI_field_get_val((java_lang_Short *) value, value, val); break; case PRIMITIVETYPE_INT: - val = ((java_lang_Integer *) value)->value; + LLNI_field_get_val((java_lang_Integer *) value, value, val); break; case PRIMITIVETYPE_LONG: - val = ((java_lang_Long *) value)->value; + LLNI_field_get_val((java_lang_Long *) value, value, val); break; case PRIMITIVETYPE_FLOAT: - val = ((java_lang_Float *) value)->value; + LLNI_field_get_val((java_lang_Float *) value, value, val); break; case PRIMITIVETYPE_DOUBLE: - val = ((java_lang_Double *) value)->value; + LLNI_field_get_val((java_lang_Double *) value, value, val); break; default: exceptions_throw_illegalargumentexception(); @@ -894,7 +856,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(JNIEnv *env, java_lang_r /* check if value is an instance of the destination class */ /* XXX TODO */ - /* if (!builtin_instanceof((java_objectheader *) value, df->class)) */ + /* if (!builtin_instanceof((java_handle_t *) value, df->class)) */ /* break; */ *((java_lang_Object **) faddr) = value; @@ -912,16 +874,18 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set(JNIEnv *env, java_lang_r * Method: setBoolean * Signature: (Ljava/lang/Object;Z)V */ -JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setBoolean(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, s4 value) +JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setBoolean(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, int32_t value) { classinfo *c; fieldinfo *f; void *addr; + int32_t slot; /* get the class and the field */ - c = (classinfo *) this->declaringClass; - f = &c->fields[this->slot]; + LLNI_field_get_cls(this, clazz, c); + LLNI_field_get_val(this, slot , slot); + f = &c->fields[slot]; /* get the address of the field with an internal helper */ @@ -932,7 +896,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setBoolean(JNIEnv *env, java switch (f->parseddesc->decltype) { case PRIMITIVETYPE_BOOLEAN: - *((s4 *) addr) = value; + *((int32_t *) addr) = value; break; default: exceptions_throw_illegalargumentexception(); @@ -947,16 +911,18 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setBoolean(JNIEnv *env, java * Method: setByte * Signature: (Ljava/lang/Object;B)V */ -JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setByte(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, s4 value) +JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setByte(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, int32_t value) { classinfo *c; fieldinfo *f; void *addr; + int32_t slot; /* get the class and the field */ - c = (classinfo *) this->declaringClass; - f = &c->fields[this->slot]; + LLNI_field_get_cls(this, clazz, c); + LLNI_field_get_val(this, slot , slot); + f = &c->fields[slot]; /* get the address of the field with an internal helper */ @@ -969,10 +935,10 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setByte(JNIEnv *env, java_la case PRIMITIVETYPE_BYTE: case PRIMITIVETYPE_SHORT: case PRIMITIVETYPE_INT: - *((s4 *) addr) = value; + *((int32_t *) addr) = value; break; case PRIMITIVETYPE_LONG: - *((s8 *) addr) = value; + *((int64_t *) addr) = value; break; case PRIMITIVETYPE_FLOAT: *((float *) addr) = value; @@ -993,16 +959,18 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setByte(JNIEnv *env, java_la * Method: setChar * Signature: (Ljava/lang/Object;C)V */ -JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setChar(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, s4 value) +JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setChar(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, int32_t value) { classinfo *c; fieldinfo *f; void *addr; + int32_t slot; /* get the class and the field */ - c = (classinfo *) this->declaringClass; - f = &c->fields[this->slot]; + LLNI_field_get_cls(this, clazz, c); + LLNI_field_get_val(this, slot , slot); + f = &c->fields[slot]; /* get the address of the field with an internal helper */ @@ -1014,10 +982,10 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setChar(JNIEnv *env, java_la switch (f->parseddesc->decltype) { case PRIMITIVETYPE_CHAR: case PRIMITIVETYPE_INT: - *((s4 *) addr) = value; + *((int32_t *) addr) = value; break; case PRIMITIVETYPE_LONG: - *((s8 *) addr) = value; + *((int64_t *) addr) = value; break; case PRIMITIVETYPE_FLOAT: *((float *) addr) = value; @@ -1038,16 +1006,18 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setChar(JNIEnv *env, java_la * Method: setShort * Signature: (Ljava/lang/Object;S)V */ -JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setShort(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, s4 value) +JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setShort(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, int32_t value) { classinfo *c; fieldinfo *f; void *addr; + int32_t slot; /* get the class and the field */ - c = (classinfo *) this->declaringClass; - f = &c->fields[this->slot]; + LLNI_field_get_cls(this, clazz, c); + LLNI_field_get_val(this, slot , slot); + f = &c->fields[slot]; /* get the address of the field with an internal helper */ @@ -1059,10 +1029,10 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setShort(JNIEnv *env, java_l switch (f->parseddesc->decltype) { case PRIMITIVETYPE_SHORT: case PRIMITIVETYPE_INT: - *((s4 *) addr) = value; + *((int32_t *) addr) = value; break; case PRIMITIVETYPE_LONG: - *((s8 *) addr) = value; + *((int64_t *) addr) = value; break; case PRIMITIVETYPE_FLOAT: *((float *) addr) = value; @@ -1083,16 +1053,18 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setShort(JNIEnv *env, java_l * Method: setInt * Signature: (Ljava/lang/Object;I)V */ -JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setInt(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, s4 value) +JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setInt(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, int32_t value) { classinfo *c; fieldinfo *f; void *addr; + int32_t slot; /* get the class and the field */ - c = (classinfo *) this->declaringClass; - f = &c->fields[this->slot]; + LLNI_field_get_cls(this, clazz, c); + LLNI_field_get_val(this, slot , slot); + f = &c->fields[slot]; /* get the address of the field with an internal helper */ @@ -1103,10 +1075,10 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setInt(JNIEnv *env, java_lan switch (f->parseddesc->decltype) { case PRIMITIVETYPE_INT: - *((s4 *) addr) = value; + *((int32_t *) addr) = value; break; case PRIMITIVETYPE_LONG: - *((s8 *) addr) = value; + *((int64_t *) addr) = value; break; case PRIMITIVETYPE_FLOAT: *((float *) addr) = value; @@ -1127,16 +1099,18 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setInt(JNIEnv *env, java_lan * Method: setLong * Signature: (Ljava/lang/Object;J)V */ -JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setLong(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, s8 value) +JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setLong(JNIEnv *env, java_lang_reflect_Field *this, java_lang_Object *o, int64_t value) { classinfo *c; fieldinfo *f; void *addr; + int32_t slot; /* get the class and the field */ - c = (classinfo *) this->declaringClass; - f = &c->fields[this->slot]; + LLNI_field_get_cls(this, clazz, c); + LLNI_field_get_val(this, slot , slot); + f = &c->fields[slot]; /* get the address of the field with an internal helper */ @@ -1147,7 +1121,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setLong(JNIEnv *env, java_la switch (f->parseddesc->decltype) { case PRIMITIVETYPE_LONG: - *((s8 *) addr) = value; + *((int64_t *) addr) = value; break; case PRIMITIVETYPE_FLOAT: *((float *) addr) = value; @@ -1173,11 +1147,13 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setFloat(JNIEnv *env, java_l classinfo *c; fieldinfo *f; void *addr; + int32_t slot; /* get the class and the field */ - c = (classinfo *) this->declaringClass; - f = &c->fields[this->slot]; + LLNI_field_get_cls(this, clazz, c); + LLNI_field_get_val(this, slot , slot); + f = &c->fields[slot]; /* get the address of the field with an internal helper */ @@ -1211,11 +1187,13 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setDouble(JNIEnv *env, java_ classinfo *c; fieldinfo *f; void *addr; + int32_t slot; /* get the class and the field */ - c = (classinfo *) this->declaringClass; - f = &c->fields[this->slot]; + LLNI_field_get_cls(this, clazz, c); + LLNI_field_get_val(this, slot , slot); + f = &c->fields[slot]; /* get the address of the field with an internal helper */ @@ -1243,14 +1221,16 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setDouble(JNIEnv *env, java_ */ JNIEXPORT java_lang_String* JNICALL Java_java_lang_reflect_Field_getSignature(JNIEnv *env, java_lang_reflect_Field* this) { - classinfo *c; - fieldinfo *f; - java_objectheader *o; + classinfo *c; + fieldinfo *f; + java_handle_t *o; + int32_t slot; /* get the class and the field */ - c = (classinfo *) this->declaringClass; - f = &c->fields[this->slot]; + LLNI_field_get_cls(this, clazz, c); + LLNI_field_get_val(this, slot , slot); + f = &c->fields[slot]; if (f->signature == NULL) return NULL; @@ -1263,6 +1243,37 @@ JNIEXPORT java_lang_String* JNICALL Java_java_lang_reflect_Field_getSignature(JN } +#if defined(ENABLE_ANNOTATIONS) +/* + * Class: java/lang/reflect/Field + * Method: declaredAnnotations + * Signature: ()Ljava/util/Map; + */ +JNIEXPORT struct java_util_Map* JNICALL Java_java_lang_reflect_Field_declaredAnnotations(JNIEnv *env, java_lang_reflect_Field *this) +{ + java_handle_t *o = (java_handle_t*)this; + struct java_util_Map *declaredAnnotations = NULL; + java_handle_bytearray_t *annotations = NULL; + java_lang_Class *declaringClass = NULL; + classinfo *referer = NULL; + + LLNI_field_get_ref(this, declaredAnnotations, declaredAnnotations); + + if (declaredAnnotations == NULL) { + LLNI_field_get_val(this, annotations, annotations); + LLNI_field_get_ref(this, clazz, declaringClass); + LLNI_class_get(this, referer); + + declaredAnnotations = reflect_get_declaredannotatios(annotations, declaringClass, referer); + + LLNI_field_set_ref(this, declaredAnnotations, declaredAnnotations); + } + + return declaredAnnotations; +} +#endif + + /* * These are local overrides for various environment variables in Emacs. * Please do not remove this and leave it at the end of the file, where