Flush mapper before pushing back a result of (virtual) method invocation. The static method call was already doing that.
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Fri, 27 Feb 2015 10:52:26 +0100
changeset 17953c23f0cebd32
parent 1794 df885b256382
child 1796 136787ac00d3
Flush mapper before pushing back a result of (virtual) method invocation. The static method call was already doing that.
rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
rt/vm/src/test/java/org/apidesign/vm4brwsr/Array.java
rt/vm/src/test/java/org/apidesign/vm4brwsr/ArrayTest.java
     1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Fri Feb 27 10:41:40 2015 +0100
     1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Fri Feb 27 10:52:26 2015 +0100
     1.3 @@ -19,7 +19,6 @@
     1.4  
     1.5  import java.io.IOException;
     1.6  import java.io.InputStream;
     1.7 -import java.util.Arrays;
     1.8  import org.apidesign.bck2brwsr.core.JavaScriptBody;
     1.9  import static org.apidesign.vm4brwsr.ByteCodeParser.*;
    1.10  
    1.11 @@ -1800,6 +1799,7 @@
    1.12          }
    1.13  
    1.14          if (returnType[0] != 'V') {
    1.15 +            mapper.flush(this);
    1.16              append("var ")
    1.17                 .append(mapper.pushT(VarType.fromFieldType(returnType[0])))
    1.18                 .append(" = ");
     2.1 --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/Array.java	Fri Feb 27 10:41:40 2015 +0100
     2.2 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/Array.java	Fri Feb 27 10:52:26 2015 +0100
     2.3 @@ -219,4 +219,36 @@
     2.4      public static String iterateArray(boolean javaArray) {
     2.5          return iterateArray(javaArray ? new String[0] : null);
     2.6      }
     2.7 +    
     2.8 +    enum ShapeType {
     2.9 +        ZERO, ONE;
    2.10 +    }
    2.11 +    
    2.12 +    private static void addType(int[][] table, ShapeType type1, ShapeType type2, int value) {
    2.13 +        table[type1.ordinal()][type2.ordinal()] = value;
    2.14 +    }
    2.15 +    
    2.16 +    public static int sumTable() {
    2.17 +        int[][] arr = { { 99, 99 }, { 999, 999 }};
    2.18 +        addType(arr, ShapeType.ZERO, ShapeType.ZERO, 0);
    2.19 +        addType(arr, ShapeType.ZERO, ShapeType.ONE, 1);
    2.20 +        addType(arr, ShapeType.ONE, ShapeType.ZERO, 1);
    2.21 +        addType(arr, ShapeType.ONE, ShapeType.ONE, 2);
    2.22 +        
    2.23 +        int sum = 0;
    2.24 +        for (int[] row : arr) {
    2.25 +            for (int i : row) {
    2.26 +                sum += i;
    2.27 +            }
    2.28 +        }
    2.29 +        return sum;
    2.30 +    }
    2.31 +    
    2.32 +    private static int inc(int v) {
    2.33 +        return v + 1;
    2.34 +    }
    2.35 +    
    2.36 +    public static int plusOrd() {
    2.37 +        return inc(ShapeType.ZERO.ordinal()) + inc(ShapeType.ONE.ordinal());
    2.38 +    }
    2.39  }
     3.1 --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/ArrayTest.java	Fri Feb 27 10:41:40 2015 +0100
     3.2 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/ArrayTest.java	Fri Feb 27 10:52:26 2015 +0100
     3.3 @@ -116,6 +116,14 @@
     3.4      @Test public void upCastOK2() throws Exception {
     3.5          assertExec("Can cast string to char sequence array", Array.class, "castArray__ZI", Double.valueOf(1), Double.valueOf(3));
     3.6      }
     3.7 +    @Test public void twoDimensionalArrayAccess() throws Exception {
     3.8 +        int exp = Array.sumTable();
     3.9 +        assertExec("Is 2d access working OK?", Array.class, "sumTable__I", exp);
    3.10 +    }
    3.11 +    @Test public void ordAccess() throws Exception {
    3.12 +        int exp = Array.plusOrd();
    3.13 +        assertExec("Is int allocated OK?", Array.class, "plusOrd__I", exp);
    3.14 +    }
    3.15      
    3.16      private static TestVM code;
    3.17