Signed-off-by: Tomek Grabiec <tgrab...@gmail.com>
---
 include/jit/exception.h |    2 +-
 include/vm/object.h     |    4 +---
 include/vm/preload.h    |   11 +++++++++++
 jit/emulate.c           |    4 ++--
 jit/exception.c         |    4 ++--
 jit/trampoline.c        |    2 +-
 test/vm/object-stub.c   |    2 +-
 vm/jato.c               |   12 ++++++------
 vm/object.c             |   27 +++++++++++----------------
 vm/preload.c            |   23 ++++++++++++++++++++++-
 vm/signal.c             |    5 +++--
 11 files changed, 61 insertions(+), 35 deletions(-)

diff --git a/include/jit/exception.h b/include/jit/exception.h
index ca31cd5..83bf8bc 100644
--- a/include/jit/exception.h
+++ b/include/jit/exception.h
@@ -55,7 +55,7 @@ void throw_exception_from_signal(void *ctx, struct vm_object 
*exception);
 void throw_exception_from_trampoline(void *ctx, struct vm_object *exception);
 void unwind(void);
 void signal_exception(struct vm_object *obj);
-void signal_new_exception(const char *class_name, const char *msg);
+void signal_new_exception(struct vm_class *vmc, const char *msg);
 void clear_exception(void);
 void init_exceptions(void);
 void thread_init_exceptions(void);
diff --git a/include/vm/object.h b/include/vm/object.h
index 4196030..ead13b5 100644
--- a/include/vm/object.h
+++ b/include/vm/object.h
@@ -31,9 +31,7 @@ struct vm_object *vm_object_alloc_array(struct vm_class 
*class, int count);
 struct vm_object *
 vm_object_alloc_string_from_utf8(const uint8_t bytes[], unsigned int length);
 struct vm_object *vm_object_alloc_string_from_c(const char *bytes);
-
-struct vm_object *new_exception(const char *class_name, const char *message);
-
+struct vm_object *new_exception(struct vm_class *vmc, const char *message);
 bool vm_object_is_instance_of(const struct vm_object *obj, const struct 
vm_class *class);
 void vm_object_check_null(struct vm_object *obj);
 void vm_object_check_array(struct vm_object *obj, unsigned int index);
diff --git a/include/vm/preload.h b/include/vm/preload.h
index 4c46462..55ba334 100644
--- a/include/vm/preload.h
+++ b/include/vm/preload.h
@@ -9,6 +9,17 @@ 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_java_lang_Error;
+extern struct vm_class *vm_java_lang_ArithmeticException;
+extern struct vm_class *vm_java_lang_NullPointerException;
+extern struct vm_class *vm_java_lang_NegativeArraySizeException;
+extern struct vm_class *vm_java_lang_ClassCastException;
+extern struct vm_class *vm_java_lang_NoClassDefFoundError;
+extern struct vm_class *vm_java_lang_UnsatisfiedLinkError;
+extern struct vm_class *vm_java_lang_ArrayIndexOutOfBoundsException;
+extern struct vm_class *vm_java_lang_ArrayStoreException;
+extern struct vm_class *vm_java_lang_RuntimeException;
+extern struct vm_class *vm_java_lang_ExceptionInInitializerError;
 extern struct vm_class *vm_boolean_class;
 extern struct vm_class *vm_char_class;
 extern struct vm_class *vm_float_class;
diff --git a/jit/emulate.c b/jit/emulate.c
index 368b8b3..6c4cb93 100644
--- a/jit/emulate.c
+++ b/jit/emulate.c
@@ -74,7 +74,7 @@ long long emulate_ldiv(long long value1, long long value2)
 {
        if (value2 == 0) {
                signal_new_exception(
-                       "java/lang/ArithmeticException", "division by zero");
+                       vm_java_lang_ArithmeticException, "division by zero");
                throw_from_native(2 * sizeof(long long));
                return 0;
        }
