Signed-off-by: Tomek Grabiec <[email protected]>
---
include/vm/reflection.h | 1 +
include/vm/types.h | 1 +
vm/jato.c | 1 +
vm/reflection.c | 29 +++++++++++++++++++++++++++++
vm/types.c | 22 +++++++++++++---------
5 files changed, 45 insertions(+), 9 deletions(-)
diff --git a/include/vm/reflection.h b/include/vm/reflection.h
index ebfd0fe..8e5f307 100644
--- a/include/vm/reflection.h
+++ b/include/vm/reflection.h
@@ -31,6 +31,7 @@ struct vm_object *native_vmclass_get_interfaces(struct
vm_object *clazz);
struct vm_object *native_vmclass_get_superclass(struct vm_object *clazz);
struct vm_object *native_field_get(struct vm_object *this, struct vm_object
*o);
jint native_field_get_modifiers_internal(struct vm_object *this);
+struct vm_object *native_field_gettype(struct vm_object *this);
struct vm_object *
native_method_invokenative(struct vm_object *method, struct vm_object *o,
diff --git a/include/vm/types.h b/include/vm/types.h
index 93fbb33..368729d 100644
--- a/include/vm/types.h
+++ b/include/vm/types.h
@@ -36,6 +36,7 @@ int vmtype_to_bytecode_type(enum vm_type);
int get_vmtype_size(enum vm_type);
const char *get_vm_type_name(enum vm_type);
const char *parse_method_args(const char *, enum vm_type *, char **);
+const char *parse_type(const char *, enum vm_type *, char **);
unsigned int count_java_arguments(const char *);
static inline bool vm_type_is_float(enum vm_type type)
diff --git a/vm/jato.c b/vm/jato.c
index bf67188..9009334 100644
--- a/vm/jato.c
+++ b/vm/jato.c
@@ -863,6 +863,7 @@ static struct vm_native natives[] = {
DEFINE_NATIVE("java/lang/reflect/Constructor", "constructNative",
&native_constructor_construct_native),
DEFINE_NATIVE("java/lang/reflect/Field", "get", &native_field_get),
DEFINE_NATIVE("java/lang/reflect/Field", "getModifiersInternal",
native_field_get_modifiers_internal),
+ DEFINE_NATIVE("java/lang/reflect/Field", "getType",
&native_field_gettype),
DEFINE_NATIVE("java/lang/reflect/Method", "getParameterTypes",
&native_method_get_parameter_types),
DEFINE_NATIVE("java/lang/reflect/Method", "invokeNative",
&native_method_invokenative),
DEFINE_NATIVE("jato/internal/VM", "enableFault",
&native_vm_enable_fault),
diff --git a/vm/reflection.c b/vm/reflection.c
index c9846f8..154e86e 100644
--- a/vm/reflection.c
+++ b/vm/reflection.c
@@ -701,3 +701,32 @@ native_method_invokenative(struct vm_object *method,
struct vm_object *o,
signal_new_exception(vm_java_lang_IllegalArgumentException, NULL);
return NULL;
}
+
+struct vm_object *native_field_gettype(struct vm_object *this)
+{
+ struct vm_field *vmf;
+
+ if (!this) {
+ signal_new_exception(vm_java_lang_NullPointerException, NULL);
+ return 0;
+ }
+
+ vmf = vm_object_to_vm_field(this);
+ if (!vmf)
+ return 0;
+
+ enum vm_type vmtype;
+ char *type_name;
+
+ if (!parse_type(vmf->type, &vmtype, &type_name)) {
+ warn("type parsing failed");
+ return NULL;
+ }
+
+ struct vm_class *vmc = vm_type_to_class(type_name, vmtype);
+
+ if (vm_class_ensure_init(vmc))
+ return NULL;
+
+ return vmc->object;
+}
diff --git a/vm/types.c b/vm/types.c
index 39e3d45..08a2e4a 100644
--- a/vm/types.c
+++ b/vm/types.c
@@ -161,20 +161,15 @@ const char *get_vm_type_name(enum vm_type type) {
return vm_type_names[type];
}
-const char *parse_method_args(const char *type_str, enum vm_type *vmtype,
- char **name_p)
+const char *parse_type(const char *type_str, enum vm_type *vmtype,
+ char **name_p)
{
- const char *type_name_start;
-
- if (*type_str == '(')
- type_str++;
-
- type_name_start = type_str;
+ const char *type_name_start = type_str;
if (name_p)
*name_p = NULL;
- if (*type_str == ')')
+ if (!type_str || *type_str == ')')
return NULL;
if (*type_str == '[') {
@@ -217,6 +212,15 @@ const char *parse_method_args(const char *type_str, enum
vm_type *vmtype,
return type_str;
}
+const char *parse_method_args(const char *type_str, enum vm_type *vmtype,
+ char **name_p)
+{
+ if (*type_str == '(')
+ type_str++;
+
+ return parse_type(type_str, vmtype, name_p);
+}
+
unsigned int count_java_arguments(const char *type)
{
unsigned int count;
--
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