2009/7/26 Tomek Grabiec <tgrab...@gmail.com>: > 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 > >
Please hold on with merging this one because I noticed that for some reason "Caused by:" parts are not printed after this patch, which seems to be a bug in JIT. -- Tomek Grabiec ------------------------------------------------------------------------------ _______________________________________________ Jatovm-devel mailing list Jatovm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jatovm-devel