Signed-off-by: Tomek Grabiec <tgrab...@gmail.com> --- vm/reflection.c | 77 +++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 53 insertions(+), 24 deletions(-)
diff --git a/vm/reflection.c b/vm/reflection.c index 4e17823..72267ed 100644 --- a/vm/reflection.c +++ b/vm/reflection.c @@ -5,17 +5,33 @@ #include "vm/reflection.h" #include "jit/exception.h" +static struct vm_class *to_vmclass(struct vm_object *object) +{ + struct vm_class *vmc; + + if (!object) + goto throw; + + vmc = vm_class_get_class_from_class_object(object); + if (!vmc) + goto throw; + + return vmc; +throw: + signal_new_exception(vm_java_lang_NullPointerException, NULL); + return NULL; +} + struct vm_object * -native_vmclass_get_declared_fields(struct vm_object *class_object, +native_vmclass_get_declared_fields(struct vm_object *clazz, jboolean public_only) { struct vm_class *vmc; - if (!vm_object_is_instance_of(class_object, vm_java_lang_Class)) + vmc = to_vmclass(clazz); + if (!vmc) return NULL; - vmc = vm_class_get_class_from_class_object(class_object); - int count; if (public_only) { @@ -64,7 +80,7 @@ native_vmclass_get_declared_fields(struct vm_object *class_object, } field_set_object(field, vm_java_lang_reflect_Field_declaringClass, - class_object); + clazz); field_set_object(field, vm_java_lang_reflect_Field_name, name_object); field_set_int32(field, vm_java_lang_reflect_Field_slot, @@ -77,16 +93,15 @@ native_vmclass_get_declared_fields(struct vm_object *class_object, } struct vm_object * -native_vmclass_get_declared_constructors(struct vm_object *class_object, +native_vmclass_get_declared_constructors(struct vm_object *clazz, jboolean public_only) { struct vm_class *vmc; - if (!vm_object_is_instance_of(class_object, vm_java_lang_Class)) + vmc = to_vmclass(clazz); + if (!vmc) return NULL; - vmc = vm_class_get_class_from_class_object(class_object); - int count = 0; for (int i = 0; i < vmc->class->methods_count; i++) { @@ -124,7 +139,7 @@ native_vmclass_get_declared_constructors(struct vm_object *class_object, } field_set_object(ctor, vm_java_lang_reflect_Constructor_clazz, - class_object); + clazz); field_set_int32(ctor, vm_java_lang_reflect_Constructor_slot, i); @@ -143,6 +158,11 @@ native_constructor_get_parameter_types(struct vm_object *ctor) struct vm_method *vmm; int slot; + if (!ctor) { + signal_new_exception(vm_java_lang_NullPointerException, NULL); + return NULL; + } + clazz = field_get_object(ctor, vm_java_lang_reflect_Constructor_clazz); slot = field_get_int32(ctor, vm_java_lang_reflect_Constructor_slot); @@ -163,6 +183,11 @@ jint native_constructor_get_modifiers_internal(struct vm_object *ctor) struct vm_method *vmm; int slot; + if (!ctor) { + signal_new_exception(vm_java_lang_NullPointerException, NULL); + return 0; + } + clazz = field_get_object(ctor, vm_java_lang_reflect_Constructor_clazz); slot = field_get_int32(ctor, vm_java_lang_reflect_Constructor_slot); @@ -182,18 +207,22 @@ native_constructor_construct_native(struct vm_object *this, struct vm_class *class; struct vm_method *vmm; - if (!vm_object_is_instance_of(declaring_class, vm_java_lang_Class)) + class = to_vmclass(declaring_class); + if (!class) return NULL; - class = vm_class_get_class_from_class_object(declaring_class); vmm = &class->methods[slot]; result = vm_object_alloc(class); + if (!result) { + NOT_IMPLEMENTED; + return NULL; + } /* TODO: We support only ()V constructors yet. */ assert(args == NULL || args->array_length == 0); - vm_call_method_object(vmm, result); + vm_call_method(vmm, result); return result; } @@ -201,11 +230,10 @@ struct vm_object *native_vmclass_get_interfaces(struct vm_object *clazz) { struct vm_class *vmc; - if (!vm_object_is_instance_of(clazz, vm_java_lang_Class)) + vmc = to_vmclass(clazz); + if (!vmc) return NULL; - vmc = vm_class_get_class_from_class_object(clazz); - struct vm_object *array = vm_object_alloc_array(vm_array_of_java_lang_Class, vmc->nr_interfaces); @@ -229,14 +257,10 @@ struct vm_object *native_vmclass_get_superclass(struct vm_object *clazz) { struct vm_class *vmc; - if (!clazz) - return NULL; - - if (!vm_object_is_instance_of(clazz, vm_java_lang_Class)) + vmc = to_vmclass(clazz); + if (!vmc) return NULL; - vmc = vm_class_get_class_from_class_object(clazz); - if (vm_class_is_array_class(vmc)) return vm_java_lang_Object->object; @@ -320,6 +344,11 @@ struct vm_object *native_field_get(struct vm_object *this, struct vm_object *o) unsigned int slot; void *value_p; + if (!this) { + signal_new_exception(vm_java_lang_NullPointerException, NULL); + return NULL; + } + clazz = field_get_object(this, vm_java_lang_reflect_Field_declaringClass); slot = field_get_int32(this, vm_java_lang_reflect_Field_slot); @@ -340,9 +369,9 @@ struct vm_object *native_field_get(struct vm_object *this, struct vm_object *o) enum vm_type type = vm_field_type(vmf); - if (vm_field_is_static(vmf)) + if (vm_field_is_static(vmf)) { value_p = vmc->static_values + vmf->offset; - else { + } else { /* * If o is null, you get a NullPointerException, and * if it is incompatible with the declaring class of -- 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