src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java
changeset 8 82772c96ec57
parent 7 5b135a2f2de3
child 9 0cab1e07e677
     1.1 --- a/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java	Mon Aug 27 15:16:39 2012 +0200
     1.2 +++ b/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java	Sat Sep 15 22:12:49 2012 +0200
     1.3 @@ -21,6 +21,10 @@
     1.4  import java.io.InputStream;
     1.5  import java.util.List;
     1.6  import static org.netbeans.modules.classfile.ByteCodes.*;
     1.7 +import org.netbeans.modules.classfile.CPClassInfo;
     1.8 +import org.netbeans.modules.classfile.CPEntry;
     1.9 +import org.netbeans.modules.classfile.CPFieldInfo;
    1.10 +import org.netbeans.modules.classfile.CPLongInfo;
    1.11  import org.netbeans.modules.classfile.CPMethodInfo;
    1.12  import org.netbeans.modules.classfile.ClassFile;
    1.13  import org.netbeans.modules.classfile.Code;
    1.14 @@ -137,24 +141,28 @@
    1.15                      out.append("stack.push(arg").append(indx + ");");
    1.16                      break;
    1.17                  }
    1.18 +                case bc_astore_0:
    1.19                  case bc_istore_0:
    1.20                  case bc_lstore_0:
    1.21                  case bc_fstore_0:
    1.22                  case bc_dstore_0:
    1.23                      out.append("arg0 = stack.pop();");
    1.24                      break;
    1.25 +                case bc_astore_1:
    1.26                  case bc_istore_1:
    1.27                  case bc_lstore_1:
    1.28                  case bc_fstore_1:
    1.29                  case bc_dstore_1:
    1.30                      out.append("arg1 = stack.pop();");
    1.31                      break;
    1.32 +                case bc_astore_2:
    1.33                  case bc_istore_2:
    1.34                  case bc_lstore_2:
    1.35                  case bc_fstore_2:
    1.36                  case bc_dstore_2:
    1.37                      out.append("arg2 = stack.pop();");
    1.38                      break;
    1.39 +                case bc_astore_3:
    1.40                  case bc_istore_3:
    1.41                  case bc_lstore_3:
    1.42                  case bc_fstore_3:
    1.43 @@ -262,6 +270,14 @@
    1.44                  case bc_iconst_5:
    1.45                      out.append("stack.push(5);");
    1.46                      break;
    1.47 +                case bc_ldc_w:
    1.48 +                case bc_ldc2_w: {
    1.49 +                    int indx = readIntArg(byteCodes, i);
    1.50 +                    CPEntry entry = jc.getConstantPool().get(indx);
    1.51 +                    i += 2;
    1.52 +                    out.append("stack.push(" + entry.getValue() + ");");
    1.53 +                    break;
    1.54 +                }
    1.55                  case bc_if_icmpeq: {
    1.56                      i = generateIf(byteCodes, i, "==");
    1.57                      break;
    1.58 @@ -323,6 +339,37 @@
    1.59                      i += 2;
    1.60                      break;
    1.61                  }
    1.62 +                case bc_new: {
    1.63 +                    int indx = readIntArg(byteCodes, i);
    1.64 +                    CPClassInfo ci = jc.getConstantPool().getClass(indx);
    1.65 +                    out.append("stack.push(");
    1.66 +                    out.append("new ").append(ci.getClassName().getExternalName().replace('.','_'));
    1.67 +                    out.append("());");
    1.68 +                    i += 2;
    1.69 +                    break;
    1.70 +                }
    1.71 +                case bc_dup:
    1.72 +                    out.append("stack.push(stack[stack.length - 1]);");
    1.73 +                    break;
    1.74 +                case bc_bipush:
    1.75 +                    out.append("stack.push(" + byteCodes[++i] + ");");
    1.76 +                    break;
    1.77 +                case bc_invokevirtual:
    1.78 +                case bc_invokespecial: {
    1.79 +                    int indx = readIntArg(byteCodes, i);
    1.80 +                    CPMethodInfo mi = (CPMethodInfo) jc.getConstantPool().get(indx);
    1.81 +                    out.append("{ var tmp = stack.pop(); tmp." + mi.getMethodName() + "(); }");
    1.82 +                    i += 2;
    1.83 +                    break;
    1.84 +                }
    1.85 +                case bc_getfield: {
    1.86 +                    int indx = readIntArg(byteCodes, i);
    1.87 +                    CPFieldInfo fi = (CPFieldInfo) jc.getConstantPool().get(indx);
    1.88 +                    out.append(" stack.push(stack.pop().").append(fi.getFieldName()).append(");");
    1.89 +                    i += 2;
    1.90 +                    break;
    1.91 +                }
    1.92 +                    
    1.93              }
    1.94              out.append(" /*");
    1.95              for (int j = prev; j <= i; j++) {