@@ -86,7 +86,7 @@ long long emulate_lrem(long long value1, long long value2)
 {
        if (value2 == 0) {
                signal_new_exception(
-                       "java/lang/ArithmeticException", "division by zero");
+                       vm_java_lang_ArithmeticException, "division by zero");
                throw_from_native(2 * sizeof(long long));
                return 0;
        }
diff --git a/jit/exception.c b/jit/exception.c
index 99179ae..20e2e1b 100644
--- a/jit/exception.c
+++ b/jit/exception.c
@@ -94,11 +94,11 @@ void signal_exception(struct vm_object *exception)
        exception_holder = exception;
 }
 
-void signal_new_exception(const char *class_name, const char *msg)
+void signal_new_exception(struct vm_class *vmc, const char *msg)
 {
        struct vm_object *e;
 
-       e = new_exception(class_name, msg);
+       e = new_exception(vmc, msg);
        signal_exception(e);
 }
 
diff --git a/jit/trampoline.c b/jit/trampoline.c
index c0ce053..faee0c4 100644
--- a/jit/trampoline.c
+++ b/jit/trampoline.c
@@ -70,7 +70,7 @@ static void *jit_native_trampoline(struct compilation_unit 
*cu)
        if (strcmp(class_name, "VMThrowable") == 0)
                die("no native function found for %s", msg->value);
 
-       signal_new_exception("java/lang/UnsatisfiedLinkError", msg->value);
+       signal_new_exception(vm_java_lang_UnsatisfiedLinkError, msg->value);
        free_str(msg);
 
        return NULL;
diff --git a/test/vm/object-stub.c b/test/vm/object-stub.c
index 24502a1..cfcabad 100644
--- a/test/vm/object-stub.c
+++ b/test/vm/object-stub.c
@@ -19,7 +19,7 @@ vm_object_alloc_string_from_c(const char *bytes)
        return NULL;
 }
 
-struct vm_object *new_exception(const char *class_name, const char *message)
+struct vm_object *new_exception(struct vm_class *class, const char *message)
 {
        return NULL;
 }
