catch (Throwable t) caches everything (as usual in Java) including JavaScript own errors.
1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu Jan 10 10:05:17 2013 +0100
1.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu Jan 10 13:09:19 2013 +0100
1.3 @@ -1594,9 +1594,19 @@
1.4 if (e.catch_cpx != 0) { //not finally
1.5 final String classInternalName = jc.getClassName(e.catch_cpx);
1.6 addReference(classInternalName);
1.7 - out.append("if (e.$instOf_" + classInternalName.replace('/', '_') + ") {");
1.8 - out.append("gt=" + e.handler_pc + "; stA0 = e; continue;");
1.9 - out.append("}\n");
1.10 + if ("java/lang/Throwable".equals(classInternalName)) {
1.11 + out.append("if (e.$instOf_java_lang_Throwable) {");
1.12 + out.append(" stA0 = e;");
1.13 + out.append("} else {");
1.14 + out.append(" stA0 = vm.java_lang_Throwable(true);");
1.15 + out.append(" vm.java_lang_Throwable.cons__VLjava_lang_String_2(stA0, e.toString());");
1.16 + out.append("}");
1.17 + out.append("gt=" + e.handler_pc + "; continue;");
1.18 + } else {
1.19 + out.append("if (e.$instOf_" + classInternalName.replace('/', '_') + ") {");
1.20 + out.append("gt=" + e.handler_pc + "; stA0 = e; continue;");
1.21 + out.append("}\n");
1.22 + }
1.23 } else {
1.24 finallyPC = e.handler_pc;
1.25 }
2.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/Exceptions.java Thu Jan 10 10:05:17 2013 +0100
2.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Exceptions.java Thu Jan 10 13:09:19 2013 +0100
2.3 @@ -17,6 +17,8 @@
2.4 */
2.5 package org.apidesign.vm4brwsr;
2.6
2.7 +import org.apidesign.bck2brwsr.core.JavaScriptBody;
2.8 +
2.9 /**
2.10 *
2.11 * @author tom
2.12 @@ -47,6 +49,18 @@
2.13 //join point
2.14 return res;
2.15 }
2.16 +
2.17 + @JavaScriptBody(args = "msg", body = "throw msg;")
2.18 + public static void thrw(String msg) {}
2.19 +
2.20 + public static String catchThrowableCatchesAll() {
2.21 + try {
2.22 + thrw("Hello!");
2.23 + return "Not here!";
2.24 + } catch (Throwable ex) {
2.25 + return ex.getMessage();
2.26 + }
2.27 + }
2.28
2.29 public static String newInstance(String n) {
2.30 try {
3.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/ExceptionsTest.java Thu Jan 10 10:05:17 2013 +0100
3.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ExceptionsTest.java Thu Jan 10 13:09:19 2013 +0100
3.3 @@ -38,6 +38,16 @@
3.4 }
3.5
3.6 @Test
3.7 + public void catchJavaScriptStringAsThrowable() throws Exception {
3.8 + assertExec(
3.9 + "Throw hello!",
3.10 + Exceptions.class,
3.11 + "catchThrowableCatchesAll__Ljava_lang_String_2",
3.12 + "Hello!"
3.13 + );
3.14 + }
3.15 +
3.16 + @Test
3.17 public void verifyMethodWithTryCatchThrow() throws Exception {
3.18 assertExec(
3.19 "Throw",