Generate the ClassCastException via java.lang.Class as that one is always known to be exported
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 20 Jan 2015 17:23:12 +0100
changeset 1774a93a52b33474
parent 1773 9830c8b761ce
child 1775 983bec6098d2
Generate the ClassCastException via java.lang.Class as that one is always known to be exported
rt/emul/mini/src/main/java/java/lang/Class.java
rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
     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              }