-/* nat/VMClass.c -
+/* native/vm/VMClass.c - java/lang/Class
- Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
- R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser,
- M. Probst, S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck,
- P. Tomsich, J. Wenninger
+ Copyright (C) 1996-2005 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
This file is part of CACAO.
Changes: Joseph Wenninger
- $Id: VMClass.c 827 2004-01-03 15:02:53Z twisti $
+ $Id: VMClass.c 1735 2004-12-07 14:33:27Z twisti $
*/
#include <string.h>
-#include "jni.h"
+
#include "types.h"
-#include "global.h"
-#include "builtin.h"
-#include "loader.h"
-#include "native.h"
-#include "tables.h"
-#include "toolbox/loging.h"
-#include "toolbox/memory.h"
-#include "java_lang_Class.h"
-#include "java_lang_reflect_Constructor.h"
-#include "java_lang_reflect_Field.h"
-#include "java_lang_reflect_Method.h"
-#include "java_lang_Throwable.h" /* needed for java_lang_VMClass.h */
-#include "java_lang_VMClass.h"
+#include "mm/memory.h"
+#include "native/jni.h"
+#include "native/native.h"
+#include "native/include/java_lang_Object.h"
+#include "native/include/java_lang_Class.h"
+#include "native/include/java_lang_ClassLoader.h"
+#include "native/include/java_security_ProtectionDomain.h"
+#include "native/include/java_lang_reflect_Constructor.h"
+#include "native/include/java_lang_reflect_Field.h"
+#include "native/include/java_lang_reflect_Method.h"
+#include "native/include/java_lang_Throwable.h" /* java_lang_VMClass.h */
+#include "native/include/java_lang_VMClass.h"
+#include "toolbox/logging.h"
+#include "vm/exceptions.h"
+#include "vm/global.h"
+#include "vm/loader.h"
+#include "vm/tables.h"
+#include "vm/builtin.h"
/* for selecting public members */
* Method: forName
* Signature: (Ljava/lang/String;)Ljava/lang/Class;
*/
-JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClass_forName(JNIEnv *env, jclass clazz, struct java_lang_String* s)
+JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_forName(JNIEnv *env, jclass clazz, java_lang_String *s)
{
classinfo *c;
utf *u;
- if (runverbose) {
- log_text("Java_java_lang_VMClass_forName called");
- log_text(javastring_tochar((java_objectheader*)s));
- }
-
/* illegal argument */
- if (!s) return NULL;
+ if (!s)
+ return NULL;
/* create utf string in which '.' is replaced by '/' */
u = javastring_toutf(s, true);
-
- c = loader_load(u);
- if (c == NULL) {
- /* class was not loaded. raise exception */
- if (runverbose)
- log_text("Setting class not found exception");
- /* there is already an exception (NoClassDefFoundError), but forName()
- returns a ClassNotFoundException */
- exceptionptr =
- native_new_and_init_string(class_java_lang_ClassNotFoundException, s);
+ /* create a new class, ... */
+ c = class_new(u);
+
+ /* load, ... */
+ if (!class_load(c)) {
+ classinfo *xclass;
+
+ xclass = (*exceptionptr)->vftbl->class;
+
+ /* if the exception is a NoClassDefFoundError, we replace it with a
+ ClassNotFoundException, otherwise return the exception */
+
+ if (xclass == class_get(utf_new_char(string_java_lang_NoClassDefFoundError))) {
+ /* clear exceptionptr, because builtin_new checks for
+ ExceptionInInitializerError */
+ *exceptionptr = NULL;
+
+ *exceptionptr =
+ new_exception_javastring(string_java_lang_ClassNotFoundException, s);
+ }
return NULL;
}
- /*log_text("Returning class");*/
- use_class_as_object (c);
+ /* link, ... */
+ if (!class_link(c))
+ return NULL;
+
+ /* ...and initialize it */
+ if (!class_init(c))
+ return NULL;
- return (java_lang_Class*) c;
+ use_class_as_object(c);
+
+ return (java_lang_Class *) c;
}
* Method: getClassLoader
* Signature: ()Ljava/lang/ClassLoader;
*/
-JNIEXPORT struct java_lang_ClassLoader* JNICALL Java_java_lang_VMClass_getClassLoader (JNIEnv *env , struct java_lang_VMClass* this )
+JNIEXPORT java_lang_ClassLoader* JNICALL Java_java_lang_VMClass_getClassLoader(JNIEnv *env, jclass clazz, java_lang_Class *that)
{
- init_systemclassloader();
- return SystemClassLoader;
+ return (java_lang_ClassLoader *) ((classinfo *) that)->classloader;
+
+/* init_systemclassloader();
+
+ return SystemClassLoader;*/
}
/*
* Class: java_lang_VMClass
- * Method: getModifiers
- * Signature: ()I
+ * Method: getComponentType
+ * Signature: ()Ljava/lang/Class;
*/
-JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClass_getComponentType (JNIEnv *env , struct java_lang_VMClass* this )
+JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getComponentType(JNIEnv *env, jclass clazz,java_lang_Class *that)
{
- classinfo *thisclass = (classinfo*) (this->vmData);
+ classinfo *thisclass = (classinfo *) that;
classinfo *c = NULL;
arraydescriptor *desc;
c = primitivetype_table[desc->arraytype].class_primitive;
/* set vftbl */
- use_class_as_object (c);
+ use_class_as_object(c);
}
- return (java_lang_Class*) c;
+ return (java_lang_Class *) c;
}
* Method: getDeclaredConstructors
* Signature: (Z)[Ljava/lang/reflect/Constructor;
*/
-JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredConstructors (JNIEnv *env , struct java_lang_VMClass* this , s4 public_only)
+JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredConstructors(JNIEnv *env, jclass clazz,
+ struct java_lang_Class *that, s4 public_only)
{
- classinfo *c = (classinfo *) (this->vmData);
+ classinfo *c = (classinfo *) that;
java_objectheader *o;
classinfo *class_constructor;
java_objectarray *array_constructor; /* result: array of Method-objects */
int public_methods = 0; /* number of public methods of the class */
int pos = 0;
int i;
- utf *utf_constr=utf_new_char("<init>");
-
-
-
- /*log_text("Java_java_lang_VMClass_getDeclaredConstructors");
- log_plain_utf(c->name);
- log_plain("\n");*/
- /* class_showmethods(c);
- class_showmethods(loader_load(utf_new_char("java/lang/Class")));*/
-
+ utf *utf_constr = utf_new_char("<init>");
/* determine number of constructors */
for (i = 0; i < c->methodscount; i++)
- if ((((c->methods[i].flags & ACC_PUBLIC)) || (!public_only)) &&
- (c->methods[i].name==utf_constr)) public_methods++;
+ if (((c->methods[i].flags & ACC_PUBLIC) || !public_only) &&
+ (c->methods[i].name == utf_constr))
+ public_methods++;
- class_constructor = (classinfo*) loader_load(utf_new_char ("java/lang/reflect/Constructor"));
- if (!class_constructor)
- return NULL;
+ class_constructor = class_new(utf_new_char("java/lang/reflect/Constructor"));
+ if (!class_constructor->loaded)
+ class_load(class_constructor);
+
+ if (!class_constructor->linked)
+ class_link(class_constructor);
array_constructor = builtin_anewarray(public_methods, class_constructor);
return NULL;
for (i = 0; i < c->methodscount; i++)
- if ((c->methods[i].flags & ACC_PUBLIC) || (!public_only)){
-
+ if ((c->methods[i].flags & ACC_PUBLIC) || !public_only){
m = &c->methods[i];
- if (m->name!=utf_constr) continue;
+ if (m->name!=utf_constr)
+ continue;
+
o = native_new_and_init(class_constructor);
array_constructor->data[pos++] = o;
/* array of exceptions declared to be thrown, information not available !! */
- exceptiontypes = builtin_anewarray (0, class_java_lang_Class);
+ exceptiontypes = builtin_anewarray(0, class_java_lang_Class);
/* class_showconstantpool(class_constructor);*/
/* initialize instance fields */
setfield_critical(class_constructor,o,"parameterTypes", "[Ljava/lang/Class;", jobject, (jobject) get_parametertypes(m));
}
- /*log_text("leaving Java_java_lang_VMClass_getDeclaredConstructors");*/
return array_constructor;
-
-
-
-
- /* panic("Java_java_lang_Class_getConstructors0 called");
- return NULL;*/
}
* Method: getDeclaredClasses
* Signature: (Z)[Ljava/lang/Class;
*/
-JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredClasses(JNIEnv *env, struct java_lang_VMClass* this , s4 publicOnly)
+JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredClasses(JNIEnv *env, jclass clazz, java_lang_Class *that, s4 publicOnly)
{
+#if defined(__GNUC__)
#warning fix the public only case
- classinfo *c = (classinfo *) (this->vmData);
+#endif
+ classinfo *c = (classinfo *) that;
int pos = 0; /* current declared class */
int declaredclasscount = 0; /* number of declared classes */
java_objectarray *result; /* array of declared classes */
int notPublicOnly = !publicOnly;
int i;
- if (!this)
- return NULL;
-
- if (!this->vmData)
+ if (!that)
return NULL;
/*printf("PublicOnly: %d\n",publicOnly);*/
- if (!Java_java_lang_VMClass_isPrimitive(env, (java_lang_VMClass *) c) && (c->name->text[0] != '[')) {
+ if (!Java_java_lang_VMClass_isPrimitive(env, clazz, (java_lang_Class *) c) && (c->name->text[0] != '[')) {
/* determine number of declared classes */
for (i = 0; i < c->innerclasscount; i++) {
if ( (c->innerclass[i].outer_class == c) && (notPublicOnly || (c->innerclass[i].flags & ACC_PUBLIC)))
result = builtin_anewarray(declaredclasscount, class_java_lang_Class);
for (i = 0; i < c->innerclasscount; i++) {
-
classinfo *inner = c->innerclass[i].inner_class;
classinfo *outer = c->innerclass[i].outer_class;
-
-
+
if ((outer == c) && (notPublicOnly || (inner->flags & ACC_PUBLIC))) {
/* outer class is this class, store innerclass in array */
use_class_as_object(inner);
* Method: getDeclaringClass
* Signature: ()Ljava/lang/Class;
*/
-JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClass_getDeclaringClass ( JNIEnv *env , struct java_lang_VMClass* this)
+JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getDeclaringClass(JNIEnv *env, jclass clazz, struct java_lang_Class *that)
{
+#if defined(__GNUC__)
#warning fixme
- classinfo *c = (classinfo *) (this->vmData);
- log_text("Java_java_lang_VMClass_getDeclaringClass");
+#endif
+ classinfo *c = (classinfo *) that;
- if (this && this->vmData && !Java_java_lang_VMClass_isPrimitive(env, this) && (c->name->text[0]!='[')) {
+ if (that && !Java_java_lang_VMClass_isPrimitive(env, clazz,that) && (c->name->text[0] != '[')) {
int i;
if (c->innerclasscount == 0) /* no innerclasses exist */
return NULL;
for (i = 0; i < c->innerclasscount; i++) {
-
classinfo *inner = c->innerclass[i].inner_class;
classinfo *outer = c->innerclass[i].outer_class;
if (inner == c) {
/* innerclass is this class */
- use_class_as_object (outer);
- return (java_lang_Class*) outer;
+ use_class_as_object(outer);
+ return (java_lang_Class *) outer;
}
}
}
}
-/*
- * Class: java/lang/Class
- * Method: getField0
- * Signature: (Ljava/lang/String;I)Ljava/lang/reflect/Field;
- */
-JNIEXPORT struct java_lang_reflect_Field* JNICALL Java_java_lang_VMClass_getField0 ( JNIEnv *env , struct java_lang_VMClass* this, struct java_lang_String* name, s4 public_only)
+java_lang_reflect_Field* cacao_getField0(JNIEnv *env, java_lang_Class *that, java_lang_String *name, s4 public_only)
{
- classinfo *c, *fieldtype;
+ classinfo *c;
+ classinfo *fieldtype;
fieldinfo *f; /* the field to be represented */
java_lang_reflect_Field *o; /* result: field-object */
- utf *desc; /* the fielddescriptor */
+ utf *desc; /* the fielddescriptor */
int idx;
/* create Field object */
- c = (classinfo*) loader_load(utf_new_char ("java/lang/reflect/Field"));
- o = (java_lang_reflect_Field*) native_new_and_init(c);
+/* c = (classinfo *) loader_load(utf_new_char("java/lang/reflect/Field")); */
+ c = class_new(utf_new_char("java/lang/reflect/Field"));
+ o = (java_lang_reflect_Field *) native_new_and_init(c);
/* get fieldinfo entry */
- idx = class_findfield_index_approx((classinfo*) (this->vmData), javastring_toutf(name, false));
- if (idx<0) {
- exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
+ idx = class_findfield_index_approx((classinfo *) that, javastring_toutf(name, false));
+
+ if (idx < 0) {
+ *exceptionptr = new_exception(string_java_lang_NoSuchFieldException);
return NULL;
}
- f= &(((struct classinfo*)(this->vmData))->fields[idx]);
- if (f) {
- if ( public_only && !(f->flags & ACC_PUBLIC))
- {
- /* field is not public and public only had been requested*/
- exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
- return NULL;
- }
+ f = &(((classinfo *) that)->fields[idx]);
+ if (f) {
+ if (public_only && !(f->flags & ACC_PUBLIC)) {
+ /* field is not public and public only had been requested*/
+ *exceptionptr = new_exception(string_java_lang_NoSuchFieldException);
+ return NULL;
+ }
desc = f->descriptor;
- fieldtype = class_from_descriptor(desc->text,utf_end(desc),NULL,CLASSLOAD_LOAD);
- if (!fieldtype) return NULL;
+ fieldtype = class_from_descriptor(desc->text, utf_end(desc), NULL, CLASSLOAD_LOAD);
+ if (!fieldtype)
+ return NULL;
/* initialize instance fields */
- setfield_critical(c,o,"declaringClass", "Ljava/lang/Class;", jobject, (jobject) (this->vmData) /*this*/);
+ setfield_critical(c,o,"declaringClass", "Ljava/lang/Class;", jobject, (jobject) that /*this*/);
/* ((java_lang_reflect_Field*)(o))->flag=f->flags;*/
/* save type in slot-field for faster processing */
- /* setfield_critical(c,o,"flag", "I", jint, (jint) f->flags); */
+ /* setfield_critical(c,o,"flag", "I", jint, (jint) f->flags); */
+ o->flag = f->flags;
setfield_critical(c,o,"slot", "I", jint, (jint) idx);
setfield_critical(c,o,"name", "Ljava/lang/String;", jstring, (jstring) name);
/*setfield_critical(c,o,"type", "Ljava/lang/Class;", jclass, fieldtype);*/
* Method: getDeclaredFields
* Signature: (Z)[Ljava/lang/reflect/Field;
*/
-JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredFields (JNIEnv *env , struct java_lang_VMClass* this , s4 public_only)
+JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredFields(JNIEnv *env, jclass clazz, java_lang_Class *that, s4 public_only)
{
- classinfo *c = (classinfo *) (this->vmData);
+ classinfo *c = (classinfo *) that;
classinfo *class_field;
java_objectarray *array_field; /* result: array of field-objects */
int public_fields = 0; /* number of elements in field-array */
/* determine number of fields */
for (i = 0; i < c->fieldscount; i++)
- if ((c->fields[i].flags & ACC_PUBLIC) || (!public_only)) public_fields++;
+ if ((c->fields[i].flags & ACC_PUBLIC) || (!public_only))
+ public_fields++;
- class_field = loader_load(utf_new_char("java/lang/reflect/Field"));
+/* class_field = loader_load(utf_new_char("java/lang/reflect/Field")); */
+ class_field = class_new(utf_new_char("java/lang/reflect/Field"));
if (!class_field)
return NULL;
/* get the fields and store in the array */
for (i = 0; i < c->fieldscount; i++)
if ( (c->fields[i].flags & ACC_PUBLIC) || (!public_only))
- array_field->data[pos++] = (java_objectheader*) Java_java_lang_VMClass_getField0
- (env,
- this,
- (java_lang_String*) javastring_new(c->fields[i].name),
- public_only);
+ array_field->data[pos++] =
+ (java_objectheader *) cacao_getField0(env,
+ that, (java_lang_String *) javastring_new(c->fields[i].name),public_only);
return array_field;
}
* Method: getInterfaces
* Signature: ()[Ljava/lang/Class;
*/
-JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getInterfaces ( JNIEnv *env , struct java_lang_VMClass* this)
+JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getInterfaces(JNIEnv *env, jclass clazz, java_lang_Class *that)
{
- classinfo *c = (classinfo*) (this->vmData);
+ classinfo *c = (classinfo *) that;
u4 i;
- java_objectarray *a = builtin_anewarray (c->interfacescount, class_java_lang_Class);
- if (!a) return NULL;
- for (i=0; i<c->interfacescount; i++) {
- use_class_as_object (c->interfaces[i]);
+ java_objectarray *a;
+
+ a = builtin_anewarray(c->interfacescount, class_java_lang_Class);
+
+ if (!a)
+ return NULL;
- a->data[i] = (java_objectheader*) c->interfaces[i];
+ for (i = 0; i < c->interfacescount; i++) {
+ use_class_as_object(c->interfaces[i]);
+
+ a->data[i] = (java_objectheader *) c->interfaces[i];
}
+
return a;
}
-/*
- * Class: java/lang/Class
- * Method: getMethod0
- * Signature: (Ljava/lang/String;[Ljava/lang/Class;I)Ljava/lang/reflect/Method;
- */
-JNIEXPORT struct java_lang_reflect_Method* JNICALL Java_java_lang_VMClass_getMethod0 ( JNIEnv *env , struct java_lang_Class*
- this, struct java_lang_String* name, java_objectarray* types, s4 which)
+java_lang_reflect_Method* cacao_getMethod0(JNIEnv *env, java_lang_Class *that, java_lang_String *name, java_objectarray *types, s4 which)
{
classinfo *c;
- classinfo *clazz = (classinfo *) this;
+ classinfo *clazz = (classinfo *) that;
java_lang_reflect_Method* o; /* result: Method-object */
java_objectarray *exceptiontypes; /* the exceptions thrown by the method */
methodinfo *m; /* the method to be represented */
- c = (classinfo*) loader_load(utf_new_char ("java/lang/reflect/Method"));
- o = (java_lang_reflect_Method*) native_new_and_init(c);
+/* c = (classinfo *) loader_load(utf_new_char("java/lang/reflect/Method")); */
+ c = class_new(utf_new_char("java/lang/reflect/Method"));
+ o = (java_lang_reflect_Method *) native_new_and_init(c);
/* find the method */
- m = class_resolvemethod_approx (
- clazz,
- javastring_toutf(name, false),
- create_methodsig(types,0)
- );
-
- if (!m || (which==MEMBER_PUBLIC && !(m->flags & ACC_PUBLIC)))
- {
- /* no apropriate method was found */
- exceptionptr = native_new_and_init (class_java_lang_NoSuchMethodException);
- return NULL;
- }
+ m = class_resolvemethod_approx(clazz,
+ javastring_toutf(name, false),
+ create_methodsig(types,0)
+ );
+
+ if (!m || (which == MEMBER_PUBLIC && !(m->flags & ACC_PUBLIC))) {
+ /* no apropriate method was found */
+ *exceptionptr = new_exception(string_java_lang_NoSuchMethodException);
+ return NULL;
+ }
- /* array of exceptions declared to be thrown, information not available !! */
- exceptiontypes = builtin_anewarray (0, class_java_lang_Class);
+ /* array of exceptions declared to be thrown, information not available! */
+ exceptiontypes = builtin_anewarray(0, class_java_lang_Class);
/* initialize instance fields */
- setfield_critical(c,o,"clazz", "Ljava/lang/Class;", jobject, (jobject) clazz /*this*/);
- setfield_critical(c,o,"parameterTypes", "[Ljava/lang/Class;", jobject, (jobject) types);
- setfield_critical(c,o,"exceptionTypes", "[Ljava/lang/Class;", jobject, (jobject) exceptiontypes);
- setfield_critical(c,o,"name", "Ljava/lang/String;", jstring, javastring_new(m->name));
- setfield_critical(c,o,"modifiers", "I", jint, m->flags);
- setfield_critical(c,o,"slot", "I", jint, 0);
- setfield_critical(c,o,"returnType", "Ljava/lang/Class;", jclass, get_returntype(m));
+
+ setfield_critical(c, o, "clazz", "Ljava/lang/Class;", jobject,
+ (jobject) clazz /*this*/);
+
+ setfield_critical(c, o, "parameterTypes", "[Ljava/lang/Class;", jobject,
+ (jobject) types);
+
+ setfield_critical(c, o, "exceptionTypes", "[Ljava/lang/Class;", jobject,
+ (jobject) exceptiontypes);
+
+ setfield_critical(c, o, "name", "Ljava/lang/String;", jstring,
+ (jobject) javastring_new(m->name));
+
+ setfield_critical(c, o, "modifiers", "I", jint,
+ m->flags);
+
+ setfield_critical(c, o, "slot", "I", jint,
+ 0);
+
+ setfield_critical(c, o, "returnType", "Ljava/lang/Class;", jclass,
+ get_returntype(m));
return o;
}
* Method: getDeclaredMethods
* Signature: (Z)[Ljava/lang/reflect/Method;
*/
-JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredMethods (JNIEnv *env , struct java_lang_VMClass* this , s4 public_only)
+JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredMethods(JNIEnv *env, jclass clazz, java_lang_Class *that, s4 public_only)
{
- classinfo *c = (classinfo *) this->vmData;
+ classinfo *c = (classinfo *) that;
java_objectheader *o;
classinfo *class_method;
java_objectarray *array_method; /* result: array of Method-objects */
utf *utf_constr=utf_new_char("<init>");
utf *utf_clinit=utf_new_char("<clinit>");
+/* class_method = (classinfo*) loader_load(utf_new_char ("java/lang/reflect/Method")); */
+ class_method = class_new(utf_new_char("java/lang/reflect/Method"));
- class_method = (classinfo*) loader_load(utf_new_char ("java/lang/reflect/Method"));
if (!class_method)
return NULL;
/* JOWENN: array classes do not declare methods according to mauve test. It should be considered, if
we should return to my old clone method overriding instead of declaring it as a member function */
- if (Java_java_lang_VMClass_isArray(env,this)) {
+ if (Java_java_lang_VMClass_isArray(env, clazz,that)) {
return builtin_anewarray(0, class_method);
}
ACC_SYNCHRONIZED | ACC_NATIVE | ACC_STRICT)
);*/
setfield_critical(class_method,o,"declaringClass", "Ljava/lang/Class;", jobject, (jobject) c /*this*/);
- setfield_critical(class_method,o,"name", "Ljava/lang/String;", jstring, javastring_new(m->name));
+ setfield_critical(class_method,o,"name", "Ljava/lang/String;", jstring, (jobject) javastring_new(m->name));
/* setfield_critical(class_method,o,"flag", "I", jint, (m->flags &
(ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED | ACC_ABSTRACT | ACC_STATIC | ACC_FINAL |
ACC_SYNCHRONIZED | ACC_NATIVE | ACC_STRICT)));*/
* Method: getModifiers
* Signature: ()I
*/
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_getModifiers ( JNIEnv *env , struct java_lang_VMClass* this)
+JNIEXPORT s4 JNICALL Java_java_lang_VMClass_getModifiers(JNIEnv *env, jclass clazz, java_lang_Class *that)
{
- classinfo *c = (classinfo *) (this->vmData);
+ classinfo *c = (classinfo *) that;
return c->flags;
}
* Method: getName
* Signature: ()Ljava/lang/String;
*/
-JNIEXPORT struct java_lang_String* JNICALL Java_java_lang_VMClass_getName ( JNIEnv *env , struct java_lang_VMClass* this) {
+JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getName(JNIEnv *env, jclass clazz, java_lang_Class* that)
+{
u4 i;
- classinfo *c = (classinfo*) (this->vmData);
- java_lang_String *s = (java_lang_String*) javastring_new(c->name);
- if (!s) return NULL;
+ classinfo *c = (classinfo *) that;
+ java_lang_String *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] = '.';
+ for (i = 0; i < s->value->header.size; i++) {
+ if (s->value->data[i] == '/')
+ s->value->data[i] = '.';
}
return s;
* Method: getBeautifiedName
* Signature: (Ljava/lang/Class;)Ljava/lang/String;
*/
-JNIEXPORT struct java_lang_String* JNICALL Java_java_lang_VMClass_getBeautifiedName(JNIEnv *env, jclass clazz, struct java_lang_Class* par1)
+JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getBeautifiedName(JNIEnv *env, jclass clazz, java_lang_Class *par1)
{
u4 dimCnt;
- classinfo *c = (classinfo*) (par1);
+ classinfo *c = (classinfo *) (par1);
char *utf__ptr = c->name->text; /* current position in utf-text */
char **utf_ptr = &utf__ptr;
char *str = NULL;
s4 len;
s4 i;
-
- if (runverbose) log_text("Java_java_lang_VMClass_getName");
-
- dimCnt = 0;
- while (*utf_ptr != desc_end) {
- if (utf_nextu2(utf_ptr) == '[') dimCnt++;
+
+#if 0
+ log_text("Java_java_lang_VMClass_getBeautifiedName");
+ utf_display(c->name);
+ log_text("beautifying");
+#endif
+ dimCnt=0;
+ while ( *utf_ptr != desc_end ) {
+ if (utf_nextu2(utf_ptr)=='[') dimCnt++;
else break;
}
utf__ptr = (*utf_ptr) - 1;
len = 0;
+
+#if 0
+ log_text("------>");
+ utf_display(c->name);
+ log_text("<------");
+#endif
+
if (((*utf_ptr) + 1) == desc_end) {
for (i = 0; i < PRIMITIVETYPE_COUNT; i++) {
if (primitivetype_table[i].typesig == (*utf__ptr)) {
}
if (len == 0) {
- len = dimCnt + strlen(c->name->text) - 2;
- str = MNEW(char, len + 1);
- strncpy(str, ++utf__ptr, len - 2 * dimCnt);
+ if (dimCnt>0) {
+ len = dimCnt + strlen(c->name->text) - 2;
+ str = MNEW(char, len + 1);
+ strncpy(str, ++utf__ptr, len - 2 * dimCnt);
+ } else {
+ len = strlen(c->name->text);
+ str = MNEW(char, len + 1);
+ strncpy(str, utf__ptr, len);
+ }
+
}
dimCnt = len - 2 * dimCnt;
}
-/*
- * Class: java/lang/Class
- * Method: getProtectionDomain0
- * Signature: ()Ljava/security/ProtectionDomain;
- */
-JNIEXPORT struct java_security_ProtectionDomain* JNICALL Java_java_lang_VMClass_getProtectionDomain0 ( JNIEnv *env , struct java_lang_Class* this)
-{
- log_text("Java_java_lang_VMClass_getProtectionDomain0 called");
- return NULL;
-}
-
-
-/*
- * Class: java/lang/Class
- * Method: getSigners
- * Signature: ()[Ljava/lang/Object;
- */
-JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getSigners ( JNIEnv *env , struct java_lang_Class* this)
-{
- log_text("Java_java_lang_VMClass_getSigners called");
- return NULL;
-}
-
/*
* Class: java/lang/Class
* Method: getSuperclass
* Signature: ()Ljava/lang/Class;
*/
-JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClass_getSuperclass ( JNIEnv *env , struct java_lang_VMClass* this)
+JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getSuperclass(JNIEnv *env, jclass clazz, java_lang_Class *that)
{
- classinfo *cl= ((classinfo*)this->vmData);
- classinfo *c=cl -> super;
+ classinfo *cl = (classinfo *) that;
+ classinfo *c = cl->super;
- if (!c) return NULL;
+ if (!c)
+ return NULL;
use_class_as_object (c);
- return (java_lang_Class*) c;
+
+ return (java_lang_Class *) c;
}
* Method: isArray
* Signature: ()Z
*/
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isArray ( JNIEnv *env , struct java_lang_VMClass* this)
+JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isArray(JNIEnv *env, jclass clazz, java_lang_Class *that)
{
- classinfo *c = (classinfo*) (this->vmData);
+ classinfo *c = (classinfo *) that;
+
return c->vftbl->arraydesc != NULL;
}
* Method: isAssignableFrom
* Signature: (Ljava/lang/Class;)Z
*/
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isAssignableFrom ( JNIEnv *env , struct java_lang_VMClass* this, struct java_lang_Class* sup)
+JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isAssignableFrom(JNIEnv *env, jclass clazz, java_lang_Class *that, java_lang_Class *sup)
{
/* log_text("Java_java_lang_VMClass_isAssignableFrom");*/
- if (!this) return 0;
+
if (!sup) return 0;
- if (!this->vmData) {
+ if (!that) {
panic("sup->vmClass is NULL in VMClass.isAssignableFrom");
return 0;
}
- return (*env)->IsAssignableForm(env, (jclass) sup, (jclass) (this->vmData));
+ return (*env)->IsAssignableForm(env, (jclass) sup, (jclass) that);
}
* Method: isInstance
* Signature: (Ljava/lang/Object;)Z
*/
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInstance ( JNIEnv *env , struct java_lang_VMClass* this, struct java_lang_Object* obj)
+JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInstance(JNIEnv *env, jclass clazz, java_lang_Class *that, java_lang_Object *obj)
{
- classinfo *clazz = (classinfo*) (this->vmData);
- return (*env)->IsInstanceOf(env,(jobject) obj,clazz);
+/* classinfo *clazz = (classinfo *) that; */
+
+ return (*env)->IsInstanceOf(env, (jobject) obj, (jclass) that);
}
* Method: isInterface
* Signature: ()Z
*/
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInterface ( JNIEnv *env , struct java_lang_VMClass* this)
+JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInterface(JNIEnv *env, jclass clazz, java_lang_Class *that)
{
- classinfo *c = (classinfo*) this->vmData;
- if (c->flags & ACC_INTERFACE) return true;
+ classinfo *c = (classinfo *) that;
+
+ if (c->flags & ACC_INTERFACE)
+ return true;
+
return false;
}
* Method: isPrimitive
* Signature: ()Z
*/
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isPrimitive(JNIEnv *env, struct java_lang_VMClass* this)
+JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isPrimitive(JNIEnv *env, jclass clazz, java_lang_Class *that)
{
int i;
- classinfo *c = (classinfo *) this->vmData;
+ classinfo *c = (classinfo *) that;
/* search table of primitive classes */
for (i = 0; i < PRIMITIVETYPE_COUNT; i++)
- if (primitivetype_table[i].class_primitive == c) return true;
+ if (primitivetype_table[i].class_primitive == c)
+ return true;
return false;
}
/*
- * Class: java/lang/Class
- * Method: registerNatives
+ * Class: java_lang_VMClass
+ * Method: initialize
* Signature: ()V
*/
-JNIEXPORT void JNICALL Java_java_lang_VMClass_registerNatives ( JNIEnv *env )
-{
- /* empty */
-}
-
-
-/*
- * Class: java/lang/Class
- * Method: setProtectionDomain0
- * Signature: (Ljava/security/ProtectionDomain;)V
- */
-JNIEXPORT void JNICALL Java_java_lang_VMClass_setProtectionDomain0 ( JNIEnv *env , struct java_lang_Class* this, struct java_security_ProtectionDomain* par1)
-{
- if (verbose)
- log_text("Java_java_lang_VMClass_setProtectionDomain0 called");
-}
-
-
-/*
- * Class: java/lang/Class
- * Method: setSigners
- * Signature: ([Ljava/lang/Object;)V
- */
-JNIEXPORT void JNICALL Java_java_lang_VMClass_setSigners ( JNIEnv *env , struct java_lang_Class* this, java_objectarray* par1)
+JNIEXPORT void JNICALL Java_java_lang_VMClass_initialize(JNIEnv *env, jclass clazz, java_lang_Class *c)
{
- if (verbose)
- log_text("Java_java_lang_VMClass_setSigners called");
-}
+ classinfo *ci;
+ ci = (classinfo *) c;
-/*
- * Class: java_lang_VMClass
- * Method: initialize
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_java_lang_VMClass_initialize (JNIEnv *env , struct java_lang_VMClass* this ){
- log_text("Java_java_lang_VMClass_initialize");
+ /* initialize class */
+ if (!ci->initialized)
+ /* No need to check return value, because class_init already sets the */
+ /* exception pointer. */
+ (void) class_init(ci);
}
* Method: loadArrayClass
* Signature: (Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/Class;
*/
-JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClass_loadArrayClass (JNIEnv *env , jclass clazz, struct java_lang_String* par1, struct
- java_lang_ClassLoader* par2) {
+JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_loadArrayClass(JNIEnv *env, jclass clazz, java_lang_String *par1, java_lang_ClassLoader* par2)
+{
log_text("Java_java_lang_VMClass_loadArrayClass");
+
return 0;
}
/*
- * Class: java_lang_VMClass
+ * Class: java/lang/VMClass
* Method: throwException
* Signature: (Ljava/lang/Throwable;)V
*/
-JNIEXPORT void JNICALL Java_java_lang_VMClass_throwException (JNIEnv *env , jclass clazz, struct java_lang_Throwable* par1) {
- log_text("Java_java_lang_VMClass_throwException");
-}
-
-
-/*
- * Class: java_lang_VMClass
- * Method: step7
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_java_lang_VMClass_step7 (JNIEnv *env , struct java_lang_VMClass* this ) {
- log_text("Java_java_lang_VMClass_step7");
-}
-
-
-/*
- * Class: java_lang_VMClass
- * Method: step8
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_java_lang_VMClass_step8 (JNIEnv *env , struct java_lang_VMClass* this ) {
- log_text("Java_java_lang_VMClass_step8");
-}
-
-
-/*
- * Class: java_lang_VMClass
- * Method: isInitialized
- * Signature: ()Z
- */
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInitialized (JNIEnv *env , struct java_lang_VMClass* this ) {
- log_text("Java_java_lang_VMClass_isInitialized");
- return 1;
-}
-
-
-/*
- * Class: java_lang_VMClass
- * Method: setInitialized
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_java_lang_VMClass_setInitialized (JNIEnv *env , struct java_lang_VMClass* this ) {
- log_text("Java_java_lang_VMClass_setInitialized");
+JNIEXPORT void JNICALL Java_java_lang_VMClass_throwException(JNIEnv *env, jclass clazz, java_lang_Throwable *t)
+{
+ *exceptionptr = (java_objectheader *) t;
}