Signed-off-by: Tomek Grabiec <tgrab...@gmail.com>
---
 include/vm/preload.h |    3 +++
 vm/preload.c         |   16 ++++++++++++++++
 vm/reflection.c      |   44 +++++++++++++++++++++++++++++++++++++-------
 3 files changed, 56 insertions(+), 7 deletions(-)

diff --git a/include/vm/preload.h b/include/vm/preload.h
index 4976468..c5f6614 100644
--- a/include/vm/preload.h
+++ b/include/vm/preload.h
@@ -48,6 +48,7 @@ extern struct vm_class *vm_java_lang_Long;
 extern struct vm_class *vm_java_lang_Short;
 extern struct vm_class *vm_java_lang_IllegalArgumentException;
 extern struct vm_class *vm_java_lang_ClassLoader;
+extern struct vm_class *vm_java_lang_Number;
 extern struct vm_class *vm_boolean_class;
 extern struct vm_class *vm_char_class;
 extern struct vm_class *vm_float_class;
@@ -106,6 +107,8 @@ extern struct vm_method *vm_java_lang_Integer_init;
 extern struct vm_method *vm_java_lang_Long_init;
 extern struct vm_method *vm_java_lang_Short_init;
 extern struct vm_method *vm_java_lang_ClassLoader_loadClass;
+extern struct vm_method *vm_java_lang_Number_intValue;
+extern struct vm_method *vm_java_lang_Number_floatValue;
 
 int preload_vm_classes(void);
 
diff --git a/vm/preload.c b/vm/preload.c
index f75304b..8f83aa1 100644
--- a/vm/preload.c
+++ b/vm/preload.c
@@ -89,6 +89,7 @@ struct vm_class *vm_java_lang_Integer;
 struct vm_class *vm_java_lang_Long;
 struct vm_class *vm_java_lang_Short;
 struct vm_class *vm_java_lang_VMString;
+struct vm_class *vm_java_lang_Number;
 struct vm_class *vm_boolean_class;
 struct vm_class *vm_char_class;
 struct vm_class *vm_float_class;
@@ -149,6 +150,7 @@ static const struct preload_entry preload_entries[] = {
        { "java/lang/Long", &vm_java_lang_Long },
        { "java/lang/ClassLoader", &vm_java_lang_ClassLoader},
        { "java/lang/VMString", &vm_java_lang_VMString},
+       { "java/lang/Number", &vm_java_lang_Number },
 };
 
 static const struct preload_entry primitive_preload_entries[] = {
@@ -252,6 +254,8 @@ struct vm_method *vm_java_lang_Long_init;
 struct vm_method *vm_java_lang_Short_init;
 struct vm_method *vm_java_lang_ClassLoader_loadClass;
 struct vm_method *vm_java_lang_VMString_intern;
+struct vm_method *vm_java_lang_Number_intValue;
+struct vm_method *vm_java_lang_Number_floatValue;
 
 static const struct method_preload_entry method_preload_entries[] = {
        {
@@ -404,6 +408,18 @@ static const struct method_preload_entry 
method_preload_entries[] = {
                "(Ljava/lang/String;)Ljava/lang/String;",
                &vm_java_lang_VMString_intern,
        },
+       {
+               &vm_java_lang_Number,
+               "intValue",
+               "()I",
+               &vm_java_lang_Number_intValue,
+       },
+       {
+               &vm_java_lang_Number,
+               "floatValue",
+               "()F",
+               &vm_java_lang_Number_floatValue,
+       },
 };
 
 /*
diff --git a/vm/reflection.c b/vm/reflection.c
index 093d5a7..5ca70b2 100644
--- a/vm/reflection.c
+++ b/vm/reflection.c
@@ -618,6 +618,41 @@ jint native_field_get_modifiers_internal(struct vm_object 
*this)
        return vmf->field->access_flags;
 }
 
+static int unwrap_and_set_field(void *field_ptr, enum vm_type type,
+                               struct vm_object *value)
+{
+       switch (type) {
+       case J_REFERENCE:
+               *(jobject *) field_ptr = value;
+               return 0;
+       case J_BYTE:
+       case J_BOOLEAN:
+       case J_SHORT:
+       case J_CHAR:
+       case J_INT:
+               /*
+                * We can handle those as int because these values are
+                * returned by ireturn anyway.
+                */
+               *(long *) field_ptr = 
vm_call_method_this_a(vm_java_lang_Number_intValue,
+                                                           value, NULL);
+               return 0;
+       case J_FLOAT:
+               *(jfloat *) field_ptr = (jfloat) 
vm_call_method_this_a(vm_java_lang_Number_floatValue,
+                                                                      value, 
NULL);
+               return 0;
+       case J_LONG:
+       case J_DOUBLE:
+               error("not implemented");
+       case J_VOID:
+       case J_RETURN_ADDRESS:
+       case VM_TYPE_MAX:
+               error("unexpected type");
+       }
+
+       return 0;
+}
+
 static int marshall_call_arguments(struct vm_method *vmm, unsigned long *args,
                                   struct vm_object *args_array)
 {
@@ -639,13 +674,8 @@ static int marshall_call_arguments(struct vm_method *vmm, 
unsigned long *args,
 
                arg = array_get_field_ptr(args_array, args_array_idx++);
 
-               if (type == J_REFERENCE)
-                       *(jobject *) &args[idx++] = arg;
-               else {
-                       /* XXX: marshalling of primitive types not
-                          implemented yet. */
-                       error("primitive type marshalling not implemented");
-               }
+               if (unwrap_and_set_field(&args[idx++], type, arg))
+                       return -1;
        }
 
        return 0;
-- 
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