Cleanup fallouts from JamVM and re-enable natives for
VMThrowable.fillInStackTrace() and VMThrowable.getStackTrace().

Signed-off-by: Tomek Grabiec <tgrab...@gmail.com>
---
 include/vm/java_lang.h   |    5 ++-
 include/vm/object.h      |   12 +++++
 include/vm/stack-trace.h |    5 +-
 vm/jato.c                |   24 ++++------
 vm/stack-trace.c         |  117 +++++++++++++++++----------------------------
 5 files changed, 72 insertions(+), 91 deletions(-)

diff --git a/include/vm/java_lang.h b/include/vm/java_lang.h
index 06ed716..cb9d150 100644
--- a/include/vm/java_lang.h
+++ b/include/vm/java_lang.h
@@ -6,7 +6,9 @@ extern struct vm_class *vm_java_lang_Class;
 extern struct vm_class *vm_java_lang_String;
 extern struct vm_class *vm_java_lang_Throwable;
 extern struct vm_class *vm_java_util_Properties;
-
+extern struct vm_class *vm_java_lang_VMThrowable;
+extern struct vm_class *vm_java_lang_StackTraceElement;
+extern struct vm_class *vm_array_of_java_lang_StackTraceElement;
 extern struct vm_class *vm_boolean_class;
 extern struct vm_class *vm_char_class;
 extern struct vm_class *vm_float_class;
@@ -21,6 +23,7 @@ extern struct vm_field *vm_java_lang_String_offset;
 extern struct vm_field *vm_java_lang_String_count;
 extern struct vm_field *vm_java_lang_String_value;
 extern struct vm_field *vm_java_lang_Throwable_detailMessage;
+extern struct vm_field *vm_java_lang_VMThrowable_vmdata;
 
 extern struct vm_method *vm_java_util_Properties_setProperty;
 
diff --git a/include/vm/object.h b/include/vm/object.h
index a38a1d3..4196030 100644
--- a/include/vm/object.h
+++ b/include/vm/object.h
@@ -84,4 +84,16 @@ array_get_field_char(struct vm_object *obj, int index)
        return *(uint16_t *) &obj->fields[index * get_vmtype_size(J_CHAR)];
 }
 
+static inline void
+array_set_field_ptr(struct vm_object *obj, int index, void *value)
+{
+       *(void **) &obj->fields[index * get_vmtype_size(J_REFERENCE)] = value;
+}
+
+static inline void *
+array_get_field_ptr(struct vm_object *obj, int index)
+{
+       return *(void **) &obj->fields[index * get_vmtype_size(J_REFERENCE)];
+}
+
 #endif
diff --git a/include/vm/stack-trace.h b/include/vm/stack-trace.h
index 8759ced..953afc8 100644
--- a/include/vm/stack-trace.h
+++ b/include/vm/stack-trace.h
@@ -41,9 +41,8 @@ struct vm_object *get_stack_trace(struct stack_trace_elem *);
 struct vm_object *get_stack_trace_from_ctx(void *ctx);
 struct vm_object *convert_stack_trace(struct vm_object *vmthrowable);
 struct vm_object *new_stack_trace_element(struct vm_method *, unsigned long);
-struct vm_object * __vm_native vm_throwable_fill_in_stack_trace(struct 
vm_object *);
-struct vm_object * __vm_native vm_throwable_get_stack_trace(struct vm_object 
*, struct vm_object *);
-void set_throwable_vmstate(struct vm_object *throwable, struct vm_object 
*vmstate);
+struct vm_object * __vm_native native_vmthrowable_fill_in_stack_trace(struct 
vm_object *);
+struct vm_object * __vm_native native_vmthrowable_get_stack_trace(struct 
vm_object *, struct vm_object *);
 
 bool called_from_jit_trampoline(struct native_stack_frame *frame);
 void vm_print_exception(struct vm_object *exception);
diff --git a/vm/jato.c b/vm/jato.c
index 439c237..2567ad7 100644
--- a/vm/jato.c
+++ b/vm/jato.c
@@ -156,19 +156,6 @@ static int32_t __vm_native 
native_vmsystem_identityhashcode(struct vm_object *ob
        return (int32_t) obj;
 }
 
