Signed-off-by: Tomek Grabiec <[email protected]>
---
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 5223478..527297d 100644
--- a/vm/jato.c
+++ b/vm/jato.c
@@ -738,6 +738,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
[email protected]
https://lists.sourceforge.net/lists/listinfo/jatovm-devel