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