#4669 @ html.java.net: Provide generic conversion function and when catching something, use it to convert to appropriate Java exception
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Fri, 26 Apr 2013 13:35:21 +0200
changeset 102200ae3f46e54f
parent 1010 e2d1dc505c24
child 1025 4680cb7d6294
#4669 @ html.java.net: Provide generic conversion function and when catching something, use it to convert to appropriate Java exception
rt/emul/mini/src/main/java/java/lang/Throwable.java
rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
rt/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/StaticUseSub.java
rt/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/StaticUseSubTest.java
     1.1 --- a/rt/emul/mini/src/main/java/java/lang/Throwable.java	Thu Apr 18 17:34:28 2013 +0200
     1.2 +++ b/rt/emul/mini/src/main/java/java/lang/Throwable.java	Fri Apr 26 13:35:21 2013 +0200
     1.3 @@ -1085,4 +1085,22 @@
     1.4  //        else
     1.5  //            return suppressedExceptions.toArray(EMPTY_THROWABLE_ARRAY);
     1.6      }
     1.7 +    
     1.8 +    private static Object bck2BrwsrCnvrt(Object o) {
     1.9 +        if (o instanceof Throwable) {
    1.10 +            return o;
    1.11 +        }
    1.12 +        final String msg = msg(o);
    1.13 +        if (msg == null || msg.startsWith("TypeError")) {
    1.14 +            return new NullPointerException(msg);
    1.15 +        }
    1.16 +        return new Throwable(msg);
    1.17 +    }
    1.18 +    
    1.19 +    @JavaScriptBody(args = { "o" }, body = "return o ? o.toString() : null;")
    1.20 +    private static native String msg(Object o);
    1.21 +
    1.22 +    @JavaScriptOnly(name = "bck2BrwsrCnvrt", value = "c.bck2BrwsrCnvrt__Ljava_lang_Object_2Ljava_lang_Object_2")
    1.23 +    private static void bck2BrwsrCnvrtVM() {
    1.24 +    }
    1.25  }
     2.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Thu Apr 18 17:34:28 2013 +0200
     2.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Fri Apr 26 13:35:21 2013 +0200
     2.3 @@ -1787,20 +1787,11 @@
     2.4              if (e.catch_cpx != 0) { //not finally
     2.5                  final String classInternalName = jc.getClassName(e.catch_cpx);
     2.6                  addReference(classInternalName);
     2.7 -                if ("java/lang/Throwable".equals(classInternalName)) {
     2.8 -                    out.append("if (e.$instOf_java_lang_Throwable) {");
     2.9 -                    out.append("  var stA0 = e;");
    2.10 -                    out.append("} else {");
    2.11 -                    out.append("  var stA0 = vm.java_lang_Throwable(true);");
    2.12 -                    out.append("  vm.java_lang_Throwable.cons__VLjava_lang_String_2.call(stA0, e.toString());");
    2.13 -                    out.append("}");
    2.14 -                    goTo(out, current, e.handler_pc, topMostLabel);
    2.15 -                } else {
    2.16 -                    out.append("if (e.$instOf_" + classInternalName.replace('/', '_') + ") {");
    2.17 -                    out.append("var stA0 = e;");
    2.18 -                    goTo(out, current, e.handler_pc, topMostLabel);
    2.19 -                    out.append("}\n");
    2.20 -                }
    2.21 +                out.append("e = vm.java_lang_Throwable(false).bck2BrwsrCnvrt(e);");
    2.22 +                out.append("if (e.$instOf_" + classInternalName.replace('/', '_') + ") {");
    2.23 +                out.append("var stA0 = e;");
    2.24 +                goTo(out, current, e.handler_pc, topMostLabel);
    2.25 +                out.append("}\n");
    2.26              } else {
    2.27                  finallyPC = e.handler_pc;
    2.28              }
     3.1 --- a/rt/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/StaticUseSub.java	Thu Apr 18 17:34:28 2013 +0200
     3.2 +++ b/rt/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/StaticUseSub.java	Fri Apr 26 13:35:21 2013 +0200
     3.3 @@ -24,4 +24,7 @@
     3.4      public static Object getNonNull() {
     3.5          return NON_NULL;
     3.6      }
     3.7 +    static Object getNull() {
     3.8 +        return null;
     3.9 +    }
    3.10  }
     4.1 --- a/rt/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/StaticUseSubTest.java	Thu Apr 18 17:34:28 2013 +0200
     4.2 +++ b/rt/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/StaticUseSubTest.java	Fri Apr 26 13:35:21 2013 +0200
     4.3 @@ -30,6 +30,14 @@
     4.4          Object ret = StaticUseSub.getNonNull();
     4.5          return ret.getClass().getName();
     4.6      }
     4.7 +    
     4.8 +    @Compare public String isNullPointerTheSame() throws Exception {
     4.9 +        try {
    4.10 +            return StaticUseSub.getNull().getClass().toString();
    4.11 +        } catch (NullPointerException ex) {
    4.12 +            return ex.getClass().getName();
    4.13 +        }
    4.14 +    }
    4.15  
    4.16      @Factory public static Object[] create() {
    4.17          return VMTest.create(StaticUseSubTest.class);