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