OSDN Git Service

* gcj/field.h (_Jv_Field::getClass): Don't use JvAssert.
[pf3gnuchains/gcc-fork.git] / libjava / gcj / field.h
1 // field.h - Header file for fieldID instances.  -*- c++ -*-
2
3 /* Copyright (C) 1998, 1999, 2000  Red Hat, Inc.
4
5    This file is part of libgcj.
6
7 This software is copyrighted work licensed under the terms of the
8 Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
9 details.  */
10
11 #ifndef __GCJ_FIELD_H__
12 #define __GCJ_FIELD_H__
13
14 #include <java/lang/Class.h>
15 #include <java/lang/reflect/Field.h>
16
17 #define _Jv_FIELD_UNRESOLVED_FLAG       0x8000
18 #define _Jv_FIELD_CONSTANT_VALUE        0x4000
19
20 struct _Jv_Field
21 {
22 #ifndef COMPACT_FIELDS
23   struct _Jv_Utf8Const* name;
24 #endif
25
26   /* The type of the field, if isResolved().
27      If !isResolved():  The fields's signature as a (Utf8Const*). */
28   jclass                type;
29
30   _Jv_ushort            flags;
31
32 #ifdef COMPACT_FIELDS
33   jshort                nameIndex;  /* offset in class's name table */
34 #else
35   _Jv_ushort            bsize;  /* not really needed ... */
36 #endif
37
38   union {
39     jint                boffset;  /* offset in bytes for instance field */
40     void*               addr;  /* address of static field */
41   } u;
42
43 #ifdef __cplusplus
44   jboolean isResolved ()
45   { return ! (flags & _Jv_FIELD_UNRESOLVED_FLAG); }
46
47   public:
48
49   int getOffset () { return u.boffset; }
50
51   jobject getObjectField (jobject obj)
52   { return *(jobject *)((char *)obj + getOffset ()); }
53
54   jfieldID getNextField () { return this + 1; }
55
56   jboolean isRef () 
57     { 
58       if (!isResolved ()) 
59         {
60           char first = ((_Jv_Utf8Const*)type)->data[0]; 
61           return first == '[' || first == 'L';
62         }
63       else
64         {
65           return ! type->isPrimitive ();
66         }
67     }
68
69   jclass getClass ()
70   {
71     // We can't use JvAssert here because it is not in a public
72     // header.
73     // JvAssert (isResolved ());
74     return type;
75   }
76
77   // FIXME - may need to mask off internal flags.
78   int getModifiers() { return flags; }
79
80 #ifdef COMPACT_FIELDS
81   _Jv_Utf8Const * getNameUtf8Const (jclass cls)
82   { return clas->fieldNames + nameIndex; }
83 #else
84   _Jv_Utf8Const * getNameUtf8Const (jclass) { return name; }
85 #endif
86 #endif
87 };
88
89 #ifdef __cplusplus
90
91 inline jbyte
92 _Jv_GetStaticByteField (jclass, _Jv_Field* field)
93 {
94   return * (jbyte *) field->u.addr;
95 }
96
97 inline jshort
98 _Jv_GetStaticShortField (jclass, _Jv_Field* field)
99 {
100   return * (jshort *) field->u.addr;
101 }
102
103 inline jint
104 _Jv_GetStaticIntField (jclass, _Jv_Field* field)
105 {
106   return * (jint *) field->u.addr;
107 }
108
109 inline jlong
110 _Jv_GetStaticLongField (jclass, _Jv_Field* field)
111 {
112   return * (jlong *) field->u.addr;
113 }
114
115 inline jobject
116 _Jv_GetObjectField (jobject obj, _Jv_Field* field)
117 {
118   return field->getObjectField (obj);
119 }
120
121 inline jbyte
122 _Jv_GetByteField (jobject obj, _Jv_Field* field)
123 {
124   return * (jbyte *) ((char*) obj + field->getOffset ());
125 }
126
127 inline jshort
128 _Jv_GetShortField (jobject obj, _Jv_Field* field)
129 {
130   return * (jshort *) ((char*) obj + field->getOffset ());
131 }
132 inline jint
133 _Jv_GetIntField (jobject obj, _Jv_Field* field)
134 {
135   return * (jint *) ((char*) obj + field->getOffset ());
136 }
137 inline jlong
138 _Jv_GetLongField (jobject obj, _Jv_Field* field)
139 {
140   return * (jlong *) ((char*) obj + field->getOffset ());
141 }
142
143 extern inline jfieldID 
144 _Jv_FromReflectedField (java::lang::reflect::Field *field)
145
146   return (jfieldID) ((char *) field->declaringClass->fields + field->offset); 
147
148
149
150 #ifdef __GCJ_CNI_H__
151 extern inline jfieldID
152 JvGetFirstInstanceField (jclass klass)
153 {
154   return &(klass->fields[klass->static_field_count]);
155 }
156
157 extern inline jint
158 JvNumInstanceFields (jclass klass)
159 {
160   return klass->field_count - klass->static_field_count;
161 }
162
163 extern inline jfieldID
164 JvGetFirstStaticField (jclass klass)
165 {
166   return &(klass->fields[0]);
167 }
168
169 extern inline jint
170 JvNumStaticFields (jclass klass)
171 {
172   return klass->static_field_count;
173 }
174
175 extern inline jboolean
176 JvFieldIsRef (jfieldID field)
177 {
178   return field->isRef ();
179 }
180
181 extern inline jobject
182 JvGetObjectField (jobject obj, _Jv_Field* field)
183 {
184   return _Jv_GetObjectField (obj, field);
185 }
186 #endif /* defined (__GCJ_CNI_H__) */
187
188 #endif /* __cplusplus */
189
190 #endif /* __GCJ_FIELD_H */