Shows array content with -Xtrace:invoke-verbose: args : J_REFERENCE : 0x898b618 = {'/' ,'u' ,'s' ,'r' ,'/' ,'l' ,'o' ,'c' ,'a' ,'l' ,'/' ,'c' ,'l' ,'a' ,'s' ,'s' ,'p' ,'a' ,'t' ,'h', ...30 more} ([C)
Signed-off-by: Tomek Grabiec <tgrab...@gmail.com> --- include/vm/object.h | 37 +++++++++++++++++++++++++++ jit/trace-jit.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 0 deletions(-) diff --git a/include/vm/object.h b/include/vm/object.h index 8d7ad3e..a97282f 100644 --- a/include/vm/object.h +++ b/include/vm/object.h @@ -5,6 +5,7 @@ #include <stdbool.h> #include <stdint.h> +#include "vm/jni.h" #include "vm/field.h" #include "vm/thread.h" #include "vm/vm.h" @@ -137,6 +138,42 @@ array_set_field_byte(struct vm_object *obj, int index, uint8_t value) *(uint8_t *) &obj->fields[index * get_vmtype_size(J_BYTE)] = value; } +static inline jboolean +array_get_field_boolean(struct vm_object *obj, int index) +{ + return *(jboolean *) &obj->fields[index * get_vmtype_size(J_BOOLEAN)]; +} + +static inline jshort +array_get_field_short(struct vm_object *obj, int index) +{ + return *(jshort *) &obj->fields[index * get_vmtype_size(J_SHORT)]; +} + +static inline jint +array_get_field_int(struct vm_object *obj, int index) +{ + return *(jint *) &obj->fields[index * get_vmtype_size(J_INT)]; +} + +static inline jlong +array_get_field_long(struct vm_object *obj, int index) +{ + return *(jlong *) &obj->fields[index * get_vmtype_size(J_LONG)]; +} + +static inline float +array_get_field_float(struct vm_object *obj, int index) +{ + return *(float *) &obj->fields[index * get_vmtype_size(J_FLOAT)]; +} + +static inline double +array_get_field_double(struct vm_object *obj, int index) +{ + return *(double *) &obj->fields[index * get_vmtype_size(J_DOUBLE)]; +} + static inline void array_set_field_ptr(struct vm_object *obj, int index, void *value) { diff --git a/jit/trace-jit.c b/jit/trace-jit.c index 420eaef..bb0984e 100644 --- a/jit/trace-jit.c +++ b/jit/trace-jit.c @@ -22,6 +22,7 @@ #include "lib/string.h" #include "vm/bytecodes.h" #include "vm/class.h" +#include "vm/jni.h" #include "vm/method.h" #include "vm/object.h" #include "vm/preload.h" @@ -30,6 +31,7 @@ #include "arch/stack-frame.h" +#include <ctype.h> #include <malloc.h> #include <stdlib.h> #include <stdio.h> @@ -356,6 +358,69 @@ void trace_magic_trampoline(struct compilation_unit *cu) trace_flush(); } +static void print_array(struct vm_object *obj) +{ + const int max_elems = 20; + struct vm_class *elem_class; + enum vm_type type; + + elem_class = vm_class_get_array_element_class(obj->class); + type = vm_class_get_storage_vmtype(elem_class); + + trace_printf("= {"); + + for (int i = 0; i < obj->array_length && i < max_elems; i++) { + if (i > 0) + trace_printf(" ,"); + + if (type == J_CHAR) { + jchar c = array_get_field_char(obj, i); + + if (isprint(c)) + trace_printf("'%c'", c); + else + trace_printf("<%d>", c); + + continue; + } + + switch (type) { + case J_REFERENCE: + trace_printf("%p", array_get_field_ptr(obj, i)); + break; + case J_BYTE: + trace_printf("%x", (int)array_get_field_byte(obj, i)); + break; + case J_SHORT: + trace_printf("%x", (int)array_get_field_short(obj, i)); + break; + case J_INT: + trace_printf("%x", array_get_field_int(obj, i)); + break; + case J_LONG: + trace_printf("%llx", array_get_field_long(obj, i)); + break; + case J_FLOAT: + trace_printf("%f", array_get_field_float(obj, i)); + break; + case J_DOUBLE: + trace_printf("%f", array_get_field_double(obj, i)); + break; + case J_BOOLEAN: + trace_printf("%s", array_get_field_boolean(obj, i) + ? "true" : "false"); + break; + default: + error("invalid array element type"); + } + } + + if (obj->array_length > max_elems) + trace_printf(", ...%d more", obj->array_length - max_elems); + + trace_printf("}"); +} + static void print_arg(enum vm_type arg_type, const unsigned long *args, int *arg_index) { @@ -411,6 +476,9 @@ static void print_arg(enum vm_type arg_type, const unsigned long *args, free(str); } + if (vm_class_is_array_class(obj->class)) + print_array(obj); + trace_printf(" (%s)", obj->class->name); } -- 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