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

Reply via email to