OSDN Git Service

improve open-coding of complex divide, use new method in g77
[pf3gnuchains/gcc-fork.git] / libjava / include / java-field.h
1 // java-field.h - Header file for fieldID instances.  -*- c++ -*-
2
3 /* Copyright (C) 1998, 1999  Cygnus Solutions
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 __JAVA_FIELD_H__
12 #define __JAVA_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   short                 nameIndex;  /* ofsfet in class's name table */
34 #else
35   _Jv_ushort            bsize;  /* not really needed ... */
36 #endif
37
38   union {
39     int                 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 getNextInstanceField () { return this + 1; }
55
56   jboolean isRef () { return ! isResolved () || ! type->isPrimitive (); }
57
58   // FIXME - may need to mask off internal flags.
59   int getModifiers() { return flags; }
60
61 #ifdef COMPACT_FIELDS
62   _Jv_Utf8Const * getNameUtf8Const (jclass cls)
63   { return clas->fieldNames + nameIndex; }
64 #else
65   _Jv_Utf8Const * getNameUtf8Const (jclass) { return name; }
66 #endif
67 #endif
68 };
69
70 #ifdef __cplusplus
71 inline jbyte
72 _Jv_GetStaticByteField (jclass, _Jv_Field* field)
73 {
74   return * (jbyte *) field->u.addr;
75 }
76
77 inline jshort
78 _Jv_GetStaticShortField (jclass, _Jv_Field* field)
79 {
80   return * (jshort *) field->u.addr;
81 }
82
83 inline jint
84 _Jv_GetStaticIntField (jclass, _Jv_Field* field)
85 {
86   return * (jint *) field->u.addr;
87 }
88
89 inline jlong
90 _Jv_GetStaticLongField (jclass, _Jv_Field* field)
91 {
92   return * (jlong *) field->u.addr;
93 }
94
95 inline jobject
96 _Jv_GetObjectField (jobject obj, _Jv_Field* field)
97 {
98   return field->getObjectField (obj);
99 }
100
101 inline jbyte
102 _Jv_GetByteField (jobject obj, _Jv_Field* field)
103 {
104   return * (jbyte *) ((char*) obj + field->getOffset ());
105 }
106
107 inline jshort
108 _Jv_GetShortField (jobject obj, _Jv_Field* field)
109 {
110   return * (jshort *) ((char*) obj + field->getOffset ());
111 }
112 inline jint
113 _Jv_GetIntField (jobject obj, _Jv_Field* field)
114 {
115   return * (jint *) ((char*) obj + field->getOffset ());
116 }
117 inline jlong
118 _Jv_GetLongField (jobject obj, _Jv_Field* field)
119 {
120   return * (jlong *) ((char*) obj + field->getOffset ());
121 }
122
123 extern inline jfieldID 
124 _Jv_FromReflectedField (java::lang::reflect::Field *field)
125
126   return (jfieldID) ((char *) field->declaringClass->fields + field->offset); 
127
128
129
130 #ifdef __JAVA_CNI_H__
131 extern inline jfieldID
132 JvGetFirstInstanceField (jclass klass)
133 {
134   return &(klass->fields[klass->static_field_count]);
135 }
136
137 extern inline jint
138 JvNumInstanceFields (jclass klass)
139 {
140   return klass->field_count - klass->static_field_count;
141 }
142
143 extern inline jboolean
144 JvFieldIsRef (jfieldID field)
145 {
146   return field->isRef ();
147 }
148
149 extern inline jobject
150 JvGetObjectField (jobject obj, _Jv_Field* field)
151 {
152   return _Jv_GetObjectField (obj, field);
153 }
154 #endif /* defined (__JAVA_CNI_H__) */
155
156 #endif
157
158 #endif /* __JAVA_FIELD_H */