Signed-off-by: Tomek Grabiec <[email protected]>
---
include/vm/class.h | 2 +-
test/jamvm/class-stub.c | 2 +-
vm/class.c | 29 +++++++++++++++++++++++------
vm/signal.c | 2 +-
4 files changed, 26 insertions(+), 9 deletions(-)
diff --git a/include/vm/class.h b/include/vm/class.h
index 5af69b8..697dd9e 100644
--- a/include/vm/class.h
+++ b/include/vm/class.h
@@ -3,7 +3,7 @@
#include <vm/vm.h>
-struct object *create_object(char *class_name);
+struct object *new_exception(char *class_name, char *message);
unsigned long is_object_instance_of(struct object *obj, struct object *type);
void check_array(struct object *obj, unsigned int index);
void check_cast(struct object *obj, struct object *type);
diff --git a/test/jamvm/class-stub.c b/test/jamvm/class-stub.c
index 739246a..cc28848 100644
--- a/test/jamvm/class-stub.c
+++ b/test/jamvm/class-stub.c
@@ -1,7 +1,7 @@
#include <vm/vm.h>
#include <stdlib.h>
-struct object *create_object(char *class_name)
+struct object *new_exception(char *class_name, char *message)
{
return NULL;
}
diff --git a/vm/class.c b/vm/class.c
index 0658148..2cf0157 100644
--- a/vm/class.c
+++ b/vm/class.c
@@ -24,23 +24,40 @@
* Please refer to the file LICENSE for details.
*/
+#include <jit/compiler.h>
+#include <vm/die.h>
#include <vm/vm.h>
#include <stdlib.h>
-struct object *create_object(char *class_name)
+typedef void (*exception_init_fn)(struct object *, struct object *);
+
+struct object *new_exception(char *class_name, char *message)
{
- Class *e_class;
+ struct object *message_str;
+ struct methodblock *mb;
struct object *obj;
- MethodBlock *init;
+ Class *e_class;
e_class = findSystemClass(class_name);
+ if (!e_class)
+ return NULL;
+
obj = allocObject(e_class);
if (!obj)
return NULL;
- init = lookupMethod(e_class, "<init>", "()V");
- if (init)
- executeMethod(obj, init);
+ if (message == NULL)
+ message_str = NULL;
+ else
+ message_str = Cstr2String(message);
+
+ mb = lookupMethod(e_class, "<init>", "(Ljava/lang/String;)V");
+ if (!mb)
+ die("%s: constructor not found for class %s\n",
+ __FUNCTION__, class_name);
+
+ exception_init_fn init = (exception_init_fn)method_trampoline_ptr(mb);
+ init(obj, message_str);
return obj;
}
diff --git a/vm/signal.c b/vm/signal.c
index c8fa535..32db706 100644
--- a/vm/signal.c
+++ b/vm/signal.c
@@ -41,7 +41,7 @@ static void sigsegv_handler(int sig, siginfo_t *si, void *ctx)
struct object *exception;
/* TODO: exception's stack trace should be filled using ctx */
- exception = create_object("java/lang/NullPointerException");
+ exception = new_exception("java/lang/NullPointerException",
NULL);
if (exception == NULL) {
/* TODO: throw OutOfMemoryError */
fprintf(stderr, "%s: Out of memory\n", __FUNCTION__);
--
1.6.0.6
------------------------------------------------------------------------------
Register Now for Creativity and Technology (CaT), June 3rd, NYC. CaT
is a gathering of tech-side developers & brand creativity professionals. Meet
the minds behind Google Creative Lab, Visual Complexity, Processing, &
iPhoneDevCamp as they present alongside digital heavyweights like Barbarian
Group, R/GA, & Big Spaceship. http://p.sf.net/sfu/creativitycat-com
_______________________________________________
Jatovm-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jatovm-devel