Signed-off-by: Tomek Grabiec <[email protected]>
---
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/jatovm-devel