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