Signed-off-by: Tomek Grabiec <tgrab...@gmail.com>
---
 include/jit/args.h |    2 +-
 jit/args.c         |   32 +++++++++++++++++++++++++++-----
 jit/trace-jit.c    |    2 +-
 3 files changed, 29 insertions(+), 7 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 9438f3a..3b97c6e 100644
--- a/jit/trace-jit.c
+++ b/jit/trace-jit.c
@@ -572,7 +572,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);
        }
-- 
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