Signed-off-by: Tomek Grabiec <tgrab...@gmail.com>
---
 regression/jvm/ExceptionsTest.java |   59 ++++++++++++++++++++++++++++++++++++
 vm/signal.c                        |   25 +++++++++++++++
 2 files changed, 84 insertions(+), 0 deletions(-)

diff --git a/regression/jvm/ExceptionsTest.java 
b/regression/jvm/ExceptionsTest.java
index 41dc8ad..54535ac 100644
--- a/regression/jvm/ExceptionsTest.java
+++ b/regression/jvm/ExceptionsTest.java
@@ -41,6 +41,9 @@ public class ExceptionsTest extends TestCase {
     public static void takeInt(int val) {
     }
 
+    public static void takeLong(long val) {
+    }
+
     public static void testTryBlockDoesNotThrowAnything() {
         boolean caught;
         try {
@@ -254,6 +257,58 @@ public class ExceptionsTest extends TestCase {
         assertTrue(catched);
     }
 
+    public static void testIdiv() {
+        boolean catched = false;
+        int denominator = 0;
+
+        try {
+            takeInt(1 / denominator);
+        } catch (ArithmeticException e) {
+            catched = true;
+        }
+
+        assertTrue(catched);
+    }
+
+    public static void testIrem() {
+        boolean catched = false;
+        int denominator = 0;
+
+        try {
+            takeInt(1 % denominator);
+        } catch (ArithmeticException e) {
+            catched = true;
+        }
+
+        assertTrue(catched);
+    }
+
+    public static void testLdiv() {
+        boolean catched = false;
+        long denominator = 0;
+
+        try {
+            takeLong(1L / denominator);
+        } catch (ArithmeticException e) {
+            catched = true;
+        }
+
+        assertTrue(catched);
+    }
+
+    public static void testLrem() {
+        boolean catched = false;
+        long denominator = 0;
+
+        try {
+            takeLong(1L % denominator);
+        } catch (ArithmeticException e) {
+            catched = true;
+        }
+
+        assertTrue(catched);
+    }
+
     public static void main(String args[]) {
         testTryBlockDoesNotThrowAnything();
         testThrowAndCatchInTheSameMethod();
@@ -273,6 +328,10 @@ public class ExceptionsTest extends TestCase {
         testPutfield();
         testMonitorenter();
         /* no test for Monitorexit */
+        testIdiv();
+        testIrem();
+        /* testLdiv(); */
+        /* testLrem(); */
 
         exit();
     }
diff --git a/vm/signal.c b/vm/signal.c
index 32db706..1a032d2 100644
--- a/vm/signal.c
+++ b/vm/signal.c
@@ -32,6 +32,28 @@
 #include <unistd.h>
 #include <ucontext.h>
 
+static void sigfpe_handler(int sig, siginfo_t *si, void *ctx)
+{
+       if (signal_from_jit_method(ctx) && si->si_code == FPE_INTDIV) {
+               struct object *exception;
+
+               /* TODO: exception's stack trace should be filled using ctx */
+               exception = new_exception("java/lang/ArithmeticException",
+                                         "/ by zero");
+               if (exception == NULL) {
+                       /* TODO: throw OutOfMemoryError */
+                       fprintf(stderr, "%s: Out of memory\n", __FUNCTION__);
+                       goto exit;
+               }
+
+               throw_exception_from_signal(ctx, exception);
+               return;
+       }
+
+ exit:
+       print_backtrace_and_die(sig, si, ctx);
+}
+
 static void sigsegv_handler(int sig, siginfo_t *si, void *ctx)
 {
        /* Assume that zero-page access is caused by dereferencing a
@@ -71,6 +93,9 @@ void setup_signal_handlers(void)
        sa.sa_sigaction = sigsegv_handler;
        sigaction(SIGSEGV, &sa, NULL);
 
+       sa.sa_sigaction = sigfpe_handler;
+       sigaction(SIGFPE, &sa, NULL);
+
        sa.sa_sigaction = signal_handler;
        sigaction(SIGUSR1, &sa, NULL);
 }
-- 
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
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to