1.1 --- a/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java Mon Aug 27 13:16:29 2012 +0200
1.2 +++ b/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java Mon Aug 27 14:27:06 2012 +0200
1.3 @@ -79,14 +79,12 @@
1.4 index++;
1.5 }
1.6 }
1.7 - out.append(") {").append("\n var ");
1.8 + out.append(") {").append("\n");
1.9 final Code code = m.getCode();
1.10 int len = code.getMaxLocals();
1.11 - space = "";
1.12 - for (int i = 0; i < len; i++) {
1.13 - out.append(space);
1.14 - out.append("var").append(String.valueOf(i));
1.15 - space = ",";
1.16 + for (int index = args.size(), i = args.size(); i < len; i++) {
1.17 + out.append(" var ");
1.18 + out.append("arg").append(String.valueOf(i)).append(";\n");
1.19 }
1.20 out.append(";\n var stack = new Array(");
1.21 out.append(Integer.toString(code.getMaxStack()));
1.22 @@ -139,6 +137,30 @@
1.23 out.append("stack.push(arg").append(indx + ");");
1.24 break;
1.25 }
1.26 + case bc_istore_0:
1.27 + case bc_lstore_0:
1.28 + case bc_fstore_0:
1.29 + case bc_dstore_0:
1.30 + out.append("arg0 = stack.pop();");
1.31 + break;
1.32 + case bc_istore_1:
1.33 + case bc_lstore_1:
1.34 + case bc_fstore_1:
1.35 + case bc_dstore_1:
1.36 + out.append("arg1 = stack.pop();");
1.37 + break;
1.38 + case bc_istore_2:
1.39 + case bc_lstore_2:
1.40 + case bc_fstore_2:
1.41 + case bc_dstore_2:
1.42 + out.append("arg2 = stack.pop();");
1.43 + break;
1.44 + case bc_istore_3:
1.45 + case bc_lstore_3:
1.46 + case bc_fstore_3:
1.47 + case bc_dstore_3:
1.48 + out.append("arg3 = stack.pop();");
1.49 + break;
1.50 case bc_iadd:
1.51 case bc_ladd:
1.52 case bc_fadd:
1.53 @@ -165,6 +187,16 @@
1.54 case bc_ddiv:
1.55 out.append("{ var tmp = stack.pop(); stack.push(stack.pop() / tmp); }");
1.56 break;
1.57 + case bc_iinc: {
1.58 + final int varIndx = (byteCodes[++i] + 256) % 256;
1.59 + final int incrBy = (byteCodes[++i] + 256) % 256;
1.60 + if (incrBy == 1) {
1.61 + out.append("arg" + varIndx).append("++;");
1.62 + } else {
1.63 + out.append("arg" + varIndx).append(" += " + incrBy).append(";");
1.64 + }
1.65 + break;
1.66 + }
1.67 case bc_ireturn:
1.68 case bc_lreturn:
1.69 case bc_freturn:
1.70 @@ -237,6 +269,12 @@
1.71 case bc_if_icmpge:
1.72 i = generateIf(byteCodes, i, "<=");
1.73 break;
1.74 + case bc_goto: {
1.75 + int indx = i + readIntArg(byteCodes, i);
1.76 + out.append("gt = " + indx).append("; continue;");
1.77 + i += 2;
1.78 + break;
1.79 + }
1.80 case bc_invokestatic: {
1.81 int methodIndex = readIntArg(byteCodes, i);
1.82 CPMethodInfo mi = (CPMethodInfo) jc.getConstantPool().get(methodIndex);
1.83 @@ -286,9 +324,9 @@
1.84 }
1.85
1.86 private int readIntArg(byte[] byteCodes, int offsetInstruction) {
1.87 - final int indxHi = (byteCodes[offsetInstruction + 1] + 256) % 256;
1.88 - final int indxLo = (byteCodes[offsetInstruction + 2] + 256) % 256;
1.89 - return (indxHi << 16) + indxLo;
1.90 + final int indxHi = byteCodes[offsetInstruction + 1] << 8;
1.91 + final int indxLo = byteCodes[offsetInstruction + 2];
1.92 + return (indxHi & 0xffffff00) | (indxLo & 0xff);
1.93 }
1.94
1.95 private static int countArgs(String descriptor, boolean[] hasReturnType, StringBuilder sig) {