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

Reply via email to