#4669 @ html.java.net: Provide generic conversion function and when catching something, use it to convert to appropriate Java exception
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);