diff --git a/vm/jato.c b/vm/jato.c
index f005dd8..ccd60b5 100644
--- a/vm/jato.c
+++ b/vm/jato.c
@@ -110,20 +110,20 @@ native_vmsystem_arraycopy(struct vm_object *src, int 
src_start,
        int elem_size;
 
        if (!src || !dest || !src->class || !dest->class) {
-               signal_new_exception("java.lang.NullPointerException", NULL);
+               signal_new_exception(vm_java_lang_NullPointerException, NULL);
                goto throw;
        }
 
        if (!vm_class_is_array_class(src->class) ||
            !vm_class_is_array_class(dest->class)) {
-               signal_new_exception("java.lang.ArrayStoreException", NULL);
+               signal_new_exception(vm_java_lang_ArrayStoreException, NULL);
                goto throw;
        }
 
        src_elem_class = vm_class_get_array_element_class(src->class);
        dest_elem_class = vm_class_get_array_element_class(dest->class);
        if (!src_elem_class || !dest_elem_class) {
-               signal_new_exception("java.lang.NullPointerException", NULL);
+               signal_new_exception(vm_java_lang_NullPointerException, NULL);
                goto throw;
        }
 
@@ -136,8 +136,8 @@ native_vmsystem_arraycopy(struct vm_object *src, int 
src_start,
        if (len < 0 ||
            src_start < 0 || src_start + len > src->array_length ||
            dest_start < 0 || dest_start + len > dest->array_length) {
-               signal_new_exception("java.lang.ArrayIndexOutOfBoundsException",
-                                    NULL);
+               signal_new_exception(
+                       vm_java_lang_ArrayIndexOutOfBoundsException, NULL);
                goto throw;
        }
 
@@ -160,7 +160,7 @@ static struct vm_object * __vm_native
 native_vmobject_getclass(struct vm_object *object)
 {
        if (!object || !object->class) {
-               signal_new_exception("java.lang.NullPointerException", NULL);
+               signal_new_exception(vm_java_lang_NullPointerException, NULL);
                throw_from_native(sizeof object);
        }
 
diff --git a/vm/object.c b/vm/object.c
index f997025..c52ffd5 100644
--- a/vm/object.c
+++ b/vm/object.c
@@ -241,19 +241,14 @@ vm_object_alloc_string_from_c(const char *bytes)
 
 typedef void (*exception_init_fn)(struct vm_object *, struct vm_object *);
 
-struct vm_object *new_exception(const char *class_name, const char *message)
+struct vm_object *new_exception(struct vm_class *vmc, const char *message)
 {
        struct vm_object *message_str;
        exception_init_fn init;
        struct vm_method *mb;
        struct vm_object *obj;
-       struct vm_class *e_class;
 
-       e_class = classloader_load(class_name);
-       if (!e_class)
-               return NULL;
-
-       obj = vm_object_alloc(e_class);
+       obj = vm_object_alloc(vmc);
        if (!obj)
                return NULL;
 
@@ -262,10 +257,10 @@ struct vm_object *new_exception(const char *class_name, 
const char *message)
        else
                message_str = vm_object_alloc_string_from_c(message);
 
-       mb = vm_class_get_method(e_class,
+       mb = vm_class_get_method(vmc,
                "<init>", "(Ljava/lang/String;)V");
        if (!mb)
-               die("constructor not found for class %s\n", class_name);
+               error("constructor not found");
 
        init = vm_method_trampoline_ptr(mb);
        init(obj, message_str);
@@ -296,7 +291,7 @@ void vm_object_check_array(struct vm_object *obj, unsigned 
int index)
        cb = obj->class;
 
        if (!vm_class_is_array_class(cb)) {
-               signal_new_exception("java/lang/RuntimeException",
+               signal_new_exception(vm_java_lang_RuntimeException,
                                     "object is not an array");
                goto throw;
        }
@@ -307,7 +302,7 @@ void vm_object_check_array(struct vm_object *obj, unsigned 
int index)
                return;
 
        sprintf(index_str, "%d > %d", index, array_len - 1);
-       signal_new_exception("java/lang/ArrayIndexOutOfBoundsException",
+       signal_new_exception(vm_java_lang_ArrayIndexOutOfBoundsException,
                             index_str);
 
  throw:
@@ -327,7 +322,7 @@ void array_store_check(struct vm_object *arrayref, struct 
vm_object *obj)
        class = arrayref->class;
 
        if (!vm_class_is_array_class(class)) {
-               signal_new_exception("java/lang/RuntimeException",
+               signal_new_exception(vm_java_lang_RuntimeException,
                                     "object is not an array");
                goto throw;
        }
@@ -346,7 +341,7 @@ void array_store_check(struct vm_object *arrayref, struct 
vm_object *obj)
        if (err)
                goto error;
 
-       signal_new_exception("java/lang/ArrayStoreException", str->value);
+       signal_new_exception(vm_java_lang_ArrayStoreException, str->value);
        free_str(str);
 
  throw:
@@ -399,7 +394,7 @@ void vm_object_check_cast(struct vm_object *obj, struct 
vm_class *class)
        if (err)
                goto error;
 
-       signal_new_exception("java/lang/ClassCastException", str->value);
+       signal_new_exception(vm_java_lang_ClassCastException, str->value);
        free_str(str);
  throw:
        throw_from_native(2 * sizeof(struct vm_object *));
@@ -419,7 +414,7 @@ void array_size_check(int size)
 {
        if (size < 0) {
                signal_new_exception(
-                       "java/lang/NegativeArraySizeException", NULL);
+                       vm_java_lang_NegativeArraySizeException, NULL);
                throw_from_native(sizeof(int));
        }
 }
@@ -435,7 +430,7 @@ void multiarray_size_check(int n, ...)
                if (va_arg(ap, int) >= 0)
                        continue;
 
-               signal_new_exception("java/lang/NegativeArraySizeException",
+               signal_new_exception(vm_java_lang_NegativeArraySizeException,
                                     NULL);
                va_end(ap);
                throw_from_native(sizeof(int) * (n + 1));
diff --git a/vm/preload.c b/vm/preload.c
index dfac41f..49aaeee 100644
--- a/vm/preload.c
+++ b/vm/preload.c
@@ -43,7 +43,17 @@ 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_java_lang_RE;
+struct vm_class *vm_java_lang_Error;
+struct vm_class *vm_java_lang_ArithmeticException;
+struct vm_class *vm_java_lang_NullPointerException;
+struct vm_class *vm_java_lang_NegativeArraySizeException;
+struct vm_class *vm_java_lang_ClassCastException;
+struct vm_class *vm_java_lang_NoClassDefFoundError;
+struct vm_class *vm_java_lang_UnsatisfiedLinkError;
+struct vm_class *vm_java_lang_ArrayIndexOutOfBoundsException;
+struct vm_class *vm_java_lang_ArrayStoreException;
+struct vm_class *vm_java_lang_RuntimeException;
+struct vm_class *vm_java_lang_ExceptionInInitializerError;
 struct vm_class *vm_boolean_class;
 struct vm_class *vm_char_class;
 struct vm_class *vm_float_class;
@@ -62,6 +72,17 @@ static const struct preload_entry preload_entries[] = {
        { "java/lang/StackTraceElement", &vm_java_lang_StackTraceElement },
        { "[Ljava/lang/StackTraceElement;", 
&vm_array_of_java_lang_StackTraceElement },
        { "java/lang/VMThrowable",      &vm_java_lang_VMThrowable },
+       { "java/lang/ArithmeticException", &vm_java_lang_ArithmeticException },
+       { "java/lang/ArrayIndexOutOfBoundsException", 
&vm_java_lang_ArrayIndexOutOfBoundsException },
+       { "java/lang/ArrayStoreException", &vm_java_lang_ArrayStoreException },
+       { "java/lang/ClassCastException", &vm_java_lang_ClassCastException },
+       { "java/lang/Error",            &vm_java_lang_Error },
+       { "java/lang/ExceptionInInitializerError", 
&vm_java_lang_ExceptionInInitializerError },
+       { "java/lang/NegativeArraySizeException", 
&vm_java_lang_NegativeArraySizeException },
+       { "java/lang/NoClassDefFoundError", &vm_java_lang_NoClassDefFoundError 
},
+       { "java/lang/NullPointerException", &vm_java_lang_NullPointerException 
},
+       { "java/lang/RuntimeException", &vm_java_lang_RuntimeException },
+       { "java/lang/UnsatisfiedLinkError", &vm_java_lang_UnsatisfiedLinkError 
},
 };
 
 static const struct preload_entry primitive_preload_entries[] = {
diff --git a/vm/signal.c b/vm/signal.c
index e5b9eaf..bcf1e8f 100644
--- a/vm/signal.c
+++ b/vm/signal.c
@@ -26,6 +26,7 @@
 
 #include <jit/exception.h>
 
+#include <vm/preload.h>
 #include <vm/backtrace.h>
 #include <vm/signal.h>
 #include <vm/class.h>
@@ -63,14 +64,14 @@ throw_from_signal_bh(unsigned long jit_addr)
 
 static unsigned long throw_arithmetic_exception(unsigned long src_addr)
 {
-       signal_new_exception("java/lang/ArithmeticException",
+       signal_new_exception(vm_java_lang_ArithmeticException,
                             "division by zero");
        return throw_from_signal_bh(src_addr);
 }
 
 static unsigned long throw_null_pointer_exception(unsigned long src_addr)
 {
-       signal_new_exception("java/lang/NullPointerException", NULL);
+       signal_new_exception(vm_java_lang_NullPointerException, NULL);
        return throw_from_signal_bh(src_addr);
 }
 
-- 
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