* src/vm/global.h (ACC_CLASS_MEMBER): New define.
authortwisti <none@none>
Fri, 17 Aug 2007 21:21:51 +0000 (21:21 +0000)
committertwisti <none@none>
Fri, 17 Aug 2007 21:21:51 +0000 (21:21 +0000)
(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.

NEWS
src/native/vm/gnu/java_lang_VMClass.c
src/native/vm/java_lang_Class.c
src/native/vm/java_lang_Class.h
src/vm/global.h
src/vmcore/class.c
src/vmcore/class.h

diff --git a/NEWS b/NEWS
index 737fbc2ea1fa24c00d7bbee7e5a137ce3885a744..137b44178a7537a14368a3e9d0991abf6705d597 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,8 @@ New in release 0.99 (August x, 2007)
   * 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)
index 47ce862209750d6dc57465d828649728f8f63158..d07a84124445146695ce8e513a197498a2a2823c 100644 (file)
    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"
@@ -44,6 +47,8 @@
 
 #include "native/vm/java_lang_Class.h"
 
+#include "vmcore/class.h"
+
 
 /* native methods implemented by this file ************************************/
 
@@ -73,11 +78,9 @@ static JNINativeMethod methods[] = {
        { "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
 };
 
 
@@ -322,7 +325,14 @@ JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredA
  */
 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;
 }
 
 
@@ -359,13 +369,15 @@ JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getClassSignature(JNI
 }
 
 
-#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);
+}
 
 
 /*
@@ -373,7 +385,10 @@ JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isAnonymousClass(JNIEnv *env, jclass
  * 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);
+}
 
 
 /*
@@ -381,8 +396,10 @@ JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isLocalClass(JNIEnv *env, jclass cla
  * 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);
+}
 
 
 /*
index e7eee391d490dce573863bb2f414128e93e2c70e..ed55b58d809842c787c38f8daa81741dab675d16 100644 (file)
@@ -22,7 +22,7 @@
    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 $
 
 */
 
@@ -688,41 +688,6 @@ java_handle_objectarray_t *_Jv_java_lang_Class_getDeclaredAnnotations(java_lang_
 #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
@@ -732,35 +697,23 @@ java_lang_Class *_Jv_java_lang_Class_getEnclosingClass(java_lang_Class *klass)
 
 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);
@@ -862,32 +815,6 @@ java_lang_String *_Jv_java_lang_Class_getClassSignature(java_lang_Class* klass)
        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 */
 
 
index a13dd724654f39e94431216dbc0ef82f5a0d9d6c..676d1d53a765bfaedf578f8bb9c008082238cf4b 100644 (file)
@@ -86,19 +86,12 @@ void                           _Jv_java_lang_Class_throwException(java_lang_Thro
 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 */
 
 
index e462ba259cbec8f0044182857ced2c4b09fdd768..a1891dae83f44c9a754ace0e0f09e57b788271c8 100644 (file)
@@ -22,7 +22,7 @@
    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 $
 
 */
 
@@ -177,14 +177,16 @@ typedef struct java_objectarray_t java_objectarray_t;
 
 #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 *******************************************/
index b33227872c0693adaa84cb9c64e77578cbf70aef..05f04dffd456390b493828282e52c45bfb1ff38c 100644 (file)
@@ -22,7 +22,7 @@
    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 $
 
 */
 
@@ -520,11 +520,16 @@ static bool class_load_attribute_enclosingmethod(classbuffer *cb)
 
 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;
 
@@ -574,19 +579,45 @@ bool class_load_attributes(classbuffer *cb)
                        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) {
@@ -1605,6 +1636,21 @@ bool class_is_primitive(classinfo *c)
 }
 
 
+/* 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.
@@ -1636,6 +1682,36 @@ bool class_is_interface(classinfo *c)
 }
 
 
+/* 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
@@ -1722,9 +1798,15 @@ java_handle_objectarray_t *class_get_declaredclasses(classinfo *c, bool publicOn
                /* 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;
@@ -1748,6 +1830,12 @@ java_handle_objectarray_t *class_get_declaredclasses(classinfo *c, bool publicOn
                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. */
 
@@ -1785,52 +1873,71 @@ java_handle_objectarray_t *class_get_declaredclasses(classinfo *c, bool publicOn
 
 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;
 }
 
 
index 6c450de738db6ea7d69528c0411267550b7c8ec7..7c5042407deea7933dac3d114e6f6c534e29e0fb 100644 (file)
@@ -22,7 +22,7 @@
    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 $
 
 */
 
@@ -138,6 +138,8 @@ struct classinfo {                /* class structure                          */
        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               */
@@ -357,20 +359,25 @@ methodinfo *class_resolvemethod(classinfo *c, utf *name, utf *dest);
 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 */