Changes: Joseph Wenninger
Christian Thalinger
- Edwin Steiner
+ Edwin Steiner
- $Id: VMClass.c 4589 2006-03-13 08:02:58Z edwin $
+ $Id: VMClass.c 4725 2006-04-04 08:45:43Z twisti $
*/
/*
- * Class: java/lang/VMClass
- * Method: forName
- * Signature: (Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;
+ * Class: java/lang/Class
+ * Method: isInstance
+ * Signature: (Ljava/lang/Object;)Z
*/
-JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_forName(JNIEnv *env, jclass clazz, java_lang_String *name, s4 initialize, java_lang_ClassLoader *loader)
+JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInstance(JNIEnv *env, jclass clazz, java_lang_Class *klass, java_lang_Object *o)
{
- classinfo *c;
- utf *u;
- u2 *pos;
- s4 i;
+ classinfo *c;
+ java_objectheader *ob;
- /* illegal argument */
+ c = (classinfo *) klass;
+ ob = (java_objectheader *) o;
- if (!name)
- return NULL;
+ if (!(c->state & CLASS_LINKED))
+ if (!link_class(c))
+ return 0;
- /* name must not contain '/' (mauve test) */
+ return builtin_instanceof(ob, c);
+}
- for (i = 0, pos = name->value->data + name->offset; i < name->count; i++, pos++) {
- if (*pos == '/') {
- *exceptionptr =
- new_exception_javastring(string_java_lang_ClassNotFoundException, name);
- return NULL;
- }
+
+/*
+ * Class: java/lang/Class
+ * Method: isAssignableFrom
+ * Signature: (Ljava/lang/Class;)Z
+ */
+JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isAssignableFrom(JNIEnv *env, jclass clazz, java_lang_Class *klass, java_lang_Class *c)
+{
+ classinfo *kc;
+ classinfo *cc;
+
+ kc = (classinfo *) klass;
+ cc = (classinfo *) c;
+
+ if (cc == NULL) {
+ exceptions_throw_nullpointerexception();
+ return 0;
}
- /* create utf string in which '.' is replaced by '/' */
+ if (!(kc->state & CLASS_LINKED))
+ if (!link_class(kc))
+ return 0;
- u = javastring_toutf(name, true);
+ if (!(cc->state & CLASS_LINKED))
+ if (!link_class(cc))
+ return 0;
- /* try to load, ... */
+ /* XXX this may be wrong for array classes */
- if (!(c = load_class_from_classloader(u, (java_objectheader *) loader))) {
- classinfo *xclass;
+ return builtin_isanysubclass(cc, kc);
+}
- xclass = (*exceptionptr)->vftbl->class;
- /* if the exception is a NoClassDefFoundError, we replace it with a
- ClassNotFoundException, otherwise return the exception */
+/*
+ * Class: java/lang/Class
+ * Method: isInterface
+ * Signature: ()Z
+ */
+JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInterface(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+{
+ classinfo *c;
- if (xclass == class_java_lang_NoClassDefFoundError) {
- /* clear exceptionptr, because builtin_new checks for
- ExceptionInInitializerError */
- *exceptionptr = NULL;
+ c = (classinfo *) klass;
- *exceptionptr =
- new_exception_javastring(string_java_lang_ClassNotFoundException, name);
- }
+ if (c->flags & ACC_INTERFACE)
+ return true;
- return NULL;
+ return false;
+}
+
+
+/*
+ * Class: java/lang/Class
+ * Method: isPrimitive
+ * Signature: ()Z
+ */
+JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isPrimitive(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+{
+ classinfo *c;
+ s4 i;
+
+ c = (classinfo *) klass;
+
+ /* search table of primitive classes */
+
+ for (i = 0; i < PRIMITIVETYPE_COUNT; i++)
+ if (primitivetype_table[i].class_primitive == c)
+ return true;
+
+ return false;
+}
+
+
+/*
+ * Class: java/lang/VMClass
+ * Method: getName
+ * Signature: ()Ljava/lang/String;
+ */
+JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getName(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+{
+ classinfo *c;
+ java_lang_String *s;
+ u4 i;
+
+ c = (classinfo *) klass;
+ s = (java_lang_String *) javastring_new(c->name);
+
+ if (!s)
+ return NULL;
+
+ /* return string where '/' is replaced by '.' */
+
+ for (i = 0; i < s->value->header.size; i++) {
+ if (s->value->data[i] == '/')
+ s->value->data[i] = '.';
}
- /* link, ... */
+ return s;
+}
- if (!link_class(c))
+
+/*
+ * Class: java/lang/Class
+ * Method: getSuperclass
+ * Signature: ()Ljava/lang/Class;
+ */
+JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getSuperclass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+{
+ classinfo *c;
+ classinfo *sc;
+
+ c = (classinfo *) klass;
+
+ /* for java.lang.Object, primitive and Void classes we return NULL */
+ if (!c->super.any)
return NULL;
-
- /* ...and initialize it, if required */
- if (initialize)
- if (!initialize_class(c))
- return NULL;
+ /* for interfaces we also return NULL */
+ if (c->flags & ACC_INTERFACE)
+ return NULL;
- return (java_lang_Class *) c;
+ /* we may have to resolve the super class reference */
+ if (!resolve_classref_or_classinfo(NULL, c->super, resolveEager,
+ true, /* check access */
+ false, /* don't link */
+ &sc))
+ {
+ return NULL;
+ }
+
+ /* store the resolution */
+ c->super.cls = sc;
+
+ return (java_lang_Class *) sc;
}
/*
* Class: java/lang/VMClass
- * Method: getClassLoader
- * Signature: ()Ljava/lang/ClassLoader;
+ * Method: getInterfaces
+ * Signature: ()[Ljava/lang/Class;
*/
-JNIEXPORT java_lang_ClassLoader* JNICALL Java_java_lang_VMClass_getClassLoader(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getInterfaces(JNIEnv *env, jclass clazz, java_lang_Class *klass)
{
- classinfo *c;
+ classinfo *c;
+ classinfo *ic;
+ java_objectarray *oa;
+ u4 i;
c = (classinfo *) klass;
- return (java_lang_ClassLoader *) c->classloader;
+ if (!(c->state & CLASS_LINKED))
+ if (!link_class(c))
+ return NULL;
+
+ oa = builtin_anewarray(c->interfacescount, class_java_lang_Class);
+
+ if (!oa)
+ return NULL;
+
+ for (i = 0; i < c->interfacescount; i++) {
+ ic = c->interfaces[i].cls;
+
+ oa->data[i] = (java_objectheader *) ic;
+ }
+
+ return oa;
}
/*
* Class: java/lang/VMClass
- * Method: getDeclaredConstructors
- * Signature: (Z)[Ljava/lang/reflect/Constructor;
+ * Method: getModifiers
+ * Signature: (Z)I
*/
-JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredConstructors(JNIEnv *env, jclass clazz, java_lang_Class *klass, s4 publicOnly)
+JNIEXPORT s4 JNICALL Java_java_lang_VMClass_getModifiers(JNIEnv *env, jclass clazz, java_lang_Class *klass, s4 ignoreInnerClassesAttrib)
{
- classinfo *c;
- methodinfo *m; /* the current method to be represented */
- java_objectarray *oa; /* result: array of Method-objects */
- java_objectheader *o;
- java_lang_reflect_Constructor *rc;
- s4 public_methods; /* number of public methods of the class */
- s4 pos;
- s4 i;
+ classinfo *c;
+ classref_or_classinfo inner;
+ classref_or_classinfo outer;
+ utf *innername;
+ s4 i;
c = (classinfo *) klass;
- /* determine number of constructors */
+ if (!ignoreInnerClassesAttrib && (c->innerclasscount != 0)) {
+ /* search for passed class as inner class */
- for (i = 0, public_methods = 0; i < c->methodscount; i++) {
- m = &c->methods[i];
+ for (i = 0; i < c->innerclasscount; i++) {
+ inner = c->innerclass[i].inner_class;
+ outer = c->innerclass[i].outer_class;
- if (((m->flags & ACC_PUBLIC) || (publicOnly == 0)) &&
- (m->name == utf_init))
- public_methods++;
+ /* Check if inner is a classref or a real class and get
+ the name of the structure */
+
+ innername = IS_CLASSREF(inner) ? inner.ref->name : inner.cls->name;
+
+ /* innerclass is this class */
+
+ if (innername == c->name) {
+ /* has the class actually an outer class? */
+
+ if (outer.any)
+ /* return flags got from the outer class file */
+ return c->innerclass[i].flags;
+ else
+ return c->flags;
+ }
+ }
}
- oa = builtin_anewarray(public_methods, class_java_lang_reflect_Constructor);
+ /* passed class is no inner class or it was not requested */
- if (!oa)
- return NULL;
+ return c->flags;
+}
- for (i = 0, pos = 0; i < c->methodscount; i++) {
- m = &c->methods[i];
- if (((m->flags & ACC_PUBLIC) || (publicOnly == 0)) &&
- (m->name == utf_init)) {
+/*
+ * Class: java/lang/VMClass
+ * Method: getDeclaringClass
+ * Signature: ()Ljava/lang/Class;
+ */
+JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getDeclaringClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+{
+ classinfo *c;
+ classref_or_classinfo inner;
+ utf *innername;
+ classinfo *outer;
+ s4 i;
- if (!(o = native_new_and_init(class_java_lang_reflect_Constructor)))
- return NULL;
+ c = (classinfo *) klass;
- /* initialize instance fields */
+ if (!Java_java_lang_VMClass_isPrimitive(env, clazz, klass) &&
+ (c->name->text[0] != '[')) {
- rc = (java_lang_reflect_Constructor *) o;
+ if (c->innerclasscount == 0) /* no innerclasses exist */
+ return NULL;
+
+ for (i = 0; i < c->innerclasscount; i++) {
+ inner = c->innerclass[i].inner_class;
- rc->clazz = (java_lang_Class *) c;
- rc->slot = i;
+ /* check if inner_class is a classref or a real class and
+ get the class name from the structure */
- /* store object into array */
+ innername = IS_CLASSREF(inner) ? inner.ref->name : inner.cls->name;
- oa->data[pos++] = o;
+ /* innerclass is this class */
+
+ if (innername == c->name) {
+ /* maybe the outer class is not loaded yet */
+
+ if (!resolve_classref_or_classinfo(NULL,
+ c->innerclass[i].outer_class,
+ resolveEager, false, false,
+ &outer))
+ return NULL;
+
+ if (!(outer->state & CLASS_LINKED))
+ if (!link_class(outer))
+ return NULL;
+
+ return (java_lang_Class *) outer;
+ }
}
}
- return oa;
+ /* return NULL for arrayclasses and primitive classes */
+
+ return NULL;
}
}
-/*
- * Class: java/lang/VMClass
- * Method: getDeclaringClass
- * Signature: ()Ljava/lang/Class;
- */
-JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getDeclaringClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
-{
- classinfo *c;
- classref_or_classinfo inner;
- utf *innername;
- classinfo *outer;
- s4 i;
-
- c = (classinfo *) klass;
-
- if (!Java_java_lang_VMClass_isPrimitive(env, clazz, klass) &&
- (c->name->text[0] != '[')) {
-
- if (c->innerclasscount == 0) /* no innerclasses exist */
- return NULL;
-
- for (i = 0; i < c->innerclasscount; i++) {
- inner = c->innerclass[i].inner_class;
-
- /* check if inner_class is a classref or a real class and
- get the class name from the structure */
-
- innername = IS_CLASSREF(inner) ? inner.ref->name : inner.cls->name;
-
- /* innerclass is this class */
-
- if (innername == c->name) {
- /* maybe the outer class is not loaded yet */
-
- if (!resolve_classref_or_classinfo(NULL,
- c->innerclass[i].outer_class,
- resolveEager, false, false,
- &outer))
- return NULL;
-
- if (!(outer->state & CLASS_LINKED))
- if (!link_class(outer))
- return NULL;
-
- return (java_lang_Class *) outer;
- }
- }
- }
-
- /* return NULL for arrayclasses and primitive classes */
-
- return NULL;
-}
-
-
/*
* Class: java/lang/VMClass
* Method: getDeclaredFields
/* initialize instance fields */
- rf = (java_lang_reflect_Field *) o;
-
- rf->declaringClass = (java_lang_Class *) c;
- rf->name = javastring_new(f->name);
- rf->slot = i;
-
- /* store object into array */
-
- oa->data[pos++] = o;
- }
- }
-
- return oa;
-}
-
-
-/*
- * Class: java/lang/VMClass
- * Method: getInterfaces
- * Signature: ()[Ljava/lang/Class;
- */
-JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getInterfaces(JNIEnv *env, jclass clazz, java_lang_Class *klass)
-{
- classinfo *c;
- classinfo *ic;
- java_objectarray *oa;
- u4 i;
-
- c = (classinfo *) klass;
-
- if (!(c->state & CLASS_LINKED))
- if (!link_class(c))
- return NULL;
-
- oa = builtin_anewarray(c->interfacescount, class_java_lang_Class);
+ rf = (java_lang_reflect_Field *) o;
- if (!oa)
- return NULL;
+ rf->declaringClass = (java_lang_Class *) c;
+ rf->name = javastring_new(f->name);
+ rf->slot = i;
- for (i = 0; i < c->interfacescount; i++) {
- ic = c->interfaces[i].cls;
+ /* store object into array */
- oa->data[i] = (java_objectheader *) ic;
+ oa->data[pos++] = o;
+ }
}
return oa;
/*
* Class: java/lang/VMClass
- * Method: getModifiers
- * Signature: (Z)I
+ * Method: getDeclaredConstructors
+ * Signature: (Z)[Ljava/lang/reflect/Constructor;
*/
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_getModifiers(JNIEnv *env, jclass clazz, java_lang_Class *klass, s4 ignoreInnerClassesAttrib)
+JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredConstructors(JNIEnv *env, jclass clazz, java_lang_Class *klass, s4 publicOnly)
{
- classinfo *c;
- classref_or_classinfo inner;
- classref_or_classinfo outer;
- utf *innername;
- s4 i;
+ classinfo *c;
+ methodinfo *m; /* the current method to be represented */
+ java_objectarray *oa; /* result: array of Method-objects */
+ java_objectheader *o;
+ java_lang_reflect_Constructor *rc;
+ s4 public_methods; /* number of public methods of the class */
+ s4 pos;
+ s4 i;
c = (classinfo *) klass;
- if (!ignoreInnerClassesAttrib && (c->innerclasscount != 0)) {
- /* search for passed class as inner class */
-
- for (i = 0; i < c->innerclasscount; i++) {
- inner = c->innerclass[i].inner_class;
- outer = c->innerclass[i].outer_class;
-
- /* Check if inner is a classref or a real class and get
- the name of the structure */
+ /* determine number of constructors */
- innername = IS_CLASSREF(inner) ? inner.ref->name : inner.cls->name;
+ for (i = 0, public_methods = 0; i < c->methodscount; i++) {
+ m = &c->methods[i];
- /* innerclass is this class */
+ if (((m->flags & ACC_PUBLIC) || (publicOnly == 0)) &&
+ (m->name == utf_init))
+ public_methods++;
+ }
- if (innername == c->name) {
- /* has the class actually an outer class? */
+ oa = builtin_anewarray(public_methods, class_java_lang_reflect_Constructor);
- if (outer.any)
- /* return flags got from the outer class file */
- return c->innerclass[i].flags;
- else
- return c->flags;
- }
- }
- }
+ if (!oa)
+ return NULL;
- /* passed class is no inner class or it was not requested */
+ for (i = 0, pos = 0; i < c->methodscount; i++) {
+ m = &c->methods[i];
- return c->flags;
-}
+ if (((m->flags & ACC_PUBLIC) || (publicOnly == 0)) &&
+ (m->name == utf_init)) {
+ if (!(o = native_new_and_init(class_java_lang_reflect_Constructor)))
+ return NULL;
-/*
- * Class: java/lang/VMClass
- * Method: getName
- * Signature: ()Ljava/lang/String;
- */
-JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getName(JNIEnv *env, jclass clazz, java_lang_Class *klass)
-{
- classinfo *c;
- java_lang_String *s;
- u4 i;
+ /* initialize instance fields */
- c = (classinfo *) klass;
- s = (java_lang_String *) javastring_new(c->name);
+ rc = (java_lang_reflect_Constructor *) o;
- if (!s)
- return NULL;
+ rc->clazz = (java_lang_Class *) c;
+ rc->slot = i;
- /* return string where '/' is replaced by '.' */
+ /* store object into array */
- for (i = 0; i < s->value->header.size; i++) {
- if (s->value->data[i] == '/')
- s->value->data[i] = '.';
+ oa->data[pos++] = o;
+ }
}
- return s;
+ return oa;
}
/*
- * Class: java/lang/Class
- * Method: getSuperclass
- * Signature: ()Ljava/lang/Class;
+ * Class: java/lang/VMClass
+ * Method: getClassLoader
+ * Signature: ()Ljava/lang/ClassLoader;
*/
-JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getSuperclass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+JNIEXPORT java_lang_ClassLoader* JNICALL Java_java_lang_VMClass_getClassLoader(JNIEnv *env, jclass clazz, java_lang_Class *klass)
{
classinfo *c;
- classinfo *sc;
c = (classinfo *) klass;
- /* for java.lang.Object, primitive and Void classes we return NULL */
- if (!c->super.any)
- return NULL;
-
- /* for interfaces we also return NULL */
- if (c->flags & ACC_INTERFACE)
- return NULL;
-
- /* we may have to resolve the super class reference */
- if (!resolve_classref_or_classinfo(NULL, c->super, resolveEager,
- true, /* check access */
- false, /* don't link */
- &sc))
- {
- return NULL;
- }
-
- /* store the resolution */
- c->super.cls = sc;
-
- return (java_lang_Class *) sc;
+ return (java_lang_ClassLoader *) c->classloader;
}
/*
- * Class: java/lang/Class
- * Method: isArray
- * Signature: ()Z
+ * Class: java/lang/VMClass
+ * Method: forName
+ * Signature: (Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;
*/
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isArray(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_forName(JNIEnv *env, jclass clazz, java_lang_String *name, s4 initialize, java_lang_ClassLoader *loader)
{
- classinfo *c = (classinfo *) klass;
-
- if (!(c->state & CLASS_LINKED))
- if (!link_class(c))
- return 0;
-
- return (c->vftbl->arraydesc != NULL);
-}
+ classinfo *c;
+ utf *u;
+ u2 *pos;
+ s4 i;
+ /* illegal argument */
-/*
- * Class: java/lang/Class
- * Method: isAssignableFrom
- * Signature: (Ljava/lang/Class;)Z
- */
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isAssignableFrom(JNIEnv *env, jclass clazz, java_lang_Class *klass, java_lang_Class *c)
-{
- classinfo *kc;
- classinfo *cc;
+ if (!name)
+ return NULL;
- kc = (classinfo *) klass;
- cc = (classinfo *) c;
+ /* name must not contain '/' (mauve test) */
- if (cc == NULL) {
- exceptions_throw_nullpointerexception();
- return 0;
+ for (i = 0, pos = name->value->data + name->offset; i < name->count; i++, pos++) {
+ if (*pos == '/') {
+ *exceptionptr =
+ new_exception_javastring(string_java_lang_ClassNotFoundException, name);
+ return NULL;
+ }
}
- if (!(kc->state & CLASS_LINKED))
- if (!link_class(kc))
- return 0;
-
- if (!(cc->state & CLASS_LINKED))
- if (!link_class(cc))
- return 0;
+ /* create utf string in which '.' is replaced by '/' */
- /* XXX this may be wrong for array classes */
+ u = javastring_toutf(name, true);
- return builtin_isanysubclass(cc, kc);
-}
+ /* try to load, ... */
+ if (!(c = load_class_from_classloader(u, (java_objectheader *) loader))) {
+ classinfo *xclass;
-/*
- * Class: java/lang/Class
- * Method: isInstance
- * Signature: (Ljava/lang/Object;)Z
- */
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInstance(JNIEnv *env, jclass clazz, java_lang_Class *klass, java_lang_Object *o)
-{
- classinfo *c;
- java_objectheader *ob;
+ xclass = (*exceptionptr)->vftbl->class;
- c = (classinfo *) klass;
- ob = (java_objectheader *) o;
+ /* if the exception is a NoClassDefFoundError, we replace it with a
+ ClassNotFoundException, otherwise return the exception */
- if (!(c->state & CLASS_LINKED))
- if (!link_class(c))
- return 0;
+ if (xclass == class_java_lang_NoClassDefFoundError) {
+ /* clear exceptionptr, because builtin_new checks for
+ ExceptionInInitializerError */
+ *exceptionptr = NULL;
- return builtin_instanceof(ob, c);
-}
+ *exceptionptr =
+ new_exception_javastring(string_java_lang_ClassNotFoundException, name);
+ }
+ return NULL;
+ }
-/*
- * Class: java/lang/Class
- * Method: isInterface
- * Signature: ()Z
- */
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInterface(JNIEnv *env, jclass clazz, java_lang_Class *klass)
-{
- classinfo *c;
+ /* link, ... */
- c = (classinfo *) klass;
+ if (!link_class(c))
+ return NULL;
+
+ /* ...and initialize it, if required */
- if (c->flags & ACC_INTERFACE)
- return true;
+ if (initialize)
+ if (!initialize_class(c))
+ return NULL;
- return false;
+ return (java_lang_Class *) c;
}
/*
* Class: java/lang/Class
- * Method: isPrimitive
+ * Method: isArray
* Signature: ()Z
*/
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isPrimitive(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isArray(JNIEnv *env, jclass clazz, java_lang_Class *klass)
{
- classinfo *c;
- s4 i;
-
- c = (classinfo *) klass;
-
- /* search table of primitive classes */
+ classinfo *c = (classinfo *) klass;
- for (i = 0; i < PRIMITIVETYPE_COUNT; i++)
- if (primitivetype_table[i].class_primitive == c)
- return true;
+ if (!(c->state & CLASS_LINKED))
+ if (!link_class(c))
+ return 0;
- return false;
+ return (c->vftbl->arraydesc != NULL);
}