Signed-off-by: Tomek Grabiec <[email protected]>
---
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/jatovm-devel