catch (Throwable t) caches everything (as usual in Java) including JavaScript own errors.
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 10 Jan 2013 13:09:19 +0100
changeset 4239b5868bf56ec
parent 422 8e0818ad6c4d
child 424 aef4fd91e99c
catch (Throwable t) caches everything (as usual in Java) including JavaScript own errors.
vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
vm/src/test/java/org/apidesign/vm4brwsr/Exceptions.java
vm/src/test/java/org/apidesign/vm4brwsr/ExceptionsTest.java
     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",