Cleanup fallouts from JamVM and re-enable natives for VMThrowable.fillInStackTrace() and VMThrowable.getStackTrace().
Signed-off-by: Tomek Grabiec <tgrab...@gmail.com> --- include/vm/java_lang.h | 5 ++- include/vm/object.h | 12 +++++ include/vm/stack-trace.h | 5 +- vm/jato.c | 24 ++++------ vm/stack-trace.c | 117 +++++++++++++++++---------------------------- 5 files changed, 72 insertions(+), 91 deletions(-) diff --git a/include/vm/java_lang.h b/include/vm/java_lang.h index 06ed716..cb9d150 100644 --- a/include/vm/java_lang.h +++ b/include/vm/java_lang.h @@ -6,7 +6,9 @@ extern struct vm_class *vm_java_lang_Class; extern struct vm_class *vm_java_lang_String; extern struct vm_class *vm_java_lang_Throwable; extern struct vm_class *vm_java_util_Properties; - +extern struct vm_class *vm_java_lang_VMThrowable; +extern struct vm_class *vm_java_lang_StackTraceElement; +extern struct vm_class *vm_array_of_java_lang_StackTraceElement; extern struct vm_class *vm_boolean_class; extern struct vm_class *vm_char_class; extern struct vm_class *vm_float_class; @@ -21,6 +23,7 @@ extern struct vm_field *vm_java_lang_String_offset; extern struct vm_field *vm_java_lang_String_count; extern struct vm_field *vm_java_lang_String_value; extern struct vm_field *vm_java_lang_Throwable_detailMessage; +extern struct vm_field *vm_java_lang_VMThrowable_vmdata; extern struct vm_method *vm_java_util_Properties_setProperty; diff --git a/include/vm/object.h b/include/vm/object.h index a38a1d3..4196030 100644 --- a/include/vm/object.h +++ b/include/vm/object.h @@ -84,4 +84,16 @@ array_get_field_char(struct vm_object *obj, int index) return *(uint16_t *) &obj->fields[index * get_vmtype_size(J_CHAR)]; } +static inline void +array_set_field_ptr(struct vm_object *obj, int index, void *value) +{ + *(void **) &obj->fields[index * get_vmtype_size(J_REFERENCE)] = value; +} + +static inline void * +array_get_field_ptr(struct vm_object *obj, int index) +{ + return *(void **) &obj->fields[index * get_vmtype_size(J_REFERENCE)]; +} + #endif diff --git a/include/vm/stack-trace.h b/include/vm/stack-trace.h index 8759ced..953afc8 100644 --- a/include/vm/stack-trace.h +++ b/include/vm/stack-trace.h @@ -41,9 +41,8 @@ struct vm_object *get_stack_trace(struct stack_trace_elem *); struct vm_object *get_stack_trace_from_ctx(void *ctx); struct vm_object *convert_stack_trace(struct vm_object *vmthrowable); struct vm_object *new_stack_trace_element(struct vm_method *, unsigned long); -struct vm_object * __vm_native vm_throwable_fill_in_stack_trace(struct vm_object *); -struct vm_object * __vm_native vm_throwable_get_stack_trace(struct vm_object *, struct vm_object *); -void set_throwable_vmstate(struct vm_object *throwable, struct vm_object *vmstate); +struct vm_object * __vm_native native_vmthrowable_fill_in_stack_trace(struct vm_object *); +struct vm_object * __vm_native native_vmthrowable_get_stack_trace(struct vm_object *, struct vm_object *); bool called_from_jit_trampoline(struct native_stack_frame *frame); void vm_print_exception(struct vm_object *exception); diff --git a/vm/jato.c b/vm/jato.c index 439c237..2567ad7 100644 --- a/vm/jato.c +++ b/vm/jato.c @@ -156,19 +156,6 @@ static int32_t __vm_native native_vmsystem_identityhashcode(struct vm_object *ob return (int32_t) obj; } -/* - * This stub is needed by java.lang.VMThrowable constructor to work. It should - * return java.lang.VMState instance, or null in which case no stack trace will - * be printed by printStackTrace() method. - */ -static struct vm_object * __vm_native -native_vmthrowable_fill_in_stack_trace(struct vm_object *message) -{ - NOT_IMPLEMENTED; - - return NULL; -} - static struct vm_object * __vm_native native_vmobject_getclass(struct vm_object *object) { @@ -220,6 +207,7 @@ static struct vm_native natives[] = { DEFINE_NATIVE("java/lang/VMSystem", "arraycopy", &native_vmsystem_arraycopy), DEFINE_NATIVE("java/lang/VMSystem", "identityHashCode", &native_vmsystem_identityhashcode), DEFINE_NATIVE("java/lang/VMThrowable", "fillInStackTrace", &native_vmthrowable_fill_in_stack_trace), + DEFINE_NATIVE("java/lang/VMThrowable", "getStackTrace", &native_vmthrowable_get_stack_trace), }; static void jit_init_natives(void) @@ -240,7 +228,9 @@ struct vm_class *vm_java_lang_Class; struct vm_class *vm_java_lang_String; struct vm_class *vm_java_lang_Throwable; struct vm_class *vm_java_util_Properties; - +struct vm_class *vm_java_lang_VMThrowable; +struct vm_class *vm_java_lang_StackTraceElement; +struct vm_class *vm_array_of_java_lang_StackTraceElement; struct vm_class *vm_boolean_class; struct vm_class *vm_char_class; struct vm_class *vm_float_class; @@ -256,6 +246,10 @@ static const struct preload_entry preload_entries[] = { { "java/lang/String", &vm_java_lang_String }, { "java/lang/Throwable", &vm_java_lang_Throwable }, { "java/util/Properties", &vm_java_util_Properties }, + { "java/lang/RuntimeException", &vm_java_lang_RE }, + { "java/lang/VMThrowable", &vm_java_lang_VMThrowable }, + { "java/lang/StackTraceElement", &vm_java_lang_StackTraceElement }, + { "[Ljava/lang/StackTraceElement;", &vm_array_of_java_lang_StackTraceElement }, }; static const struct preload_entry primitive_preload_entries[] = { @@ -281,6 +275,7 @@ struct vm_field *vm_java_lang_String_offset; struct vm_field *vm_java_lang_String_count; struct vm_field *vm_java_lang_String_value; struct vm_field *vm_java_lang_Throwable_detailMessage; +struct vm_field *vm_java_lang_VMThrowable_vmdata; static const struct field_preload_entry field_preload_entries[] = { { &vm_java_lang_Class, "vmdata", "Ljava/lang/Object;", &vm_java_lang_Class_vmdata }, @@ -288,6 +283,7 @@ static const struct field_preload_entry field_preload_entries[] = { { &vm_java_lang_String, "count", "I", &vm_java_lang_String_count }, { &vm_java_lang_String, "value", "[C", &vm_java_lang_String_value }, { &vm_java_lang_Throwable, "detailMessage", "Ljava/lang/String;", &vm_java_lang_Throwable_detailMessage }, + { &vm_java_lang_VMThrowable, "vmdata", "Ljava/lang/Object;", &vm_java_lang_VMThrowable_vmdata }, }; struct method_preload_entry { diff --git a/vm/stack-trace.c b/vm/stack-trace.c index 7cc9555..3b31afc 100644 --- a/vm/stack-trace.c +++ b/vm/stack-trace.c @@ -44,57 +44,43 @@ __thread struct native_stack_frame *bottom_stack_frame; -static struct vm_class *vmthrowable_class; -static struct vm_class *throwable_class; -static struct vm_class *ste_class; -static struct vm_class *ste_array_class; -static int backtrace_offset; -static int vmstate_offset; - typedef void (*ste_init_fn)(struct vm_object *, struct vm_object *, int, struct vm_object *, struct vm_object *, int); +typedef struct vm_object *(*throwable_tostring_fn)(struct vm_object *); +typedef struct vm_object *(*throwable_stacktracestring_fn)(struct vm_object *); static ste_init_fn ste_init; +static throwable_tostring_fn throwable_tostring; +static throwable_stacktracestring_fn throwable_stacktracestring; void init_stack_trace_printing(void) { - struct vm_field *backtrace_fld; - struct vm_field *vmstate_fld; struct vm_method *ste_init_mb; + struct vm_method *throwable_tostring_mb; + struct vm_method *throwable_stacktracestring_mb; - NOT_IMPLEMENTED; - return; - - /* XXX: Preload these. */ - vmthrowable_class = classloader_load("java/lang/VMThrowable"); - throwable_class = classloader_load("java/lang/Throwable"); - ste_class = classloader_load("java/lang/StackTraceElement"); - ste_array_class = classloader_load("[Ljava/lang/StackTraceElement;"); - - if (exception_occurred()) - goto error; - - ste_init_mb = vm_class_get_method_recursive(ste_class, "<init>", + ste_init_mb = vm_class_get_method_recursive( + vm_java_lang_StackTraceElement, + "<init>", "(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Z)V"); - if (ste_init_mb == NULL) - goto error; - - ste_init = vm_method_trampoline_ptr(ste_init_mb); - - backtrace_fld = vm_class_get_field_recursive(vmthrowable_class, - "backtrace", "Ljava/lang/Object;"); - vmstate_fld = vm_class_get_field_recursive(throwable_class, - "vmState", "Ljava/lang/VMThrowable;"); - if (!backtrace_fld || !vmstate_fld) - goto error; + throwable_tostring_mb = + vm_class_get_method_recursive(vm_java_lang_Throwable, + "toString", "()Ljava/lang/String;"); - backtrace_offset = backtrace_fld->offset; - vmstate_offset = vmstate_fld->offset; - return; + throwable_stacktracestring_mb = + vm_class_get_method_recursive(vm_java_lang_Throwable, + "stackTraceString", "()Ljava/lang/String;"); - error: - die("initialization failed"); + ste_init = vm_method_trampoline_ptr(ste_init_mb); + throwable_tostring = vm_method_trampoline_ptr(throwable_tostring_mb); + throwable_stacktracestring = + vm_method_trampoline_ptr(throwable_stacktracestring_mb); + + if (!ste_init_mb || + !throwable_tostring || + !throwable_stacktracestring) + error("initialization failed"); } /** @@ -236,7 +222,6 @@ struct vm_object *get_stack_trace(struct stack_trace_elem *st_elem) struct compilation_unit *cu; struct vm_object *vmstate; struct vm_object *array; - unsigned long *data; int array_type; int depth; int i; @@ -245,7 +230,7 @@ struct vm_object *get_stack_trace(struct stack_trace_elem *st_elem) if (depth == 0) return NULL; - vmstate = vm_object_alloc(vmthrowable_class); + vmstate = vm_object_alloc(vm_java_lang_VMThrowable); if (!vmstate) return NULL; @@ -254,8 +239,6 @@ struct vm_object *get_stack_trace(struct stack_trace_elem *st_elem) if (!array) return NULL; - data = ARRAY_DATA(array); - i = 0; do { unsigned long bc_offset; @@ -274,13 +257,11 @@ struct vm_object *get_stack_trace(struct stack_trace_elem *st_elem) bc_offset = native_ptr_to_bytecode_offset(cu, (unsigned char*)st_elem->addr); - data[i++] = (unsigned long)cu->method; - - /* We must add cu->method->code to be compatible with JamVM. */ - data[i++] = bc_offset + (unsigned long)cu->method->jit_code; + array_set_field_ptr(array, i++, cu->method); + array_set_field_ptr(array, i++, (void*)bc_offset); } while (get_prev_stack_trace_elem(st_elem) == 0); - INST_DATA(vmstate)[backtrace_offset] = (uintptr_t)array; + field_set_object(vmstate, vm_java_lang_VMThrowable_vmdata, array); return vmstate; } @@ -307,12 +288,9 @@ new_stack_trace_element(struct vm_method *mb, unsigned long bc_offset) line_no = bytecode_offset_to_line_no(mb, bc_offset); is_native = vm_method_is_native(mb); - NOT_IMPLEMENTED; -#if 0 if (!is_native && cb->source_file_name) - file_name = createString(cb->source_file_name); + file_name = vm_object_alloc_string_from_c(cb->source_file_name); else -#endif file_name = NULL; class_dot_name = slash2dots(cb->name); @@ -320,7 +298,7 @@ new_stack_trace_element(struct vm_method *mb, unsigned long bc_offset) method_name = vm_object_alloc_string_from_c(mb->name); free(class_dot_name); - ste = vm_object_alloc(ste_class); + ste = vm_object_alloc(vm_java_lang_StackTraceElement); if(!ste) return NULL; @@ -338,63 +316,61 @@ new_stack_trace_element(struct vm_method *mb, unsigned long bc_offset) */ struct vm_object *convert_stack_trace(struct vm_object *vmthrowable) { - unsigned long *stack_trace; struct vm_object *ste_array; struct vm_object *array; - struct vm_object **dest; int depth; int i; + int j; - array = (struct vm_object *)INST_DATA(vmthrowable)[backtrace_offset]; + array = field_get_object(vmthrowable, vm_java_lang_VMThrowable_vmdata); if (!array) return NULL; - stack_trace = ARRAY_DATA(array); - depth = ARRAY_LEN(array); + depth = array->array_length; - ste_array = vm_object_alloc_array(ste_array_class, depth / 2); + ste_array = vm_object_alloc_array( + vm_array_of_java_lang_StackTraceElement, depth / 2); if (!ste_array) return NULL; - dest = ARRAY_DATA(ste_array); - - for(i = 0; i < depth; dest++) { + for(i = 0, j = 0; i < depth; j++) { struct vm_method *mb; unsigned long bc_offset; struct vm_object *ste; - mb = (struct vm_method *)stack_trace[i++]; - bc_offset = stack_trace[i++] - (unsigned long)mb->jit_code; + mb = array_get_field_ptr(array, i++); + bc_offset = (unsigned long)array_get_field_ptr(array, i++); ste = new_stack_trace_element(mb, bc_offset); if(ste == NULL || exception_occurred()) return NULL; - *dest = ste; + array_set_field_ptr(ste_array, j, ste); } return ste_array; } struct vm_object * __vm_native -vm_throwable_fill_in_stack_trace(struct vm_object *throwable) +native_vmthrowable_fill_in_stack_trace(struct vm_object *throwable) { struct stack_trace_elem st_elem; if (init_stack_trace_elem(&st_elem)) return NULL; - if (skip_frames_from_class(&st_elem, vmthrowable_class)) + if (skip_frames_from_class(&st_elem, vm_java_lang_VMThrowable)) return NULL; - if (skip_frames_from_class(&st_elem, throwable_class)) + if (skip_frames_from_class(&st_elem, vm_java_lang_Throwable)) return NULL; return get_stack_trace(&st_elem); } struct vm_object * __vm_native -vm_throwable_get_stack_trace(struct vm_object *this, struct vm_object *throwable) +native_vmthrowable_get_stack_trace(struct vm_object *this, + struct vm_object *throwable) { struct vm_object *result; @@ -406,11 +382,6 @@ vm_throwable_get_stack_trace(struct vm_object *this, struct vm_object *throwable return result; } -void set_throwable_vmstate(struct vm_object *throwable, struct vm_object *vmstate) -{ - INST_DATA(throwable)[vmstate_offset] = (uintptr_t)vmstate; -} - void vm_print_exception(struct vm_object *exception) { struct vm_object *message_obj; -- 1.6.0.6 ------------------------------------------------------------------------------ _______________________________________________ Jatovm-devel mailing list Jatovm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jatovm-devel