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