-/*
- * This stub is needed by java.lang.VMThrowable constructor to work. It should
- * return java.lang.VMState instance, or null in which case no stack trace will
- * be printed by printStackTrace() method.
- */
-static struct vm_object * __vm_native
-native_vmthrowable_fill_in_stack_trace(struct vm_object *message)
-{
-       NOT_IMPLEMENTED;
-
-       return NULL;
-}
-
 static struct vm_object * __vm_native
 native_vmobject_getclass(struct vm_object *object)
 {
@@ -220,6 +207,7 @@ static struct vm_native natives[] = {
        DEFINE_NATIVE("java/lang/VMSystem", "arraycopy", 
&native_vmsystem_arraycopy),
        DEFINE_NATIVE("java/lang/VMSystem", "identityHashCode", 
&native_vmsystem_identityhashcode),
        DEFINE_NATIVE("java/lang/VMThrowable", "fillInStackTrace", 
&native_vmthrowable_fill_in_stack_trace),
+       DEFINE_NATIVE("java/lang/VMThrowable", "getStackTrace", 
&native_vmthrowable_get_stack_trace),
 };
 
 static void jit_init_natives(void)
@@ -240,7 +228,9 @@ struct vm_class *vm_java_lang_Class;
 struct vm_class *vm_java_lang_String;
 struct vm_class *vm_java_lang_Throwable;
 struct vm_class *vm_java_util_Properties;
-
+struct vm_class *vm_java_lang_VMThrowable;
+struct vm_class *vm_java_lang_StackTraceElement;
+struct vm_class *vm_array_of_java_lang_StackTraceElement;
 struct vm_class *vm_boolean_class;
 struct vm_class *vm_char_class;
 struct vm_class *vm_float_class;
@@ -256,6 +246,10 @@ static const struct preload_entry preload_entries[] = {
        { "java/lang/String",           &vm_java_lang_String },
        { "java/lang/Throwable",        &vm_java_lang_Throwable },
        { "java/util/Properties",       &vm_java_util_Properties },
+       { "java/lang/RuntimeException", &vm_java_lang_RE },
+       { "java/lang/VMThrowable",      &vm_java_lang_VMThrowable },
+       { "java/lang/StackTraceElement", &vm_java_lang_StackTraceElement },
+       { "[Ljava/lang/StackTraceElement;", 
&vm_array_of_java_lang_StackTraceElement },
 };
 
 static const struct preload_entry primitive_preload_entries[] = {
@@ -281,6 +275,7 @@ struct vm_field *vm_java_lang_String_offset;
 struct vm_field *vm_java_lang_String_count;
 struct vm_field *vm_java_lang_String_value;
 struct vm_field *vm_java_lang_Throwable_detailMessage;
+struct vm_field *vm_java_lang_VMThrowable_vmdata;
 
 static const struct field_preload_entry field_preload_entries[] = {
        { &vm_java_lang_Class, "vmdata", "Ljava/lang/Object;", 
&vm_java_lang_Class_vmdata },
@@ -288,6 +283,7 @@ static const struct field_preload_entry 
field_preload_entries[] = {
        { &vm_java_lang_String, "count", "I",   &vm_java_lang_String_count },
        { &vm_java_lang_String, "value", "[C",  &vm_java_lang_String_value },
        { &vm_java_lang_Throwable, "detailMessage", "Ljava/lang/String;", 
&vm_java_lang_Throwable_detailMessage },
+       { &vm_java_lang_VMThrowable, "vmdata", "Ljava/lang/Object;", 
&vm_java_lang_VMThrowable_vmdata },
 };
 
 struct method_preload_entry {
diff --git a/vm/stack-trace.c b/vm/stack-trace.c
index 7cc9555..3b31afc 100644
--- a/vm/stack-trace.c
+++ b/vm/stack-trace.c
@@ -44,57 +44,43 @@
 
 __thread struct native_stack_frame *bottom_stack_frame;
 
-static struct vm_class *vmthrowable_class;
-static struct vm_class *throwable_class;
-static struct vm_class *ste_class;
-static struct vm_class *ste_array_class;
-static int backtrace_offset;
-static int vmstate_offset;
-
 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_field *backtrace_fld;
-       struct vm_field *vmstate_fld;
        struct vm_method *ste_init_mb;
+       struct vm_method *throwable_tostring_mb;
+       struct vm_method *throwable_stacktracestring_mb;
 
-       NOT_IMPLEMENTED;
-       return;
-
-       /* XXX: Preload these. */
-       vmthrowable_class = classloader_load("java/lang/VMThrowable");
-       throwable_class = classloader_load("java/lang/Throwable");
-       ste_class = classloader_load("java/lang/StackTraceElement");
-       ste_array_class = classloader_load("[Ljava/lang/StackTraceElement;");
-
-       if (exception_occurred())
-               goto error;
-
-       ste_init_mb = vm_class_get_method_recursive(ste_class, "<init>",
+       ste_init_mb = vm_class_get_method_recursive(
+               vm_java_lang_StackTraceElement,
+               "<init>",
                "(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Z)V");
-       if (ste_init_mb == NULL)
-               goto error;
-
-       ste_init = vm_method_trampoline_ptr(ste_init_mb);
-
-       backtrace_fld = vm_class_get_field_recursive(vmthrowable_class,
-               "backtrace", "Ljava/lang/Object;");
-       vmstate_fld = vm_class_get_field_recursive(throwable_class,
-               "vmState", "Ljava/lang/VMThrowable;");
 
-       if (!backtrace_fld || !vmstate_fld)
-               goto error;
+       throwable_tostring_mb =
+               vm_class_get_method_recursive(vm_java_lang_Throwable,
+                       "toString", "()Ljava/lang/String;");
 
-       backtrace_offset = backtrace_fld->offset;
-       vmstate_offset = vmstate_fld->offset;
-       return;
+       throwable_stacktracestring_mb =
+               vm_class_get_method_recursive(vm_java_lang_Throwable,
+                       "stackTraceString", "()Ljava/lang/String;");
 
- error:
-       die("initialization failed");
+       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");
 }
 
 /**
@@ -236,7 +222,6 @@ struct vm_object *get_stack_trace(struct stack_trace_elem 
*st_elem)
        struct compilation_unit *cu;
        struct vm_object *vmstate;
        struct vm_object *array;
-       unsigned long *data;
        int array_type;
        int depth;
        int i;
@@ -245,7 +230,7 @@ struct vm_object *get_stack_trace(struct stack_trace_elem 
*st_elem)
        if (depth == 0)
                return NULL;
 
-       vmstate = vm_object_alloc(vmthrowable_class);
+       vmstate = vm_object_alloc(vm_java_lang_VMThrowable);
        if (!vmstate)
                return NULL;
 
@@ -254,8 +239,6 @@ struct vm_object *get_stack_trace(struct stack_trace_elem 
*st_elem)
        if (!array)
                return NULL;
 
-       data = ARRAY_DATA(array);
-
        i = 0;
        do {
                unsigned long bc_offset;
@@ -274,13 +257,11 @@ struct vm_object *get_stack_trace(struct stack_trace_elem 
*st_elem)
                        bc_offset = native_ptr_to_bytecode_offset(cu,
                                (unsigned char*)st_elem->addr);
 
-               data[i++] = (unsigned long)cu->method;
-
-               /* We must add cu->method->code to be compatible with JamVM. */
-               data[i++] = bc_offset + (unsigned long)cu->method->jit_code;
+               array_set_field_ptr(array, i++, cu->method);
+               array_set_field_ptr(array, i++, (void*)bc_offset);
        } while (get_prev_stack_trace_elem(st_elem) == 0);
 
-       INST_DATA(vmstate)[backtrace_offset] = (uintptr_t)array;
+       field_set_object(vmstate, vm_java_lang_VMThrowable_vmdata, array);
 
        return vmstate;
 }
@@ -307,12 +288,9 @@ new_stack_trace_element(struct vm_method *mb, unsigned 
long bc_offset)
        line_no = bytecode_offset_to_line_no(mb, bc_offset);
        is_native = vm_method_is_native(mb);
 
-       NOT_IMPLEMENTED;
-#if 0
        if (!is_native && cb->source_file_name)
-               file_name = createString(cb->source_file_name);
+               file_name = vm_object_alloc_string_from_c(cb->source_file_name);
        else
-#endif
                file_name = NULL;
 
        class_dot_name = slash2dots(cb->name);
@@ -320,7 +298,7 @@ new_stack_trace_element(struct vm_method *mb, unsigned long 
bc_offset)
        method_name = vm_object_alloc_string_from_c(mb->name);
        free(class_dot_name);
 
-       ste = vm_object_alloc(ste_class);
+       ste = vm_object_alloc(vm_java_lang_StackTraceElement);
        if(!ste)
                return NULL;
 
@@ -338,63 +316,61 @@ new_stack_trace_element(struct vm_method *mb, unsigned 
long bc_offset)
  */
 struct vm_object *convert_stack_trace(struct vm_object *vmthrowable)
 {
-       unsigned long *stack_trace;
        struct vm_object *ste_array;
        struct vm_object *array;
-       struct vm_object **dest;
        int depth;
        int i;
+       int j;
 
-       array = (struct vm_object *)INST_DATA(vmthrowable)[backtrace_offset];
+       array = field_get_object(vmthrowable, vm_java_lang_VMThrowable_vmdata);
        if (!array)
                return NULL;
 
-       stack_trace = ARRAY_DATA(array);
-       depth = ARRAY_LEN(array);
+       depth = array->array_length;
 
-       ste_array = vm_object_alloc_array(ste_array_class, depth / 2);
+       ste_array = vm_object_alloc_array(
+               vm_array_of_java_lang_StackTraceElement, depth / 2);
        if (!ste_array)
                return NULL;
 
-       dest = ARRAY_DATA(ste_array);
-
-       for(i = 0; i < depth; dest++) {
+       for(i = 0, j = 0; i < depth; j++) {
                struct vm_method *mb;
                unsigned long bc_offset;
                struct vm_object *ste;
 
-               mb = (struct vm_method *)stack_trace[i++];
-               bc_offset = stack_trace[i++] - (unsigned long)mb->jit_code;
+               mb = array_get_field_ptr(array, i++);
+               bc_offset = (unsigned long)array_get_field_ptr(array, i++);
 
                ste = new_stack_trace_element(mb, bc_offset);
                if(ste == NULL || exception_occurred())
                        return NULL;
 
-               *dest = ste;
+               array_set_field_ptr(ste_array, j, ste);
        }
 
        return ste_array;
 }
 
 struct vm_object * __vm_native
-vm_throwable_fill_in_stack_trace(struct vm_object *throwable)
+native_vmthrowable_fill_in_stack_trace(struct vm_object *throwable)
 {
        struct stack_trace_elem st_elem;
 
        if (init_stack_trace_elem(&st_elem))
                return NULL;
 
-       if (skip_frames_from_class(&st_elem, vmthrowable_class))
+       if (skip_frames_from_class(&st_elem, vm_java_lang_VMThrowable))
                return NULL;
 
-       if (skip_frames_from_class(&st_elem, throwable_class))
+       if (skip_frames_from_class(&st_elem, vm_java_lang_Throwable))
                return NULL;
 
        return get_stack_trace(&st_elem);
 }
 
 struct vm_object * __vm_native
-vm_throwable_get_stack_trace(struct vm_object *this, struct vm_object 
*throwable)
+native_vmthrowable_get_stack_trace(struct vm_object *this,
+                            struct vm_object *throwable)
 {
        struct vm_object *result;
 
@@ -406,11 +382,6 @@ vm_throwable_get_stack_trace(struct vm_object *this, 
struct vm_object *throwable
        return result;
 }
 
-void set_throwable_vmstate(struct vm_object *throwable, struct vm_object 
*vmstate)
-{
-       INST_DATA(throwable)[vmstate_offset] = (uintptr_t)vmstate;
-}
-
 void vm_print_exception(struct vm_object *exception)
 {
        struct vm_object *message_obj;
-- 
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