(ACC_CLASS_ANONYMOUS): Likewise.
* src/native/vm/java_lang_Class.c
(_Jv_java_lang_Class_getEnclosingClass): Removed.
(_Jv_java_lang_Class_getEnclosingMethod_intern): Use
class_get_enclosingclass.
* src/native/vm/java_lang_Class.h
(_Jv_java_lang_Class_getEnclosingClass): Removed.
* src/native/vm/gnu/java_lang_VMClass.c (stdint.h): Added.
(vmcore/class.h): Likewise.
(methods): Enabled isAnonymousClass, isLocalClass and isMemberClass.
(Java_java_lang_VMClass_getEnclosingClass): Use
class_get_enclosingclass.
(isAnonymousClass): Implemented.
(isLocalClass): Likewise.
(isMemberClass): Likewise.
* src/vmcore/class.c (class_load_attributes): Set ACC_CLASS_MEMBER and
ACC_CLASS_ANONYMOUS flags.
(class_is_anonymousclass): New function.
(class_is_localclass): Likewise.
(class_is_memberclass): Likewise.
(class_get_declaredclasses): Check if outer is NULL.
(class_get_declaringclass): Rewritten to use c->declaringclass.
(class_get_enclosingclass): New function.
* src/vmcore/class.h (classinfo): Added declaringclass.(
(class_is_anonymousclass): New function.
(class_is_localclass): Likewise.
(class_is_memberclass): Likewise.
(class_get_enclosingclass): Likewise.
* NEWS: Added news.
* Use 8-byte stack-slots on all architectures.
* Faster C-to-Java calls.
* Removed genoffsets, cross-compilation is now much easier.
+ * Implemented Class.isAnonymousClass(), isLocalClass() and
+ isMemberClass() for GNU Classpath.
New in release 0.98 (June 6, 2007)
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: java_lang_VMClass.c 8330 2007-08-16 18:15:51Z twisti $
+ $Id: java_lang_VMClass.c 8339 2007-08-17 21:21:51Z twisti $
*/
#include "config.h"
+
+#include <stdint.h>
+
#include "vm/types.h"
#include "native/jni.h"
#include "native/vm/java_lang_Class.h"
+#include "vmcore/class.h"
+
/* native methods implemented by this file ************************************/
{ "getEnclosingConstructor", "(Ljava/lang/Class;)Ljava/lang/reflect/Constructor;", (void *) (ptrint) &Java_java_lang_VMClass_getEnclosingConstructor },
{ "getEnclosingMethod", "(Ljava/lang/Class;)Ljava/lang/reflect/Method;", (void *) (ptrint) &Java_java_lang_VMClass_getEnclosingMethod },
{ "getClassSignature", "(Ljava/lang/Class;)Ljava/lang/String;", (void *) (ptrint) &Java_java_lang_VMClass_getClassSignature },
-#if 0
{ "isAnonymousClass", "(Ljava/lang/Class;)Z", (void *) (ptrint) &Java_java_lang_VMClass_isAnonymousClass },
{ "isLocalClass", "(Ljava/lang/Class;)Z", (void *) (ptrint) &Java_java_lang_VMClass_isLocalClass },
{ "isMemberClass", "(Ljava/lang/Class;)Z", (void *) (ptrint) &Java_java_lang_VMClass_isMemberClass },
-#endif
};
*/
JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getEnclosingClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
{
- return _Jv_java_lang_Class_getEnclosingClass(klass);
+ classinfo *c;
+ classinfo *result;
+
+ c = (classinfo *) klass;
+
+ result = class_get_enclosingclass(c)
+
+ return (java_lang_Class *) result;
}
}
-#if 0
/*
* Class: java/lang/VMClass
* Method: isAnonymousClass
* Signature: (Ljava/lang/Class;)Z
*/
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isAnonymousClass(JNIEnv *env, jclass clazz, struct java_lang_Class* par1);
+JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isAnonymousClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+{
+ return class_is_anonymousclass((classinfo *) klass);
+}
/*
* Method: isLocalClass
* Signature: (Ljava/lang/Class;)Z
*/
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isLocalClass(JNIEnv *env, jclass clazz, struct java_lang_Class* par1);
+JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isLocalClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+{
+ return class_is_localclass((classinfo *) klass);
+}
/*
* Method: isMemberClass
* Signature: (Ljava/lang/Class;)Z
*/
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isMemberClass(JNIEnv *env, jclass clazz, struct java_lang_Class* par1);
-#endif
+JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isMemberClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+{
+ return class_is_memberclass((classinfo *) klass);
+}
/*
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: java_lang_Class.c 8330 2007-08-16 18:15:51Z twisti $
+ $Id: java_lang_Class.c 8339 2007-08-17 21:21:51Z twisti $
*/
#endif
-/*
- * Class: java/lang/Class
- * Method: getEnclosingClass
- * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
- */
-java_lang_Class *_Jv_java_lang_Class_getEnclosingClass(java_lang_Class *klass)
-{
- classinfo *c;
- classref_or_classinfo cr;
- classinfo *ec;
-
- c = (classinfo *) klass;
-
- /* get enclosing class */
-
- cr = c->enclosingclass;
-
- if (cr.any == NULL)
- return NULL;
-
- /* resolve the class if necessary */
-
- if (IS_CLASSREF(cr)) {
- ec = resolve_classref_eager(cr.ref);
-
- if (ec == NULL)
- return NULL;
- }
- else
- ec = cr.cls;
-
- return (java_lang_Class *) ec;
-}
-
-
/* _Jv_java_lang_Class_getEnclosingMethod_intern *******************************
Helper function for _Jv_java_lang_Class_getEnclosingConstructor and
static methodinfo *_Jv_java_lang_Class_getEnclosingMethod_intern(classinfo *c)
{
- classref_or_classinfo cr;
- constant_nameandtype *cn;
- classinfo *ec;
- methodinfo *m;
+ constant_nameandtype *cn;
+ classinfo *ec;
+ methodinfo *m;
/* get enclosing class and method */
- cr = c->enclosingclass;
+ ec = class_get_enclosingclass(c);
cn = c->enclosingmethod;
/* check for enclosing class and method */
- if (cr.any == NULL)
+ if (ec == NULL)
return NULL;
if (cn == NULL)
return NULL;
- /* resolve the class if necessary */
-
- if (IS_CLASSREF(cr)) {
- ec = resolve_classref_eager(cr.ref);
-
- if (ec == NULL)
- return NULL;
- }
- else
- ec = cr.cls;
-
/* find method in enclosing class */
m = class_findmethod(ec, cn->name, cn->descriptor);
return (java_lang_String *) o;
}
-
-#if 0
-/*
- * Class: java/lang/Class
- * Method: isAnonymousClass
- * Signature: (Ljava/lang/Class;)Z
- */
-s4 _Jv_java_lang_Class_isAnonymousClass(JNIEnv *env, jclass clazz, struct java_lang_Class* par1);
-
-
-/*
- * Class: java/lang/VMClass
- * Method: isLocalClass
- * Signature: (Ljava/lang/Class;)Z
- */
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isLocalClass(JNIEnv *env, jclass clazz, struct java_lang_Class* par1);
-
-
-/*
- * Class: java/lang/VMClass
- * Method: isMemberClass
- * Signature: (Ljava/lang/Class;)Z
- */
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isMemberClass(JNIEnv *env, jclass clazz, struct java_lang_Class* par1);
-#endif
-
#endif /* ENABLE_JAVASE */
java_handle_objectarray_t *_Jv_java_lang_Class_getDeclaredAnnotations(java_lang_Class* klass);
#endif
-java_lang_Class *_Jv_java_lang_Class_getEnclosingClass(java_lang_Class *klass);
java_lang_reflect_Constructor *_Jv_java_lang_Class_getEnclosingConstructor(java_lang_Class *klass);
java_lang_reflect_Method *_Jv_java_lang_Class_getEnclosingMethod(java_lang_Class *klass);
java_lang_String *_Jv_java_lang_Class_getClassSignature(java_lang_Class* klass);
#endif
-#if 0
-s4 _Jv_java_lang_Class_isAnonymousClass(JNIEnv *env, jclass clazz, struct java_lang_Class* par1);
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isLocalClass(JNIEnv *env, jclass clazz, struct java_lang_Class* par1);
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isMemberClass(JNIEnv *env, jclass clazz, struct java_lang_Class* par1);
-#endif
-
#endif /* _JV_JAVA_LANG_CLASS_H */
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: global.h 8318 2007-08-16 10:05:34Z michi $
+ $Id: global.h 8339 2007-08-17 21:21:51Z twisti $
*/
#define ACC_CLASS_REFLECT_MASK 0x0000ffff/* flags reported by reflection */
-#define ACC_CLASS_PRIMITIVE 0x00010000/* class is a primitive class */
+#define ACC_CLASS_PRIMITIVE 0x00010000
+#define ACC_CLASS_MEMBER 0x00020000
+#define ACC_CLASS_ANONYMOUS 0x00040000
-#define ACC_CLASS_HAS_POINTERS 0x00020000/* instance contains pointers */
+#define ACC_CLASS_HAS_POINTERS 0x00080000/* instance contains pointers */
-#define ACC_CLASS_REFERENCE_MASK 0x001c0000
-#define ACC_CLASS_REFERENCE_SOFT 0x00040000
-#define ACC_CLASS_REFERENCE_WEAK 0x00080000
-#define ACC_CLASS_REFERENCE_PHANTOM 0x00100000
+#define ACC_CLASS_REFERENCE_MASK 0x00700000
+#define ACC_CLASS_REFERENCE_SOFT 0x00100000
+#define ACC_CLASS_REFERENCE_WEAK 0x00200000
+#define ACC_CLASS_REFERENCE_PHANTOM 0x00400000
/* special flags used in methodinfo *******************************************/
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: class.c 8330 2007-08-16 18:15:51Z twisti $
+ $Id: class.c 8339 2007-08-17 21:21:51Z twisti $
*/
bool class_load_attributes(classbuffer *cb)
{
- classinfo *c;
- u4 i, j;
- u2 attributes_count;
- u2 attribute_name_index;
- utf *attribute_name;
+ classinfo *c;
+ uint16_t attributes_count;
+ uint16_t attribute_name_index;
+ utf *attribute_name;
+ innerclassinfo *info;
+ classref_or_classinfo inner;
+ classref_or_classinfo outer;
+ utf *name;
+ uint16_t flags;
+ int i, j;
c = cb->class;
for (j = 0; j < c->innerclasscount; j++) {
/* The innerclass structure contains a class with an encoded
name, its defining scope, its simple name and a bitmask of
- the access flags. If an inner class is not a member, its
- outer_class is NULL, if a class is anonymous, its name is
- NULL. */
+ the access flags. */
- innerclassinfo *info = c->innerclass + j;
-
- info->inner_class.ref =
- innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
- info->outer_class.ref =
- innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
- info->name =
- innerclass_getconstant(c, suck_u2(cb), CONSTANT_Utf8);
- info->flags = suck_u2(cb);
+ info = c->innerclass + j;
+
+ inner.ref = innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
+ outer.ref = innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
+ name = innerclass_getconstant(c, suck_u2(cb), CONSTANT_Utf8);
+ flags = suck_u2(cb);
+
+ /* If the current inner-class is the currently loaded
+ class check for some special flags. */
+
+ if (inner.ref->name == c->name) {
+ /* If an inner-class is not a member, its
+ outer-class is NULL. */
+
+ if (outer.ref != NULL) {
+ c->flags |= ACC_CLASS_MEMBER;
+
+ /* A member class doesn't have an
+ EnclosingMethod attribute, so set the
+ enclosing-class to be the same as the
+ declaring-class. */
+
+ c->declaringclass = outer;
+ c->enclosingclass = outer;
+ }
+
+ /* If an inner-class is anonymous, its name is
+ NULL. */
+
+ if (name == NULL)
+ c->flags |= ACC_CLASS_ANONYMOUS;
+ }
+
+ info->inner_class = inner;
+ info->outer_class = outer;
+ info->name = name;
+ info->flags = flags;
}
}
else if (attribute_name == utf_SourceFile) {
}
+/* class_is_anonymousclass *****************************************************
+
+ Checks if the given class is an anonymous class.
+
+*******************************************************************************/
+
+bool class_is_anonymousclass(classinfo *c)
+{
+ if (c->flags & ACC_CLASS_ANONYMOUS)
+ return true;
+
+ return false;
+}
+
+
/* class_is_array **************************************************************
Checks if the given class is an array class.
}
+/* class_is_localclass *********************************************************
+
+ Checks if the given class is a local class.
+
+*******************************************************************************/
+
+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.
+
+*******************************************************************************/
+
+bool class_is_memberclass(classinfo *c)
+{
+ if (c->flags & ACC_CLASS_MEMBER)
+ return true;
+
+ return false;
+}
+
+
/* class_get_superclass ********************************************************
Return the super class of the given class. If the super-field is a
/* Determine number of declared classes. */
for (i = 0; i < c->innerclasscount; i++) {
+ /* Get outer-class. If the inner-class is not a member
+ class, the outer-class is NULL. */
+
outer = c->innerclass[i].outer_class;
- /* Check if outer_class is a classref or a real class and
+ if (outer.any == NULL)
+ continue;
+
+ /* Check if outer-class is a classref or a real class and
get the class name from the structure. */
outername = IS_CLASSREF(outer) ? outer.ref->name : outer.cls->name;
inner = c->innerclass[i].inner_class;
outer = c->innerclass[i].outer_class;
+ /* Get outer-class. If the inner-class is not a member class,
+ the outer-class is NULL. */
+
+ if (outer.any == NULL)
+ continue;
+
/* Check if outer_class is a classref or a real class and get
the class name from the structure. */
classinfo *class_get_declaringclass(classinfo *c)
{
- classref_or_classinfo innercr;
- utf *innername;
- classref_or_classinfo outercr;
- classinfo *outer;
- int16_t i;
+ classref_or_classinfo cr;
+ classinfo *dc;
+
+ /* Get declaring class. */
- /* return NULL for arrayclasses and primitive classes */
+ cr = c->declaringclass;
- if (class_is_primitive(c) || (c->name->text[0] == '['))
+ if (cr.any == NULL)
return NULL;
- /* no innerclasses exist */
+ /* Resolve the class if necessary. */
- if (c->innerclasscount == 0)
- return NULL;
+ if (IS_CLASSREF(cr)) {
+/* dc = resolve_classref_eager(cr.ref); */
+ dc = resolve_classref_or_classinfo_eager(cr, true);
- for (i = 0; i < c->innerclasscount; i++) {
- /* Check if inner_class is a classref or a real class and get
- the class name from the structure. */
+ if (dc == NULL)
+ return NULL;
+
+ /* Store the resolved class in the class structure. */
- innercr = c->innerclass[i].inner_class;
+ cr.cls = dc;
+ }
- innername = IS_CLASSREF(innercr) ?
- innercr.ref->name : innercr.cls->name;
+ dc = cr.cls;
- /* Is the current innerclass this class? */
+ return dc;
+}
- if (innername == c->name) {
- /* Maybe the outer class is not loaded yet. */
- outercr = c->innerclass[i].outer_class;
+/* class_get_enclosingclass ****************************************************
- outer = resolve_classref_or_classinfo_eager(outercr, false);
+ Return the enclosing class for the given class.
- if (outer == NULL)
- return NULL;
+*******************************************************************************/
- if (!(outer->state & CLASS_LINKED))
- if (!link_class(outer))
- return NULL;
+classinfo *class_get_enclosingclass(classinfo *c)
+{
+ classref_or_classinfo cr;
+ classinfo *ec;
- return outer;
- }
+ /* Get enclosing class. */
+
+ cr = c->enclosingclass;
+
+ if (cr.any == NULL)
+ return NULL;
+
+ /* Resolve the class if necessary. */
+
+ if (IS_CLASSREF(cr)) {
+/* ec = resolve_classref_eager(cr.ref); */
+ ec = resolve_classref_or_classinfo_eager(cr, true);
+
+ if (ec == NULL)
+ return NULL;
+
+ /* Store the resolved class in the class structure. */
+
+ cr.cls = ec;
}
- return NULL;
+ ec = cr.cls;
+
+ return ec;
}
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: class.h 8330 2007-08-16 18:15:51Z twisti $
+ $Id: class.h 8339 2007-08-17 21:21:51Z twisti $
*/
u2 innerclasscount; /* number of inner classes */
innerclassinfo *innerclass;
+ classref_or_classinfo declaringclass;
+
#if defined(ENABLE_JAVASE)
classref_or_classinfo enclosingclass; /* enclosing class */
constant_nameandtype *enclosingmethod; /* enclosing method */
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_isanysubclass(classinfo *sub, classinfo *super);
-bool class_is_primitive(classinfo *c);
-bool class_is_array(classinfo *c);
-bool class_is_interface(classinfo *c);
+bool class_issubclass(classinfo *sub, classinfo *super);
+bool class_isanysubclass(classinfo *sub, classinfo *super);
+
+bool class_is_primitive(classinfo *c);
+bool class_is_anonymousclass(classinfo *c);
+bool class_is_array(classinfo *c);
+bool class_is_interface(classinfo *c);
+bool class_is_localclass(classinfo *c);
+bool class_is_memberclass(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);
classinfo *class_get_declaringclass(classinfo *c);
+classinfo *class_get_enclosingclass(classinfo *c);
java_handle_objectarray_t *class_get_interfaces(classinfo *c);
#if defined(ENABLE_JAVASE)
-utf *class_get_signature(classinfo *c);
+utf *class_get_signature(classinfo *c);
#endif
/* some debugging functions */