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