As java/lang/String.substring() is now working so is java/lang/Throwable.stackTraceString(). It allows us to get the full exception descripton with just one method call.
Signed-off-by: Tomek Grabiec <tgrab...@gmail.com> --- include/vm/preload.h | 8 +-- test/vm/preload-stub.c | 8 +-- vm/preload.c | 48 +-------------- vm/stack-trace.c | 156 +++--------------------------------------------- 4 files changed, 13 insertions(+), 207 deletions(-) diff --git a/include/vm/preload.h b/include/vm/preload.h index 233c0e6..867f9fc 100644 --- a/include/vm/preload.h +++ b/include/vm/preload.h @@ -43,16 +43,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_getCause; -extern struct vm_method *vm_java_lang_Throwable_toString; +extern struct vm_method *vm_java_lang_Throwable_stackTraceString; extern struct vm_method *vm_java_lang_Throwable_getStackTrace; extern struct vm_method *vm_java_lang_Throwable_setStackTrace; extern struct vm_method *vm_java_lang_StackTraceElement_init; -extern struct vm_method *vm_java_lang_StackTraceElement_getFileName; -extern struct vm_method *vm_java_lang_StackTraceElement_getClassName; -extern struct vm_method *vm_java_lang_StackTraceElement_getMethodName; -extern struct vm_method *vm_java_lang_StackTraceElement_getLineNumber; -extern struct vm_method *vm_java_lang_StackTraceElement_isNativeMethod; -extern struct vm_method *vm_java_lang_StackTraceElement_equals; int preload_vm_classes(void); diff --git a/test/vm/preload-stub.c b/test/vm/preload-stub.c index 25c5b2b..7d871c1 100644 --- a/test/vm/preload-stub.c +++ b/test/vm/preload-stub.c @@ -34,13 +34,7 @@ struct vm_class *vm_java_lang_StackOverflowError; struct vm_method *vm_java_lang_Throwable_initCause; struct vm_method *vm_java_lang_Throwable_getCause; -struct vm_method *vm_java_lang_Throwable_toString; +struct vm_method *vm_java_lang_Throwable_stackTraceString; struct vm_method *vm_java_lang_Throwable_getStackTrace; struct vm_method *vm_java_lang_Throwable_setStackTrace; struct vm_method *vm_java_lang_StackTraceElement_init; -struct vm_method *vm_java_lang_StackTraceElement_getFileName; -struct vm_method *vm_java_lang_StackTraceElement_getClassName; -struct vm_method *vm_java_lang_StackTraceElement_getMethodName; -struct vm_method *vm_java_lang_StackTraceElement_getLineNumber; -struct vm_method *vm_java_lang_StackTraceElement_isNativeMethod; -struct vm_method *vm_java_lang_StackTraceElement_equals; diff --git a/vm/preload.c b/vm/preload.c index 4bfb9df..54e749c 100644 --- a/vm/preload.c +++ b/vm/preload.c @@ -139,16 +139,10 @@ 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_getCause; -struct vm_method *vm_java_lang_Throwable_toString; +struct vm_method *vm_java_lang_Throwable_stackTraceString; struct vm_method *vm_java_lang_Throwable_getStackTrace; struct vm_method *vm_java_lang_Throwable_setStackTrace; struct vm_method *vm_java_lang_StackTraceElement_init; -struct vm_method *vm_java_lang_StackTraceElement_getFileName; -struct vm_method *vm_java_lang_StackTraceElement_getClassName; -struct vm_method *vm_java_lang_StackTraceElement_getMethodName; -struct vm_method *vm_java_lang_StackTraceElement_getLineNumber; -struct vm_method *vm_java_lang_StackTraceElement_isNativeMethod; -struct vm_method *vm_java_lang_StackTraceElement_equals; static const struct method_preload_entry method_preload_entries[] = { { @@ -183,45 +177,9 @@ static const struct method_preload_entry method_preload_entries[] = { }, { &vm_java_lang_Throwable, - "toString", + "stackTraceString", "()Ljava/lang/String;", - &vm_java_lang_Throwable_toString, - }, - { - &vm_java_lang_StackTraceElement, - "getFileName", - "()Ljava/lang/String;", - &vm_java_lang_StackTraceElement_getFileName, - }, - { - &vm_java_lang_StackTraceElement, - "getClassName", - "()Ljava/lang/String;", - &vm_java_lang_StackTraceElement_getClassName, - }, - { - &vm_java_lang_StackTraceElement, - "getMethodName", - "()Ljava/lang/String;", - &vm_java_lang_StackTraceElement_getMethodName, - }, - { - &vm_java_lang_StackTraceElement, - "getLineNumber", - "()I", - &vm_java_lang_StackTraceElement_getLineNumber, - }, - { - &vm_java_lang_StackTraceElement, - "isNativeMethod", - "()Z", - &vm_java_lang_StackTraceElement_isNativeMethod, - }, - { - &vm_java_lang_StackTraceElement, - "equals", - "(Ljava/lang/Object;)Z", - &vm_java_lang_StackTraceElement_equals, + &vm_java_lang_Throwable_stackTraceString, }, { &vm_java_lang_StackTraceElement, diff --git a/vm/stack-trace.c b/vm/stack-trace.c index 1c3418f..1fe185d 100644 --- a/vm/stack-trace.c +++ b/vm/stack-trace.c @@ -597,152 +597,6 @@ native_vmthrowable_get_stack_trace(struct vm_object *this, return result; } -static void -vm_throwable_to_string(struct vm_object *this, struct string *str) -{ - struct vm_object *string_obj; - - string_obj = vm_call_method_object(vm_java_lang_Throwable_toString, - this); - if (!string_obj) - return; - - char *cstr = vm_string_to_cstr(string_obj); - str_append(str, cstr); - free(cstr); -} - -static void vm_stack_trace_element_to_string(struct vm_object *elem, - struct string *str) -{ - struct vm_object *method_name; - struct vm_object *file_name; - struct vm_object *class_name; - char *method_name_str; - char *file_name_str; - char *class_name_str; - jint line_number; - jboolean is_native; - - file_name = vm_call_method_object( - vm_java_lang_StackTraceElement_getFileName, elem); - line_number = vm_call_method_jint( - vm_java_lang_StackTraceElement_getLineNumber, elem); - class_name = vm_call_method_object( - vm_java_lang_StackTraceElement_getClassName, elem); - method_name = vm_call_method_object( - vm_java_lang_StackTraceElement_getMethodName, elem); - is_native = vm_call_method_jboolean( - vm_java_lang_StackTraceElement_isNativeMethod, elem); - - if (class_name) { - class_name_str = vm_string_to_cstr(class_name); - - str_append(str, class_name_str); - if (method_name) - str_append(str, "."); - } - - if (method_name) { - method_name_str = vm_string_to_cstr(method_name); - str_append(str, method_name_str); - } - - str_append(str, "("); - - if (file_name) { - file_name_str = vm_string_to_cstr(file_name); - str_append(str, file_name_str); - } else { - if (is_native) - str_append(str, "Native Method"); - else - str_append(str, "Unknown Source"); - } - - if (line_number >= 0) - str_append(str, ":%d", line_number); - - str_append(str, ")"); -} - -static void -vm_throwable_stack_trace(struct vm_object *this, struct string *str, - struct vm_object *stack, int equal) -{ - vm_throwable_to_string(this, str); - str_append(str, "\n"); - - if (stack == NULL || stack->array_length == 0) { - str_append(str, " <<No stacktrace available>>\n"); - return; - } - - for (int i = 0; i < stack->array_length - equal; i++) { - struct vm_object *elem = array_get_field_ptr(stack, i); - - str_append(str, " at "); - if (!elem) - str_append(str, "<<Unknown>>"); - else - vm_stack_trace_element_to_string(elem, str); - - str_append(str, "\n"); - } - - if (equal > 0) - str_append(str, " ...%d more\n", equal); -} - - -static void -vm_throwable_print_stack_trace(struct vm_object *this, struct string *str) -{ - struct vm_object *stack; - struct vm_object *cause; - - stack = vm_call_method_object( - vm_java_lang_Throwable_getStackTrace, this); - - vm_throwable_stack_trace(this, str, stack, 0); - - cause = this; - while ((cause = vm_call_method_object(vm_java_lang_Throwable_getCause, - cause))) - { - struct vm_object *p_stack; - - str_append(str, "Caused by: "); - - p_stack = stack; - stack = vm_call_method_object( - vm_java_lang_Throwable_getStackTrace, cause); - - if (p_stack == NULL || p_stack->array_length == 0) { - vm_throwable_stack_trace(cause, str, stack, 0); - continue; - } - - int equal = 0; - int frame = stack->array_length - 1; - int p_frame = p_stack->array_length - 1; - - while (frame > 0 && p_frame > 0) { - if (!vm_call_method_jboolean( - vm_java_lang_StackTraceElement_equals, - array_get_field_ptr(stack, frame), - array_get_field_ptr(p_stack, p_frame))) - break; - - equal++; - frame--; - p_frame--; - } - - vm_throwable_stack_trace(cause, str, stack, equal); - } -} - static void vm_print_exception_description(struct vm_object *exception) { struct vm_object *message_obj; @@ -766,7 +620,7 @@ static void vm_print_exception_description(struct vm_object *exception) void vm_print_exception(struct vm_object *exception) { - struct vm_object *old_exception; + struct vm_object *old_exception, *string; struct string *str; str = alloc_str(); @@ -779,10 +633,16 @@ void vm_print_exception(struct vm_object *exception) /* TODO: print correct thread name */ str_append(str, "Exception in thread \"main\" "); - vm_throwable_print_stack_trace(exception, str); + string = vm_call_method_object(vm_java_lang_Throwable_stackTraceString, exception); if (exception_occurred()) goto error; + char *string_s = vm_string_to_cstr(string); + if (!string_s) + goto error; + + str_append(str, string_s); + fprintf(stderr, "%s", str->value); free_str(str); -- 1.6.0.6 ------------------------------------------------------------------------------ _______________________________________________ Jatovm-devel mailing list Jatovm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jatovm-devel