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

Reply via email to