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

Reply via email to