Signed-off-by: Tomek Grabiec <tgrab...@gmail.com>
---
 include/jit/args.h |    2 +-
 jit/args.c         |   32 +++++++++++++++++++++++++++-----
 jit/trace-jit.c    |    2 +-
 vm/method.c        |    2 +-
 4 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/include/jit/args.h b/include/jit/args.h
index b2fdd5a..5728048 100644
--- a/include/jit/args.h
+++ b/include/jit/args.h
@@ -17,7 +17,7 @@ struct expression *convert_args(struct stack *mimic_stack,
                                struct vm_method *method);
 struct expression *convert_native_args(struct stack *mimic_stack,
                                       unsigned long nr_args);
-const char *parse_method_args(const char *type_str, enum vm_type *vmtype);
+const char *parse_method_args(const char *type_str, enum vm_type *vmtype, char 
**name_p);
 
 #ifndef CONFIG_ARGS_MAP
 static inline int args_map_init(struct vm_method *method)
diff --git a/jit/args.c b/jit/args.c
index 46caee0..deed9c0 100644
--- a/jit/args.c
+++ b/jit/args.c
@@ -147,13 +147,19 @@ convert_native_args(struct stack *mimic_stack, unsigned 
long nr_args)
        return args_list;
 }
 
-const char *parse_method_args(const char *type_str, enum vm_type *vmtype)
+const char *parse_method_args(const char *type_str, enum vm_type *vmtype,
+                             char **name_p)
 {
-       char type_name[] = { "X" };
+       const char *type_name_start;
 
        if (*type_str == '(')
                type_str++;
 
+       type_name_start = type_str;
+
+       if (name_p)
+               *name_p = NULL;
+
        if (*type_str == ')')
                return NULL;
 
@@ -162,18 +168,34 @@ const char *parse_method_args(const char *type_str, enum 
vm_type *vmtype)
                type_str++;
 
                if (*type_str != 'L') {
-                       return type_str + 1;
+                       type_str++;
+                       goto out;
                }
        }
 
        if (*type_str == 'L') {
+               ++type_name_start;
                ++type_str;
                while (*(type_str++) != ';')
                        ;
                *vmtype = J_REFERENCE;
        } else {
-               type_name[0] = *(type_str++);
-               *vmtype = str_to_type(type_name);
+               char primitive_name[2];
+
+               primitive_name[0] = *(type_str++);
+               primitive_name[1] = 0;
+
+               *vmtype = str_to_type(primitive_name);
+       }
+
+ out:
+       if (name_p) {
+               size_t size = (size_t) type_str - (size_t) type_name_start;
+
+               if (*vmtype == J_REFERENCE)
+                       size--;
+
+               *name_p = strndup(type_name_start, size);
        }
 
        return type_str;
diff --git a/jit/trace-jit.c b/jit/trace-jit.c
index 25a3d4b..cb6f21a 100644
--- a/jit/trace-jit.c
+++ b/jit/trace-jit.c
@@ -522,7 +522,7 @@ static void trace_invoke_args(struct vm_method *vmm,
 
        trace_printf("\targs\t:\n");
 
-       while ((type_str = parse_method_args(type_str, &arg_type))) {
+       while ((type_str = parse_method_args(type_str, &arg_type, NULL))) {
                trace_printf("\t   %-12s: ", get_vm_type_name(arg_type));
                print_arg(arg_type, frame->args, &arg_index);
        }
diff --git a/vm/method.c b/vm/method.c
index 074a62a..566aee9 100644
--- a/vm/method.c
+++ b/vm/method.c
@@ -184,7 +184,7 @@ unsigned int vm_method_java_argument_count(struct vm_method 
*vmm)
        count = 0;
        a = vmm->type;
 
-       while ((a = parse_method_args(a, &type)))
+       while ((a = parse_method_args(a, &type, NULL)))
                count ++;
 
        return 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
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to