field.h 3.99 KB
Newer Older
Tom Tromey committed
1
// field.h - Header file for fieldID instances.  -*- c++ -*-
Tom Tromey committed
2

3
/* Copyright (C) 1998, 1999, 2000  Free Software Foundation
Tom Tromey committed
4 5 6 7 8 9 10

   This file is part of libgcj.

This software is copyrighted work licensed under the terms of the
Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
details.  */

Tom Tromey committed
11 12
#ifndef __GCJ_FIELD_H__
#define __GCJ_FIELD_H__
Tom Tromey committed
13 14 15

#include <java/lang/Class.h>
#include <java/lang/reflect/Field.h>
16
#include <java/lang/reflect/Modifier.h>
17
#include <gnu/gcj/RawData.h>
Tom Tromey committed
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

#define _Jv_FIELD_UNRESOLVED_FLAG	0x8000
#define	_Jv_FIELD_CONSTANT_VALUE	0x4000

struct _Jv_Field
{
#ifndef COMPACT_FIELDS
  struct _Jv_Utf8Const*	name;
#endif

  /* The type of the field, if isResolved().
     If !isResolved():  The fields's signature as a (Utf8Const*). */
  jclass		type;

  _Jv_ushort		flags;

#ifdef COMPACT_FIELDS
35
  jshort		nameIndex;  /* offset in class's name table */
Tom Tromey committed
36 37 38 39 40
#else
  _Jv_ushort		bsize;  /* not really needed ... */
#endif

  union {
41
    jint		boffset;  /* offset in bytes for instance field */
Tom Tromey committed
42 43 44 45 46 47 48 49 50 51 52 53 54 55
    void*		addr;  /* address of static field */
  } u;

#ifdef __cplusplus
  jboolean isResolved ()
  { return ! (flags & _Jv_FIELD_UNRESOLVED_FLAG); }

  public:

  int getOffset () { return u.boffset; }

  jobject getObjectField (jobject obj)
  { return *(jobject *)((char *)obj + getOffset ()); }

56
  jfieldID getNextField () { return this + 1; }
Tom Tromey committed
57

Anthony Green committed
58 59 60 61 62 63 64 65 66 67 68 69
  jboolean isRef () 
    { 
      if (!isResolved ()) 
	{
	  char first = ((_Jv_Utf8Const*)type)->data[0]; 
	  return first == '[' || first == 'L';
	}
      else
	{
	  return ! type->isPrimitive ();
	}
    }
Tom Tromey committed
70

71 72
  jclass getClass ()
  {
73 74 75
    // We can't use JvAssert here because it is not in a public
    // header.
    // JvAssert (isResolved ());
76 77 78
    return type;
  }

79 80 81 82 83
  // Need to mask off all unknown/internal flags before returning.
  int getModifiers()
  {
    return flags & java::lang::reflect::Modifier::ALL_FLAGS;
  }
Tom Tromey committed
84 85 86 87 88 89 90 91 92 93 94

#ifdef COMPACT_FIELDS
  _Jv_Utf8Const * getNameUtf8Const (jclass cls)
  { return clas->fieldNames + nameIndex; }
#else
  _Jv_Utf8Const * getNameUtf8Const (jclass) { return name; }
#endif
#endif
};

#ifdef __cplusplus
95

Tom Tromey committed
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
inline jbyte
_Jv_GetStaticByteField (jclass, _Jv_Field* field)
{
  return * (jbyte *) field->u.addr;
}

inline jshort
_Jv_GetStaticShortField (jclass, _Jv_Field* field)
{
  return * (jshort *) field->u.addr;
}

inline jint
_Jv_GetStaticIntField (jclass, _Jv_Field* field)
{
  return * (jint *) field->u.addr;
}

inline jlong
_Jv_GetStaticLongField (jclass, _Jv_Field* field)
{
  return * (jlong *) field->u.addr;
}

inline jobject
_Jv_GetObjectField (jobject obj, _Jv_Field* field)
{
  return field->getObjectField (obj);
}

inline jbyte
_Jv_GetByteField (jobject obj, _Jv_Field* field)
{
  return * (jbyte *) ((char*) obj + field->getOffset ());
}

inline jshort
_Jv_GetShortField (jobject obj, _Jv_Field* field)
{
  return * (jshort *) ((char*) obj + field->getOffset ());
}
inline jint
_Jv_GetIntField (jobject obj, _Jv_Field* field)
{
  return * (jint *) ((char*) obj + field->getOffset ());
}
inline jlong
_Jv_GetLongField (jobject obj, _Jv_Field* field)
{
  return * (jlong *) ((char*) obj + field->getOffset ());
}

extern inline jfieldID 
_Jv_FromReflectedField (java::lang::reflect::Field *field)
{ 
  return (jfieldID) ((char *) field->declaringClass->fields + field->offset); 
} 


Tom Tromey committed
155
#ifdef __GCJ_CNI_H__
Tom Tromey committed
156 157 158 159 160 161 162 163 164 165 166 167
extern inline jfieldID
JvGetFirstInstanceField (jclass klass)
{
  return &(klass->fields[klass->static_field_count]);
}

extern inline jint
JvNumInstanceFields (jclass klass)
{
  return klass->field_count - klass->static_field_count;
}

168 169 170 171 172 173 174 175 176 177 178 179
extern inline jfieldID
JvGetFirstStaticField (jclass klass)
{
  return &(klass->fields[0]);
}

extern inline jint
JvNumStaticFields (jclass klass)
{
  return klass->static_field_count;
}

Tom Tromey committed
180 181 182
extern inline jboolean
JvFieldIsRef (jfieldID field)
{
183
  return field->isRef () && field->type != &gnu::gcj::RawData::class$;
Tom Tromey committed
184 185 186 187 188 189 190
}

extern inline jobject
JvGetObjectField (jobject obj, _Jv_Field* field)
{
  return _Jv_GetObjectField (obj, field);
}
Tom Tromey committed
191
#endif /* defined (__GCJ_CNI_H__) */
Tom Tromey committed
192

193
#endif /* __cplusplus */
Tom Tromey committed
194

Tom Tromey committed
195
#endif /* __GCJ_FIELD_H */