1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Dec 07 19:16:21 2012 +0100
1.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Wed Dec 12 11:04:02 2012 +0100
1.3 @@ -188,85 +188,63 @@
1.4 if (jsb != null) {
1.5 return jsb;
1.6 }
1.7 - StringBuilder argsCnt = new StringBuilder();
1.8 - final String mn = findMethodName(m, argsCnt);
1.9 - out.append(prefix).append(mn).append(" = function");
1.10 + final String mn = findMethodName(m, new StringBuilder());
1.11 if (mn.equals("class__V")) {
1.12 toInitilize.add(className(jc) + "(false)." + mn);
1.13 }
1.14 - out.append('(');
1.15 - String space = "";
1.16 - for (int index = 0, i = 0; i < argsCnt.length(); i++) {
1.17 - out.append(space);
1.18 - out.append("arg").append(String.valueOf(index));
1.19 - space = ",";
1.20 - final String desc = null;// XXX findDescriptor(args.get(i).getDescriptor());
1.21 - if (argsCnt.charAt(i) == '1') {
1.22 - index += 2;
1.23 - } else {
1.24 - index++;
1.25 - }
1.26 - }
1.27 - out.append(") {").append("\n");
1.28 - if (m.getCode() != null) {
1.29 - int len = m.getMaxLocals();
1.30 - for (int i = argsCnt.length(); i < len; i++) {
1.31 - out.append(" var ");
1.32 - out.append("arg").append(String.valueOf(i)).append(";\n");
1.33 - }
1.34 - produceCode(m);
1.35 - } else {
1.36 - out.append(" throw 'no code found for ").append(m.getInternalSig()).append("';\n");
1.37 - }
1.38 - out.append("};");
1.39 + generateMethod(prefix, mn, m);
1.40 return mn;
1.41 }
1.42 -
1.43 +
1.44 private String generateInstanceMethod(String prefix, MethodData m) throws IOException {
1.45 String jsb = javaScriptBody(prefix, m, false);
1.46 if (jsb != null) {
1.47 return jsb;
1.48 }
1.49 - StringBuilder argsCnt = new StringBuilder();
1.50 - final String mn = findMethodName(m, argsCnt);
1.51 - out.append(prefix).append(mn).append(" = function");
1.52 - out.append("(arg0");
1.53 - String space = ",";
1.54 - for (int index = 1, i = 0; i < argsCnt.length(); i++) {
1.55 - out.append(space);
1.56 - out.append("arg").append(String.valueOf(index));
1.57 - if (argsCnt.charAt(i) == '1') {
1.58 - index += 2;
1.59 - } else {
1.60 - index++;
1.61 - }
1.62 - }
1.63 - out.append(") {").append("\n");
1.64 - if (m.getCode() != null) {
1.65 - int len = m.getMaxLocals();
1.66 - for (int i = argsCnt.length(); i < len; i++) {
1.67 - out.append(" var ");
1.68 - out.append("arg").append(String.valueOf(i + 1)).append(";\n");
1.69 - }
1.70 - produceCode(m);
1.71 - } else {
1.72 - out.append(" throw 'no code found for ").append(m.getInternalSig()).append("';\n");
1.73 - }
1.74 - out.append("};");
1.75 + final String mn = findMethodName(m, new StringBuilder());
1.76 + generateMethod(prefix, mn, m);
1.77 return mn;
1.78 }
1.79
1.80 - private void produceCode(MethodData m) throws IOException {
1.81 + private void generateMethod(String prefix, String name, MethodData m)
1.82 + throws IOException {
1.83 + final StackMapIterator stackMapIterator = m.createStackMapIterator();
1.84 + final LocalsMapper lmapper =
1.85 + new LocalsMapper(stackMapIterator.getArguments());
1.86 +
1.87 + out.append(prefix).append(name).append(" = function(");
1.88 + lmapper.outputArguments(out);
1.89 + out.append(") {").append("\n");
1.90 +
1.91 final byte[] byteCodes = m.getCode();
1.92 - final StackMapIterator stackMapIterator = m.createStackMapIterator();
1.93 - final StackToVariableMapper mapper = new StackToVariableMapper();
1.94 + if (byteCodes == null) {
1.95 + out.append(" throw 'no code found for ")
1.96 + .append(m.getInternalSig()).append("';\n");
1.97 + out.append("};");
1.98 + return;
1.99 + }
1.100 +
1.101 + final StackMapper smapper = new StackMapper();
1.102 +
1.103 + final int maxLocals = m.getMaxLocals();
1.104 + if (maxLocals > 0) {
1.105 + // TODO: generate only used local variables
1.106 + for (int j = 0; j <= VarType.LAST; ++j) {
1.107 + out.append("\n var ").append(Variable.getLocalVariable(j, 0));
1.108 + for (int i = 1; i < maxLocals; ++i) {
1.109 + out.append(", ");
1.110 + out.append(Variable.getLocalVariable(j, i));
1.111 + }
1.112 + out.append(';');
1.113 + }
1.114 + }
1.115
1.116 // maxStack includes two stack positions for every pushed long / double
1.117 // so this might generate more stack variables than we need
1.118 final int maxStack = m.getMaxStack();
1.119 if (maxStack > 0) {
1.120 // TODO: generate only used stack variables
1.121 - for (int j = 0; j <= Variable.LAST_TYPE; ++j) {
1.122 + for (int j = 0; j <= VarType.LAST; ++j) {
1.123 out.append("\n var ").append(Variable.getStackVariable(j, 0));
1.124 for (int i = 1; i < maxStack; ++i) {
1.125 out.append(", ");
1.126 @@ -284,7 +262,8 @@
1.127 stackMapIterator.advanceTo(i);
1.128 if (lastStackFrame != stackMapIterator.getFrameIndex()) {
1.129 lastStackFrame = stackMapIterator.getFrameIndex();
1.130 - mapper.syncWithFrameStack(stackMapIterator.getFrameStack());
1.131 + lmapper.syncWithFrameLocals(stackMapIterator.getFrameLocals());
1.132 + smapper.syncWithFrameStack(stackMapIterator.getFrameStack());
1.133 out.append(" case " + i).append(": ");
1.134 } else {
1.135 out.append(" /* " + i).append(" */ ");
1.136 @@ -292,303 +271,293 @@
1.137 final int c = readByte(byteCodes, i);
1.138 switch (c) {
1.139 case opc_aload_0:
1.140 - emit(out, "@1 = arg0;", mapper.pushA());
1.141 + emit(out, "@1 = @2;", smapper.pushA(), lmapper.getA(0));
1.142 break;
1.143 case opc_iload_0:
1.144 - emit(out, "@1 = arg0;", mapper.pushI());
1.145 + emit(out, "@1 = @2;", smapper.pushI(), lmapper.getI(0));
1.146 break;
1.147 case opc_lload_0:
1.148 - emit(out, "@1 = arg0;", mapper.pushL());
1.149 + emit(out, "@1 = @2;", smapper.pushL(), lmapper.getL(0));
1.150 break;
1.151 case opc_fload_0:
1.152 - emit(out, "@1 = arg0;", mapper.pushF());
1.153 + emit(out, "@1 = @2;", smapper.pushF(), lmapper.getF(0));
1.154 break;
1.155 case opc_dload_0:
1.156 - emit(out, "@1 = arg0;", mapper.pushD());
1.157 + emit(out, "@1 = @2;", smapper.pushD(), lmapper.getD(0));
1.158 break;
1.159 case opc_aload_1:
1.160 - emit(out, "@1 = arg1;", mapper.pushA());
1.161 + emit(out, "@1 = @2;", smapper.pushA(), lmapper.getA(1));
1.162 break;
1.163 case opc_iload_1:
1.164 - emit(out, "@1 = arg1;", mapper.pushI());
1.165 + emit(out, "@1 = @2;", smapper.pushI(), lmapper.getI(1));
1.166 break;
1.167 case opc_lload_1:
1.168 - emit(out, "@1 = arg1;", mapper.pushL());
1.169 + emit(out, "@1 = @2;", smapper.pushL(), lmapper.getL(1));
1.170 break;
1.171 case opc_fload_1:
1.172 - emit(out, "@1 = arg1;", mapper.pushF());
1.173 + emit(out, "@1 = @2;", smapper.pushF(), lmapper.getF(1));
1.174 break;
1.175 case opc_dload_1:
1.176 - emit(out, "@1 = arg1;", mapper.pushD());
1.177 + emit(out, "@1 = @2;", smapper.pushD(), lmapper.getD(1));
1.178 break;
1.179 case opc_aload_2:
1.180 - emit(out, "@1 = arg2;", mapper.pushA());
1.181 + emit(out, "@1 = @2;", smapper.pushA(), lmapper.getA(2));
1.182 break;
1.183 case opc_iload_2:
1.184 - emit(out, "@1 = arg2;", mapper.pushI());
1.185 + emit(out, "@1 = @2;", smapper.pushI(), lmapper.getI(2));
1.186 break;
1.187 case opc_lload_2:
1.188 - emit(out, "@1 = arg2;", mapper.pushL());
1.189 + emit(out, "@1 = @2;", smapper.pushL(), lmapper.getL(2));
1.190 break;
1.191 case opc_fload_2:
1.192 - emit(out, "@1 = arg2;", mapper.pushF());
1.193 + emit(out, "@1 = @2;", smapper.pushF(), lmapper.getF(2));
1.194 break;
1.195 case opc_dload_2:
1.196 - emit(out, "@1 = arg2;", mapper.pushD());
1.197 + emit(out, "@1 = @2;", smapper.pushD(), lmapper.getD(2));
1.198 break;
1.199 case opc_aload_3:
1.200 - emit(out, "@1 = arg3;", mapper.pushA());
1.201 + emit(out, "@1 = @2;", smapper.pushA(), lmapper.getA(3));
1.202 break;
1.203 case opc_iload_3:
1.204 - emit(out, "@1 = arg3;", mapper.pushI());
1.205 + emit(out, "@1 = @2;", smapper.pushI(), lmapper.getI(3));
1.206 break;
1.207 case opc_lload_3:
1.208 - emit(out, "@1 = arg3;", mapper.pushL());
1.209 + emit(out, "@1 = @2;", smapper.pushL(), lmapper.getL(3));
1.210 break;
1.211 case opc_fload_3:
1.212 - emit(out, "@1 = arg3;", mapper.pushF());
1.213 + emit(out, "@1 = @2;", smapper.pushF(), lmapper.getF(3));
1.214 break;
1.215 case opc_dload_3:
1.216 - emit(out, "@1 = arg3;", mapper.pushD());
1.217 + emit(out, "@1 = @2;", smapper.pushD(), lmapper.getD(3));
1.218 break;
1.219 case opc_iload: {
1.220 final int indx = readByte(byteCodes, ++i);
1.221 - emit(out, "@1 = arg@2;",
1.222 - mapper.pushI(), Integer.toString(indx));
1.223 + emit(out, "@1 = @2;", smapper.pushI(), lmapper.getI(indx));
1.224 break;
1.225 }
1.226 case opc_lload: {
1.227 final int indx = readByte(byteCodes, ++i);
1.228 - emit(out, "@1 = arg@2;",
1.229 - mapper.pushL(), Integer.toString(indx));
1.230 + emit(out, "@1 = @2;", smapper.pushL(), lmapper.getL(indx));
1.231 break;
1.232 }
1.233 case opc_fload: {
1.234 final int indx = readByte(byteCodes, ++i);
1.235 - emit(out, "@1 = arg@2;",
1.236 - mapper.pushF(), Integer.toString(indx));
1.237 + emit(out, "@1 = @2;", smapper.pushF(), lmapper.getF(indx));
1.238 break;
1.239 }
1.240 case opc_dload: {
1.241 final int indx = readByte(byteCodes, ++i);
1.242 - emit(out, "@1 = arg@2;",
1.243 - mapper.pushD(), Integer.toString(indx));
1.244 + emit(out, "@1 = @2;", smapper.pushD(), lmapper.getD(indx));
1.245 break;
1.246 }
1.247 case opc_aload: {
1.248 final int indx = readByte(byteCodes, ++i);
1.249 - emit(out, "@1 = arg@2;",
1.250 - mapper.pushA(), Integer.toString(indx));
1.251 + emit(out, "@1 = @2;", smapper.pushA(), lmapper.getA(indx));
1.252 break;
1.253 }
1.254 case opc_istore: {
1.255 final int indx = readByte(byteCodes, ++i);
1.256 - emit(out, "arg@1 = @2;",
1.257 - Integer.toString(indx), mapper.popI());
1.258 + emit(out, "@1 = @2;", lmapper.setI(indx), smapper.popI());
1.259 break;
1.260 }
1.261 case opc_lstore: {
1.262 final int indx = readByte(byteCodes, ++i);
1.263 - emit(out, "arg@1 = @2;",
1.264 - Integer.toString(indx), mapper.popL());
1.265 + emit(out, "@1 = @2;", lmapper.setL(indx), smapper.popL());
1.266 break;
1.267 }
1.268 case opc_fstore: {
1.269 final int indx = readByte(byteCodes, ++i);
1.270 - emit(out, "arg@1 = @2;",
1.271 - Integer.toString(indx), mapper.popF());
1.272 + emit(out, "@1 = @2;", lmapper.setF(indx), smapper.popF());
1.273 break;
1.274 }
1.275 case opc_dstore: {
1.276 final int indx = readByte(byteCodes, ++i);
1.277 - emit(out, "arg@1 = @2;",
1.278 - Integer.toString(indx), mapper.popD());
1.279 + emit(out, "@1 = @2;", lmapper.setD(indx), smapper.popD());
1.280 break;
1.281 }
1.282 case opc_astore: {
1.283 final int indx = readByte(byteCodes, ++i);
1.284 - emit(out, "arg@1 = @2;",
1.285 - Integer.toString(indx), mapper.popA());
1.286 + emit(out, "@1 = @2;", lmapper.setA(indx), smapper.popA());
1.287 break;
1.288 }
1.289 case opc_astore_0:
1.290 - emit(out, "arg0 = @1;", mapper.popA());
1.291 + emit(out, "@1 = @2;", lmapper.setA(0), smapper.popA());
1.292 break;
1.293 case opc_istore_0:
1.294 - emit(out, "arg0 = @1;", mapper.popI());
1.295 + emit(out, "@1 = @2;", lmapper.setI(0), smapper.popI());
1.296 break;
1.297 case opc_lstore_0:
1.298 - emit(out, "arg0 = @1;", mapper.popL());
1.299 + emit(out, "@1 = @2;", lmapper.setL(0), smapper.popL());
1.300 break;
1.301 case opc_fstore_0:
1.302 - emit(out, "arg0 = @1;", mapper.popF());
1.303 + emit(out, "@1 = @2;", lmapper.setF(0), smapper.popF());
1.304 break;
1.305 case opc_dstore_0:
1.306 - emit(out, "arg0 = @1;", mapper.popD());
1.307 + emit(out, "@1 = @2;", lmapper.setD(0), smapper.popD());
1.308 break;
1.309 case opc_astore_1:
1.310 - emit(out, "arg1 = @1;", mapper.popA());
1.311 + emit(out, "@1 = @2;", lmapper.setA(1), smapper.popA());
1.312 break;
1.313 case opc_istore_1:
1.314 - emit(out, "arg1 = @1;", mapper.popI());
1.315 + emit(out, "@1 = @2;", lmapper.setI(1), smapper.popI());
1.316 break;
1.317 case opc_lstore_1:
1.318 - emit(out, "arg1 = @1;", mapper.popL());
1.319 + emit(out, "@1 = @2;", lmapper.setL(1), smapper.popL());
1.320 break;
1.321 case opc_fstore_1:
1.322 - emit(out, "arg1 = @1;", mapper.popF());
1.323 + emit(out, "@1 = @2;", lmapper.setF(1), smapper.popF());
1.324 break;
1.325 case opc_dstore_1:
1.326 - emit(out, "arg1 = @1;", mapper.popD());
1.327 + emit(out, "@1 = @2;", lmapper.setD(1), smapper.popD());
1.328 break;
1.329 case opc_astore_2:
1.330 - emit(out, "arg2 = @1;", mapper.popA());
1.331 + emit(out, "@1 = @2;", lmapper.setA(2), smapper.popA());
1.332 break;
1.333 case opc_istore_2:
1.334 - emit(out, "arg2 = @1;", mapper.popI());
1.335 + emit(out, "@1 = @2;", lmapper.setI(2), smapper.popI());
1.336 break;
1.337 case opc_lstore_2:
1.338 - emit(out, "arg2 = @1;", mapper.popL());
1.339 + emit(out, "@1 = @2;", lmapper.setL(2), smapper.popL());
1.340 break;
1.341 case opc_fstore_2:
1.342 - emit(out, "arg2 = @1;", mapper.popF());
1.343 + emit(out, "@1 = @2;", lmapper.setF(2), smapper.popF());
1.344 break;
1.345 case opc_dstore_2:
1.346 - emit(out, "arg2 = @1;", mapper.popD());
1.347 + emit(out, "@1 = @2;", lmapper.setD(2), smapper.popD());
1.348 break;
1.349 case opc_astore_3:
1.350 - emit(out, "arg3 = @1;", mapper.popA());
1.351 + emit(out, "@1 = @2;", lmapper.setA(3), smapper.popA());
1.352 break;
1.353 case opc_istore_3:
1.354 - emit(out, "arg3 = @1;", mapper.popI());
1.355 + emit(out, "@1 = @2;", lmapper.setI(3), smapper.popI());
1.356 break;
1.357 case opc_lstore_3:
1.358 - emit(out, "arg3 = @1;", mapper.popL());
1.359 + emit(out, "@1 = @2;", lmapper.setL(3), smapper.popL());
1.360 break;
1.361 case opc_fstore_3:
1.362 - emit(out, "arg3 = @1;", mapper.popF());
1.363 + emit(out, "@1 = @2;", lmapper.setF(3), smapper.popF());
1.364 break;
1.365 case opc_dstore_3:
1.366 - emit(out, "arg3 = @1;", mapper.popD());
1.367 + emit(out, "@1 = @2;", lmapper.setD(3), smapper.popD());
1.368 break;
1.369 case opc_iadd:
1.370 - emit(out, "@1 += @2;", mapper.getI(1), mapper.popI());
1.371 + emit(out, "@1 += @2;", smapper.getI(1), smapper.popI());
1.372 break;
1.373 case opc_ladd:
1.374 - emit(out, "@1 += @2;", mapper.getL(1), mapper.popL());
1.375 + emit(out, "@1 += @2;", smapper.getL(1), smapper.popL());
1.376 break;
1.377 case opc_fadd:
1.378 - emit(out, "@1 += @2;", mapper.getF(1), mapper.popF());
1.379 + emit(out, "@1 += @2;", smapper.getF(1), smapper.popF());
1.380 break;
1.381 case opc_dadd:
1.382 - emit(out, "@1 += @2;", mapper.getD(1), mapper.popD());
1.383 + emit(out, "@1 += @2;", smapper.getD(1), smapper.popD());
1.384 break;
1.385 case opc_isub:
1.386 - emit(out, "@1 -= @2;", mapper.getI(1), mapper.popI());
1.387 + emit(out, "@1 -= @2;", smapper.getI(1), smapper.popI());
1.388 break;
1.389 case opc_lsub:
1.390 - emit(out, "@1 -= @2;", mapper.getL(1), mapper.popL());
1.391 + emit(out, "@1 -= @2;", smapper.getL(1), smapper.popL());
1.392 break;
1.393 case opc_fsub:
1.394 - emit(out, "@1 -= @2;", mapper.getF(1), mapper.popF());
1.395 + emit(out, "@1 -= @2;", smapper.getF(1), smapper.popF());
1.396 break;
1.397 case opc_dsub:
1.398 - emit(out, "@1 -= @2;", mapper.getD(1), mapper.popD());
1.399 + emit(out, "@1 -= @2;", smapper.getD(1), smapper.popD());
1.400 break;
1.401 case opc_imul:
1.402 - emit(out, "@1 *= @2;", mapper.getI(1), mapper.popI());
1.403 + emit(out, "@1 *= @2;", smapper.getI(1), smapper.popI());
1.404 break;
1.405 case opc_lmul:
1.406 - emit(out, "@1 *= @2;", mapper.getL(1), mapper.popL());
1.407 + emit(out, "@1 *= @2;", smapper.getL(1), smapper.popL());
1.408 break;
1.409 case opc_fmul:
1.410 - emit(out, "@1 *= @2;", mapper.getF(1), mapper.popF());
1.411 + emit(out, "@1 *= @2;", smapper.getF(1), smapper.popF());
1.412 break;
1.413 case opc_dmul:
1.414 - emit(out, "@1 *= @2;", mapper.getD(1), mapper.popD());
1.415 + emit(out, "@1 *= @2;", smapper.getD(1), smapper.popD());
1.416 break;
1.417 case opc_idiv:
1.418 emit(out, "@1 = Math.floor(@1 / @2);",
1.419 - mapper.getI(1), mapper.popI());
1.420 + smapper.getI(1), smapper.popI());
1.421 break;
1.422 case opc_ldiv:
1.423 emit(out, "@1 = Math.floor(@1 / @2);",
1.424 - mapper.getL(1), mapper.popL());
1.425 + smapper.getL(1), smapper.popL());
1.426 break;
1.427 case opc_fdiv:
1.428 - emit(out, "@1 /= @2;", mapper.getF(1), mapper.popF());
1.429 + emit(out, "@1 /= @2;", smapper.getF(1), smapper.popF());
1.430 break;
1.431 case opc_ddiv:
1.432 - emit(out, "@1 /= @2;", mapper.getD(1), mapper.popD());
1.433 + emit(out, "@1 /= @2;", smapper.getD(1), smapper.popD());
1.434 break;
1.435 case opc_irem:
1.436 - emit(out, "@1 %= @2;", mapper.getI(1), mapper.popI());
1.437 + emit(out, "@1 %= @2;", smapper.getI(1), smapper.popI());
1.438 break;
1.439 case opc_lrem:
1.440 - emit(out, "@1 %= @2;", mapper.getL(1), mapper.popL());
1.441 + emit(out, "@1 %= @2;", smapper.getL(1), smapper.popL());
1.442 break;
1.443 case opc_frem:
1.444 - emit(out, "@1 %= @2;", mapper.getF(1), mapper.popF());
1.445 + emit(out, "@1 %= @2;", smapper.getF(1), smapper.popF());
1.446 break;
1.447 case opc_drem:
1.448 - emit(out, "@1 %= @2;", mapper.getD(1), mapper.popD());
1.449 + emit(out, "@1 %= @2;", smapper.getD(1), smapper.popD());
1.450 break;
1.451 case opc_iand:
1.452 - emit(out, "@1 &= @2;", mapper.getI(1), mapper.popI());
1.453 + emit(out, "@1 &= @2;", smapper.getI(1), smapper.popI());
1.454 break;
1.455 case opc_land:
1.456 - emit(out, "@1 &= @2;", mapper.getL(1), mapper.popL());
1.457 + emit(out, "@1 &= @2;", smapper.getL(1), smapper.popL());
1.458 break;
1.459 case opc_ior:
1.460 - emit(out, "@1 |= @2;", mapper.getI(1), mapper.popI());
1.461 + emit(out, "@1 |= @2;", smapper.getI(1), smapper.popI());
1.462 break;
1.463 case opc_lor:
1.464 - emit(out, "@1 |= @2;", mapper.getL(1), mapper.popL());
1.465 + emit(out, "@1 |= @2;", smapper.getL(1), smapper.popL());
1.466 break;
1.467 case opc_ixor:
1.468 - emit(out, "@1 ^= @2;", mapper.getI(1), mapper.popI());
1.469 + emit(out, "@1 ^= @2;", smapper.getI(1), smapper.popI());
1.470 break;
1.471 case opc_lxor:
1.472 - emit(out, "@1 ^= @2;", mapper.getL(1), mapper.popL());
1.473 + emit(out, "@1 ^= @2;", smapper.getL(1), smapper.popL());
1.474 break;
1.475 case opc_ineg:
1.476 - emit(out, "@1 = -@1;", mapper.getI(0));
1.477 + emit(out, "@1 = -@1;", smapper.getI(0));
1.478 break;
1.479 case opc_lneg:
1.480 - emit(out, "@1 = -@1;", mapper.getL(0));
1.481 + emit(out, "@1 = -@1;", smapper.getL(0));
1.482 break;
1.483 case opc_fneg:
1.484 - emit(out, "@1 = -@1;", mapper.getF(0));
1.485 + emit(out, "@1 = -@1;", smapper.getF(0));
1.486 break;
1.487 case opc_dneg:
1.488 - emit(out, "@1 = -@1;", mapper.getD(0));
1.489 + emit(out, "@1 = -@1;", smapper.getD(0));
1.490 break;
1.491 case opc_ishl:
1.492 - emit(out, "@1 <<= @2;", mapper.getI(1), mapper.popI());
1.493 + emit(out, "@1 <<= @2;", smapper.getI(1), smapper.popI());
1.494 break;
1.495 case opc_lshl:
1.496 - emit(out, "@1 <<= @2;", mapper.getL(1), mapper.popI());
1.497 + emit(out, "@1 <<= @2;", smapper.getL(1), smapper.popI());
1.498 break;
1.499 case opc_ishr:
1.500 - emit(out, "@1 >>= @2;", mapper.getI(1), mapper.popI());
1.501 + emit(out, "@1 >>= @2;", smapper.getI(1), smapper.popI());
1.502 break;
1.503 case opc_lshr:
1.504 - emit(out, "@1 >>= @2;", mapper.getL(1), mapper.popI());
1.505 + emit(out, "@1 >>= @2;", smapper.getL(1), smapper.popI());
1.506 break;
1.507 case opc_iushr:
1.508 - emit(out, "@1 >>>= @2;", mapper.getI(1), mapper.popI());
1.509 + emit(out, "@1 >>>= @2;", smapper.getI(1), smapper.popI());
1.510 break;
1.511 case opc_lushr:
1.512 - emit(out, "@1 >>>= @2;", mapper.getL(1), mapper.popI());
1.513 + emit(out, "@1 >>>= @2;", smapper.getL(1), smapper.popI());
1.514 break;
1.515 case opc_iinc: {
1.516 final int varIndx = readByte(byteCodes, ++i);
1.517 final int incrBy = byteCodes[++i];
1.518 if (incrBy == 1) {
1.519 - emit(out, "arg@1++;", Integer.toString(varIndx));
1.520 + emit(out, "@1++;", lmapper.getI(varIndx));
1.521 } else {
1.522 - emit(out, "arg@1 += @2;",
1.523 - Integer.toString(varIndx),
1.524 + emit(out, "@1 += @2;",
1.525 + lmapper.getI(varIndx),
1.526 Integer.toString(incrBy));
1.527 }
1.528 break;
1.529 @@ -597,60 +566,60 @@
1.530 emit(out, "return;");
1.531 break;
1.532 case opc_ireturn:
1.533 - emit(out, "return @1;", mapper.popI());
1.534 + emit(out, "return @1;", smapper.popI());
1.535 break;
1.536 case opc_lreturn:
1.537 - emit(out, "return @1;", mapper.popL());
1.538 + emit(out, "return @1;", smapper.popL());
1.539 break;
1.540 case opc_freturn:
1.541 - emit(out, "return @1;", mapper.popF());
1.542 + emit(out, "return @1;", smapper.popF());
1.543 break;
1.544 case opc_dreturn:
1.545 - emit(out, "return @1;", mapper.popD());
1.546 + emit(out, "return @1;", smapper.popD());
1.547 break;
1.548 case opc_areturn:
1.549 - emit(out, "return @1;", mapper.popA());
1.550 + emit(out, "return @1;", smapper.popA());
1.551 break;
1.552 case opc_i2l:
1.553 - emit(out, "@2 = @1;", mapper.popI(), mapper.pushL());
1.554 + emit(out, "@2 = @1;", smapper.popI(), smapper.pushL());
1.555 break;
1.556 case opc_i2f:
1.557 - emit(out, "@2 = @1;", mapper.popI(), mapper.pushF());
1.558 + emit(out, "@2 = @1;", smapper.popI(), smapper.pushF());
1.559 break;
1.560 case opc_i2d:
1.561 - emit(out, "@2 = @1;", mapper.popI(), mapper.pushD());
1.562 + emit(out, "@2 = @1;", smapper.popI(), smapper.pushD());
1.563 break;
1.564 case opc_l2i:
1.565 - emit(out, "@2 = @1;", mapper.popL(), mapper.pushI());
1.566 + emit(out, "@2 = @1;", smapper.popL(), smapper.pushI());
1.567 break;
1.568 // max int check?
1.569 case opc_l2f:
1.570 - emit(out, "@2 = @1;", mapper.popL(), mapper.pushF());
1.571 + emit(out, "@2 = @1;", smapper.popL(), smapper.pushF());
1.572 break;
1.573 case opc_l2d:
1.574 - emit(out, "@2 = @1;", mapper.popL(), mapper.pushD());
1.575 + emit(out, "@2 = @1;", smapper.popL(), smapper.pushD());
1.576 break;
1.577 case opc_f2d:
1.578 - emit(out, "@2 = @1;", mapper.popF(), mapper.pushD());
1.579 + emit(out, "@2 = @1;", smapper.popF(), smapper.pushD());
1.580 break;
1.581 case opc_d2f:
1.582 - emit(out, "@2 = @1;", mapper.popD(), mapper.pushF());
1.583 + emit(out, "@2 = @1;", smapper.popD(), smapper.pushF());
1.584 break;
1.585 case opc_f2i:
1.586 emit(out, "@2 = Math.floor(@1);",
1.587 - mapper.popF(), mapper.pushI());
1.588 + smapper.popF(), smapper.pushI());
1.589 break;
1.590 case opc_f2l:
1.591 emit(out, "@2 = Math.floor(@1);",
1.592 - mapper.popF(), mapper.pushL());
1.593 + smapper.popF(), smapper.pushL());
1.594 break;
1.595 case opc_d2i:
1.596 emit(out, "@2 = Math.floor(@1);",
1.597 - mapper.popD(), mapper.pushI());
1.598 + smapper.popD(), smapper.pushI());
1.599 break;
1.600 case opc_d2l:
1.601 emit(out, "@2 = Math.floor(@1);",
1.602 - mapper.popD(), mapper.pushL());
1.603 + smapper.popD(), smapper.pushL());
1.604 break;
1.605 case opc_i2b:
1.606 case opc_i2c:
1.607 @@ -658,55 +627,55 @@
1.608 out.append("/* number conversion */");
1.609 break;
1.610 case opc_aconst_null:
1.611 - emit(out, "@1 = null;", mapper.pushA());
1.612 + emit(out, "@1 = null;", smapper.pushA());
1.613 break;
1.614 case opc_iconst_m1:
1.615 - emit(out, "@1 = -1;", mapper.pushI());
1.616 + emit(out, "@1 = -1;", smapper.pushI());
1.617 break;
1.618 case opc_iconst_0:
1.619 - emit(out, "@1 = 0;", mapper.pushI());
1.620 + emit(out, "@1 = 0;", smapper.pushI());
1.621 break;
1.622 case opc_dconst_0:
1.623 - emit(out, "@1 = 0;", mapper.pushD());
1.624 + emit(out, "@1 = 0;", smapper.pushD());
1.625 break;
1.626 case opc_lconst_0:
1.627 - emit(out, "@1 = 0;", mapper.pushL());
1.628 + emit(out, "@1 = 0;", smapper.pushL());
1.629 break;
1.630 case opc_fconst_0:
1.631 - emit(out, "@1 = 0;", mapper.pushF());
1.632 + emit(out, "@1 = 0;", smapper.pushF());
1.633 break;
1.634 case opc_iconst_1:
1.635 - emit(out, "@1 = 1;", mapper.pushI());
1.636 + emit(out, "@1 = 1;", smapper.pushI());
1.637 break;
1.638 case opc_lconst_1:
1.639 - emit(out, "@1 = 1;", mapper.pushL());
1.640 + emit(out, "@1 = 1;", smapper.pushL());
1.641 break;
1.642 case opc_fconst_1:
1.643 - emit(out, "@1 = 1;", mapper.pushF());
1.644 + emit(out, "@1 = 1;", smapper.pushF());
1.645 break;
1.646 case opc_dconst_1:
1.647 - emit(out, "@1 = 1;", mapper.pushD());
1.648 + emit(out, "@1 = 1;", smapper.pushD());
1.649 break;
1.650 case opc_iconst_2:
1.651 - emit(out, "@1 = 2;", mapper.pushI());
1.652 + emit(out, "@1 = 2;", smapper.pushI());
1.653 break;
1.654 case opc_fconst_2:
1.655 - emit(out, "@1 = 2;", mapper.pushF());
1.656 + emit(out, "@1 = 2;", smapper.pushF());
1.657 break;
1.658 case opc_iconst_3:
1.659 - emit(out, "@1 = 3;", mapper.pushI());
1.660 + emit(out, "@1 = 3;", smapper.pushI());
1.661 break;
1.662 case opc_iconst_4:
1.663 - emit(out, "@1 = 4;", mapper.pushI());
1.664 + emit(out, "@1 = 4;", smapper.pushI());
1.665 break;
1.666 case opc_iconst_5:
1.667 - emit(out, "@1 = 5;", mapper.pushI());
1.668 + emit(out, "@1 = 5;", smapper.pushI());
1.669 break;
1.670 case opc_ldc: {
1.671 int indx = readByte(byteCodes, ++i);
1.672 String v = encodeConstant(indx);
1.673 - int type = constantToVariableType(jc.getTag(indx));
1.674 - emit(out, "@1 = @2;", mapper.pushT(type), v);
1.675 + int type = VarType.fromConstantType(jc.getTag(indx));
1.676 + emit(out, "@1 = @2;", smapper.pushT(type), v);
1.677 break;
1.678 }
1.679 case opc_ldc_w:
1.680 @@ -714,110 +683,110 @@
1.681 int indx = readIntArg(byteCodes, i);
1.682 i += 2;
1.683 String v = encodeConstant(indx);
1.684 - int type = constantToVariableType(jc.getTag(indx));
1.685 - emit(out, "@1 = @2;", mapper.pushT(type), v);
1.686 + int type = VarType.fromConstantType(jc.getTag(indx));
1.687 + emit(out, "@1 = @2;", smapper.pushT(type), v);
1.688 break;
1.689 }
1.690 case opc_lcmp:
1.691 emit(out, "@3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);",
1.692 - mapper.popL(), mapper.popL(), mapper.pushI());
1.693 + smapper.popL(), smapper.popL(), smapper.pushI());
1.694 break;
1.695 case opc_fcmpl:
1.696 case opc_fcmpg:
1.697 emit(out, "@3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);",
1.698 - mapper.popF(), mapper.popF(), mapper.pushI());
1.699 + smapper.popF(), smapper.popF(), smapper.pushI());
1.700 break;
1.701 case opc_dcmpl:
1.702 case opc_dcmpg:
1.703 emit(out, "@3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);",
1.704 - mapper.popD(), mapper.popD(), mapper.pushI());
1.705 + smapper.popD(), smapper.popD(), smapper.pushI());
1.706 break;
1.707 case opc_if_acmpeq:
1.708 - i = generateIf(byteCodes, i, mapper.popA(), mapper.popA(),
1.709 + i = generateIf(byteCodes, i, smapper.popA(), smapper.popA(),
1.710 "===");
1.711 break;
1.712 case opc_if_acmpne:
1.713 - i = generateIf(byteCodes, i, mapper.popA(), mapper.popA(),
1.714 + i = generateIf(byteCodes, i, smapper.popA(), smapper.popA(),
1.715 "!=");
1.716 break;
1.717 case opc_if_icmpeq:
1.718 - i = generateIf(byteCodes, i, mapper.popI(), mapper.popI(),
1.719 + i = generateIf(byteCodes, i, smapper.popI(), smapper.popI(),
1.720 "==");
1.721 break;
1.722 case opc_ifeq: {
1.723 int indx = i + readIntArg(byteCodes, i);
1.724 emit(out, "if (@1 == 0) { gt = @2; continue; }",
1.725 - mapper.popI(), Integer.toString(indx));
1.726 + smapper.popI(), Integer.toString(indx));
1.727 i += 2;
1.728 break;
1.729 }
1.730 case opc_ifne: {
1.731 int indx = i + readIntArg(byteCodes, i);
1.732 emit(out, "if (@1 != 0) { gt = @2; continue; }",
1.733 - mapper.popI(), Integer.toString(indx));
1.734 + smapper.popI(), Integer.toString(indx));
1.735 i += 2;
1.736 break;
1.737 }
1.738 case opc_iflt: {
1.739 int indx = i + readIntArg(byteCodes, i);
1.740 emit(out, "if (@1 < 0) { gt = @2; continue; }",
1.741 - mapper.popI(), Integer.toString(indx));
1.742 + smapper.popI(), Integer.toString(indx));
1.743 i += 2;
1.744 break;
1.745 }
1.746 case opc_ifle: {
1.747 int indx = i + readIntArg(byteCodes, i);
1.748 emit(out, "if (@1 <= 0) { gt = @2; continue; }",
1.749 - mapper.popI(), Integer.toString(indx));
1.750 + smapper.popI(), Integer.toString(indx));
1.751 i += 2;
1.752 break;
1.753 }
1.754 case opc_ifgt: {
1.755 int indx = i + readIntArg(byteCodes, i);
1.756 emit(out, "if (@1 > 0) { gt = @2; continue; }",
1.757 - mapper.popI(), Integer.toString(indx));
1.758 + smapper.popI(), Integer.toString(indx));
1.759 i += 2;
1.760 break;
1.761 }
1.762 case opc_ifge: {
1.763 int indx = i + readIntArg(byteCodes, i);
1.764 emit(out, "if (@1 >= 0) { gt = @2; continue; }",
1.765 - mapper.popI(), Integer.toString(indx));
1.766 + smapper.popI(), Integer.toString(indx));
1.767 i += 2;
1.768 break;
1.769 }
1.770 case opc_ifnonnull: {
1.771 int indx = i + readIntArg(byteCodes, i);
1.772 emit(out, "if (@1 !== null) { gt = @2; continue; }",
1.773 - mapper.popA(), Integer.toString(indx));
1.774 + smapper.popA(), Integer.toString(indx));
1.775 i += 2;
1.776 break;
1.777 }
1.778 case opc_ifnull: {
1.779 int indx = i + readIntArg(byteCodes, i);
1.780 emit(out, "if (@1 === null) { gt = @2; continue; }",
1.781 - mapper.popA(), Integer.toString(indx));
1.782 + smapper.popA(), Integer.toString(indx));
1.783 i += 2;
1.784 break;
1.785 }
1.786 case opc_if_icmpne:
1.787 - i = generateIf(byteCodes, i, mapper.popI(), mapper.popI(),
1.788 + i = generateIf(byteCodes, i, smapper.popI(), smapper.popI(),
1.789 "!=");
1.790 break;
1.791 case opc_if_icmplt:
1.792 - i = generateIf(byteCodes, i, mapper.popI(), mapper.popI(),
1.793 + i = generateIf(byteCodes, i, smapper.popI(), smapper.popI(),
1.794 "<");
1.795 break;
1.796 case opc_if_icmple:
1.797 - i = generateIf(byteCodes, i, mapper.popI(), mapper.popI(),
1.798 + i = generateIf(byteCodes, i, smapper.popI(), smapper.popI(),
1.799 "<=");
1.800 break;
1.801 case opc_if_icmpgt:
1.802 - i = generateIf(byteCodes, i, mapper.popI(), mapper.popI(),
1.803 + i = generateIf(byteCodes, i, smapper.popI(), smapper.popI(),
1.804 ">");
1.805 break;
1.806 case opc_if_icmpge:
1.807 - i = generateIf(byteCodes, i, mapper.popI(), mapper.popI(),
1.808 + i = generateIf(byteCodes, i, smapper.popI(), smapper.popI(),
1.809 ">=");
1.810 break;
1.811 case opc_goto: {
1.812 @@ -832,7 +801,7 @@
1.813 table += 4;
1.814 int n = readInt4(byteCodes, table);
1.815 table += 4;
1.816 - out.append("switch (").append(mapper.popI()).append(") {\n");
1.817 + out.append("switch (").append(smapper.popI()).append(") {\n");
1.818 while (n-- > 0) {
1.819 int cnstnt = readInt4(byteCodes, table);
1.820 table += 4;
1.821 @@ -852,7 +821,7 @@
1.822 table += 4;
1.823 int high = readInt4(byteCodes, table);
1.824 table += 4;
1.825 - out.append("switch (").append(mapper.popI()).append(") {\n");
1.826 + out.append("switch (").append(smapper.popI()).append(") {\n");
1.827 while (low <= high) {
1.828 int offset = i + readInt4(byteCodes, table);
1.829 table += 4;
1.830 @@ -864,23 +833,23 @@
1.831 break;
1.832 }
1.833 case opc_invokeinterface: {
1.834 - i = invokeVirtualMethod(byteCodes, i, mapper) + 2;
1.835 + i = invokeVirtualMethod(byteCodes, i, smapper) + 2;
1.836 break;
1.837 }
1.838 case opc_invokevirtual:
1.839 - i = invokeVirtualMethod(byteCodes, i, mapper);
1.840 + i = invokeVirtualMethod(byteCodes, i, smapper);
1.841 break;
1.842 case opc_invokespecial:
1.843 - i = invokeStaticMethod(byteCodes, i, mapper, false);
1.844 + i = invokeStaticMethod(byteCodes, i, smapper, false);
1.845 break;
1.846 case opc_invokestatic:
1.847 - i = invokeStaticMethod(byteCodes, i, mapper, true);
1.848 + i = invokeStaticMethod(byteCodes, i, smapper, true);
1.849 break;
1.850 case opc_new: {
1.851 int indx = readIntArg(byteCodes, i);
1.852 String ci = jc.getClassName(indx);
1.853 emit(out, "@1 = new @2;",
1.854 - mapper.pushA(), ci.replace('/', '_'));
1.855 + smapper.pushA(), ci.replace('/', '_'));
1.856 addReference(ci);
1.857 i += 2;
1.858 break;
1.859 @@ -888,21 +857,21 @@
1.860 case opc_newarray:
1.861 ++i; // skip type of array
1.862 emit(out, "@2 = new Array(@1).fillNulls();",
1.863 - mapper.popI(), mapper.pushA());
1.864 + smapper.popI(), smapper.pushA());
1.865 break;
1.866 case opc_anewarray:
1.867 i += 2; // skip type of array
1.868 emit(out, "@2 = new Array(@1).fillNulls();",
1.869 - mapper.popI(), mapper.pushA());
1.870 + smapper.popI(), smapper.pushA());
1.871 break;
1.872 case opc_multianewarray: {
1.873 i += 2;
1.874 int dim = readByte(byteCodes, ++i);
1.875 - out.append("{ var a0 = new Array(").append(mapper.popI())
1.876 + out.append("{ var a0 = new Array(").append(smapper.popI())
1.877 .append(").fillNulls();");
1.878 for (int d = 1; d < dim; d++) {
1.879 out.append("\n var l" + d).append(" = ")
1.880 - .append(mapper.popI()).append(';');
1.881 + .append(smapper.popI()).append(';');
1.882 out.append("\n for (var i" + d).append (" = 0; i" + d).
1.883 append(" < a" + (d - 1)).
1.884 append(".length; i" + d).append("++) {");
1.885 @@ -914,110 +883,110 @@
1.886 for (int d = 1; d < dim; d++) {
1.887 out.append("\n }");
1.888 }
1.889 - out.append("\n").append(mapper.pushA()).append(" = a0; }");
1.890 + out.append("\n").append(smapper.pushA()).append(" = a0; }");
1.891 break;
1.892 }
1.893 case opc_arraylength:
1.894 - emit(out, "@2 = @1.length;", mapper.popA(), mapper.pushI());
1.895 + emit(out, "@2 = @1.length;", smapper.popA(), smapper.pushI());
1.896 break;
1.897 case opc_lastore:
1.898 emit(out, "@3[@2] = @1;",
1.899 - mapper.popL(), mapper.popI(), mapper.popA());
1.900 + smapper.popL(), smapper.popI(), smapper.popA());
1.901 break;
1.902 case opc_fastore:
1.903 emit(out, "@3[@2] = @1;",
1.904 - mapper.popF(), mapper.popI(), mapper.popA());
1.905 + smapper.popF(), smapper.popI(), smapper.popA());
1.906 break;
1.907 case opc_dastore:
1.908 emit(out, "@3[@2] = @1;",
1.909 - mapper.popD(), mapper.popI(), mapper.popA());
1.910 + smapper.popD(), smapper.popI(), smapper.popA());
1.911 break;
1.912 case opc_aastore:
1.913 emit(out, "@3[@2] = @1;",
1.914 - mapper.popA(), mapper.popI(), mapper.popA());
1.915 + smapper.popA(), smapper.popI(), smapper.popA());
1.916 break;
1.917 case opc_iastore:
1.918 case opc_bastore:
1.919 case opc_castore:
1.920 case opc_sastore:
1.921 emit(out, "@3[@2] = @1;",
1.922 - mapper.popI(), mapper.popI(), mapper.popA());
1.923 + smapper.popI(), smapper.popI(), smapper.popA());
1.924 break;
1.925 case opc_laload:
1.926 emit(out, "@3 = @2[@1];",
1.927 - mapper.popI(), mapper.popA(), mapper.pushL());
1.928 + smapper.popI(), smapper.popA(), smapper.pushL());
1.929 break;
1.930 case opc_faload:
1.931 emit(out, "@3 = @2[@1];",
1.932 - mapper.popI(), mapper.popA(), mapper.pushF());
1.933 + smapper.popI(), smapper.popA(), smapper.pushF());
1.934 break;
1.935 case opc_daload:
1.936 emit(out, "@3 = @2[@1];",
1.937 - mapper.popI(), mapper.popA(), mapper.pushD());
1.938 + smapper.popI(), smapper.popA(), smapper.pushD());
1.939 break;
1.940 case opc_aaload:
1.941 emit(out, "@3 = @2[@1];",
1.942 - mapper.popI(), mapper.popA(), mapper.pushA());
1.943 + smapper.popI(), smapper.popA(), smapper.pushA());
1.944 break;
1.945 case opc_iaload:
1.946 case opc_baload:
1.947 case opc_caload:
1.948 case opc_saload:
1.949 emit(out, "@3 = @2[@1];",
1.950 - mapper.popI(), mapper.popA(), mapper.pushI());
1.951 + smapper.popI(), smapper.popA(), smapper.pushI());
1.952 break;
1.953 case opc_pop:
1.954 case opc_pop2:
1.955 - mapper.pop(1);
1.956 + smapper.pop(1);
1.957 out.append("/* pop */");
1.958 break;
1.959 case opc_dup: {
1.960 - final Variable v = mapper.get(0);
1.961 - emit(out, "@1 = @2;", mapper.pushT(v.getType()), v);
1.962 + final Variable v = smapper.get(0);
1.963 + emit(out, "@1 = @2;", smapper.pushT(v.getType()), v);
1.964 break;
1.965 }
1.966 case opc_dup2: {
1.967 - if (mapper.get(0).isCategory2()) {
1.968 - final Variable v = mapper.get(0);
1.969 - emit(out, "@1 = @2;", mapper.pushT(v.getType()), v);
1.970 + if (smapper.get(0).isCategory2()) {
1.971 + final Variable v = smapper.get(0);
1.972 + emit(out, "@1 = @2;", smapper.pushT(v.getType()), v);
1.973 } else {
1.974 - final Variable v1 = mapper.get(0);
1.975 - final Variable v2 = mapper.get(1);
1.976 + final Variable v1 = smapper.get(0);
1.977 + final Variable v2 = smapper.get(1);
1.978 emit(out, "{ @1 = @2; @3 = @4; }",
1.979 - mapper.pushT(v2.getType()), v2,
1.980 - mapper.pushT(v1.getType()), v1);
1.981 + smapper.pushT(v2.getType()), v2,
1.982 + smapper.pushT(v1.getType()), v1);
1.983 }
1.984 break;
1.985 }
1.986 case opc_dup_x1: {
1.987 - final Variable vi1 = mapper.pop();
1.988 - final Variable vi2 = mapper.pop();
1.989 - final Variable vo3 = mapper.pushT(vi1.getType());
1.990 - final Variable vo2 = mapper.pushT(vi2.getType());
1.991 - final Variable vo1 = mapper.pushT(vi1.getType());
1.992 + final Variable vi1 = smapper.pop();
1.993 + final Variable vi2 = smapper.pop();
1.994 + final Variable vo3 = smapper.pushT(vi1.getType());
1.995 + final Variable vo2 = smapper.pushT(vi2.getType());
1.996 + final Variable vo1 = smapper.pushT(vi1.getType());
1.997
1.998 emit(out, "{ @1 = @2; @3 = @4; @5 = @6; }",
1.999 vo1, vi1, vo2, vi2, vo3, vo1);
1.1000 break;
1.1001 }
1.1002 case opc_dup_x2: {
1.1003 - if (mapper.get(1).isCategory2()) {
1.1004 - final Variable vi1 = mapper.pop();
1.1005 - final Variable vi2 = mapper.pop();
1.1006 - final Variable vo3 = mapper.pushT(vi1.getType());
1.1007 - final Variable vo2 = mapper.pushT(vi2.getType());
1.1008 - final Variable vo1 = mapper.pushT(vi1.getType());
1.1009 + if (smapper.get(1).isCategory2()) {
1.1010 + final Variable vi1 = smapper.pop();
1.1011 + final Variable vi2 = smapper.pop();
1.1012 + final Variable vo3 = smapper.pushT(vi1.getType());
1.1013 + final Variable vo2 = smapper.pushT(vi2.getType());
1.1014 + final Variable vo1 = smapper.pushT(vi1.getType());
1.1015
1.1016 emit(out, "{ @1 = @2; @3 = @4; @5 = @6; }",
1.1017 vo1, vi1, vo2, vi2, vo3, vo1);
1.1018 } else {
1.1019 - final Variable vi1 = mapper.pop();
1.1020 - final Variable vi2 = mapper.pop();
1.1021 - final Variable vi3 = mapper.pop();
1.1022 - final Variable vo4 = mapper.pushT(vi1.getType());
1.1023 - final Variable vo3 = mapper.pushT(vi3.getType());
1.1024 - final Variable vo2 = mapper.pushT(vi2.getType());
1.1025 - final Variable vo1 = mapper.pushT(vi1.getType());
1.1026 + final Variable vi1 = smapper.pop();
1.1027 + final Variable vi2 = smapper.pop();
1.1028 + final Variable vi3 = smapper.pop();
1.1029 + final Variable vo4 = smapper.pushT(vi1.getType());
1.1030 + final Variable vo3 = smapper.pushT(vi3.getType());
1.1031 + final Variable vo2 = smapper.pushT(vi2.getType());
1.1032 + final Variable vo1 = smapper.pushT(vi1.getType());
1.1033
1.1034 emit(out, "{ @1 = @2; @3 = @4; @5 = @6; @7 = @8; }",
1.1035 vo1, vi1, vo2, vi2, vo3, vi3, vo4, vo1);
1.1036 @@ -1026,29 +995,29 @@
1.1037 }
1.1038 case opc_bipush:
1.1039 emit(out, "@1 = @2;",
1.1040 - mapper.pushI(), Integer.toString(byteCodes[++i]));
1.1041 + smapper.pushI(), Integer.toString(byteCodes[++i]));
1.1042 break;
1.1043 case opc_sipush:
1.1044 emit(out, "@1 = @2;",
1.1045 - mapper.pushI(),
1.1046 + smapper.pushI(),
1.1047 Integer.toString(readIntArg(byteCodes, i)));
1.1048 i += 2;
1.1049 break;
1.1050 case opc_getfield: {
1.1051 int indx = readIntArg(byteCodes, i);
1.1052 String[] fi = jc.getFieldInfoName(indx);
1.1053 - final int type = fieldToVariableType(fi[2].charAt(0));
1.1054 + final int type = VarType.fromFieldType(fi[2].charAt(0));
1.1055 emit(out, "@2 = @1.fld_@3;",
1.1056 - mapper.popA(), mapper.pushT(type), fi[1]);
1.1057 + smapper.popA(), smapper.pushT(type), fi[1]);
1.1058 i += 2;
1.1059 break;
1.1060 }
1.1061 case opc_getstatic: {
1.1062 int indx = readIntArg(byteCodes, i);
1.1063 String[] fi = jc.getFieldInfoName(indx);
1.1064 - final int type = fieldToVariableType(fi[2].charAt(0));
1.1065 + final int type = VarType.fromFieldType(fi[2].charAt(0));
1.1066 emit(out, "@1 = @2.@3;",
1.1067 - mapper.pushT(type), fi[0].replace('/', '_'), fi[1]);
1.1068 + smapper.pushT(type), fi[0].replace('/', '_'), fi[1]);
1.1069 i += 2;
1.1070 addReference(fi[0]);
1.1071 break;
1.1072 @@ -1056,18 +1025,18 @@
1.1073 case opc_putfield: {
1.1074 int indx = readIntArg(byteCodes, i);
1.1075 String[] fi = jc.getFieldInfoName(indx);
1.1076 - final int type = fieldToVariableType(fi[2].charAt(0));
1.1077 + final int type = VarType.fromFieldType(fi[2].charAt(0));
1.1078 emit(out, "@2.fld_@3 = @1;",
1.1079 - mapper.popT(type), mapper.popA(), fi[1]);
1.1080 + smapper.popT(type), smapper.popA(), fi[1]);
1.1081 i += 2;
1.1082 break;
1.1083 }
1.1084 case opc_putstatic: {
1.1085 int indx = readIntArg(byteCodes, i);
1.1086 String[] fi = jc.getFieldInfoName(indx);
1.1087 - final int type = fieldToVariableType(fi[2].charAt(0));
1.1088 + final int type = VarType.fromFieldType(fi[2].charAt(0));
1.1089 emit(out, "@1.@2 = @3;",
1.1090 - fi[0].replace('/', '_'), fi[1], mapper.popT(type));
1.1091 + fi[0].replace('/', '_'), fi[1], smapper.popT(type));
1.1092 i += 2;
1.1093 addReference(fi[0]);
1.1094 break;
1.1095 @@ -1079,7 +1048,7 @@
1.1096 // no way to check arrays right now
1.1097 // XXX proper exception
1.1098 emit(out, "if (@1.$instOf_@2 != 1) throw {};",
1.1099 - mapper.getA(0), type.replace('/', '_'));
1.1100 + smapper.getA(0), type.replace('/', '_'));
1.1101 }
1.1102 i += 2;
1.1103 break;
1.1104 @@ -1088,28 +1057,28 @@
1.1105 int indx = readIntArg(byteCodes, i);
1.1106 final String type = jc.getClassName(indx);
1.1107 emit(out, "@2 = @1.$instOf_@3 ? 1 : 0;",
1.1108 - mapper.popA(), mapper.pushI(), type.replace('/', '_'));
1.1109 + smapper.popA(), smapper.pushI(), type.replace('/', '_'));
1.1110 i += 2;
1.1111 break;
1.1112 }
1.1113 case opc_athrow: {
1.1114 - final Variable v = mapper.popA();
1.1115 - mapper.clear();
1.1116 + final Variable v = smapper.popA();
1.1117 + smapper.clear();
1.1118
1.1119 emit(out, "{ @1 = @2; throw @2; }",
1.1120 - mapper.pushA(), v);
1.1121 + smapper.pushA(), v);
1.1122 break;
1.1123 }
1.1124
1.1125 case opc_monitorenter: {
1.1126 out.append("/* monitor enter */");
1.1127 - mapper.popA();
1.1128 + smapper.popA();
1.1129 break;
1.1130 }
1.1131
1.1132 case opc_monitorexit: {
1.1133 out.append("/* monitor exit */");
1.1134 - mapper.popA();
1.1135 + smapper.popA();
1.1136 break;
1.1137 }
1.1138
1.1139 @@ -1127,6 +1096,7 @@
1.1140 out.append("\n");
1.1141 }
1.1142 out.append(" }\n");
1.1143 + out.append("};");
1.1144 }
1.1145
1.1146 private int generateIf(byte[] byteCodes, int i,
1.1147 @@ -1274,7 +1244,7 @@
1.1148 return name.toString();
1.1149 }
1.1150
1.1151 - private int invokeStaticMethod(byte[] byteCodes, int i, final StackToVariableMapper mapper, boolean isStatic)
1.1152 + private int invokeStaticMethod(byte[] byteCodes, int i, final StackMapper mapper, boolean isStatic)
1.1153 throws IOException {
1.1154 int methodIndex = readIntArg(byteCodes, i);
1.1155 String[] mi = jc.getFieldInfoName(methodIndex);
1.1156 @@ -1290,7 +1260,7 @@
1.1157 }
1.1158
1.1159 if (returnType[0] != 'V') {
1.1160 - out.append(mapper.pushT(fieldToVariableType(returnType[0])))
1.1161 + out.append(mapper.pushT(VarType.fromFieldType(returnType[0])))
1.1162 .append(" = ");
1.1163 }
1.1164
1.1165 @@ -1311,7 +1281,7 @@
1.1166 addReference(in);
1.1167 return i;
1.1168 }
1.1169 - private int invokeVirtualMethod(byte[] byteCodes, int i, final StackToVariableMapper mapper)
1.1170 + private int invokeVirtualMethod(byte[] byteCodes, int i, final StackMapper mapper)
1.1171 throws IOException {
1.1172 int methodIndex = readIntArg(byteCodes, i);
1.1173 String[] mi = jc.getFieldInfoName(methodIndex);
1.1174 @@ -1327,7 +1297,7 @@
1.1175 }
1.1176
1.1177 if (returnType[0] != 'V') {
1.1178 - out.append(mapper.pushT(fieldToVariableType(returnType[0])))
1.1179 + out.append(mapper.pushT(VarType.fromFieldType(returnType[0])))
1.1180 .append(" = ");
1.1181 }
1.1182
1.1183 @@ -1517,56 +1487,6 @@
1.1184 ap.parse(data, cd);
1.1185 }
1.1186
1.1187 - private static int constantToVariableType(final byte constantTag) {
1.1188 - switch (constantTag) {
1.1189 - case CONSTANT_INTEGER:
1.1190 - return Variable.TYPE_INT;
1.1191 - case CONSTANT_FLOAT:
1.1192 - return Variable.TYPE_FLOAT;
1.1193 - case CONSTANT_LONG:
1.1194 - return Variable.TYPE_LONG;
1.1195 - case CONSTANT_DOUBLE:
1.1196 - return Variable.TYPE_DOUBLE;
1.1197 -
1.1198 - case CONSTANT_CLASS:
1.1199 - case CONSTANT_UTF8:
1.1200 - case CONSTANT_UNICODE:
1.1201 - case CONSTANT_STRING:
1.1202 - return Variable.TYPE_REF;
1.1203 -
1.1204 - case CONSTANT_FIELD:
1.1205 - case CONSTANT_METHOD:
1.1206 - case CONSTANT_INTERFACEMETHOD:
1.1207 - case CONSTANT_NAMEANDTYPE:
1.1208 - /* unclear how to handle for now */
1.1209 - default:
1.1210 - throw new IllegalStateException("Unhandled constant tag");
1.1211 - }
1.1212 - }
1.1213 -
1.1214 - private static int fieldToVariableType(final char fieldType) {
1.1215 - switch (fieldType) {
1.1216 - case 'B':
1.1217 - case 'C':
1.1218 - case 'S':
1.1219 - case 'Z':
1.1220 - case 'I':
1.1221 - return Variable.TYPE_INT;
1.1222 - case 'J':
1.1223 - return Variable.TYPE_LONG;
1.1224 - case 'F':
1.1225 - return Variable.TYPE_FLOAT;
1.1226 - case 'D':
1.1227 - return Variable.TYPE_DOUBLE;
1.1228 - case 'L':
1.1229 - case '[':
1.1230 - return Variable.TYPE_REF;
1.1231 -
1.1232 - default:
1.1233 - throw new IllegalStateException("Unhandled field type");
1.1234 - }
1.1235 - }
1.1236 -
1.1237 private static void emit(final Appendable out,
1.1238 final String format,
1.1239 final CharSequence... params) throws IOException {