# HG changeset patch # User Jaroslav Tulach # Date 1356972627 -3600 # Node ID a9be982d9b9c8ef1d8df46fa49d04450a6442db6 # Parent 5452b9fbd253f9c52c5e19bc9f05c8df6d267679 Finally block is supported diff -r 5452b9fbd253 -r a9be982d9b9c vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Dec 31 12:44:51 2012 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Dec 31 17:50:27 2012 +0100 @@ -1585,6 +1585,7 @@ private void generateCatch(TrapData[] traps) throws IOException { out.append("} catch (e) {\n"); + int finallyPC = -1; for (TrapData e : traps) { if (e == null) { break; @@ -1596,10 +1597,14 @@ out.append("gt=" + e.handler_pc + "; stA0 = e; continue;"); out.append("}\n"); } else { - //finally - todo + finallyPC = e.handler_pc; } } - out.append("throw e;"); + if (finallyPC == -1) { + out.append("throw e;"); + } else { + out.append("gt=" + finallyPC + "; stA0 = e; continue;"); + } out.append("\n}"); } } diff -r 5452b9fbd253 -r a9be982d9b9c vm/src/test/java/org/apidesign/vm4brwsr/Exceptions.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/Exceptions.java Mon Dec 31 12:44:51 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Exceptions.java Mon Dec 31 17:50:27 2012 +0100 @@ -61,4 +61,14 @@ return ex.getMessage(); } } + + private static int counter; + public static int readCounter(String n) throws ClassNotFoundException { + try { + Class.forName(n); + } finally { + counter++; + } + return counter; + } } diff -r 5452b9fbd253 -r a9be982d9b9c vm/src/test/java/org/apidesign/vm4brwsr/ExceptionsTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/ExceptionsTest.java Mon Dec 31 12:44:51 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ExceptionsTest.java Mon Dec 31 17:50:27 2012 +0100 @@ -70,6 +70,30 @@ ); } + @Test public void testThreeCalls() throws Exception { + Object vm = code.invokeFunction("bck2brwsr"); + Object clazz = code.invokeMethod(vm, "loadClass", Exceptions.class.getName()); + + String method = "readCounter__ILjava_lang_String_2"; + + try { + Object ret = code.invokeMethod(clazz, method, "org.apidesign.Unknown"); + fail("We expect an CNFE!"); + } catch (ScriptException scriptException) { + // script exception should be OK + } + { + // 2nd invocation + Object ret = code.invokeMethod(clazz, method, "java.lang.String"); + assertEquals(ret, Double.valueOf(2)); + } + { + // 3rd invocation + Object ret = code.invokeMethod(clazz, method, "java.lang.Integer"); + assertEquals(ret, Double.valueOf(3)); + } + } + private static CharSequence codeSeq; private static Invocable code;