src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java
changeset 2 4679bf342a1f
parent 1 48b1dce93691
child 3 e44f0155d946
     1.1 --- a/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java	Mon Aug 27 05:17:08 2012 +0200
     1.2 +++ b/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java	Mon Aug 27 05:47:44 2012 +0200
     1.3 @@ -20,7 +20,7 @@
     1.4  import java.io.IOException;
     1.5  import java.io.InputStream;
     1.6  import java.util.List;
     1.7 -import org.netbeans.modules.classfile.ByteCodes;
     1.8 +import static org.netbeans.modules.classfile.ByteCodes.*;
     1.9  import org.netbeans.modules.classfile.ClassFile;
    1.10  import org.netbeans.modules.classfile.Code;
    1.11  import org.netbeans.modules.classfile.Method;
    1.12 @@ -67,10 +67,16 @@
    1.13          }
    1.14          out.append('(');
    1.15          String space = "";
    1.16 -        for (int i = 0; i < args.size(); i++) {
    1.17 +        for (int index = 0, i = 0; i < args.size(); i++) {
    1.18              out.append(space);
    1.19 -            out.append("arg").append(String.valueOf(i));
    1.20 +            out.append("arg").append(String.valueOf(index));
    1.21              space = ",";
    1.22 +            final String desc = args.get(i).getDescriptor();
    1.23 +            if ("D".equals(desc)) {
    1.24 +                index += 2;
    1.25 +            } else {
    1.26 +                index++;
    1.27 +            }
    1.28          }
    1.29          out.append(") {").append("\n  var ");
    1.30          final Code code = m.getCode();
    1.31 @@ -94,38 +100,68 @@
    1.32              out.append("  ");
    1.33              final int c = (byteCodes[i] + 256) % 256;
    1.34              switch (c) {
    1.35 -                case ByteCodes.bc_aload_0:
    1.36 -                case ByteCodes.bc_iload_0:
    1.37 -                case ByteCodes.bc_lload_0:
    1.38 -                case ByteCodes.bc_fload_0:
    1.39 -                case ByteCodes.bc_dload_0:
    1.40 +                case bc_aload_0:
    1.41 +                case bc_iload_0:
    1.42 +                case bc_lload_0:
    1.43 +                case bc_fload_0:
    1.44 +                case bc_dload_0:
    1.45                      out.append("stack.push(arg0);");
    1.46                      break;
    1.47 -                case ByteCodes.bc_aload_1:
    1.48 -                case ByteCodes.bc_iload_1:
    1.49 -                case ByteCodes.bc_lload_1:
    1.50 -                case ByteCodes.bc_fload_1:
    1.51 -                case ByteCodes.bc_dload_1:
    1.52 +                case bc_aload_1:
    1.53 +                case bc_iload_1:
    1.54 +                case bc_lload_1:
    1.55 +                case bc_fload_1:
    1.56 +                case bc_dload_1:
    1.57                      out.append("stack.push(arg1);");
    1.58                      break;
    1.59 -                case ByteCodes.bc_iadd:
    1.60 -                case ByteCodes.bc_ladd:
    1.61 -                case ByteCodes.bc_fadd:
    1.62 -                case ByteCodes.bc_dadd:
    1.63 +                case bc_aload_2:
    1.64 +                case bc_iload_2:
    1.65 +                case bc_lload_2:
    1.66 +                case bc_fload_2:
    1.67 +                case bc_dload_2:
    1.68 +                    out.append("stack.push(arg2);");
    1.69 +                    break;
    1.70 +                case bc_iadd:
    1.71 +                case bc_ladd:
    1.72 +                case bc_fadd:
    1.73 +                case bc_dadd:
    1.74                      out.append("stack.push(stack.pop() + stack.pop());");
    1.75                      break;
    1.76 -                case ByteCodes.bc_imul:
    1.77 -                case ByteCodes.bc_lmul:
    1.78 -                case ByteCodes.bc_fmul:
    1.79 -                case ByteCodes.bc_dmul:
    1.80 +                case bc_isub:
    1.81 +                case bc_lsub:
    1.82 +                case bc_fsub:
    1.83 +                case bc_dsub:
    1.84 +                    out.append("stack.push(- stack.pop() + stack.pop());");
    1.85 +                    break;
    1.86 +                case bc_imul:
    1.87 +                case bc_lmul:
    1.88 +                case bc_fmul:
    1.89 +                case bc_dmul:
    1.90                      out.append("stack.push(stack.pop() * stack.pop());");
    1.91                      break;
    1.92 -                case ByteCodes.bc_ireturn:
    1.93 -                case ByteCodes.bc_lreturn:
    1.94 -                case ByteCodes.bc_freturn:
    1.95 -                case ByteCodes.bc_dreturn:
    1.96 +                case bc_ireturn:
    1.97 +                case bc_lreturn:
    1.98 +                case bc_freturn:
    1.99 +                case bc_dreturn:
   1.100                      out.append("return stack.pop();");
   1.101                      break;
   1.102 +                case bc_i2l:
   1.103 +                case bc_i2f:
   1.104 +                case bc_i2d:
   1.105 +                case bc_l2i:
   1.106 +                case bc_l2f:
   1.107 +                case bc_l2d:
   1.108 +                case bc_f2i:
   1.109 +                case bc_f2l:
   1.110 +                case bc_f2d:
   1.111 +                case bc_d2i:
   1.112 +                case bc_d2l:
   1.113 +                case bc_d2f:
   1.114 +                case bc_i2b:
   1.115 +                case bc_i2c:
   1.116 +                case bc_i2s:
   1.117 +                    out.append("/* number conversion */");
   1.118 +                    break;
   1.119              }
   1.120              out.append("/*");
   1.121              for (int j = prev; j <= i; j++) {