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 <assert.h>
-
-#include "vm/types.h"
+#include <stdint.h>
#include "native/jni.h"
+#include "native/llni.h"
#include "native/native.h"
#include "native/include/java_lang_Boolean.h"
#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
};
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] <caller>
*/
- if (!access_check_member(c, f->flags, 0))
+ if (!access_check_field(f, 0))
return NULL;
}
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 */
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 */
* 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;
}
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;
if (!resolve_class_from_typedesc(desc, true, false, &ret))
return NULL;
- return (java_lang_Class *) ret;
+ return LLNI_classinfo_wrap(ret);
}
* 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;
}
* 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 */
switch (f->parseddesc->decltype) {
case PRIMITIVETYPE_BOOLEAN:
- return (s4) *((s4 *) addr);
+ return (int32_t) *((int32_t *) addr);
default:
exceptions_throw_illegalargumentexception();
return 0;
* 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 */
switch (f->parseddesc->decltype) {
case PRIMITIVETYPE_BYTE:
- return (s4) *((s4 *) addr);
+ return (int32_t) *((int32_t *) addr);
default:
exceptions_throw_illegalargumentexception();
return 0;
* 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 */
switch (f->parseddesc->decltype) {
case PRIMITIVETYPE_CHAR:
- return (s4) *((s4 *) addr);
+ return (int32_t) *((int32_t *) addr);
default:
exceptions_throw_illegalargumentexception();
return 0;
* 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 */
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;
* 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 */
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;
* 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 */
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;
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 */
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:
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 */
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:
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 */
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
switch (df->parseddesc->decltype) {
case PRIMITIVETYPE_BOOLEAN: {
- s4 val;
+ int32_t val;
/* determine the field to read the value */
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 */
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 */
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 */
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;
}
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();
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();
/* 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;
* 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 */
switch (f->parseddesc->decltype) {
case PRIMITIVETYPE_BOOLEAN:
- *((s4 *) addr) = value;
+ *((int32_t *) addr) = value;
break;
default:
exceptions_throw_illegalargumentexception();
* 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 */
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;
* 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 */
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;
* 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 */
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;
* 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 */
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;
* 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 */
switch (f->parseddesc->decltype) {
case PRIMITIVETYPE_LONG:
- *((s8 *) addr) = value;
+ *((int64_t *) addr) = value;
break;
case PRIMITIVETYPE_FLOAT:
*((float *) addr) = 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 */
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 */
*/
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;
}
+#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