Signed-off-by: Tomek Grabiec <tgrab...@gmail.com> --- include/vm/preload.h | 4 ++++ vm/jato.c | 2 -- vm/preload.c | 22 +++++++++++++++++++++- vm/stack-trace.c | 45 ++++++--------------------------------------- 4 files changed, 31 insertions(+), 42 deletions(-)
diff --git a/include/vm/preload.h b/include/vm/preload.h index 1f3a2e9..fe54bfa 100644 --- a/include/vm/preload.h +++ b/include/vm/preload.h @@ -38,6 +38,10 @@ extern struct vm_field *vm_java_lang_VMThrowable_vmdata; extern struct vm_method *vm_java_util_Properties_setProperty; extern struct vm_method *vm_java_lang_Throwable_initCause; +extern struct vm_method *vm_java_lang_Throwable_stackTraceString; +extern struct vm_method *vm_java_lang_Throwable_toString; +extern struct vm_method *vm_java_lang_StackTraceElement_init; + int preload_vm_classes(void); diff --git a/vm/jato.c b/vm/jato.c index 418a2be..6595699 100644 --- a/vm/jato.c +++ b/vm/jato.c @@ -328,8 +328,6 @@ main(int argc, char *argv[]) exit(EXIT_FAILURE); } - init_stack_trace_printing(); - struct vm_class *vmc = classloader_load(classname); if (!vmc) { fprintf(stderr, "error: %s: could not load\n", classname); diff --git a/vm/preload.c b/vm/preload.c index 5c8a181..fd73ce7 100644 --- a/vm/preload.c +++ b/vm/preload.c @@ -215,6 +215,9 @@ struct method_preload_entry { struct vm_method *vm_java_util_Properties_setProperty; struct vm_method *vm_java_lang_Throwable_initCause; +struct vm_method *vm_java_lang_Throwable_stackTraceString; +struct vm_method *vm_java_lang_Throwable_toString; +struct vm_method *vm_java_lang_StackTraceElement_init; static const struct method_preload_entry method_preload_entries[] = { { @@ -229,7 +232,24 @@ static const struct method_preload_entry method_preload_entries[] = { "(Ljava/lang/Throwable;)Ljava/lang/Throwable;", &vm_java_lang_Throwable_initCause, }, - + { + &vm_java_lang_StackTraceElement, + "<init>", + "(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Z)V", + &vm_java_lang_StackTraceElement_init, + }, + { + &vm_java_lang_Throwable, + "toString", + "()Ljava/lang/String;", + &vm_java_lang_Throwable_toString, + }, + { + &vm_java_lang_Throwable, + "stackTraceString", + "()Ljava/lang/String;", + &vm_java_lang_Throwable_stackTraceString, + }, }; int preload_vm_classes(void) diff --git a/vm/stack-trace.c b/vm/stack-trace.c index 064c8e4..36b3068 100644 --- a/vm/stack-trace.c +++ b/vm/stack-trace.c @@ -44,45 +44,6 @@ __thread struct native_stack_frame *bottom_stack_frame; -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_method *ste_init_mb; - struct vm_method *throwable_tostring_mb; - struct vm_method *throwable_stacktracestring_mb; - - ste_init_mb = vm_class_get_method_recursive( - vm_java_lang_StackTraceElement, - "<init>", - "(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Z)V"); - - throwable_tostring_mb = - vm_class_get_method_recursive(vm_java_lang_Throwable, - "toString", "()Ljava/lang/String;"); - - throwable_stacktracestring_mb = - vm_class_get_method_recursive(vm_java_lang_Throwable, - "stackTraceString", "()Ljava/lang/String;"); - - 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"); -} - /** * get_caller_stack_trace_elem - makes @elem to point to the stack * trace element corresponding to the caller of given element. @@ -266,6 +227,9 @@ struct vm_object *get_stack_trace(struct stack_trace_elem *st_elem) return vmstate; } +typedef void (*ste_init_fn)(struct vm_object *, struct vm_object *, int, + struct vm_object *, struct vm_object *, int); + /** * new_stack_trace_element - creates new instance of * java.lang.StackTraceElement for given method and bytecode @@ -279,6 +243,7 @@ new_stack_trace_element(struct vm_method *mb, unsigned long bc_offset) struct vm_object *file_name; struct vm_class *cb; struct vm_object *ste; + ste_init_fn ste_init; char *class_dot_name; bool is_native; int line_no; @@ -302,6 +267,8 @@ new_stack_trace_element(struct vm_method *mb, unsigned long bc_offset) if(!ste) return NULL; + ste_init = + vm_method_trampoline_ptr(vm_java_lang_StackTraceElement_init); ste_init(ste, file_name, line_no, class_name, method_name, is_native); return ste; -- 1.6.0.6 ------------------------------------------------------------------------------ _______________________________________________ Jatovm-devel mailing list Jatovm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jatovm-devel