Signed-off-by: Tomek Grabiec <[email protected]>
---
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/jatovm-devel