Signed-off-by: Tomek Grabiec <tgrab...@gmail.com> --- include/vm/preload.h | 5 +++ include/vm/reflection.h | 3 ++ vm/jato.c | 1 + vm/preload.c | 10 +++++++ vm/reflection.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 89 insertions(+), 0 deletions(-)
diff --git a/include/vm/preload.h b/include/vm/preload.h index 29a4f45..4c41ea6 100644 --- a/include/vm/preload.h +++ b/include/vm/preload.h @@ -6,6 +6,7 @@ extern struct vm_class *vm_array_of_java_lang_StackTraceElement; extern struct vm_class *vm_array_of_java_lang_String; extern struct vm_class *vm_array_of_java_lang_reflect_Constructor; extern struct vm_class *vm_array_of_java_lang_reflect_Field; +extern struct vm_class *vm_array_of_java_lang_reflect_Method; extern struct vm_class *vm_java_lang_Object; extern struct vm_class *vm_java_lang_Class; extern struct vm_class *vm_java_lang_Cloneable; @@ -35,6 +36,7 @@ extern struct vm_class *vm_java_lang_VMThread; extern struct vm_class *vm_java_lang_IllegalMonitorStateException; extern struct vm_class *vm_java_lang_reflect_Constructor; extern struct vm_class *vm_java_lang_reflect_Field; +extern struct vm_class *vm_java_lang_reflect_Method; extern struct vm_class *vm_java_lang_Byte; extern struct vm_class *vm_java_lang_Boolean; extern struct vm_class *vm_java_lang_Character; @@ -74,6 +76,9 @@ extern struct vm_field *vm_java_lang_reflect_Constructor_slot; extern struct vm_field *vm_java_lang_reflect_Field_declaringClass; extern struct vm_field *vm_java_lang_reflect_Field_name; extern struct vm_field *vm_java_lang_reflect_Field_slot; +extern struct vm_field *vm_java_lang_reflect_Method_declaringClass; +extern struct vm_field *vm_java_lang_reflect_Method_name; +extern struct vm_field *vm_java_lang_reflect_Method_slot; extern struct vm_method *vm_java_util_Properties_setProperty; extern struct vm_method *vm_java_lang_Throwable_initCause; diff --git a/include/vm/reflection.h b/include/vm/reflection.h index 538f7d1..8779b61 100644 --- a/include/vm/reflection.h +++ b/include/vm/reflection.h @@ -9,6 +9,9 @@ struct vm_object * native_vmclass_get_declared_fields(struct vm_object *class_object, jboolean public_only); struct vm_object * +native_vmclass_get_declared_methods(struct vm_object *class_object, + jboolean public_only); +struct vm_object * native_vmclass_get_declared_constructors(struct vm_object *class_object, jboolean public_only); struct vm_object * diff --git a/vm/jato.c b/vm/jato.c index 1a00d3e..a115da7 100644 --- a/vm/jato.c +++ b/vm/jato.c @@ -737,6 +737,7 @@ static struct vm_native natives[] = { DEFINE_NATIVE("java/lang/VMClass", "getClassLoader", &native_vmclass_getclassloader), DEFINE_NATIVE("java/lang/VMClass", "getDeclaredFields", &native_vmclass_get_declared_fields), DEFINE_NATIVE("java/lang/VMClass", "getDeclaredConstructors", &native_vmclass_get_declared_constructors), + DEFINE_NATIVE("java/lang/VMClass", "getDeclaredMethods", &native_vmclass_get_declared_methods), DEFINE_NATIVE("java/lang/VMClass", "getName", &native_vmclass_getname), DEFINE_NATIVE("java/lang/VMClass", "forName", &native_vmclass_forname), DEFINE_NATIVE("java/lang/VMClass", "isAnonymousClass", &native_vmclass_is_anonymous_class), diff --git a/vm/preload.c b/vm/preload.c index 2b7866d..be2c2b8 100644 --- a/vm/preload.c +++ b/vm/preload.c @@ -69,8 +69,10 @@ struct vm_class *vm_java_lang_IllegalMonitorStateException; struct vm_class *vm_java_lang_System; struct vm_class *vm_java_lang_reflect_Constructor; struct vm_class *vm_java_lang_reflect_Field; +struct vm_class *vm_java_lang_reflect_Method; struct vm_class *vm_array_of_java_lang_reflect_Constructor; struct vm_class *vm_array_of_java_lang_reflect_Field; +struct vm_class *vm_array_of_java_lang_reflect_Method; struct vm_class *vm_array_of_java_lang_Class; struct vm_class *vm_java_lang_IllegalArgumentException; struct vm_class *vm_java_lang_ClassLoader; @@ -124,9 +126,11 @@ static const struct preload_entry preload_entries[] = { { "java/lang/System", &vm_java_lang_System }, { "java/lang/reflect/Field", &vm_java_lang_reflect_Field }, { "java/lang/reflect/Constructor", &vm_java_lang_reflect_Constructor }, + { "java/lang/reflect/Method", &vm_java_lang_reflect_Method }, { "[java/lang/Class", &vm_array_of_java_lang_Class }, { "[java/lang/reflect/Constructor", &vm_array_of_java_lang_reflect_Constructor }, { "[java/lang/reflect/Field", &vm_array_of_java_lang_reflect_Field }, + { "[java/lang/reflect/Method", &vm_array_of_java_lang_reflect_Method }, { "java/lang/IllegalArgumentException", &vm_java_lang_IllegalArgumentException }, { "java/lang/Boolean", &vm_java_lang_Boolean }, { "java/lang/Byte", &vm_java_lang_Byte }, @@ -177,6 +181,9 @@ struct vm_field *vm_java_lang_reflect_Constructor_slot; struct vm_field *vm_java_lang_reflect_Field_declaringClass; struct vm_field *vm_java_lang_reflect_Field_name; struct vm_field *vm_java_lang_reflect_Field_slot; +struct vm_field *vm_java_lang_reflect_Method_declaringClass; +struct vm_field *vm_java_lang_reflect_Method_name; +struct vm_field *vm_java_lang_reflect_Method_slot; static const struct field_preload_entry field_preload_entries[] = { { &vm_java_lang_Class, "vmdata", "Ljava/lang/Object;", &vm_java_lang_Class_vmdata }, @@ -199,6 +206,9 @@ static const struct field_preload_entry field_preload_entries[] = { { &vm_java_lang_reflect_Field, "declaringClass", "Ljava/lang/Class;", &vm_java_lang_reflect_Field_declaringClass }, { &vm_java_lang_reflect_Field, "slot", "I", &vm_java_lang_reflect_Field_slot }, { &vm_java_lang_reflect_Field, "name", "Ljava/lang/String;", &vm_java_lang_reflect_Field_name }, + { &vm_java_lang_reflect_Method, "declaringClass", "Ljava/lang/Class;", &vm_java_lang_reflect_Method_declaringClass }, + { &vm_java_lang_reflect_Method, "slot", "I", &vm_java_lang_reflect_Method_slot }, + { &vm_java_lang_reflect_Method, "name", "Ljava/lang/String;", &vm_java_lang_reflect_Method_name }, }; struct method_preload_entry { diff --git a/vm/reflection.c b/vm/reflection.c index 72267ed..b4f3727 100644 --- a/vm/reflection.c +++ b/vm/reflection.c @@ -93,6 +93,76 @@ native_vmclass_get_declared_fields(struct vm_object *clazz, } struct vm_object * +native_vmclass_get_declared_methods(struct vm_object *clazz, + jboolean public_only) +{ + struct vm_class *vmc; + + vmc = to_vmclass(clazz); + if (!vmc) + return NULL; + + int count; + + if (public_only) { + count = 0; + + for (int i = 0; i < vmc->class->methods_count; i++) { + struct vm_method *vmm = &vmc->methods[i]; + + if (vm_method_is_public(vmm)) + count ++; + } + } else { + count = vmc->class->methods_count; + } + + struct vm_object *array + = vm_object_alloc_array(vm_array_of_java_lang_reflect_Method, + count); + if (!array) { + NOT_IMPLEMENTED; + return NULL; + } + + int index = 0; + + for (int i = 0; i < vmc->class->methods_count; i++) { + struct vm_method *vmm = &vmc->methods[i]; + + if (public_only && !vm_method_is_public(vmm)) + continue; + + struct vm_object *method + = vm_object_alloc(vm_java_lang_reflect_Method); + + if (!method) { + NOT_IMPLEMENTED; + return NULL; + } + + struct vm_object *name_object + = vm_object_alloc_string_from_c(vmm->name); + + if (!name_object) { + NOT_IMPLEMENTED; + return NULL; + } + + field_set_object(method, vm_java_lang_reflect_Method_declaringClass, + clazz); + field_set_object(method, vm_java_lang_reflect_Method_name, + name_object); + field_set_int32(method, vm_java_lang_reflect_Method_slot, + i); + + array_set_field_ptr(array, index++, method); + } + + return array; +} + +struct vm_object * native_vmclass_get_declared_constructors(struct vm_object *clazz, jboolean public_only) { -- 1.6.0.6 ------------------------------------------------------------------------------ Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july _______________________________________________ Jatovm-devel mailing list Jatovm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jatovm-devel