mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			193 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			193 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
// field.h - Header file for fieldID instances.  -*- c++ -*-
 | 
						|
 | 
						|
/* Copyright (C) 1998, 1999, 2000, 2004, 2006  Free Software Foundation
 | 
						|
 | 
						|
   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.  */
 | 
						|
 | 
						|
#ifndef __GCJ_FIELD_H__
 | 
						|
#define __GCJ_FIELD_H__
 | 
						|
 | 
						|
#include <java/lang/Class.h>
 | 
						|
#include <java/lang/reflect/Field.h>
 | 
						|
#include <java/lang/reflect/Modifier.h>
 | 
						|
#include <gnu/gcj/RawData.h>
 | 
						|
 | 
						|
#define _Jv_FIELD_UNRESOLVED_FLAG	0x8000
 | 
						|
 | 
						|
struct _Jv_Field
 | 
						|
{
 | 
						|
  struct _Jv_Utf8Const*	name;
 | 
						|
 | 
						|
  /* The type of the field, if isResolved().
 | 
						|
     If !isResolved():  The fields's signature as a (Utf8Const*). */
 | 
						|
  jclass		type;
 | 
						|
 | 
						|
  _Jv_ushort		flags;
 | 
						|
 | 
						|
  _Jv_ushort		bsize;  /* not really needed ... */
 | 
						|
 | 
						|
  union {
 | 
						|
    jint		boffset;  /* offset in bytes for instance field */
 | 
						|
    char*		addr;  /* address of static field */
 | 
						|
    
 | 
						|
    jobject* object_addr;  /* address of static object field... etc */
 | 
						|
    jbyte* byte_addr;
 | 
						|
    jshort* short_addr;
 | 
						|
    jchar* char_addr;
 | 
						|
    jint* int_addr;
 | 
						|
    jlong* long_addr;
 | 
						|
    jfloat* float_addr;
 | 
						|
    jdouble* double_addr;
 | 
						|
  } 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 ()); }
 | 
						|
 | 
						|
  jfieldID getNextField () { return this + 1; }
 | 
						|
 | 
						|
  jboolean isRef () 
 | 
						|
    { 
 | 
						|
      if (!isResolved ()) 
 | 
						|
	{
 | 
						|
	  char first = ((_Jv_Utf8Const*)type)->first(); 
 | 
						|
	  return first == '[' || first == 'L';
 | 
						|
	}
 | 
						|
      else
 | 
						|
	{
 | 
						|
	  return ! type->isPrimitive ();
 | 
						|
	}
 | 
						|
    }
 | 
						|
 | 
						|
  jclass getClass ()
 | 
						|
  {
 | 
						|
    // We can't use JvAssert here because it is not in a public
 | 
						|
    // header.
 | 
						|
    // JvAssert (isResolved ());
 | 
						|
    return type;
 | 
						|
  }
 | 
						|
 | 
						|
  // Need to mask off all unknown/internal flags before returning.
 | 
						|
  int getModifiers()
 | 
						|
  {
 | 
						|
    return flags & java::lang::reflect::Modifier::ALL_FLAGS;
 | 
						|
  }
 | 
						|
 | 
						|
  _Jv_Utf8Const * getNameUtf8Const (jclass) { return name; }
 | 
						|
#endif
 | 
						|
};
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
 | 
						|
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); 
 | 
						|
} 
 | 
						|
 | 
						|
 | 
						|
#ifdef __GCJ_CNI_H__
 | 
						|
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;
 | 
						|
}
 | 
						|
 | 
						|
extern inline jfieldID
 | 
						|
JvGetFirstStaticField (jclass klass)
 | 
						|
{
 | 
						|
  return &(klass->fields[0]);
 | 
						|
}
 | 
						|
 | 
						|
extern inline jint
 | 
						|
JvNumStaticFields (jclass klass)
 | 
						|
{
 | 
						|
  return klass->static_field_count;
 | 
						|
}
 | 
						|
 | 
						|
extern inline jboolean
 | 
						|
JvFieldIsRef (jfieldID field)
 | 
						|
{
 | 
						|
  return field->isRef () && field->type != &gnu::gcj::RawData::class$;
 | 
						|
}
 | 
						|
 | 
						|
extern inline jobject
 | 
						|
JvGetObjectField (jobject obj, _Jv_Field* field)
 | 
						|
{
 | 
						|
  return _Jv_GetObjectField (obj, field);
 | 
						|
}
 | 
						|
#endif /* defined (__GCJ_CNI_H__) */
 | 
						|
 | 
						|
#endif /* __cplusplus */
 | 
						|
 | 
						|
#endif /* __GCJ_FIELD_H */
 |