# HG changeset patch # User Jaroslav Tulach # Date 1461043470 -7200 # Node ID 9ca946fc4f0172af253b907e1351e7c714648130 # Parent dd63b6731507151a2fb16bc64418dd5d347d64c4 Make sure class cast exception contains the same message as produced by JDK diff -r dd63b6731507 -r 9ca946fc4f01 rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/tck/ExceptionsTest.java --- a/rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/tck/ExceptionsTest.java Tue Apr 19 05:31:17 2016 +0200 +++ b/rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/tck/ExceptionsTest.java Tue Apr 19 07:24:30 2016 +0200 @@ -54,6 +54,17 @@ int newLine = s.indexOf('\n'); return s.substring(0, newLine); } + + @Compare + public String classCastMessage() throws Exception { + Object obj = 10; + try { + return (String) obj; + } catch (ClassCastException ex) { + assert ex.getMessage().contains("cannot be cast to") : "Contains the right text: " + ex.getMessage(); + throw ex; + } + } static class MyException extends Exception { public MyException(String message) { diff -r dd63b6731507 -r 9ca946fc4f01 rt/emul/mini/src/main/java/java/lang/Class.java --- a/rt/emul/mini/src/main/java/java/lang/Class.java Tue Apr 19 05:31:17 2016 +0200 +++ b/rt/emul/mini/src/main/java/java/lang/Class.java Tue Apr 19 07:24:30 2016 +0200 @@ -1915,7 +1915,16 @@ } @Exported - @JavaScriptOnly(name = "castEx", value = "function() { throw vm.java_lang_ClassCastException(true); }") + @JavaScriptOnly(name = "castEx", value = "" + + "function(obj, type) {\n" + + " var realType = obj.getClass__Ljava_lang_Class_2().getName__Ljava_lang_String_2();\n" + + " var msg = realType + ' cannot be cast to ' + type;\n" + + " var ex = vm.java_lang_ClassCastException(true);\n" + + " ex.constructor.cons__VLjava_lang_String_2.call(ex, msg);;\n" + + " throw ex;\n" + + "}\n" + + "" + ) private static void castEx() { } diff -r dd63b6731507 -r 9ca946fc4f01 rt/emul/mini/src/main/java/java/lang/Throwable.java --- a/rt/emul/mini/src/main/java/java/lang/Throwable.java Tue Apr 19 05:31:17 2016 +0200 +++ b/rt/emul/mini/src/main/java/java/lang/Throwable.java Tue Apr 19 07:24:30 2016 +0200 @@ -762,19 +762,8 @@ return getOurStackTrace().clone(); } - private synchronized StackTraceElement[] getOurStackTrace() { - // Initialize stack trace field with information from - // backtrace if this is the first call to this method - if (stackTrace == UNASSIGNED_STACK || - (stackTrace == null && backtrace != null) /* Out of protocol state */) { - int depth = getStackTraceDepth(); - stackTrace = new StackTraceElement[depth]; - for (int i=0; i < depth; i++) - stackTrace[i] = getStackTraceElement(i); - } else if (stackTrace == null) { - return UNASSIGNED_STACK; - } - return stackTrace; + private StackTraceElement[] getOurStackTrace() { + return new StackTraceElement[0]; } /** diff -r dd63b6731507 -r 9ca946fc4f01 rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Tue Apr 19 05:31:17 2016 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Tue Apr 19 07:24:30 2016 +0200 @@ -2420,8 +2420,8 @@ String type = jc.getClassName(indx); if (!type.startsWith("[")) { emitNoFlush(smapper, - "if (@1 !== null && !@1['$instOf_@2']) vm.java_lang_Class(false).castEx();", - smapper.getT(0, VarType.REFERENCE, false), mangleClassName(type)); + "if (@1 !== null && !@1['$instOf_@2']) vm.java_lang_Class(false).castEx(@1, '@3');", + smapper.getT(0, VarType.REFERENCE, false), mangleClassName(type), type.replace('/', '.')); } else { int cnt = 0; while (type.charAt(cnt) == '[') {