1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Dec 31 12:44:51 2012 +0100
1.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Dec 31 17:50:27 2012 +0100
1.3 @@ -1585,6 +1585,7 @@
1.4
1.5 private void generateCatch(TrapData[] traps) throws IOException {
1.6 out.append("} catch (e) {\n");
1.7 + int finallyPC = -1;
1.8 for (TrapData e : traps) {
1.9 if (e == null) {
1.10 break;
1.11 @@ -1596,10 +1597,14 @@
1.12 out.append("gt=" + e.handler_pc + "; stA0 = e; continue;");
1.13 out.append("}\n");
1.14 } else {
1.15 - //finally - todo
1.16 + finallyPC = e.handler_pc;
1.17 }
1.18 }
1.19 - out.append("throw e;");
1.20 + if (finallyPC == -1) {
1.21 + out.append("throw e;");
1.22 + } else {
1.23 + out.append("gt=" + finallyPC + "; stA0 = e; continue;");
1.24 + }
1.25 out.append("\n}");
1.26 }
1.27 }
2.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/Exceptions.java Mon Dec 31 12:44:51 2012 +0100
2.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Exceptions.java Mon Dec 31 17:50:27 2012 +0100
2.3 @@ -61,4 +61,14 @@
2.4 return ex.getMessage();
2.5 }
2.6 }
2.7 +
2.8 + private static int counter;
2.9 + public static int readCounter(String n) throws ClassNotFoundException {
2.10 + try {
2.11 + Class.forName(n);
2.12 + } finally {
2.13 + counter++;
2.14 + }
2.15 + return counter;
2.16 + }
2.17 }
3.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/ExceptionsTest.java Mon Dec 31 12:44:51 2012 +0100
3.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ExceptionsTest.java Mon Dec 31 17:50:27 2012 +0100
3.3 @@ -70,6 +70,30 @@
3.4 );
3.5 }
3.6
3.7 + @Test public void testThreeCalls() throws Exception {
3.8 + Object vm = code.invokeFunction("bck2brwsr");
3.9 + Object clazz = code.invokeMethod(vm, "loadClass", Exceptions.class.getName());
3.10 +
3.11 + String method = "readCounter__ILjava_lang_String_2";
3.12 +
3.13 + try {
3.14 + Object ret = code.invokeMethod(clazz, method, "org.apidesign.Unknown");
3.15 + fail("We expect an CNFE!");
3.16 + } catch (ScriptException scriptException) {
3.17 + // script exception should be OK
3.18 + }
3.19 + {
3.20 + // 2nd invocation
3.21 + Object ret = code.invokeMethod(clazz, method, "java.lang.String");
3.22 + assertEquals(ret, Double.valueOf(2));
3.23 + }
3.24 + {
3.25 + // 3rd invocation
3.26 + Object ret = code.invokeMethod(clazz, method, "java.lang.Integer");
3.27 + assertEquals(ret, Double.valueOf(3));
3.28 + }
3.29 + }
3.30 +
3.31 private static CharSequence codeSeq;
3.32 private static Invocable code;
3.33