rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
branchReducedStack
changeset 1477 b012365f8fb7
parent 1474 3775fe162073
child 1479 be34f84e9d9f
child 1509 16f50abb439b
     1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Tue Feb 18 10:02:46 2014 +0100
     1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Tue Feb 18 22:20:50 2014 +0100
     1.3 @@ -831,7 +831,7 @@
     1.4                      int indx = readUByte(byteCodes, ++i);
     1.5                      String v = encodeConstant(indx);
     1.6                      int type = VarType.fromConstantType(jc.getTag(indx));
     1.7 -                    emit(smapper, out, "var @1 = @2;", smapper.pushT(type), v);
     1.8 +                    smapper.assign(out, type, v);
     1.9                      break;
    1.10                  }
    1.11                  case opc_ldc_w:
    1.12 @@ -858,18 +858,15 @@
    1.13                      break;
    1.14                  }
    1.15                  case opc_lcmp:
    1.16 -                    emit(smapper, out, "var @3 = (@2).compare64(@1);",
    1.17 -                         smapper.popL(), smapper.popL(), smapper.pushI());
    1.18 +                    smapper.replace(out, VarType.INTEGER, "(@2).compare64(@1)", smapper.popL(), smapper.getL(0));
    1.19                      break;
    1.20                  case opc_fcmpl:
    1.21                  case opc_fcmpg:
    1.22 -                    emit(smapper, out, "var @3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);",
    1.23 -                         smapper.popF(), smapper.popF(), smapper.pushI());
    1.24 +                    smapper.replace(out, VarType.INTEGER, "(@2).compare(@1)", smapper.popF(), smapper.getF(0));
    1.25                      break;
    1.26                  case opc_dcmpl:
    1.27                  case opc_dcmpg:
    1.28 -                    emit(smapper, out, "var @3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);",
    1.29 -                         smapper.popD(), smapper.popD(), smapper.pushI());
    1.30 +                    smapper.replace(out, VarType.INTEGER, "(@2).compare(@1)", smapper.popD(), smapper.getD(0));
    1.31                      break;
    1.32                  case opc_if_acmpeq:
    1.33                      i = generateIf(smapper, byteCodes, i, smapper.popA(), smapper.popA(),
    1.34 @@ -885,56 +882,56 @@
    1.35                      break;
    1.36                  case opc_ifeq: {
    1.37                      int indx = i + readShortArg(byteCodes, i);
    1.38 -                    emitIf(smapper, out, "if (@1 == 0) ",
    1.39 +                    emitIf(smapper, out, "if ((@1) == 0) ",
    1.40                           smapper.popI(), i, indx, topMostLabel);
    1.41                      i += 2;
    1.42                      break;
    1.43                  }
    1.44                  case opc_ifne: {
    1.45                      int indx = i + readShortArg(byteCodes, i);
    1.46 -                    emitIf(smapper, out, "if (@1 != 0) ",
    1.47 +                    emitIf(smapper, out, "if ((@1) != 0) ",
    1.48                           smapper.popI(), i, indx, topMostLabel);
    1.49                      i += 2;
    1.50                      break;
    1.51                  }
    1.52                  case opc_iflt: {
    1.53                      int indx = i + readShortArg(byteCodes, i);
    1.54 -                    emitIf(smapper, out, "if (@1 < 0) ",
    1.55 +                    emitIf(smapper, out, "if ((@1) < 0) ",
    1.56                           smapper.popI(), i, indx, topMostLabel);
    1.57                      i += 2;
    1.58                      break;
    1.59                  }
    1.60                  case opc_ifle: {
    1.61                      int indx = i + readShortArg(byteCodes, i);
    1.62 -                    emitIf(smapper, out, "if (@1 <= 0) ",
    1.63 +                    emitIf(smapper, out, "if ((@1) <= 0) ",
    1.64                           smapper.popI(), i, indx, topMostLabel);
    1.65                      i += 2;
    1.66                      break;
    1.67                  }
    1.68                  case opc_ifgt: {
    1.69                      int indx = i + readShortArg(byteCodes, i);
    1.70 -                    emitIf(smapper, out, "if (@1 > 0) ",
    1.71 +                    emitIf(smapper, out, "if ((@1) > 0) ",
    1.72                           smapper.popI(), i, indx, topMostLabel);
    1.73                      i += 2;
    1.74                      break;
    1.75                  }
    1.76                  case opc_ifge: {
    1.77                      int indx = i + readShortArg(byteCodes, i);
    1.78 -                    emitIf(smapper, out, "if (@1 >= 0) ",
    1.79 +                    emitIf(smapper, out, "if ((@1) >= 0) ",
    1.80                           smapper.popI(), i, indx, topMostLabel);
    1.81                      i += 2;
    1.82                      break;
    1.83                  }
    1.84                  case opc_ifnonnull: {
    1.85                      int indx = i + readShortArg(byteCodes, i);
    1.86 -                    emitIf(smapper, out, "if (@1 !== null) ",
    1.87 +                    emitIf(smapper, out, "if ((@1) !== null) ",
    1.88                           smapper.popA(), i, indx, topMostLabel);
    1.89                      i += 2;
    1.90                      break;
    1.91                  }
    1.92                  case opc_ifnull: {
    1.93                      int indx = i + readShortArg(byteCodes, i);
    1.94 -                    emitIf(smapper, out, "if (@1 === null) ",
    1.95 +                    emitIf(smapper, out, "if ((@1) === null) ",
    1.96                           smapper.popA(), i, indx, topMostLabel);
    1.97                      i += 2;
    1.98                      break;
    1.99 @@ -1013,8 +1010,7 @@
   1.100                      break;
   1.101                  }
   1.102                  case opc_arraylength:
   1.103 -                    emit(smapper, out, "var @2 = @1.length;",
   1.104 -                         smapper.popA(), smapper.pushI());
   1.105 +                    smapper.replace(out, VarType.INTEGER, "(@1).length", smapper.getA(0));
   1.106                      break;
   1.107                  case opc_lastore:
   1.108                      emit(smapper, out, "Array.at(@3, @2, @1);",
   1.109 @@ -1040,27 +1036,27 @@
   1.110                           smapper.popI(), smapper.popI(), smapper.popA());
   1.111                      break;
   1.112                  case opc_laload:
   1.113 -                    emit(smapper, out, "var @3 = Array.at(@2, @1);",
   1.114 -                         smapper.popI(), smapper.popA(), smapper.pushL());
   1.115 +                    smapper.replace(out, VarType.LONG, "Array.at(@2, @1)",
   1.116 +                         smapper.popI(), smapper.getA(0));
   1.117                      break;
   1.118                  case opc_faload:
   1.119 -                    emit(smapper, out, "var @3 = Array.at(@2, @1);",
   1.120 -                         smapper.popI(), smapper.popA(), smapper.pushF());
   1.121 +                    smapper.replace(out, VarType.FLOAT, "Array.at(@2, @1)",
   1.122 +                         smapper.popI(), smapper.getA(0));
   1.123                      break;
   1.124                  case opc_daload:
   1.125 -                    emit(smapper, out, "var @3 = Array.at(@2, @1);",
   1.126 -                         smapper.popI(), smapper.popA(), smapper.pushD());
   1.127 +                    smapper.replace(out, VarType.DOUBLE, "Array.at(@2, @1)",
   1.128 +                         smapper.popI(), smapper.getA(0));
   1.129                      break;
   1.130                  case opc_aaload:
   1.131 -                    emit(smapper, out, "var @3 = Array.at(@2, @1);",
   1.132 -                         smapper.popI(), smapper.popA(), smapper.pushA());
   1.133 +                    smapper.replace(out, VarType.REFERENCE, "Array.at(@2, @1)",
   1.134 +                         smapper.popI(), smapper.getA(0));
   1.135                      break;
   1.136                  case opc_iaload:
   1.137                  case opc_baload:
   1.138                  case opc_caload:
   1.139                  case opc_saload:
   1.140 -                    emit(smapper, out, "var @3 = Array.at(@2, @1);",
   1.141 -                         smapper.popI(), smapper.popA(), smapper.pushI());
   1.142 +                    smapper.replace(out, VarType.INTEGER, "Array.at(@2, @1)",
   1.143 +                         smapper.popI(), smapper.getA(0));
   1.144                      break;
   1.145                  case opc_pop:
   1.146                  case opc_pop2:
   1.147 @@ -1232,9 +1228,9 @@
   1.148                      final int type = VarType.fromFieldType(fi[2].charAt(0));
   1.149                      final String mangleClass = mangleClassName(fi[0]);
   1.150                      final String mangleClassAccess = accessClass(mangleClass);
   1.151 -                    emit(smapper, out, "var @2 = @4(false)._@3.call(@1);",
   1.152 -                         smapper.popA(),
   1.153 -                         smapper.pushT(type), fi[1], mangleClassAccess
   1.154 +                    smapper.replace(out, type, "@3(false)._@2.call(@1)",
   1.155 +                         smapper.getA(0),
   1.156 +                         fi[1], mangleClassAccess
   1.157                      );
   1.158                      i += 2;
   1.159                      break;
   1.160 @@ -1257,9 +1253,8 @@
   1.161                      int indx = readUShortArg(byteCodes, i);
   1.162                      String[] fi = jc.getFieldInfoName(indx);
   1.163                      final int type = VarType.fromFieldType(fi[2].charAt(0));
   1.164 -                    emit(smapper, out, "var @1 = @2(false)._@3();",
   1.165 -                         smapper.pushT(type),
   1.166 -                         accessClass(mangleClassName(fi[0])), fi[1]);
   1.167 +                    String ac = accessClass(mangleClassName(fi[0]));
   1.168 +                    smapper.assign(out, type, ac + "(false)._" + fi[1] + "()");
   1.169                      i += 2;
   1.170                      addReference(fi[0]);
   1.171                      break;
   1.172 @@ -1297,13 +1292,13 @@
   1.173                  }
   1.174  
   1.175                  case opc_monitorenter: {
   1.176 -                    out.append("/* monitor enter */");
   1.177 +                    debug("/* monitor enter */");
   1.178                      smapper.popA();
   1.179                      break;
   1.180                  }
   1.181  
   1.182                  case opc_monitorexit: {
   1.183 -                    out.append("/* monitor exit */");
   1.184 +                    debug("/* monitor exit */");
   1.185                      smapper.popA();
   1.186                      break;
   1.187                  }
   1.188 @@ -1341,9 +1336,9 @@
   1.189      ) throws IOException {
   1.190          mapper.flush(out);
   1.191          int indx = i + readShortArg(byteCodes, i);
   1.192 -        out.append("if (").append(v1)
   1.193 -           .append(' ').append(test).append(' ')
   1.194 -           .append(v2).append(") ");
   1.195 +        out.append("if ((").append(v1)
   1.196 +           .append(") ").append(test).append(" (")
   1.197 +           .append(v2).append(")) ");
   1.198          goTo(out, i, indx, topMostLabel);
   1.199          return i + 2;
   1.200      }
   1.201 @@ -2101,7 +2096,9 @@
   1.202          table += 4;
   1.203          int high = readInt4(byteCodes, table);
   1.204          table += 4;
   1.205 -        out.append("switch (").append(smapper.popI()).append(") {\n");
   1.206 +        final CharSequence swVar = smapper.popValue();
   1.207 +        smapper.flush(out);
   1.208 +        out.append("switch (").append(swVar).append(") {\n");
   1.209          while (low <= high) {
   1.210              int offset = i + readInt4(byteCodes, table);
   1.211              table += 4;
   1.212 @@ -2121,7 +2118,9 @@
   1.213          table += 4;
   1.214          int n = readInt4(byteCodes, table);
   1.215          table += 4;
   1.216 -        out.append("switch (").append(smapper.popI()).append(") {\n");
   1.217 +        final CharSequence swVar = smapper.popValue();
   1.218 +        smapper.flush(out);
   1.219 +        out.append("switch (").append(swVar).append(") {\n");
   1.220          while (n-- > 0) {
   1.221              int cnstnt = readInt4(byteCodes, table);
   1.222              table += 4;