vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
branchregisters
changeset 474 859cc3a0b8f0
parent 459 a2871a3fd4c5
child 488 9288ecf9657c
child 585 fe1a07c17681
     1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Tue Jan 15 12:44:33 2013 +0100
     1.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Fri Jan 18 15:33:03 2013 +0100
     1.3 @@ -264,37 +264,10 @@
     1.4  
     1.5          final StackMapper smapper = new StackMapper();
     1.6  
     1.7 -        final int maxLocals = m.getMaxLocals();
     1.8 -        if (maxLocals > 0) {
     1.9 -            // TODO: generate only used local variables
    1.10 -            for (int j = 0; j <= VarType.LAST; ++j) {
    1.11 -                out.append("\n  var ").append(Variable.getLocalVariable(j, 0));
    1.12 -                for (int i = 1; i < maxLocals; ++i) {
    1.13 -                    out.append(", ");
    1.14 -                    out.append(Variable.getLocalVariable(j, i));
    1.15 -                }
    1.16 -                out.append(';');
    1.17 -            }
    1.18 -        }
    1.19          if (!m.isStatic()) {
    1.20              out.append("  var ").append(" lcA0 = this;\n");
    1.21          }
    1.22  
    1.23 -        // maxStack includes two stack positions for every pushed long / double
    1.24 -        // so this might generate more stack variables than we need
    1.25 -        final int maxStack = m.getMaxStack();
    1.26 -        if (maxStack > 0) {
    1.27 -            // TODO: generate only used stack variables
    1.28 -            for (int j = 0; j <= VarType.LAST; ++j) {
    1.29 -                out.append("\n  var ").append(Variable.getStackVariable(j, 0));
    1.30 -                for (int i = 1; i < maxStack; ++i) {
    1.31 -                    out.append(", ");
    1.32 -                    out.append(Variable.getStackVariable(j, i));
    1.33 -                }
    1.34 -                out.append(';');
    1.35 -            }
    1.36 -        }
    1.37 -
    1.38          int lastStackFrame = -1;
    1.39          TrapData[] previousTrap = null;
    1.40          
    1.41 @@ -325,174 +298,184 @@
    1.42              final int c = readByte(byteCodes, i);
    1.43              switch (c) {
    1.44                  case opc_aload_0:
    1.45 -                    emit(out, "@1 = @2;", smapper.pushA(), lmapper.getA(0));
    1.46 +                    emit(out, "var @1 = @2;", smapper.pushA(), lmapper.getA(0));
    1.47                      break;
    1.48                  case opc_iload_0:
    1.49 -                    emit(out, "@1 = @2;", smapper.pushI(), lmapper.getI(0));
    1.50 +                    emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(0));
    1.51                      break;
    1.52                  case opc_lload_0:
    1.53 -                    emit(out, "@1 = @2;", smapper.pushL(), lmapper.getL(0));
    1.54 +                    emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(0));
    1.55                      break;
    1.56                  case opc_fload_0:
    1.57 -                    emit(out, "@1 = @2;", smapper.pushF(), lmapper.getF(0));
    1.58 +                    emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(0));
    1.59                      break;
    1.60                  case opc_dload_0:
    1.61 -                    emit(out, "@1 = @2;", smapper.pushD(), lmapper.getD(0));
    1.62 +                    emit(out, "var @1 = @2;", smapper.pushD(), lmapper.getD(0));
    1.63                      break;
    1.64                  case opc_aload_1:
    1.65 -                    emit(out, "@1 = @2;", smapper.pushA(), lmapper.getA(1));
    1.66 +                    emit(out, "var @1 = @2;", smapper.pushA(), lmapper.getA(1));
    1.67                      break;
    1.68                  case opc_iload_1:
    1.69 -                    emit(out, "@1 = @2;", smapper.pushI(), lmapper.getI(1));
    1.70 +                    emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(1));
    1.71                      break;
    1.72                  case opc_lload_1:
    1.73 -                    emit(out, "@1 = @2;", smapper.pushL(), lmapper.getL(1));
    1.74 +                    emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(1));
    1.75                      break;
    1.76                  case opc_fload_1:
    1.77 -                    emit(out, "@1 = @2;", smapper.pushF(), lmapper.getF(1));
    1.78 +                    emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(1));
    1.79                      break;
    1.80                  case opc_dload_1:
    1.81 -                    emit(out, "@1 = @2;", smapper.pushD(), lmapper.getD(1));
    1.82 +                    emit(out, "var @1 = @2;", smapper.pushD(), lmapper.getD(1));
    1.83                      break;
    1.84                  case opc_aload_2:
    1.85 -                    emit(out, "@1 = @2;", smapper.pushA(), lmapper.getA(2));
    1.86 +                    emit(out, "var @1 = @2;", smapper.pushA(), lmapper.getA(2));
    1.87                      break;
    1.88                  case opc_iload_2:
    1.89 -                    emit(out, "@1 = @2;", smapper.pushI(), lmapper.getI(2));
    1.90 +                    emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(2));
    1.91                      break;
    1.92                  case opc_lload_2:
    1.93 -                    emit(out, "@1 = @2;", smapper.pushL(), lmapper.getL(2));
    1.94 +                    emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(2));
    1.95                      break;
    1.96                  case opc_fload_2:
    1.97 -                    emit(out, "@1 = @2;", smapper.pushF(), lmapper.getF(2));
    1.98 +                    emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(2));
    1.99                      break;
   1.100                  case opc_dload_2:
   1.101 -                    emit(out, "@1 = @2;", smapper.pushD(), lmapper.getD(2));
   1.102 +                    emit(out, "var @1 = @2;", smapper.pushD(), lmapper.getD(2));
   1.103                      break;
   1.104                  case opc_aload_3:
   1.105 -                    emit(out, "@1 = @2;", smapper.pushA(), lmapper.getA(3));
   1.106 +                    emit(out, "var @1 = @2;", smapper.pushA(), lmapper.getA(3));
   1.107                      break;
   1.108                  case opc_iload_3:
   1.109 -                    emit(out, "@1 = @2;", smapper.pushI(), lmapper.getI(3));
   1.110 +                    emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(3));
   1.111                      break;
   1.112                  case opc_lload_3:
   1.113 -                    emit(out, "@1 = @2;", smapper.pushL(), lmapper.getL(3));
   1.114 +                    emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(3));
   1.115                      break;
   1.116                  case opc_fload_3:
   1.117 -                    emit(out, "@1 = @2;", smapper.pushF(), lmapper.getF(3));
   1.118 +                    emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(3));
   1.119                      break;
   1.120                  case opc_dload_3:
   1.121 -                    emit(out, "@1 = @2;", smapper.pushD(), lmapper.getD(3));
   1.122 +                    emit(out, "var @1 = @2;", smapper.pushD(), lmapper.getD(3));
   1.123                      break;
   1.124                  case opc_iload: {
   1.125                      final int indx = readByte(byteCodes, ++i);
   1.126 -                    emit(out, "@1 = @2;", smapper.pushI(), lmapper.getI(indx));
   1.127 +                    emit(out, "var @1 = @2;",
   1.128 +                         smapper.pushI(), lmapper.getI(indx));
   1.129                      break;
   1.130                  }
   1.131                  case opc_lload: {
   1.132                      final int indx = readByte(byteCodes, ++i);
   1.133 -                    emit(out, "@1 = @2;", smapper.pushL(), lmapper.getL(indx));
   1.134 +                    emit(out, "var @1 = @2;",
   1.135 +                         smapper.pushL(), lmapper.getL(indx));
   1.136                      break;
   1.137                  }
   1.138                  case opc_fload: {
   1.139                      final int indx = readByte(byteCodes, ++i);
   1.140 -                    emit(out, "@1 = @2;", smapper.pushF(), lmapper.getF(indx));
   1.141 +                    emit(out, "var @1 = @2;",
   1.142 +                         smapper.pushF(), lmapper.getF(indx));
   1.143                      break;
   1.144                  }
   1.145                  case opc_dload: {
   1.146                      final int indx = readByte(byteCodes, ++i);
   1.147 -                    emit(out, "@1 = @2;", smapper.pushD(), lmapper.getD(indx));
   1.148 +                    emit(out, "var @1 = @2;",
   1.149 +                         smapper.pushD(), lmapper.getD(indx));
   1.150                      break;
   1.151                  }
   1.152                  case opc_aload: {
   1.153                      final int indx = readByte(byteCodes, ++i);
   1.154 -                    emit(out, "@1 = @2;", smapper.pushA(), lmapper.getA(indx));
   1.155 +                    emit(out, "var @1 = @2;",
   1.156 +                         smapper.pushA(), lmapper.getA(indx));
   1.157                      break;
   1.158                  }
   1.159                  case opc_istore: {
   1.160                      final int indx = readByte(byteCodes, ++i);
   1.161 -                    emit(out, "@1 = @2;", lmapper.setI(indx), smapper.popI());
   1.162 +                    emit(out, "var @1 = @2;",
   1.163 +                         lmapper.setI(indx), smapper.popI());
   1.164                      break;
   1.165                  }
   1.166                  case opc_lstore: {
   1.167                      final int indx = readByte(byteCodes, ++i);
   1.168 -                    emit(out, "@1 = @2;", lmapper.setL(indx), smapper.popL());
   1.169 +                    emit(out, "var @1 = @2;",
   1.170 +                         lmapper.setL(indx), smapper.popL());
   1.171                      break;
   1.172                  }
   1.173                  case opc_fstore: {
   1.174                      final int indx = readByte(byteCodes, ++i);
   1.175 -                    emit(out, "@1 = @2;", lmapper.setF(indx), smapper.popF());
   1.176 +                    emit(out, "var @1 = @2;",
   1.177 +                         lmapper.setF(indx), smapper.popF());
   1.178                      break;
   1.179                  }
   1.180                  case opc_dstore: {
   1.181                      final int indx = readByte(byteCodes, ++i);
   1.182 -                    emit(out, "@1 = @2;", lmapper.setD(indx), smapper.popD());
   1.183 +                    emit(out, "var @1 = @2;",
   1.184 +                         lmapper.setD(indx), smapper.popD());
   1.185                      break;
   1.186                  }
   1.187                  case opc_astore: {
   1.188                      final int indx = readByte(byteCodes, ++i);
   1.189 -                    emit(out, "@1 = @2;", lmapper.setA(indx), smapper.popA());
   1.190 +                    emit(out, "var @1 = @2;",
   1.191 +                         lmapper.setA(indx), smapper.popA());
   1.192                      break;
   1.193                  }
   1.194                  case opc_astore_0:
   1.195 -                    emit(out, "@1 = @2;", lmapper.setA(0), smapper.popA());
   1.196 +                    emit(out, "var @1 = @2;", lmapper.setA(0), smapper.popA());
   1.197                      break;
   1.198                  case opc_istore_0:
   1.199 -                    emit(out, "@1 = @2;", lmapper.setI(0), smapper.popI());
   1.200 +                    emit(out, "var @1 = @2;", lmapper.setI(0), smapper.popI());
   1.201                      break;
   1.202                  case opc_lstore_0:
   1.203 -                    emit(out, "@1 = @2;", lmapper.setL(0), smapper.popL());
   1.204 +                    emit(out, "var @1 = @2;", lmapper.setL(0), smapper.popL());
   1.205                      break;
   1.206                  case opc_fstore_0:
   1.207 -                    emit(out, "@1 = @2;", lmapper.setF(0), smapper.popF());
   1.208 +                    emit(out, "var @1 = @2;", lmapper.setF(0), smapper.popF());
   1.209                      break;
   1.210                  case opc_dstore_0:
   1.211 -                    emit(out, "@1 = @2;", lmapper.setD(0), smapper.popD());
   1.212 +                    emit(out, "var @1 = @2;", lmapper.setD(0), smapper.popD());
   1.213                      break;
   1.214                  case opc_astore_1:
   1.215 -                    emit(out, "@1 = @2;", lmapper.setA(1), smapper.popA());
   1.216 +                    emit(out, "var @1 = @2;", lmapper.setA(1), smapper.popA());
   1.217                      break;
   1.218                  case opc_istore_1:
   1.219 -                    emit(out, "@1 = @2;", lmapper.setI(1), smapper.popI());
   1.220 +                    emit(out, "var @1 = @2;", lmapper.setI(1), smapper.popI());
   1.221                      break;
   1.222                  case opc_lstore_1:
   1.223 -                    emit(out, "@1 = @2;", lmapper.setL(1), smapper.popL());
   1.224 +                    emit(out, "var @1 = @2;", lmapper.setL(1), smapper.popL());
   1.225                      break;
   1.226                  case opc_fstore_1:
   1.227 -                    emit(out, "@1 = @2;", lmapper.setF(1), smapper.popF());
   1.228 +                    emit(out, "var @1 = @2;", lmapper.setF(1), smapper.popF());
   1.229                      break;
   1.230                  case opc_dstore_1:
   1.231 -                    emit(out, "@1 = @2;", lmapper.setD(1), smapper.popD());
   1.232 +                    emit(out, "var @1 = @2;", lmapper.setD(1), smapper.popD());
   1.233                      break;
   1.234                  case opc_astore_2:
   1.235 -                    emit(out, "@1 = @2;", lmapper.setA(2), smapper.popA());
   1.236 +                    emit(out, "var @1 = @2;", lmapper.setA(2), smapper.popA());
   1.237                      break;
   1.238                  case opc_istore_2:
   1.239 -                    emit(out, "@1 = @2;", lmapper.setI(2), smapper.popI());
   1.240 +                    emit(out, "var @1 = @2;", lmapper.setI(2), smapper.popI());
   1.241                      break;
   1.242                  case opc_lstore_2:
   1.243 -                    emit(out, "@1 = @2;", lmapper.setL(2), smapper.popL());
   1.244 +                    emit(out, "var @1 = @2;", lmapper.setL(2), smapper.popL());
   1.245                      break;
   1.246                  case opc_fstore_2:
   1.247 -                    emit(out, "@1 = @2;", lmapper.setF(2), smapper.popF());
   1.248 +                    emit(out, "var @1 = @2;", lmapper.setF(2), smapper.popF());
   1.249                      break;
   1.250                  case opc_dstore_2:
   1.251 -                    emit(out, "@1 = @2;", lmapper.setD(2), smapper.popD());
   1.252 +                    emit(out, "var @1 = @2;", lmapper.setD(2), smapper.popD());
   1.253                      break;
   1.254                  case opc_astore_3:
   1.255 -                    emit(out, "@1 = @2;", lmapper.setA(3), smapper.popA());
   1.256 +                    emit(out, "var @1 = @2;", lmapper.setA(3), smapper.popA());
   1.257                      break;
   1.258                  case opc_istore_3:
   1.259 -                    emit(out, "@1 = @2;", lmapper.setI(3), smapper.popI());
   1.260 +                    emit(out, "var @1 = @2;", lmapper.setI(3), smapper.popI());
   1.261                      break;
   1.262                  case opc_lstore_3:
   1.263 -                    emit(out, "@1 = @2;", lmapper.setL(3), smapper.popL());
   1.264 +                    emit(out, "var @1 = @2;", lmapper.setL(3), smapper.popL());
   1.265                      break;
   1.266                  case opc_fstore_3:
   1.267 -                    emit(out, "@1 = @2;", lmapper.setF(3), smapper.popF());
   1.268 +                    emit(out, "var @1 = @2;", lmapper.setF(3), smapper.popF());
   1.269                      break;
   1.270                  case opc_dstore_3:
   1.271 -                    emit(out, "@1 = @2;", lmapper.setD(3), smapper.popD());
   1.272 +                    emit(out, "var @1 = @2;", lmapper.setD(3), smapper.popD());
   1.273                      break;
   1.274                  case opc_iadd:
   1.275                      emit(out, "@1 = @1.add32(@2);", smapper.getI(1), smapper.popI());
   1.276 @@ -635,105 +618,105 @@
   1.277                      emit(out, "return @1;", smapper.popA());
   1.278                      break;
   1.279                  case opc_i2l:
   1.280 -                    emit(out, "@2 = @1;", smapper.popI(), smapper.pushL());
   1.281 +                    emit(out, "var @2 = @1;", smapper.popI(), smapper.pushL());
   1.282                      break;
   1.283                  case opc_i2f:
   1.284 -                    emit(out, "@2 = @1;", smapper.popI(), smapper.pushF());
   1.285 +                    emit(out, "var @2 = @1;", smapper.popI(), smapper.pushF());
   1.286                      break;
   1.287                  case opc_i2d:
   1.288 -                    emit(out, "@2 = @1;", smapper.popI(), smapper.pushD());
   1.289 +                    emit(out, "var @2 = @1;", smapper.popI(), smapper.pushD());
   1.290                      break;
   1.291                  case opc_l2i:
   1.292 -                    emit(out, "@2 = @1;", smapper.popL(), smapper.pushI());
   1.293 +                    emit(out, "var @2 = @1;", smapper.popL(), smapper.pushI());
   1.294                      break;
   1.295                      // max int check?
   1.296                  case opc_l2f:
   1.297 -                    emit(out, "@2 = @1;", smapper.popL(), smapper.pushF());
   1.298 +                    emit(out, "var @2 = @1;", smapper.popL(), smapper.pushF());
   1.299                      break;
   1.300                  case opc_l2d:
   1.301 -                    emit(out, "@2 = @1;", smapper.popL(), smapper.pushD());
   1.302 +                    emit(out, "var @2 = @1;", smapper.popL(), smapper.pushD());
   1.303                      break;
   1.304                  case opc_f2d:
   1.305 -                    emit(out, "@2 = @1;", smapper.popF(), smapper.pushD());
   1.306 +                    emit(out, "var @2 = @1;", smapper.popF(), smapper.pushD());
   1.307                      break;
   1.308                  case opc_d2f:
   1.309 -                    emit(out, "@2 = @1;", smapper.popD(), smapper.pushF());
   1.310 +                    emit(out, "var @2 = @1;", smapper.popD(), smapper.pushF());
   1.311                      break;
   1.312                  case opc_f2i:
   1.313 -                    emit(out, "@2 = Math.floor(@1);",
   1.314 +                    emit(out, "var @2 = Math.floor(@1);",
   1.315                           smapper.popF(), smapper.pushI());
   1.316                      break;
   1.317                  case opc_f2l:
   1.318 -                    emit(out, "@2 = Math.floor(@1);",
   1.319 +                    emit(out, "var @2 = Math.floor(@1);",
   1.320                           smapper.popF(), smapper.pushL());
   1.321                      break;
   1.322                  case opc_d2i:
   1.323 -                    emit(out, "@2 = Math.floor(@1);",
   1.324 +                    emit(out, "var @2 = Math.floor(@1);",
   1.325                           smapper.popD(), smapper.pushI());
   1.326                      break;
   1.327                  case opc_d2l:
   1.328 -                    emit(out, "@2 = Math.floor(@1);",
   1.329 +                    emit(out, "var @2 = Math.floor(@1);",
   1.330                           smapper.popD(), smapper.pushL());
   1.331                      break;
   1.332                  case opc_i2b:
   1.333 -                    emit(out, "@1 = @1.toInt8();", smapper.getI(0));
   1.334 +                    emit(out, "var @1 = @1.toInt8();", smapper.getI(0));
   1.335                      break;
   1.336                  case opc_i2c:
   1.337                      out.append("{ /* number conversion */ }");
   1.338                      break;
   1.339                  case opc_i2s:
   1.340 -                    emit(out, "@1 = @1.toInt16();", smapper.getI(0));
   1.341 +                    emit(out, "var @1 = @1.toInt16();", smapper.getI(0));
   1.342                      break;
   1.343                  case opc_aconst_null:
   1.344 -                    emit(out, "@1 = null;", smapper.pushA());
   1.345 +                    emit(out, "var @1 = null;", smapper.pushA());
   1.346                      break;
   1.347                  case opc_iconst_m1:
   1.348 -                    emit(out, "@1 = -1;", smapper.pushI());
   1.349 +                    emit(out, "var @1 = -1;", smapper.pushI());
   1.350                      break;
   1.351                  case opc_iconst_0:
   1.352 -                    emit(out, "@1 = 0;", smapper.pushI());
   1.353 +                    emit(out, "var @1 = 0;", smapper.pushI());
   1.354                      break;
   1.355                  case opc_dconst_0:
   1.356 -                    emit(out, "@1 = 0;", smapper.pushD());
   1.357 +                    emit(out, "var @1 = 0;", smapper.pushD());
   1.358                      break;
   1.359                  case opc_lconst_0:
   1.360 -                    emit(out, "@1 = 0;", smapper.pushL());
   1.361 +                    emit(out, "var @1 = 0;", smapper.pushL());
   1.362                      break;
   1.363                  case opc_fconst_0:
   1.364 -                    emit(out, "@1 = 0;", smapper.pushF());
   1.365 +                    emit(out, "var @1 = 0;", smapper.pushF());
   1.366                      break;
   1.367                  case opc_iconst_1:
   1.368 -                    emit(out, "@1 = 1;", smapper.pushI());
   1.369 +                    emit(out, "var @1 = 1;", smapper.pushI());
   1.370                      break;
   1.371                  case opc_lconst_1:
   1.372 -                    emit(out, "@1 = 1;", smapper.pushL());
   1.373 +                    emit(out, "var @1 = 1;", smapper.pushL());
   1.374                      break;
   1.375                  case opc_fconst_1:
   1.376 -                    emit(out, "@1 = 1;", smapper.pushF());
   1.377 +                    emit(out, "var @1 = 1;", smapper.pushF());
   1.378                      break;
   1.379                  case opc_dconst_1:
   1.380 -                    emit(out, "@1 = 1;", smapper.pushD());
   1.381 +                    emit(out, "var @1 = 1;", smapper.pushD());
   1.382                      break;
   1.383                  case opc_iconst_2:
   1.384 -                    emit(out, "@1 = 2;", smapper.pushI());
   1.385 +                    emit(out, "var @1 = 2;", smapper.pushI());
   1.386                      break;
   1.387                  case opc_fconst_2:
   1.388 -                    emit(out, "@1 = 2;", smapper.pushF());
   1.389 +                    emit(out, "var @1 = 2;", smapper.pushF());
   1.390                      break;
   1.391                  case opc_iconst_3:
   1.392 -                    emit(out, "@1 = 3;", smapper.pushI());
   1.393 +                    emit(out, "var @1 = 3;", smapper.pushI());
   1.394                      break;
   1.395                  case opc_iconst_4:
   1.396 -                    emit(out, "@1 = 4;", smapper.pushI());
   1.397 +                    emit(out, "var @1 = 4;", smapper.pushI());
   1.398                      break;
   1.399                  case opc_iconst_5:
   1.400 -                    emit(out, "@1 = 5;", smapper.pushI());
   1.401 +                    emit(out, "var @1 = 5;", smapper.pushI());
   1.402                      break;
   1.403                  case opc_ldc: {
   1.404                      int indx = readByte(byteCodes, ++i);
   1.405                      String v = encodeConstant(indx);
   1.406                      int type = VarType.fromConstantType(jc.getTag(indx));
   1.407 -                    emit(out, "@1 = @2;", smapper.pushT(type), v);
   1.408 +                    emit(out, "var @1 = @2;", smapper.pushT(type), v);
   1.409                      break;
   1.410                  }
   1.411                  case opc_ldc_w:
   1.412 @@ -742,21 +725,21 @@
   1.413                      i += 2;
   1.414                      String v = encodeConstant(indx);
   1.415                      int type = VarType.fromConstantType(jc.getTag(indx));
   1.416 -                    emit(out, "@1 = @2;", smapper.pushT(type), v);
   1.417 +                    emit(out, "var @1 = @2;", smapper.pushT(type), v);
   1.418                      break;
   1.419                  }
   1.420                  case opc_lcmp:
   1.421 -                    emit(out, "@3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);",
   1.422 +                    emit(out, "var @3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);",
   1.423                           smapper.popL(), smapper.popL(), smapper.pushI());
   1.424                      break;
   1.425                  case opc_fcmpl:
   1.426                  case opc_fcmpg:
   1.427 -                    emit(out, "@3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);",
   1.428 +                    emit(out, "var @3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);",
   1.429                           smapper.popF(), smapper.popF(), smapper.pushI());
   1.430                      break;
   1.431                  case opc_dcmpl:
   1.432                  case opc_dcmpg:
   1.433 -                    emit(out, "@3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);",
   1.434 +                    emit(out, "var @3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);",
   1.435                           smapper.popD(), smapper.popD(), smapper.pushI());
   1.436                      break;
   1.437                  case opc_if_acmpeq:
   1.438 @@ -906,7 +889,7 @@
   1.439                  case opc_new: {
   1.440                      int indx = readIntArg(byteCodes, i);
   1.441                      String ci = jc.getClassName(indx);
   1.442 -                    emit(out, "@1 = new @2;",
   1.443 +                    emit(out, "var @1 = new @2;",
   1.444                           smapper.pushA(), accessClass(ci.replace('/', '_')));
   1.445                      addReference(ci);
   1.446                      i += 2;
   1.447 @@ -926,7 +909,7 @@
   1.448                          case 11: jvmType = "[J"; break;
   1.449                          default: throw new IllegalStateException("Array type: " + atype);
   1.450                      }
   1.451 -                    emit(out, "@2 = new Array(@1).initWith('@3', 0);",
   1.452 +                    emit(out, "var @2 = new Array(@1).initWith('@3', 0);",
   1.453                           smapper.popI(), smapper.pushA(), jvmType);
   1.454                      break;
   1.455                  case opc_anewarray: {
   1.456 @@ -938,7 +921,7 @@
   1.457                      } else {
   1.458                          typeName = "[L" + typeName + ";";
   1.459                      }
   1.460 -                    emit(out, "@2 = new Array(@1).initWith('@3', null);",
   1.461 +                    emit(out, "var @2 = new Array(@1).initWith('@3', null);",
   1.462                           smapper.popI(), smapper.pushA(), typeName);
   1.463                      break;
   1.464                  }
   1.465 @@ -966,11 +949,13 @@
   1.466                      for (int d = 1; d < dim; d++) {
   1.467                          out.append("\n  }");
   1.468                      }
   1.469 -                    out.append("\n").append(smapper.pushA()).append(" = a0; }");
   1.470 +                    out.append("\nvar ").append(smapper.pushA())
   1.471 +                                        .append(" = a0; }");
   1.472                      break;
   1.473                  }
   1.474                  case opc_arraylength:
   1.475 -                    emit(out, "@2 = @1.length;", smapper.popA(), smapper.pushI());
   1.476 +                    emit(out, "var @2 = @1.length;",
   1.477 +                         smapper.popA(), smapper.pushI());
   1.478                      break;
   1.479                  case opc_lastore:
   1.480                      emit(out, "@3.at(@2, @1);",
   1.481 @@ -996,26 +981,26 @@
   1.482                           smapper.popI(), smapper.popI(), smapper.popA());
   1.483                      break;
   1.484                  case opc_laload:
   1.485 -                    emit(out, "@3 = @2.at(@1);",
   1.486 +                    emit(out, "var @3 = @2.at(@1);",
   1.487                           smapper.popI(), smapper.popA(), smapper.pushL());
   1.488                      break;
   1.489                  case opc_faload:
   1.490 -                    emit(out, "@3 = @2.at(@1);",
   1.491 +                    emit(out, "var @3 = @2.at(@1);",
   1.492                           smapper.popI(), smapper.popA(), smapper.pushF());
   1.493                      break;
   1.494                  case opc_daload:
   1.495 -                    emit(out, "@3 = @2.at(@1);",
   1.496 +                    emit(out, "var @3 = @2.at(@1);",
   1.497                           smapper.popI(), smapper.popA(), smapper.pushD());
   1.498                      break;
   1.499                  case opc_aaload:
   1.500 -                    emit(out, "@3 = @2.at(@1);",
   1.501 +                    emit(out, "var @3 = @2.at(@1);",
   1.502                           smapper.popI(), smapper.popA(), smapper.pushA());
   1.503                      break;
   1.504                  case opc_iaload:
   1.505                  case opc_baload:
   1.506                  case opc_caload:
   1.507                  case opc_saload:
   1.508 -                    emit(out, "@3 = @2.at(@1);",
   1.509 +                    emit(out, "var @3 = @2.at(@1);",
   1.510                           smapper.popI(), smapper.popA(), smapper.pushI());
   1.511                      break;
   1.512                  case opc_pop:
   1.513 @@ -1025,17 +1010,18 @@
   1.514                      break;
   1.515                  case opc_dup: {
   1.516                      final Variable v = smapper.get(0);
   1.517 -                    emit(out, "@1 = @2;", smapper.pushT(v.getType()), v);
   1.518 +                    emit(out, "var @1 = @2;", smapper.pushT(v.getType()), v);
   1.519                      break;
   1.520                  }
   1.521                  case opc_dup2: {
   1.522                      if (smapper.get(0).isCategory2()) {
   1.523                          final Variable v = smapper.get(0);
   1.524 -                        emit(out, "@1 = @2;", smapper.pushT(v.getType()), v);
   1.525 +                        emit(out, "var @1 = @2;",
   1.526 +                             smapper.pushT(v.getType()), v);
   1.527                      } else {
   1.528                          final Variable v1 = smapper.get(0);
   1.529                          final Variable v2 = smapper.get(1);
   1.530 -                        emit(out, "{ @1 = @2; @3 = @4; }",
   1.531 +                        emit(out, "var @1 = @2, @3 = @4;",
   1.532                               smapper.pushT(v2.getType()), v2,
   1.533                               smapper.pushT(v1.getType()), v1);
   1.534                      }
   1.535 @@ -1048,7 +1034,7 @@
   1.536                      final Variable vo2 = smapper.pushT(vi2.getType());
   1.537                      final Variable vo1 = smapper.pushT(vi1.getType());
   1.538  
   1.539 -                    emit(out, "{ @1 = @2; @3 = @4; @5 = @6; }",
   1.540 +                    emit(out, "var @1 = @2, @3 = @4, @5 = @6;",
   1.541                           vo1, vi1, vo2, vi2, vo3, vo1);
   1.542                      break;
   1.543                  }
   1.544 @@ -1060,7 +1046,7 @@
   1.545                          final Variable vo2 = smapper.pushT(vi2.getType());
   1.546                          final Variable vo1 = smapper.pushT(vi1.getType());
   1.547  
   1.548 -                        emit(out, "{ @1 = @2; @3 = @4; @5 = @6; }",
   1.549 +                        emit(out, "var @1 = @2, @3 = @4, @5 = @6;",
   1.550                               vo1, vi1, vo2, vi2, vo3, vo1);
   1.551                      } else {
   1.552                          final Variable vi1 = smapper.pop();
   1.553 @@ -1071,17 +1057,17 @@
   1.554                          final Variable vo2 = smapper.pushT(vi2.getType());
   1.555                          final Variable vo1 = smapper.pushT(vi1.getType());
   1.556  
   1.557 -                        emit(out, "{ @1 = @2; @3 = @4; @5 = @6; @7 = @8; }",
   1.558 +                        emit(out, "var @1 = @2, @3 = @4, @5 = @6, @7 = @8;",
   1.559                               vo1, vi1, vo2, vi2, vo3, vi3, vo4, vo1);
   1.560                      }
   1.561                      break;
   1.562                  }
   1.563                  case opc_bipush:
   1.564 -                    emit(out, "@1 = @2;",
   1.565 +                    emit(out, "var @1 = @2;",
   1.566                           smapper.pushI(), Integer.toString(byteCodes[++i]));
   1.567                      break;
   1.568                  case opc_sipush:
   1.569 -                    emit(out, "@1 = @2;",
   1.570 +                    emit(out, "var @1 = @2;",
   1.571                           smapper.pushI(),
   1.572                           Integer.toString(readIntArg(byteCodes, i)));
   1.573                      i += 2;
   1.574 @@ -1090,7 +1076,7 @@
   1.575                      int indx = readIntArg(byteCodes, i);
   1.576                      String[] fi = jc.getFieldInfoName(indx);
   1.577                      final int type = VarType.fromFieldType(fi[2].charAt(0));
   1.578 -                    emit(out, "@2 = @1.fld_@3;",
   1.579 +                    emit(out, "var @2 = @1.fld_@3;",
   1.580                           smapper.popA(), smapper.pushT(type), fi[1]);
   1.581                      i += 2;
   1.582                      break;
   1.583 @@ -1099,7 +1085,7 @@
   1.584                      int indx = readIntArg(byteCodes, i);
   1.585                      String[] fi = jc.getFieldInfoName(indx);
   1.586                      final int type = VarType.fromFieldType(fi[2].charAt(0));
   1.587 -                    emit(out, "@1 = @2(false).constructor.@3;",
   1.588 +                    emit(out, "var @1 = @2(false).constructor.@3;",
   1.589                           smapper.pushT(type),
   1.590                           accessClass(fi[0].replace('/', '_')), fi[1]);
   1.591                      i += 2;
   1.592 @@ -1142,7 +1128,7 @@
   1.593                  case opc_instanceof: {
   1.594                      int indx = readIntArg(byteCodes, i);
   1.595                      final String type = jc.getClassName(indx);
   1.596 -                    emit(out, "@2 = @1.$instOf_@3 ? 1 : 0;",
   1.597 +                    emit(out, "var @2 = @1.$instOf_@3 ? 1 : 0;",
   1.598                           smapper.popA(), smapper.pushI(),
   1.599                           type.replace('/', '_'));
   1.600                      i += 2;
   1.601 @@ -1152,7 +1138,7 @@
   1.602                      final Variable v = smapper.popA();
   1.603                      smapper.clear();
   1.604  
   1.605 -                    emit(out, "{ @1 = @2; throw @2; }",
   1.606 +                    emit(out, "{ var @1 = @2; throw @2; }",
   1.607                           smapper.pushA(), v);
   1.608                      break;
   1.609                  }
   1.610 @@ -1352,7 +1338,8 @@
   1.611          }
   1.612  
   1.613          if (returnType[0] != 'V') {
   1.614 -            out.append(mapper.pushT(VarType.fromFieldType(returnType[0])))
   1.615 +            out.append("var ")
   1.616 +               .append(mapper.pushT(VarType.fromFieldType(returnType[0])))
   1.617                 .append(" = ");
   1.618          }
   1.619  
   1.620 @@ -1396,7 +1383,8 @@
   1.621          }
   1.622  
   1.623          if (returnType[0] != 'V') {
   1.624 -            out.append(mapper.pushT(VarType.fromFieldType(returnType[0])))
   1.625 +            out.append("var ")
   1.626 +               .append(mapper.pushT(VarType.fromFieldType(returnType[0])))
   1.627                 .append(" = ");
   1.628          }
   1.629  
   1.630 @@ -1628,15 +1616,15 @@
   1.631                  addReference(classInternalName);
   1.632                  if ("java/lang/Throwable".equals(classInternalName)) {
   1.633                      out.append("if (e.$instOf_java_lang_Throwable) {");
   1.634 -                    out.append("  stA0 = e;");
   1.635 +                    out.append("  var stA0 = e;");
   1.636                      out.append("} else {");
   1.637 -                    out.append("  stA0 = vm.java_lang_Throwable(true);");
   1.638 +                    out.append("  var stA0 = vm.java_lang_Throwable(true);");
   1.639                      out.append("  vm.java_lang_Throwable.cons__VLjava_lang_String_2.call(stA0, e.toString());");
   1.640                      out.append("}");
   1.641                      out.append("gt=" + e.handler_pc + "; continue;");
   1.642                  } else {
   1.643                      out.append("if (e.$instOf_" + classInternalName.replace('/', '_') + ") {");
   1.644 -                    out.append("gt=" + e.handler_pc + "; stA0 = e; continue;");
   1.645 +                    out.append("gt=" + e.handler_pc + "; var stA0 = e; continue;");
   1.646                      out.append("}\n");
   1.647                  }
   1.648              } else {
   1.649 @@ -1646,7 +1634,7 @@
   1.650          if (finallyPC == -1) {
   1.651              out.append("throw e;");
   1.652          } else {
   1.653 -            out.append("gt=" + finallyPC + "; stA0 = e; continue;");
   1.654 +            out.append("gt=" + finallyPC + "; var stA0 = e; continue;");
   1.655          }
   1.656          out.append("\n}");
   1.657      }