Another if statements to flush stack before generating them ReducedStack
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 17 Feb 2014 14:26:55 +0100
branchReducedStack
changeset 14685d6b648a39db
parent 1467 5538c1eb03be
child 1469 f57fa856ffc4
Another if statements to flush stack before generating them
rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
rt/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethod.java
rt/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java
     1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Mon Feb 17 12:08:31 2014 +0100
     1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Mon Feb 17 14:26:55 2014 +0100
     1.3 @@ -859,15 +859,15 @@
     1.4                           smapper.popD(), smapper.popD(), smapper.pushI());
     1.5                      break;
     1.6                  case opc_if_acmpeq:
     1.7 -                    i = generateIf(byteCodes, i, smapper.popA(), smapper.popA(),
     1.8 +                    i = generateIf(smapper, byteCodes, i, smapper.popA(), smapper.popA(),
     1.9                                     "===", topMostLabel);
    1.10                      break;
    1.11                  case opc_if_acmpne:
    1.12 -                    i = generateIf(byteCodes, i, smapper.popA(), smapper.popA(),
    1.13 +                    i = generateIf(smapper, byteCodes, i, smapper.popA(), smapper.popA(),
    1.14                                     "!==", topMostLabel);
    1.15                      break;
    1.16                  case opc_if_icmpeq:
    1.17 -                    i = generateIf(byteCodes, i, smapper.popI(), smapper.popI(),
    1.18 +                    i = generateIf(smapper, byteCodes, i, smapper.popI(), smapper.popI(),
    1.19                                     "==", topMostLabel);
    1.20                      break;
    1.21                  case opc_ifeq: {
    1.22 @@ -927,23 +927,23 @@
    1.23                      break;
    1.24                  }
    1.25                  case opc_if_icmpne:
    1.26 -                    i = generateIf(byteCodes, i, smapper.popI(), smapper.popI(),
    1.27 +                    i = generateIf(smapper, byteCodes, i, smapper.popI(), smapper.popI(),
    1.28                                     "!=", topMostLabel);
    1.29                      break;
    1.30                  case opc_if_icmplt:
    1.31 -                    i = generateIf(byteCodes, i, smapper.popI(), smapper.popI(),
    1.32 +                    i = generateIf(smapper, byteCodes, i, smapper.popI(), smapper.popI(),
    1.33                                     "<", topMostLabel);
    1.34                      break;
    1.35                  case opc_if_icmple:
    1.36 -                    i = generateIf(byteCodes, i, smapper.popI(), smapper.popI(),
    1.37 +                    i = generateIf(smapper, byteCodes, i, smapper.popI(), smapper.popI(),
    1.38                                     "<=", topMostLabel);
    1.39                      break;
    1.40                  case opc_if_icmpgt:
    1.41 -                    i = generateIf(byteCodes, i, smapper.popI(), smapper.popI(),
    1.42 +                    i = generateIf(smapper, byteCodes, i, smapper.popI(), smapper.popI(),
    1.43                                     ">", topMostLabel);
    1.44                      break;
    1.45                  case opc_if_icmpge:
    1.46 -                    i = generateIf(byteCodes, i, smapper.popI(), smapper.popI(),
    1.47 +                    i = generateIf(smapper, byteCodes, i, smapper.popI(), smapper.popI(),
    1.48                                     ">=", topMostLabel);
    1.49                      break;
    1.50                  case opc_goto: {
    1.51 @@ -1320,7 +1320,11 @@
    1.52          out.append("\n};");
    1.53      }
    1.54  
    1.55 -    private int generateIf(byte[] byteCodes, int i, final CharSequence v2, final CharSequence v1, final String test, int topMostLabel) throws IOException {
    1.56 +    private int generateIf(StackMapper mapper, byte[] byteCodes, 
    1.57 +        int i, final CharSequence v2, final CharSequence v1, 
    1.58 +        final String test, int topMostLabel
    1.59 +    ) throws IOException {
    1.60 +        mapper.flush(out);
    1.61          int indx = i + readShortArg(byteCodes, i);
    1.62          out.append("if (").append(v1)
    1.63             .append(' ').append(test).append(' ')
     2.1 --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethod.java	Mon Feb 17 12:08:31 2014 +0100
     2.2 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethod.java	Mon Feb 17 14:26:55 2014 +0100
     2.3 @@ -137,6 +137,53 @@
     2.4          return i.sum(nowrap?-w:w, 1);
     2.5      }
     2.6      
     2.7 +    public static String toStringArr() {
     2.8 +        class N implements Next {
     2.9 +            int idx = 0;
    2.10 +            
    2.11 +            @Override
    2.12 +            public boolean hasNext() {
    2.13 +                return idx < 5;
    2.14 +            }
    2.15 +
    2.16 +            @Override
    2.17 +            public String next() {
    2.18 +                switch (idx++) {
    2.19 +                    case 0: return "Zero";
    2.20 +                    case 1: return "One";
    2.21 +                    case 2: return "Two";
    2.22 +                    case 3: return "Three";
    2.23 +                    case 4: return "Four";
    2.24 +                }
    2.25 +                throw new IllegalStateException();
    2.26 +            }
    2.27 +        }
    2.28 +        return toString(null, new N()).toString();
    2.29 +    }
    2.30 +    
    2.31 +    static String toString(Object thiz, Next it) {
    2.32 +        if (!it.hasNext()) {
    2.33 +            return "[]";
    2.34 +        }
    2.35 +
    2.36 +        StringBuilder sb = new StringBuilder();
    2.37 +        sb.append('[');
    2.38 +        for (;;) {
    2.39 +            String e = it.next();
    2.40 +            sb.append(e == thiz ? "(this Collection)" : e);
    2.41 +            if (!it.hasNext()) {
    2.42 +                return sb.append(']').toString();
    2.43 +            }
    2.44 +            sb.append(',').append(' ');
    2.45 +        }
    2.46 +    }
    2.47 +    
    2.48 +    static interface Next {
    2.49 +        boolean hasNext();
    2.50 +        String next();
    2.51 +    }
    2.52 +    
    2.53 +    
    2.54      static {
    2.55          // check order of initializers
    2.56          StaticUse.NON_NULL.equals(new Object());
     3.1 --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java	Mon Feb 17 12:08:31 2014 +0100
     3.2 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java	Mon Feb 17 14:26:55 2014 +0100
     3.3 @@ -224,6 +224,15 @@
     3.4          );
     3.5      }
     3.6      
     3.7 +    @Test public void collectionToString() throws Exception {
     3.8 +        String exp = StaticMethod.toStringArr();
     3.9 +        assertExec(
    3.10 +            "0 to 4",
    3.11 +            StaticMethod.class, "toStringArr__Ljava_lang_String_2",
    3.12 +            exp
    3.13 +        );
    3.14 +    }
    3.15 +    
    3.16      @Test public void or() throws Exception {
    3.17          assertExec(
    3.18              "Or will be 7",