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 }