/* src/vmcore/class.h - class related functions header
- Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
- C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
- E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
- J. Wenninger, Institut f. Computersprachen - TU Wien
+ Copyright (C) 1996-2005, 2006, 2007, 2008
+ CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
This file is part of CACAO.
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: class.h 7307 2007-02-09 12:47:10Z twisti $
-
*/
typedef struct classinfo classinfo;
typedef struct innerclassinfo innerclassinfo;
typedef struct extra_classref extra_classref;
+typedef struct castinfo castinfo;
#include "config.h"
+
+#include <stdint.h>
+
#include "vm/types.h"
#include "toolbox/list.h"
#include "vm/global.h"
+#include "vm/stringlocal.h"
#if defined(ENABLE_JAVASE)
# include "vmcore/annotation.h"
/* classinfo ******************************************************************/
/* We define this dummy structure of java_lang_Class so we can
- bootstrap cacaoh without needing a java_lang_Class.h file. If the
- size is big enough, is checked during runtime in vm_create. */
+ bootstrap cacaoh without needing a java_lang_Class.h file. Whether
+ the size of the dummy structure is big enough is checked during
+ runtime in vm_create. */
typedef struct {
- java_objectheader header;
- ptrint padding[4];
+ java_object_t header;
+#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
+ intptr_t padding[4];
+#elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
+ intptr_t padding[19];
+#elif defined(WITH_JAVA_RUNTIME_LIBRARY_CLDC1_1)
+ intptr_t padding[3];
+#else
+# error unknown classpath configuration
+#endif
} dummy_java_lang_Class;
struct classinfo { /* class structure */
s4 parseddescsize; /* size of the parsed descriptors block */
u1 *parseddescs; /* parsed descriptors */
- classref_or_classinfo super; /* super class */
+ classinfo *super; /* super class */
classinfo *sub; /* sub class pointer */
classinfo *nextsub; /* pointer to next class in sub class list */
- s4 interfacescount; /* number of interfaces */
- classref_or_classinfo *interfaces; /* superinterfaces */
+ int32_t interfacescount; /* number of interfaces */
+ classinfo **interfaces; /* super interfaces */
- s4 fieldscount; /* number of fields */
+ int32_t fieldscount; /* number of fields */
fieldinfo *fields; /* field table */
- s4 methodscount; /* number of methods */
+ int32_t methodscount; /* number of methods */
methodinfo *methods; /* method table */
- listnode listnode; /* linkage */
-
s4 state; /* current class state */
s4 index; /* hierarchy depth (classes) or index */
/* (interfaces) */
u2 innerclasscount; /* number of inner classes */
innerclassinfo *innerclass;
-#if defined(ENABLE_JAVASE)
+ classref_or_classinfo declaringclass;
classref_or_classinfo enclosingclass; /* enclosing class */
constant_nameandtype *enclosingmethod; /* enclosing method */
-#endif
utf *packagename; /* full name of the package */
utf *sourcefile; /* SourceFile attribute */
#if defined(ENABLE_JAVASE)
utf *signature; /* Signature attribute */
- s4 runtimevisibleannotationscount;
- annotation_t *runtimevisibleannotations;
+#if defined(ENABLE_ANNOTATIONS)
+ /* All the annotation attributes are NULL (and not a zero length array) */
+ /* if there is nothing. */
+ java_object_t *annotations; /* annotations of this class */
+
+ java_object_t *method_annotations; /* array of annotations of the methods */
+ java_object_t *method_parameterannotations; /* array of parameter */
+ /* annotations of the methods */
+ java_object_t *method_annotationdefaults; /* array of annotation default */
+ /* values of the methods */
+
+ java_object_t *field_annotations; /* array of annotations of the fields */
+
+#endif
+#endif
+ classloader_t *classloader; /* NULL for bootstrap classloader */
+
+#if defined(ENABLE_JAVASE)
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
+ java_object_t *protectiondomain;
+ java_objectarray_t *signers;
+# endif
#endif
- java_objectheader *classloader; /* NULL for bootstrap classloader */
};
};
-/* global variables ***********************************************************/
+/* castinfo *******************************************************************/
-extern list unlinkedclasses; /* this is only used for eager class loading */
+struct castinfo {
+ s4 super_baseval;
+ s4 super_diffval;
+ s4 sub_baseval;
+};
+/* global variables ***********************************************************/
+
/* frequently used classes ****************************************************/
-/* important system classes */
+/* Important system classes. */
extern classinfo *class_java_lang_Object;
extern classinfo *class_java_lang_Class;
extern classinfo *class_java_lang_System;
extern classinfo *class_java_lang_Thread;
extern classinfo *class_java_lang_ThreadGroup;
-extern classinfo *class_java_lang_VMSystem;
-extern classinfo *class_java_lang_VMThread;
+extern classinfo *class_java_lang_Throwable;
extern classinfo *class_java_io_Serializable;
+/* Important system exceptions. */
-/* system exception classes required in cacao */
-
-extern classinfo *class_java_lang_Throwable;
-extern classinfo *class_java_lang_Error;
-extern classinfo *class_java_lang_LinkageError;
-extern classinfo *class_java_lang_NoClassDefFoundError;
-extern classinfo *class_java_lang_OutOfMemoryError;
-extern classinfo *class_java_lang_VirtualMachineError;
+extern classinfo *class_java_lang_Exception;
+extern classinfo *class_java_lang_ClassNotFoundException;
+extern classinfo *class_java_lang_RuntimeException;
-#if defined(WITH_CLASSPATH_GNU)
+#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
+extern classinfo *class_java_lang_VMSystem;
+extern classinfo *class_java_lang_VMThread;
extern classinfo *class_java_lang_VMThrowable;
#endif
-extern classinfo *class_java_lang_Exception;
-extern classinfo *class_java_lang_ClassCastException;
-extern classinfo *class_java_lang_ClassNotFoundException;
+#if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
+extern classinfo *class_sun_reflect_MagicAccessorImpl;
+#endif
#if defined(ENABLE_JAVASE)
extern classinfo *class_java_lang_Void;
extern classinfo *class_java_lang_Float;
extern classinfo *class_java_lang_Double;
-
-/* some runtime exception */
-
-extern classinfo *class_java_lang_NullPointerException;
-
-
/* some classes which may be used more often */
#if defined(ENABLE_JAVASE)
extern classinfo *class_java_lang_reflect_Method;
extern classinfo *class_java_security_PrivilegedAction;
extern classinfo *class_java_util_Vector;
+extern classinfo *class_java_util_HashMap;
+
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
+extern classinfo *class_java_lang_reflect_VMConstructor;
+extern classinfo *class_java_lang_reflect_VMField;
+extern classinfo *class_java_lang_reflect_VMMethod;
+# endif
extern classinfo *arrayclass_java_lang_Object;
+
+# if defined(ENABLE_ANNOTATIONS)
+extern classinfo *class_sun_reflect_ConstantPool;
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
+extern classinfo *class_sun_reflect_annotation_AnnotationParser;
+# endif
+# endif
#endif
extern classinfo *pseudo_class_New;
-/* function prototypes ********************************************************/
+/* inline functions ***********************************************************/
-/* create a new classinfo struct */
-classinfo *class_create_classinfo(utf *u);
+/**
+ * Returns the classname of the class, where slashes ('/') are
+ * replaced by dots ('.').
+ *
+ * @param c class to get name of
+ * @return classname
+ */
+inline static java_handle_t* class_get_classname(classinfo* c)
+{
+ java_handle_t *s;
+
+ /* Create a java string. */
+
+ s = javastring_new_slash_to_dot(c->name);
+
+ return s;
+}
+
+
+/* class_is_primitive **********************************************************
+
+ Checks if the given class is a primitive class.
+
+*******************************************************************************/
+
+static inline bool class_is_primitive(classinfo *c)
+{
+ if (c->flags & ACC_CLASS_PRIMITIVE)
+ return true;
+
+ return false;
+}
+
+
+/* class_is_anonymousclass *****************************************************
+
+ Checks if the given class is an anonymous class.
+
+*******************************************************************************/
+
+static inline bool class_is_anonymousclass(classinfo *c)
+{
+ if (c->flags & ACC_CLASS_ANONYMOUS)
+ return true;
-/* postset's the header.vftbl */
-void class_postset_header_vftbl(void);
+ return false;
+}
-/* set the package name after the name has been set */
-void class_set_packagename(classinfo *c);
-bool class_load_attributes(classbuffer *cb);
+/* class_is_array **************************************************************
+
+ Checks if the given class is an array class.
+
+*******************************************************************************/
+
+static inline bool class_is_array(classinfo *c)
+{
+ if (!(c->state & CLASS_LINKED))
+ if (!link_class(c))
+ return false;
+
+ return (c->vftbl->arraydesc != NULL);
+}
+
+
+/* class_is_interface **********************************************************
+
+ Checks if the given class is an interface.
+
+*******************************************************************************/
+
+static inline bool class_is_interface(classinfo *c)
+{
+ if (c->flags & ACC_INTERFACE)
+ return true;
+
+ return false;
+}
+
+
+/* class_is_localclass *********************************************************
+
+ Checks if the given class is a local class.
+
+*******************************************************************************/
+
+static inline bool class_is_localclass(classinfo *c)
+{
+ if ((c->enclosingmethod != NULL) && !class_is_anonymousclass(c))
+ return true;
+
+ return false;
+}
+
+
+/* class_is_memberclass ********************************************************
+
+ Checks if the given class is a member class.
+
+*******************************************************************************/
+
+static inline bool class_is_memberclass(classinfo *c)
+{
+ if (c->flags & ACC_CLASS_MEMBER)
+ return true;
+
+ return false;
+}
+
+
+/* class_get_classloader *******************************************************
+
+ Return the classloader of the given class.
+
+*******************************************************************************/
+
+static inline classloader_t *class_get_classloader(classinfo *c)
+{
+ classloader_t *cl;
+
+ cl = c->classloader;
+
+ /* The classloader may be NULL. */
+
+ return cl;
+}
+
+
+/* class_get_superclass ********************************************************
+
+ Return the super class of the given class.
+
+*******************************************************************************/
+
+static inline classinfo *class_get_superclass(classinfo *c)
+{
+ /* For interfaces we return NULL. */
+
+ if (c->flags & ACC_INTERFACE)
+ return NULL;
+
+ /* For java/lang/Object, primitive-type and Void classes c->super
+ is NULL and we return NULL. */
+
+ return c->super;
+}
+
+
+/* function prototypes ********************************************************/
+
+classinfo *class_create_classinfo(utf *u);
+void class_postset_header_vftbl(void);
+classinfo *class_define(utf *name, classloader_t *cl, int32_t length, uint8_t *data, java_handle_t *pd);
+void class_set_packagename(classinfo *c);
+
+bool class_load_attributes(classbuffer *cb);
/* retrieve constantpool element */
voidptr class_getconstant(classinfo *class, u4 pos, u4 ctype);
methodinfo *class_resolveclassmethod(classinfo *c, utf *name, utf *dest, classinfo *referer, bool throwexception);
methodinfo *class_resolveinterfacemethod(classinfo *c, utf *name, utf *dest, classinfo *referer, bool throwexception);
-bool class_issubclass(classinfo *sub, classinfo *super);
+bool class_issubclass(classinfo *sub, classinfo *super);
+bool class_isanysubclass(classinfo *sub, classinfo *super);
+bool class_is_assignable_from(classinfo *to, classinfo *from);
+bool class_is_instance(classinfo *c, java_handle_t *h);
+
+classloader_t *class_get_classloader(classinfo *c);
+classinfo *class_get_superclass(classinfo *c);
+classinfo *class_get_componenttype(classinfo *c);
+java_handle_objectarray_t *class_get_declaredclasses(classinfo *c, bool publicOnly);
+java_handle_objectarray_t *class_get_declaredconstructors(classinfo *c, bool publicOnly);
+java_handle_objectarray_t *class_get_declaredfields(classinfo *c, bool publicOnly);
+java_handle_objectarray_t *class_get_declaredmethods(classinfo *c, bool publicOnly);
+classinfo *class_get_declaringclass(classinfo *c);
+classinfo *class_get_enclosingclass(classinfo *c);
+java_handle_t* class_get_enclosingconstructor(classinfo *c);
+methodinfo* class_get_enclosingmethod_raw(classinfo *c);
+java_handle_t* class_get_enclosingmethod(classinfo *c);
+java_handle_objectarray_t *class_get_interfaces(classinfo *c);
+java_handle_bytearray_t *class_get_annotations(classinfo *c);
+int32_t class_get_modifiers(classinfo *c, bool ignoreInnerClassesAttrib);
+java_handle_t *class_get_name(classinfo *c);
+
+#if defined(ENABLE_JAVASE)
+utf *class_get_signature(classinfo *c);
+#endif
/* some debugging functions */