Signed-off-by: Tomek Grabiec <tgrab...@gmail.com>
---
 include/vm/field.h      |    5 +++
 include/vm/preload.h    |    5 +++
 include/vm/reflection.h |    3 ++
 vm/jato.c               |    1 +
 vm/preload.c            |   10 ++++++
 vm/reflection.c         |   72 +++++++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 96 insertions(+), 0 deletions(-)

diff --git a/include/vm/field.h b/include/vm/field.h
index 20bfc0f..3407a8c 100644
--- a/include/vm/field.h
+++ b/include/vm/field.h
@@ -38,6 +38,11 @@ static inline bool vm_field_is_final(const struct vm_field 
*vmf)
        return vmf->field->access_flags & CAFEBABE_FIELD_ACC_FINAL;
 }
 
+static inline bool vm_field_is_public(const struct vm_field *vmf)
+{
+       return vmf->field->access_flags & CAFEBABE_FIELD_ACC_PUBLIC;
+}
+
 static inline enum vm_type vm_field_type(const struct vm_field *vmf)
 {
        return str_to_type(vmf->type);
diff --git a/include/vm/preload.h b/include/vm/preload.h
index 0cc1db0..4fd134d 100644
--- a/include/vm/preload.h
+++ b/include/vm/preload.h
@@ -4,6 +4,7 @@
 extern struct vm_class *vm_array_of_java_lang_Class;
 extern struct vm_class *vm_array_of_java_lang_StackTraceElement;
 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_java_lang_Object;
 extern struct vm_class *vm_java_lang_Class;
 extern struct vm_class *vm_java_lang_Cloneable;
@@ -32,6 +33,7 @@ extern struct vm_class *vm_java_lang_ThreadGroup;
 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_boolean_class;
 extern struct vm_class *vm_char_class;
 extern struct vm_class *vm_float_class;
@@ -58,6 +60,9 @@ extern struct vm_field *vm_java_lang_VMThread_thread;
 extern struct vm_field *vm_java_lang_VMThread_vmdata;
 extern struct vm_field *vm_java_lang_reflect_Constructor_clazz;
 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_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 119e90f..f695651 100644
--- a/include/vm/reflection.h
+++ b/include/vm/reflection.h
@@ -6,6 +6,9 @@
 struct vm_object;
 
 struct vm_object *
+native_vmclass_get_declared_fields(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 08faa2d..96f56e3 100644
--- a/vm/jato.c
+++ b/vm/jato.c
@@ -654,6 +654,7 @@ static struct vm_native natives[] = {
        DEFINE_NATIVE("jato/internal/VM", "println", &native_vmruntime_println),
        DEFINE_NATIVE("jato/internal/VM", "throwNullPointerException", 
&native_vm_throw_null_pointer_exception),
        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", "getName", &native_vmclass_getname),
        DEFINE_NATIVE("java/lang/VMClass", "forName", &native_vmclass_forname),
diff --git a/vm/preload.c b/vm/preload.c
index c74c68c..d4a1705 100644
--- a/vm/preload.c
+++ b/vm/preload.c
@@ -67,7 +67,9 @@ struct vm_class *vm_java_lang_VMThread;
 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_array_of_java_lang_reflect_Constructor;
+struct vm_class *vm_array_of_java_lang_reflect_Field;
 struct vm_class *vm_array_of_java_lang_Class;
 struct vm_class *vm_boolean_class;
 struct vm_class *vm_char_class;
@@ -108,9 +110,11 @@ static const struct preload_entry preload_entries[] = {
        { "java/lang/VMThread", &vm_java_lang_VMThread },
        { "java/lang/IllegalMonitorStateException", 
&vm_java_lang_IllegalMonitorStateException },
        { "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/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 },
 };
 
 static const struct preload_entry primitive_preload_entries[] = {
@@ -148,6 +152,9 @@ struct vm_field *vm_java_lang_VMThread_thread;
 struct vm_field *vm_java_lang_VMThread_vmdata;
 struct vm_field *vm_java_lang_reflect_Constructor_clazz;
 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;
 
 static const struct field_preload_entry field_preload_entries[] = {
        { &vm_java_lang_Class, "vmdata", "Ljava/lang/Object;", 
&vm_java_lang_Class_vmdata },
@@ -167,6 +174,9 @@ static const struct field_preload_entry 
field_preload_entries[] = {
        { &vm_java_lang_VMThread, "vmdata", "Ljava/lang/Object;", 
&vm_java_lang_VMThread_vmdata },
        { &vm_java_lang_reflect_Constructor, "clazz", "Ljava/lang/Class;", 
&vm_java_lang_reflect_Constructor_clazz },
        { &vm_java_lang_reflect_Constructor, "slot", "I", 
&vm_java_lang_reflect_Constructor_slot },
+       { &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 },
 };
 
 struct method_preload_entry {
diff --git a/vm/reflection.c b/vm/reflection.c
index 5e7085b..f8df788 100644
--- a/vm/reflection.c
+++ b/vm/reflection.c
@@ -3,6 +3,78 @@
 #include "vm/die.h"
 #include "vm/preload.h"
 #include "vm/reflection.h"
+#include "jit/exception.h"
+
+struct vm_object *
+native_vmclass_get_declared_fields(struct vm_object *class_object,
+                                  jboolean public_only)
+{
+       struct vm_class *vmc;
+
+       if (!vm_object_is_instance_of(class_object, vm_java_lang_Class))
+               return NULL;
+
+       vmc = vm_class_get_class_from_class_object(class_object);
+
+       int count;
+
+       if (public_only) {
+               count = 0;
+
+               for (int i = 0; i < vmc->class->fields_count; i++) {
+                       struct vm_field *vmf = &vmc->fields[i];
+
+                       if (vm_field_is_public(vmf))
+                               count ++;
+               }
+       } else {
+               count = vmc->class->fields_count;
+       }
+
+       struct vm_object *array
+               = vm_object_alloc_array(vm_array_of_java_lang_reflect_Field,
+                                       count);
+       if (!array) {
+               NOT_IMPLEMENTED;
+               return NULL;
+       }
+
+       int index = 0;
+
+       for (int i = 0; i < vmc->class->fields_count; i++) {
+               struct vm_field *vmf = &vmc->fields[i];
+
+               if (public_only && !vm_field_is_public(vmf))
+                       continue;
+
+               struct vm_object *field
+                       = vm_object_alloc(vm_java_lang_reflect_Field);
+
+               if (!field) {
+                       NOT_IMPLEMENTED;
+                       return NULL;
+               }
+
+               struct vm_object *name_object
+                       = vm_object_alloc_string_from_c(vmf->name);
+
+               if (!name_object) {
+                       NOT_IMPLEMENTED;
+                       return NULL;
+               }
+
+               field_set_object(field, 
vm_java_lang_reflect_Field_declaringClass,
+                                class_object);
+               field_set_object(field, vm_java_lang_reflect_Field_name,
+                                name_object);
+               field_set_int32(field, vm_java_lang_reflect_Field_slot,
+                               i);
+
+               array_set_field_ptr(array, index++, field);
+       }
+
+       return array;
+}
 
 struct vm_object *
 native_vmclass_get_declared_constructors(struct vm_object *class_object,
-- 
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