1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Feb 17 07:52:41 2014 +0100
1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Feb 17 07:54:35 2014 +0100
1.3 @@ -1938,6 +1938,13 @@
1.4 return ",";
1.5 }
1.6
1.7 + final void emitNoFlush(
1.8 + StackMapper sm,
1.9 + final Appendable out,
1.10 + final String format, final CharSequence... params
1.11 + ) throws IOException {
1.12 + emitImpl(out, format, params);
1.13 + }
1.14 final void emit(
1.15 StackMapper sm,
1.16 final Appendable out,
1.17 @@ -2127,12 +2134,12 @@
1.18 private void generateCheckcast(int indx, final StackMapper smapper) throws IOException {
1.19 final String type = jc.getClassName(indx);
1.20 if (!type.startsWith("[")) {
1.21 - emit(smapper, out,
1.22 + emitNoFlush(smapper, out,
1.23 "if (@1 !== null && !@1.$instOf_@2) throw vm.java_lang_ClassCastException(true);",
1.24 - smapper.getA(0), type.replace('/', '_'));
1.25 + smapper.getT(0, VarType.REFERENCE, false), type.replace('/', '_'));
1.26 } else {
1.27 - 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);",
1.28 - smapper.getA(0), type
1.29 + 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);",
1.30 + smapper.getT(0, VarType.REFERENCE, false), type
1.31 );
1.32 }
1.33 }
2.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/StackMapper.java Mon Feb 17 07:52:41 2014 +0100
2.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/StackMapper.java Mon Feb 17 07:54:35 2014 +0100
2.3 @@ -84,7 +84,7 @@
2.4 void flush(Appendable out) throws IOException {
2.5 int count = stackTypeIndexPairs.getSize();
2.6 for (int i = 0; i < count; i++) {
2.7 - String val = stackValues.getAndClear(i);
2.8 + String val = stackValues.getAndClear(i, true);
2.9 if (val == null) {
2.10 continue;
2.11 }
2.12 @@ -160,6 +160,9 @@
2.13 }
2.14
2.15 public CharSequence getT(final int indexFromTop, final int type) {
2.16 + return getT(indexFromTop, type, true);
2.17 + }
2.18 + public CharSequence getT(final int indexFromTop, final int type, boolean clear) {
2.19 final int stackSize = stackTypeIndexPairs.getSize();
2.20 if (indexFromTop >= stackSize) {
2.21 throw new IllegalStateException("Stack underflow");
2.22 @@ -170,7 +173,7 @@
2.23 throw new IllegalStateException("Type mismatch");
2.24 }
2.25 String value =
2.26 - stackValues.getAndClear(stackSize - indexFromTop - 1);
2.27 + stackValues.getAndClear(stackSize - indexFromTop - 1, clear);
2.28 if (value != null) {
2.29 return value;
2.30 }
3.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/StringArray.java Mon Feb 17 07:52:41 2014 +0100
3.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/StringArray.java Mon Feb 17 07:54:35 2014 +0100
3.3 @@ -113,9 +113,11 @@
3.4 return -1;
3.5 }
3.6
3.7 - String getAndClear(int count) {
3.8 + String getAndClear(int count, boolean clear) {
3.9 String s = arr[count];
3.10 - arr[count] = null;
3.11 + if (clear) {
3.12 + arr[count] = null;
3.13 + }
3.14 return s;
3.15 }
3.16
4.1 --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethod.java Mon Feb 17 07:52:41 2014 +0100
4.2 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethod.java Mon Feb 17 07:54:35 2014 +0100
4.3 @@ -128,6 +128,10 @@
4.4 }
4.5 }
4.6
4.7 + public static int castString(Object o) {
4.8 + return ((String)o).length();
4.9 + }
4.10 +
4.11 static {
4.12 // check order of initializers
4.13 StaticUse.NON_NULL.equals(new Object());
5.1 --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java Mon Feb 17 07:52:41 2014 +0100
5.2 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java Mon Feb 17 07:54:35 2014 +0100
5.3 @@ -36,6 +36,15 @@
5.4 );
5.5 }
5.6
5.7 + @Test public void cast() throws Exception {
5.8 + assertExec(
5.9 + "Length is four",
5.10 + StaticMethod.class, "castString__ILjava_lang_Object_2",
5.11 + Double.valueOf(4),
5.12 + "Ahoj"
5.13 + );
5.14 + }
5.15 +
5.16 @Test public void checkReallyInitializedValues() throws Exception {
5.17 assertExec(
5.18 "Return true",