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

Reply via email to