1 // java-field.h - Header file for fieldID instances. -*- c++ -*-
3 /* Copyright (C) 1998, 1999 Cygnus Solutions
5 This file is part of libgcj.
7 This software is copyrighted work licensed under the terms of the
8 Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
11 #ifndef __JAVA_FIELD_H__
12 #define __JAVA_FIELD_H__
14 #include <java/lang/Class.h>
15 #include <java/lang/reflect/Field.h>
17 #define _Jv_FIELD_UNRESOLVED_FLAG 0x8000
18 #define _Jv_FIELD_CONSTANT_VALUE 0x4000
22 #ifndef COMPACT_FIELDS
23 struct _Jv_Utf8Const* name;
26 /* The type of the field, if isResolved().
27 If !isResolved(): The fields's signature as a (Utf8Const*). */
33 short nameIndex; /* ofsfet in class's name table */
35 _Jv_ushort bsize; /* not really needed ... */
39 int boffset; /* offset in bytes for instance field */
40 void* addr; /* address of static field */
44 jboolean isResolved ()
45 { return ! (flags & _Jv_FIELD_UNRESOLVED_FLAG); }
49 int getOffset () { return u.boffset; }
51 jobject getObjectField (jobject obj)
52 { return *(jobject *)((char *)obj + getOffset ()); }
54 jfieldID getNextInstanceField () { return this + 1; }
56 jboolean isRef () { return ! isResolved () || ! type->isPrimitive (); }
58 // FIXME - may need to mask off internal flags.
59 int getModifiers() { return flags; }
62 _Jv_Utf8Const * getNameUtf8Const (jclass cls)
63 { return clas->fieldNames + nameIndex; }
65 _Jv_Utf8Const * getNameUtf8Const (jclass) { return name; }
72 _Jv_GetStaticByteField (jclass, _Jv_Field* field)
74 return * (jbyte *) field->u.addr;
78 _Jv_GetStaticShortField (jclass, _Jv_Field* field)
80 return * (jshort *) field->u.addr;
84 _Jv_GetStaticIntField (jclass, _Jv_Field* field)
86 return * (jint *) field->u.addr;
90 _Jv_GetStaticLongField (jclass, _Jv_Field* field)
92 return * (jlong *) field->u.addr;
96 _Jv_GetObjectField (jobject obj, _Jv_Field* field)
98 return field->getObjectField (obj);
102 _Jv_GetByteField (jobject obj, _Jv_Field* field)
104 return * (jbyte *) ((char*) obj + field->getOffset ());
108 _Jv_GetShortField (jobject obj, _Jv_Field* field)
110 return * (jshort *) ((char*) obj + field->getOffset ());
113 _Jv_GetIntField (jobject obj, _Jv_Field* field)
115 return * (jint *) ((char*) obj + field->getOffset ());
118 _Jv_GetLongField (jobject obj, _Jv_Field* field)
120 return * (jlong *) ((char*) obj + field->getOffset ());
123 extern inline jfieldID
124 _Jv_FromReflectedField (java::lang::reflect::Field *field)
126 return (jfieldID) ((char *) field->declaringClass->fields + field->offset);
130 #ifdef __JAVA_CNI_H__
131 extern inline jfieldID
132 JvGetFirstInstanceField (jclass klass)
134 return &(klass->fields[klass->static_field_count]);
138 JvNumInstanceFields (jclass klass)
140 return klass->field_count - klass->static_field_count;
143 extern inline jboolean
144 JvFieldIsRef (jfieldID field)
146 return field->isRef ();
149 extern inline jobject
150 JvGetObjectField (jobject obj, _Jv_Field* field)
152 return _Jv_GetObjectField (obj, field);
154 #endif /* defined (__JAVA_CNI_H__) */
158 #endif /* __JAVA_FIELD_H */