#ifndef __JAVA_LANG_CLASS_H__
#define __JAVA_LANG_CLASS_H__
#pragma interface
#include <stddef.h>
#include <java/lang/Object.h>
#include <java/lang/String.h>
#include <java/net/URL.h>
#include <java/lang/reflect/Modifier.h>
#include <java/security/ProtectionDomain.h>
#include <java/lang/Package.h>
#include <gnu/gcj/runtime/StackTrace.h>
extern "C" void _Jv_InitClass (jclass klass);
extern "C" void _Jv_RegisterClasses (const jclass *classes);
extern "C" void _Jv_RegisterClasses_Counted (const jclass *classes,
size_t count);
extern "C" void *_Jv_LookupInterfaceMethodIdx (jclass klass, jclass iface,
int meth_idx);
extern "C" void *_Jv_ResolvePoolEntry (jclass this_class, jint index);
enum
{
JV_STATE_NOTHING = 0,
JV_STATE_PRELOADING = 1, JV_STATE_LOADING = 3, JV_STATE_READ = 4, JV_STATE_LOADED = 5,
JV_STATE_COMPILED = 6,
JV_STATE_PREPARED = 7, JV_STATE_LINKED = 9,
JV_STATE_IN_PROGRESS = 10,
JV_STATE_ERROR = 12,
JV_STATE_DONE = 14 };
struct _Jv_Field;
struct _Jv_VTable;
union _Jv_word;
struct _Jv_ArrayVTable;
class _Jv_Linker;
class _Jv_ExecutionEngine;
class _Jv_CompiledEngine;
class _Jv_InterpreterEngine;
struct _Jv_Constants
{
jint size;
jbyte *tags;
_Jv_word *data;
};
struct _Jv_Method
{
_Jv_Utf8Const *name;
_Jv_Utf8Const *signature;
_Jv_ushort accflags;
_Jv_ushort index;
void *ncode;
_Jv_Utf8Const **throws;
_Jv_Method *getNextMethod ()
{ return this + 1; }
};
union _Jv_IDispatchTable
{
struct
{
jshort iindex;
jshort itable_length;
void **itable;
} cls;
struct
{
jshort *ioffsets;
} iface;
};
struct _Jv_ifaces
{
jclass *list;
jshort len;
jshort count;
};
struct _Jv_MethodSymbol
{
_Jv_Utf8Const *class_name;
_Jv_Utf8Const *name;
_Jv_Utf8Const *signature;
};
struct _Jv_OffsetTable
{
jint state;
jint offsets[];
};
struct _Jv_AddressTable
{
jint state;
void *addresses[];
};
struct _Jv_CatchClass
{
java::lang::Class **address;
_Jv_Utf8Const *classname;
};
enum
{
JV_ASSERT_END_OF_TABLE = 0,
JV_ASSERT_TYPES_COMPATIBLE = 1,
JV_ASSERT_IS_INSTANTIABLE = 2
};
struct _Jv_TypeAssertion
{
jint assertion_code;
_Jv_Utf8Const *op1;
_Jv_Utf8Const *op2;
};
#define JV_PRIMITIVE_VTABLE ((_Jv_VTable *) -1)
#define JV_CLASS(Obj) ((jclass) (*(_Jv_VTable **) Obj)->clas)
_Jv_Method *_Jv_GetMethodLocal (jclass klass, _Jv_Utf8Const *name,
_Jv_Utf8Const *signature);
jboolean _Jv_IsAssignableFrom (jclass, jclass);
jboolean _Jv_IsAssignableFromSlow (jclass, jclass);
jboolean _Jv_InterfaceAssignableFrom (jclass, jclass);
_Jv_Method* _Jv_LookupDeclaredMethod (jclass, _Jv_Utf8Const *,
_Jv_Utf8Const*, jclass * = NULL);
jfieldID JvGetFirstInstanceField (jclass);
jint JvNumInstanceFields (jclass);
jfieldID JvGetFirstStaticField (jclass);
jint JvNumStaticFields (jclass);
jobject _Jv_AllocObject (jclass);
void *_Jv_AllocObj (jint, jclass);
void *_Jv_AllocPtrFreeObj (jint, jclass);
void *_Jv_AllocArray (jint, jclass);
bool _Jv_getInterfaceMethod(jclass, jclass&, int&,
const _Jv_Utf8Const*,
const _Jv_Utf8Const*);
jobject _Jv_JNI_ToReflectedField (_Jv_JNIEnv *, jclass, jfieldID,
jboolean);
jobject _Jv_JNI_ToReflectedMethod (_Jv_JNIEnv *, jclass, jmethodID,
jboolean);
jfieldID _Jv_FromReflectedField (java::lang::reflect::Field *);
jmethodID _Jv_FromReflectedMethod (java::lang::reflect::Method *);
jmethodID _Jv_FromReflectedConstructor (java::lang::reflect::Constructor *);
jint JvNumMethods (jclass);
jmethodID JvGetFirstMethod (jclass);
class java::lang::ClassLoader;
class java::lang::VMClassLoader;
class java::io::ObjectOutputStream;
class java::io::ObjectInputStream;
class java::io::ObjectStreamClass;
void _Jv_RegisterClassHookDefault (jclass klass);
void _Jv_RegisterInitiatingLoader (jclass,java::lang::ClassLoader*);
void _Jv_UnregisterInitiatingLoader (jclass,java::lang::ClassLoader*);
void _Jv_UnregisterClass (jclass);
jclass _Jv_FindClass (_Jv_Utf8Const *name,
java::lang::ClassLoader *loader);
jclass _Jv_FindClassInCache (_Jv_Utf8Const *name);
jclass _Jv_PopClass (void);
void _Jv_PushClass (jclass k);
void _Jv_NewArrayClass (jclass element,
java::lang::ClassLoader *loader,
_Jv_VTable *array_vtable = 0);
jclass _Jv_NewClass (_Jv_Utf8Const *name, jclass superclass,
java::lang::ClassLoader *loader);
void _Jv_InitNewClassFields (jclass klass);
void _Jv_InitPrimClass (jclass, char *, char, int);
jstring _Jv_GetMethodString (jclass, _Jv_Method *, jclass = NULL);
jboolean _Jv_CheckAccess (jclass self_klass, jclass other_klass,
jint flags);
jclass _Jv_GetArrayClass (jclass klass, java::lang::ClassLoader *loader);
jboolean _Jv_IsInterpretedClass (jclass);
#ifdef INTERPRETER
void _Jv_InitField (jobject, jclass, int);
class _Jv_ClassReader;
class _Jv_InterpClass;
class _Jv_InterpMethod;
#endif
class _Jv_BytecodeVerifier;
class gnu::gcj::runtime::StackTrace;
class java::io::VMObjectStreamClass;
void _Jv_sharedlib_register_hook (jclass klass);
class java::lang::Class : public java::lang::Object
{
public:
static jclass forName (jstring className, jboolean initialize,
java::lang::ClassLoader *loader);
static jclass forName (jstring className);
JArray<jclass> *getClasses (void);
java::lang::ClassLoader *getClassLoader (void);
java::lang::ClassLoader *getClassLoaderInternal (void)
{
return loader;
}
java::lang::reflect::Constructor *getConstructor (JArray<jclass> *);
JArray<java::lang::reflect::Constructor *> *getConstructors (void);
java::lang::reflect::Constructor *getDeclaredConstructor (JArray<jclass> *);
JArray<java::lang::reflect::Constructor *> *getDeclaredConstructors (void);
java::lang::reflect::Field *getDeclaredField (jstring);
JArray<java::lang::reflect::Field *> *getDeclaredFields ();
JArray<java::lang::reflect::Field *> *getDeclaredFields (jboolean);
java::lang::reflect::Method *getDeclaredMethod (jstring, JArray<jclass> *);
JArray<java::lang::reflect::Method *> *getDeclaredMethods (void);
JArray<jclass> *getDeclaredClasses (void);
jclass getDeclaringClass (void);
java::lang::reflect::Field *getField (jstring);
private:
JArray<java::lang::reflect::Field *> internalGetFields ();
JArray<java::lang::reflect::Constructor *> *_getConstructors (jboolean);
java::lang::reflect::Field *getField (jstring, jint);
jint _getMethods (JArray<java::lang::reflect::Method *> *result,
jint offset);
java::lang::reflect::Field *getPrivateField (jstring);
java::lang::reflect::Method *getPrivateMethod (jstring, JArray<jclass> *);
java::security::ProtectionDomain *getProtectionDomain0 ();
java::lang::reflect::Method *_getMethod (jstring, JArray<jclass> *);
java::lang::reflect::Method *_getDeclaredMethod (jstring, JArray<jclass> *);
public:
JArray<java::lang::reflect::Field *> *getFields (void);
JArray<jclass> *getInterfaces (void);
void getSignature (java::lang::StringBuffer *buffer);
static jstring getSignature (JArray<jclass> *, jboolean is_constructor);
JArray<java::lang::reflect::Method *> *getMethods (void);
inline jint getModifiers (void)
{
return accflags & java::lang::reflect::Modifier::ALL_FLAGS;
}
jstring getName (void);
java::net::URL *getResource (jstring resourceName);
java::io::InputStream *getResourceAsStream (jstring resourceName);
JArray<jobject> *getSigners (void);
void setSigners(JArray<jobject> *);
inline jclass getSuperclass (void)
{
return superclass;
}
inline jclass getInterface (jint n)
{
return interfaces[n];
}
inline jboolean isArray (void)
{
return name->first() == '[';
}
inline jclass getComponentType (void)
{
return isArray () ? (* (jclass *) &methods) : 0;
}
jboolean isAssignableFrom (jclass cls);
jboolean isInstance (jobject obj);
inline jboolean isInterface (void)
{
return (accflags & java::lang::reflect::Modifier::INTERFACE) != 0;
}
inline jboolean isPrimitive (void)
{
return vtable == JV_PRIMITIVE_VTABLE;
}
jobject newInstance (void);
java::security::ProtectionDomain *getProtectionDomain (void);
java::lang::Package *getPackage (void);
jstring toString (void);
jboolean desiredAssertionStatus (void);
jint size (void)
{
return size_in_bytes;
}
inline jint firstMethodIndex (void)
{
return vtable_method_count - method_count;
}
void finalize ();
Class ();
static java::lang::Class class$;
private:
void memberAccessCheck (jint flags);
void initializeClass (void);
static jstring getPackagePortion (jstring);
void set_state (jint nstate)
{
state = nstate;
notifyAll ();
}
friend _Jv_Method *::_Jv_GetMethodLocal (jclass klass, _Jv_Utf8Const *name,
_Jv_Utf8Const *signature);
friend jboolean (::_Jv_IsAssignableFrom) (jclass, jclass);
friend jboolean (::_Jv_IsAssignableFromSlow) (jclass, jclass);
friend jboolean (::_Jv_InterfaceAssignableFrom) (jclass, jclass);
friend void *::_Jv_LookupInterfaceMethodIdx (jclass klass, jclass iface,
int method_idx);
friend void ::_Jv_InitClass (jclass klass);
friend _Jv_Method* ::_Jv_LookupDeclaredMethod (jclass, _Jv_Utf8Const *,
_Jv_Utf8Const*, jclass *);
friend jfieldID (::JvGetFirstInstanceField) (jclass);
friend jint (::JvNumInstanceFields) (jclass);
friend jfieldID (::JvGetFirstStaticField) (jclass);
friend jint (::JvNumStaticFields) (jclass);
friend jobject (::_Jv_AllocObject) (jclass);
friend void *::_Jv_AllocObj (jint, jclass);
friend void *::_Jv_AllocPtrFreeObj (jint, jclass);
friend void *::_Jv_AllocArray (jint, jclass);
friend jobject (::_Jv_JNI_ToReflectedField) (_Jv_JNIEnv *, jclass, jfieldID,
jboolean);
friend jobject (::_Jv_JNI_ToReflectedMethod) (_Jv_JNIEnv *, jclass, jmethodID,
jboolean);
friend jfieldID (::_Jv_FromReflectedField) (java::lang::reflect::Field *);
friend jmethodID (::_Jv_FromReflectedMethod) (java::lang::reflect::Method *);
friend jmethodID (::_Jv_FromReflectedConstructor) (java::lang::reflect::Constructor *);
friend jint (::JvNumMethods) (jclass);
friend jmethodID (::JvGetFirstMethod) (jclass);
friend class java::lang::ClassLoader;
friend class java::lang::VMClassLoader;
friend class java::io::ObjectOutputStream;
friend class java::io::ObjectInputStream;
friend class java::io::ObjectStreamClass;
friend void ::_Jv_RegisterClasses (const jclass *classes);
friend void ::_Jv_RegisterClasses_Counted (const jclass *classes,
size_t count);
friend void ::_Jv_RegisterClassHookDefault (jclass klass);
friend void ::_Jv_RegisterInitiatingLoader (jclass,java::lang::ClassLoader*);
friend void ::_Jv_UnregisterInitiatingLoader (jclass,java::lang::ClassLoader*);
friend void ::_Jv_UnregisterClass (jclass);
friend jclass (::_Jv_FindClass) (_Jv_Utf8Const *name,
java::lang::ClassLoader *loader);
friend jclass (::_Jv_FindClassInCache) (_Jv_Utf8Const *name);
friend jclass (::_Jv_PopClass) (void);
friend void ::_Jv_PushClass (jclass k);
friend void ::_Jv_NewArrayClass (jclass element,
java::lang::ClassLoader *loader,
_Jv_VTable *array_vtable);
friend jclass (::_Jv_NewClass) (_Jv_Utf8Const *name, jclass superclass,
java::lang::ClassLoader *loader);
friend void ::_Jv_InitNewClassFields (jclass klass);
friend void ::_Jv_InitPrimClass (jclass, char *, char, int);
friend jstring (::_Jv_GetMethodString) (jclass, _Jv_Method *, jclass);
friend jboolean (::_Jv_CheckAccess) (jclass self_klass, jclass other_klass,
jint flags);
friend bool (::_Jv_getInterfaceMethod) (jclass, jclass&, int&,
const _Jv_Utf8Const*,
const _Jv_Utf8Const*);
friend jclass (::_Jv_GetArrayClass) (jclass klass,
java::lang::ClassLoader *loader);
friend jboolean (::_Jv_IsInterpretedClass) (jclass);
#ifdef INTERPRETER
friend void ::_Jv_InitField (jobject, jclass, int);
friend class ::_Jv_ClassReader;
friend class ::_Jv_InterpClass;
friend class ::_Jv_InterpMethod;
#endif
#ifdef JV_MARKOBJ_DECL
friend JV_MARKOBJ_DECL;
#endif
friend class ::_Jv_BytecodeVerifier;
friend class gnu::gcj::runtime::StackTrace;
friend class java::io::VMObjectStreamClass;
friend class ::_Jv_Linker;
friend class ::_Jv_ExecutionEngine;
friend class ::_Jv_CompiledEngine;
friend class ::_Jv_InterpreterEngine;
friend void ::_Jv_sharedlib_register_hook (jclass klass);
friend void *::_Jv_ResolvePoolEntry (jclass this_class, jint index);
jclass next_or_version;
_Jv_Utf8Const *name;
_Jv_ushort accflags;
jclass superclass;
_Jv_Constants constants;
_Jv_Method *methods;
jshort method_count;
jshort vtable_method_count;
_Jv_Field *fields;
jint size_in_bytes;
jshort field_count;
jshort static_field_count;
_Jv_VTable *vtable;
_Jv_OffsetTable *otable;
_Jv_MethodSymbol *otable_syms;
_Jv_AddressTable *atable;
_Jv_MethodSymbol *atable_syms;
_Jv_AddressTable *itable;
_Jv_MethodSymbol *itable_syms;
_Jv_CatchClass *catch_classes;
jclass *interfaces;
java::lang::ClassLoader *loader;
jshort interface_count;
jbyte state;
java::lang::Thread *thread;
jshort depth;
jclass *ancestors;
_Jv_IDispatchTable *idt;
jclass arrayclass;
java::security::ProtectionDomain *protectionDomain;
_Jv_TypeAssertion *assertion_table;
JArray<jobject> *hack_signers;
jclass chain;
void *aux_info;
_Jv_ExecutionEngine *engine;
};
inline void _Jv_InitClass (jclass klass)
{
if (__builtin_expect (klass->state == JV_STATE_DONE, true))
return;
klass->initializeClass ();
}
inline jclass
_Jv_GetArrayClass (jclass klass, java::lang::ClassLoader *loader)
{
extern void _Jv_NewArrayClass (jclass element,
java::lang::ClassLoader *loader,
_Jv_VTable *array_vtable = 0);
if (__builtin_expect (!klass->arrayclass, false))
_Jv_NewArrayClass (klass, loader);
return klass->arrayclass;
}
#endif