# HG changeset patch # User Jaroslav Tulach # Date 1392620075 -3600 # Node ID 39d26d3686d95efbe9d130b94328cd8e048296dc # Parent 39d83dd3781984bc2a5f1548e7d6650740315e55 Don't clear the stack mapping when doing a cast diff -r 39d83dd37819 -r 39d26d3686d9 rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Feb 17 07:52:41 2014 +0100 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Feb 17 07:54:35 2014 +0100 @@ -1938,6 +1938,13 @@ return ","; } + final void emitNoFlush( + StackMapper sm, + final Appendable out, + final String format, final CharSequence... params + ) throws IOException { + emitImpl(out, format, params); + } final void emit( StackMapper sm, final Appendable out, @@ -2127,12 +2134,12 @@ private void generateCheckcast(int indx, final StackMapper smapper) throws IOException { final String type = jc.getClassName(indx); if (!type.startsWith("[")) { - emit(smapper, out, + emitNoFlush(smapper, out, "if (@1 !== null && !@1.$instOf_@2) throw vm.java_lang_ClassCastException(true);", - smapper.getA(0), type.replace('/', '_')); + smapper.getT(0, VarType.REFERENCE, false), type.replace('/', '_')); } else { - emit(smapper, out, "vm.java_lang_Class(false).forName__Ljava_lang_Class_2Ljava_lang_String_2('@2').cast__Ljava_lang_Object_2Ljava_lang_Object_2(@1);", - smapper.getA(0), type + emitNoFlush(smapper, out, "vm.java_lang_Class(false).forName__Ljava_lang_Class_2Ljava_lang_String_2('@2').cast__Ljava_lang_Object_2Ljava_lang_Object_2(@1);", + smapper.getT(0, VarType.REFERENCE, false), type ); } } diff -r 39d83dd37819 -r 39d26d3686d9 rt/vm/src/main/java/org/apidesign/vm4brwsr/StackMapper.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/StackMapper.java Mon Feb 17 07:52:41 2014 +0100 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/StackMapper.java Mon Feb 17 07:54:35 2014 +0100 @@ -84,7 +84,7 @@ void flush(Appendable out) throws IOException { int count = stackTypeIndexPairs.getSize(); for (int i = 0; i < count; i++) { - String val = stackValues.getAndClear(i); + String val = stackValues.getAndClear(i, true); if (val == null) { continue; } @@ -160,6 +160,9 @@ } public CharSequence getT(final int indexFromTop, final int type) { + return getT(indexFromTop, type, true); + } + public CharSequence getT(final int indexFromTop, final int type, boolean clear) { final int stackSize = stackTypeIndexPairs.getSize(); if (indexFromTop >= stackSize) { throw new IllegalStateException("Stack underflow"); @@ -170,7 +173,7 @@ throw new IllegalStateException("Type mismatch"); } String value = - stackValues.getAndClear(stackSize - indexFromTop - 1); + stackValues.getAndClear(stackSize - indexFromTop - 1, clear); if (value != null) { return value; } diff -r 39d83dd37819 -r 39d26d3686d9 rt/vm/src/main/java/org/apidesign/vm4brwsr/StringArray.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/StringArray.java Mon Feb 17 07:52:41 2014 +0100 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/StringArray.java Mon Feb 17 07:54:35 2014 +0100 @@ -113,9 +113,11 @@ return -1; } - String getAndClear(int count) { + String getAndClear(int count, boolean clear) { String s = arr[count]; - arr[count] = null; + if (clear) { + arr[count] = null; + } return s; } diff -r 39d83dd37819 -r 39d26d3686d9 rt/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethod.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethod.java Mon Feb 17 07:52:41 2014 +0100 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethod.java Mon Feb 17 07:54:35 2014 +0100 @@ -128,6 +128,10 @@ } } + public static int castString(Object o) { + return ((String)o).length(); + } + static { // check order of initializers StaticUse.NON_NULL.equals(new Object()); diff -r 39d83dd37819 -r 39d26d3686d9 rt/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java Mon Feb 17 07:52:41 2014 +0100 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java Mon Feb 17 07:54:35 2014 +0100 @@ -36,6 +36,15 @@ ); } + @Test public void cast() throws Exception { + assertExec( + "Length is four", + StaticMethod.class, "castString__ILjava_lang_Object_2", + Double.valueOf(4), + "Ahoj" + ); + } + @Test public void checkReallyInitializedValues() throws Exception { assertExec( "Return true",