Generate the ClassCastException via java.lang.Class as that one is always known to be exported
1.1 --- a/rt/emul/mini/src/main/java/java/lang/Class.java Tue Jan 20 13:01:31 2015 +0100
1.2 +++ b/rt/emul/mini/src/main/java/java/lang/Class.java Tue Jan 20 17:23:12 2015 +0100
1.3 @@ -1858,5 +1858,10 @@
1.4 @JavaScriptOnly(name = "bck2BrwsrThrwrbl", value = "c.bck2BrwsrCnvrt__Ljava_lang_Object_2Ljava_lang_Object_2")
1.5 private static void bck2BrwsrCnvrtVM() {
1.6 }
1.7 +
1.8 + @Exported
1.9 + @JavaScriptOnly(name = "castEx", value = "function() { throw vm.java_lang_ClassCastException(true); }")
1.10 + private static void castEx() {
1.11 + }
1.12
1.13 }
2.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Tue Jan 20 13:01:31 2015 +0100
2.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Tue Jan 20 17:23:12 2015 +0100
2.3 @@ -2386,7 +2386,7 @@
2.4 String type = jc.getClassName(indx);
2.5 if (!type.startsWith("[")) {
2.6 emitNoFlush(smapper,
2.7 - "if (@1 !== null && !@1['$instOf_@2']) throw vm.java_lang_ClassCastException(true);",
2.8 + "if (@1 !== null && !@1['$instOf_@2']) vm.java_lang_Class(false).castEx();",
2.9 smapper.getT(0, VarType.REFERENCE, false), type.replace('/', '_'));
2.10 } else {
2.11 int cnt = 0;
2.12 @@ -2396,12 +2396,12 @@
2.13 if (type.charAt(cnt) == 'L') {
2.14 type = "vm." + mangleClassName(type.substring(cnt + 1, type.length() - 1));
2.15 emitNoFlush(smapper,
2.16 - "if (@1 !== null && !Array.prototype['isInstance__ZLjava_lang_Object_2ILjava_lang_Object_2'](@1, @3, @2)) throw vm.java_lang_ClassCastException(true);",
2.17 + "if (@1 !== null && !Array.prototype['isInstance__ZLjava_lang_Object_2ILjava_lang_Object_2'](@1, @3, @2)) vm.java_lang_Class(false).castEx();",
2.18 smapper.getT(0, VarType.REFERENCE, false), type, "" + cnt
2.19 );
2.20 } else {
2.21 emitNoFlush(smapper,
2.22 - "if (@1 !== null && !Array.prototype['isInstance__ZLjava_lang_Object_2Ljava_lang_String_2'](@1, '@2')) throw vm.java_lang_ClassCastException(true);",
2.23 + "if (@1 !== null && !Array.prototype['isInstance__ZLjava_lang_Object_2Ljava_lang_String_2'](@1, '@2')) vm.java_lang_Class(false).castEx();",
2.24 smapper.getT(0, VarType.REFERENCE, false), type
2.25 );
2.26 }