Signed-off-by: Tomek Grabiec <tgrab...@gmail.com>
---
 Makefile                        |    1 +
 regression/jvm/FinallyTest.java |  126 +++++++++++++++++++++++++++++++++++++++
 regression/run-suite.sh         |    1 +
 3 files changed, 128 insertions(+), 0 deletions(-)
 create mode 100644 regression/jvm/FinallyTest.java

diff --git a/Makefile b/Makefile
index 03f34aa..7fff0b1 100644
--- a/Makefile
+++ b/Makefile
@@ -226,6 +226,7 @@ REGRESSION_TEST_SUITE_CLASSES = \
        regression/jvm/ExitStatusIsOneTest.class \
        regression/jvm/ExitStatusIsZeroTest.class \
        regression/jvm/FibonacciTest.class \
+       regression/jvm/FinallyTest.class \
        regression/jvm/FloatArithmeticTest.class \
        regression/jvm/GetstaticPatchingTest.class \
        regression/jvm/IntegerArithmeticExceptionsTest.class \
diff --git a/regression/jvm/FinallyTest.java b/regression/jvm/FinallyTest.java
new file mode 100644
index 0000000..6119137
--- /dev/null
+++ b/regression/jvm/FinallyTest.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2009 Tomasz Grabiec
+ *
+ * This file is released under the GPL version 2 with the following
+ * clarification and special exception:
+ *
+ *     Linking this library statically or dynamically with other modules is
+ *     making a combined work based on this library. Thus, the terms and
+ *     conditions of the GNU General Public License cover the whole
+ *     combination.
+ *
+ *     As a special exception, the copyright holders of this library give you
+ *     permission to link this library with independent modules to produce an
+ *     executable, regardless of the license terms of these independent
+ *     modules, and to copy and distribute the resulting executable under terms
+ *     of your choice, provided that you also meet, for each linked independent
+ *     module, the terms and conditions of the license of that module. An
+ *     independent module is a module which is not derived from or based on
+ *     this library. If you modify this library, you may extend this exception
+ *     to your version of the library, but you are not obligated to do so. If
+ *     you do not wish to do so, delete this exception statement from your
+ *     version.
+ *
+ * Please refer to the file LICENSE for details.
+ */
+package jvm;
+
+/**
+ * @author Tomasz Grabiec
+ */
+public class FinallyTest extends TestCase {
+    public static int methodWithSingleFinallyBlock() {
+           while (true) {
+                   try {
+                           return 1;
+                   } finally {
+                           if (true)
+                                   break;
+                   }
+           }
+
+           return 0;
+    }
+
+    public static void testSingleFinallyBlock() {
+        assertEquals(0, methodWithSingleFinallyBlock());
+    }
+
+    public static int methodWithNestedFinallyBlocks() {
+        boolean b = true;
+
+        try {
+            return 1;
+        } finally {
+            while (b) {
+                try {
+                    return 2;
+                } finally {
+                    if (b) {
+                        break;
+                    }
+                }
+            }
+
+            if (true)
+                return 0;
+        }
+    }
+
+    public static void testNestedFinallyBlocks() {
+        assertEquals(0, methodWithNestedFinallyBlocks());
+    }
+
+    public static void testLineNumberTableAfterInlining() {
+        Exception e = null;
+        boolean b = true;
+
+        try {
+            return;
+        } finally {
+            while (b) {
+                try {
+                    return;
+                } finally {
+                    if (b) {
+                        e = new Exception();
+                        break;
+                    }
+                }
+            }
+
+            assertEquals(86, e.getStackTrace()[0].getLineNumber());
+        }
+    }
+
+    public static void testExceptionTableAfterInlining() {
+        boolean caught = false;
+        boolean caughtInFinally = false;
+        RuntimeException r1 = new RuntimeException();
+        RuntimeException r2 = new RuntimeException();
+
+        try {
+            throw r1;
+        } catch (Exception e) {
+            assertEquals(r1, e);
+            caught = true;
+        } finally {
+            try {
+                throw r2;
+            } catch (Exception e) {
+                assertEquals(r2, e);
+                caughtInFinally = true;
+            }
+        }
+
+        assertTrue(caughtInFinally);
+        assertTrue(caught);
+    }
+
+    public static void main(String args[]) {
+        testSingleFinallyBlock();
+        testNestedFinallyBlocks();
+        testLineNumberTableAfterInlining();
+        testExceptionTableAfterInlining();
+    }
+}
\ No newline at end of file
diff --git a/regression/run-suite.sh b/regression/run-suite.sh
index ed3442b..b6bacce 100755
--- a/regression/run-suite.sh
+++ b/regression/run-suite.sh
@@ -56,6 +56,7 @@ if [ -z "$CLASS_LIST" ]; then
     run_java jvm.ExitStatusIsOneTest 1
     run_java jvm.ExitStatusIsZeroTest 0
     run_java jvm.FibonacciTest 0
+    run_java jvm.FinallyTest 0
     run_java jvm.FloatArithmeticTest 0
     run_java jvm.GetstaticPatchingTest 0
     run_java jvm.IntegerArithmeticExceptionsTest 0
-- 
1.6.0.6


------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge  
This is your chance to win up to $100,000 in prizes! For a limited time, 
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize  
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to