vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
branchjavap
changeset 151 40f95fe90cdc
parent 137 45184b2f9697
child 152 2cda429aeb49
     1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Thu Nov 08 18:34:12 2012 +0100
     1.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Sun Nov 11 13:23:52 2012 +0100
     1.3 @@ -24,35 +24,22 @@
     1.4  import java.util.List;
     1.5  import org.apidesign.bck2brwsr.core.ExtraJavaScript;
     1.6  import org.apidesign.bck2brwsr.core.JavaScriptBody;
     1.7 -import org.netbeans.modules.classfile.Annotation;
     1.8 -import org.netbeans.modules.classfile.AnnotationComponent;
     1.9 -import org.netbeans.modules.classfile.ArrayElementValue;
    1.10 -import static org.netbeans.modules.classfile.ByteCodes.*;
    1.11 -import org.netbeans.modules.classfile.CPClassInfo;
    1.12 -import org.netbeans.modules.classfile.CPEntry;
    1.13 -import org.netbeans.modules.classfile.CPFieldInfo;
    1.14 -import org.netbeans.modules.classfile.CPMethodInfo;
    1.15 -import org.netbeans.modules.classfile.CPStringInfo;
    1.16 -import org.netbeans.modules.classfile.ClassFile;
    1.17 -import org.netbeans.modules.classfile.ClassName;
    1.18 -import org.netbeans.modules.classfile.Code;
    1.19 -import org.netbeans.modules.classfile.ElementValue;
    1.20 -import org.netbeans.modules.classfile.Method;
    1.21 -import org.netbeans.modules.classfile.Parameter;
    1.22 -import org.netbeans.modules.classfile.PrimitiveElementValue;
    1.23 -import org.netbeans.modules.classfile.Variable;
    1.24 +import sun.tools.javap.ClassData;
    1.25 +import sun.tools.javap.FieldData;
    1.26 +import sun.tools.javap.MethodData;
    1.27 +import static sun.tools.javap.RuntimeConstants.*;
    1.28  
    1.29  /** Translator of the code inside class files to JavaScript.
    1.30   *
    1.31   * @author Jaroslav Tulach <jtulach@netbeans.org>
    1.32   */
    1.33  public final class ByteCodeToJavaScript {
    1.34 -    private final ClassFile jc;
    1.35 +    private final ClassData jc;
    1.36      private final Appendable out;
    1.37      private final Collection<? super String> references;
    1.38  
    1.39      private ByteCodeToJavaScript(
    1.40 -        ClassFile jc, Appendable out, Collection<? super String> references
    1.41 +        ClassData jc, Appendable out, Collection<? super String> references
    1.42      ) {
    1.43          this.jc = jc;
    1.44          this.out = out;
    1.45 @@ -80,7 +67,8 @@
    1.46          Collection<? super String> references,
    1.47          Collection<? super String> scripts
    1.48      ) throws IOException {
    1.49 -        ClassFile jc = new ClassFile(classFile, true);
    1.50 +        ClassData jc = new ClassData(classFile);
    1.51 +        /*
    1.52          final ClassName extraAnn = ClassName.getClassName(ExtraJavaScript.class.getName().replace('.', '/'));
    1.53          Annotation a = jc.getAnnotation(extraAnn);
    1.54          if (a != null) {
    1.55 @@ -92,28 +80,28 @@
    1.56                  return null;
    1.57              }
    1.58          }
    1.59 -        
    1.60 +        */
    1.61          ByteCodeToJavaScript compiler = new ByteCodeToJavaScript(
    1.62              jc, out, references
    1.63          );
    1.64          List<String> toInitilize = new ArrayList<String>();
    1.65 -        for (Method m : jc.getMethods()) {
    1.66 +        for (MethodData m : jc.getMethods()) {
    1.67              if (m.isStatic()) {
    1.68                  compiler.generateStaticMethod(m, toInitilize);
    1.69              } else {
    1.70                  compiler.generateInstanceMethod(m);
    1.71              }
    1.72          }
    1.73 -        for (Variable v : jc.getVariables()) {
    1.74 +        for (FieldData v : jc.getFields()) {
    1.75              if (v.isStatic()) {
    1.76                  compiler.generateStaticField(v);
    1.77              }
    1.78          }
    1.79          
    1.80 -        final String className = jc.getName().getInternalName().replace('/', '_');
    1.81 +        final String className = className(jc);
    1.82          out.append("\nfunction ").append(className);
    1.83          out.append("() {");
    1.84 -        for (Variable v : jc.getVariables()) {
    1.85 +        for (FieldData v : jc.getFields()) {
    1.86              if (!v.isStatic()) {
    1.87                  out.append("\n  this.fld_").
    1.88                      append(v.getName()).append(" = 0;");
    1.89 @@ -124,22 +112,23 @@
    1.90              append(".prototype.$instOf_").append(className).append(") {");
    1.91          out.append("\n    return new ").append(className).append(";");
    1.92          out.append("\n  }");
    1.93 -        ClassName sc = jc.getSuperClass();
    1.94 +        // ClassName sc = jc.getSuperClass();
    1.95 +        String sc = jc.getSuperClassName(); // with _
    1.96          if (sc != null) {
    1.97              out.append("\n  var p = ").append(className)
    1.98                 .append(".prototype = ").
    1.99 -                append(sc.getInternalName().replace('/', '_')).append("_proto();");
   1.100 +                append(sc.replace('/', '_')).append("_proto();");
   1.101          } else {
   1.102              out.append("\n  var p = ").append(className).append(".prototype;");
   1.103          }
   1.104 -        for (Method m : jc.getMethods()) {
   1.105 +        for (MethodData m : jc.getMethods()) {
   1.106              if (!m.getName().contains("<init>") && !m.getName().contains("<cinit>")) {
   1.107                  compiler.generateMethodReference("\n  p.", m);
   1.108              }
   1.109          }
   1.110          out.append("\n  p.$instOf_").append(className).append(" = true;");
   1.111 -        for (ClassName superInterface : jc.getInterfaces()) {
   1.112 -            out.append("\n  p.$instOf_").append(superInterface.getInternalName().replace('/', '_')).append(" = true;");
   1.113 +        for (String superInterface : jc.getSuperInterfaces()) {
   1.114 +            out.append("\n  p.$instOf_").append(superInterface.replace('/', '_')).append(" = true;");
   1.115          }
   1.116          out.append("\n  return new ").append(className).append(";");
   1.117          out.append("\n}");
   1.118 @@ -150,25 +139,25 @@
   1.119          }
   1.120          return sb.toString();
   1.121      }
   1.122 -    private void generateStaticMethod(Method m, List<String> toInitilize) throws IOException {
   1.123 +    private void generateStaticMethod(MethodData m, List<String> toInitilize) throws IOException {
   1.124          if (javaScriptBody(m, true)) {
   1.125              return;
   1.126          }
   1.127 -        final String mn = findMethodName(m);
   1.128 +        int[] argsCnt = { -1 };
   1.129 +        final String mn = findMethodName(m, argsCnt);
   1.130          out.append("\nfunction ").append(
   1.131 -            jc.getName().getInternalName().replace('/', '_')
   1.132 +            className(jc)
   1.133          ).append('_').append(mn);
   1.134          if (mn.equals("classV")) {
   1.135 -            toInitilize.add(jc.getName().getInternalName().replace('/', '_') + '_' + mn);
   1.136 +            toInitilize.add(className(jc) + '_' + mn);
   1.137          }
   1.138          out.append('(');
   1.139          String space = "";
   1.140 -        List<Parameter> args = m.getParameters();
   1.141 -        for (int index = 0, i = 0; i < args.size(); i++) {
   1.142 +        for (int index = 0, i = 0; i < argsCnt[0]; i++) {
   1.143              out.append(space);
   1.144              out.append("arg").append(String.valueOf(index));
   1.145              space = ",";
   1.146 -            final String desc = findDescriptor(args.get(i).getDescriptor());
   1.147 +            final String desc = null;// XXX findDescriptor(args.get(i).getDescriptor());
   1.148              if ("D".equals(desc) || "J".equals(desc)) {
   1.149                  index += 2;
   1.150              } else {
   1.151 @@ -176,42 +165,42 @@
   1.152              }
   1.153          }
   1.154          out.append(") {").append("\n");
   1.155 -        final Code code = m.getCode();
   1.156 +        final byte[] code = m.getCode();
   1.157          if (code != null) {
   1.158 -            int len = code.getMaxLocals();
   1.159 -            for (int index = args.size(), i = args.size(); i < len; i++) {
   1.160 +            int len = m.getMaxLocals();
   1.161 +            for (int index = argsCnt[0], i = argsCnt[0]; i < len; i++) {
   1.162                  out.append("  var ");
   1.163                  out.append("arg").append(String.valueOf(i)).append(";\n");
   1.164              }
   1.165              out.append("  var stack = new Array();\n");
   1.166 -            produceCode(code.getByteCodes());
   1.167 +            produceCode(code);
   1.168          } else {
   1.169 -            out.append("  /* no code found for ").append(m.getTypeSignature()).append(" */\n");
   1.170 +            out.append("  /* no code found for ").append(m.getInternalSig()).append(" */\n");
   1.171          }
   1.172          out.append("}");
   1.173      }
   1.174      
   1.175 -    private void generateMethodReference(String prefix, Method m) throws IOException {
   1.176 -        final String name = findMethodName(m);
   1.177 +    private void generateMethodReference(String prefix, MethodData m) throws IOException {
   1.178 +        final String name = findMethodName(m, null);
   1.179          out.append(prefix).append(name).append(" = ")
   1.180 -           .append(jc.getName().getInternalName().replace('/', '_'))
   1.181 +           .append(className(jc))
   1.182             .append('_').append(name).append(";");
   1.183      }
   1.184      
   1.185 -    private void generateInstanceMethod(Method m) throws IOException {
   1.186 +    private void generateInstanceMethod(MethodData m) throws IOException {
   1.187          if (javaScriptBody(m, false)) {
   1.188              return;
   1.189          }
   1.190 +        int[] argsCnt = { -1 };
   1.191          out.append("\nfunction ").append(
   1.192 -            jc.getName().getInternalName().replace('/', '_')
   1.193 -        ).append('_').append(findMethodName(m));
   1.194 +            className(jc)
   1.195 +        ).append('_').append(findMethodName(m, argsCnt));
   1.196          out.append("(arg0");
   1.197          String space = ",";
   1.198 -        List<Parameter> args = m.getParameters();
   1.199 -        for (int index = 1, i = 0; i < args.size(); i++) {
   1.200 +        for (int index = 1, i = 0; i < argsCnt[0]; i++) {
   1.201              out.append(space);
   1.202              out.append("arg").append(String.valueOf(index));
   1.203 -            final String desc = findDescriptor(args.get(i).getDescriptor());
   1.204 +            final String desc = null;// XXX findDescriptor(args.get(i).getDescriptor());
   1.205              if ("D".equals(desc) || "J".equals(desc)) {
   1.206                  index += 2;
   1.207              } else {
   1.208 @@ -219,17 +208,17 @@
   1.209              }
   1.210          }
   1.211          out.append(") {").append("\n");
   1.212 -        final Code code = m.getCode();
   1.213 +        final byte[] code = m.getCode();
   1.214          if (code != null) {
   1.215 -            int len = code.getMaxLocals();
   1.216 -            for (int index = args.size(), i = args.size(); i < len; i++) {
   1.217 +            int len = m.getMaxLocals();
   1.218 +            for (int index = argsCnt[0], i = argsCnt[0]; i < len; i++) {
   1.219                  out.append("  var ");
   1.220                  out.append("arg").append(String.valueOf(i + 1)).append(";\n");
   1.221              }
   1.222              out.append(";\n  var stack = new Array();\n");
   1.223 -            produceCode(code.getByteCodes());
   1.224 +            produceCode(code);
   1.225          } else {
   1.226 -            out.append("  /* no code found for ").append(m.getTypeSignature()).append(" */\n");
   1.227 +            out.append("  /* no code found for ").append(m.getInternalSig()).append(" */\n");
   1.228          }
   1.229          out.append("}");
   1.230      }
   1.231 @@ -241,137 +230,137 @@
   1.232              out.append("    case " + i).append(": ");
   1.233              final int c = readByte(byteCodes, i);
   1.234              switch (c) {
   1.235 -                case bc_aload_0:
   1.236 -                case bc_iload_0:
   1.237 -                case bc_lload_0:
   1.238 -                case bc_fload_0:
   1.239 -                case bc_dload_0:
   1.240 +                case opc_aload_0:
   1.241 +                case opc_iload_0:
   1.242 +                case opc_lload_0:
   1.243 +                case opc_fload_0:
   1.244 +                case opc_dload_0:
   1.245                      out.append("stack.push(arg0);");
   1.246                      break;
   1.247 -                case bc_aload_1:
   1.248 -                case bc_iload_1:
   1.249 -                case bc_lload_1:
   1.250 -                case bc_fload_1:
   1.251 -                case bc_dload_1:
   1.252 +                case opc_aload_1:
   1.253 +                case opc_iload_1:
   1.254 +                case opc_lload_1:
   1.255 +                case opc_fload_1:
   1.256 +                case opc_dload_1:
   1.257                      out.append("stack.push(arg1);");
   1.258                      break;
   1.259 -                case bc_aload_2:
   1.260 -                case bc_iload_2:
   1.261 -                case bc_lload_2:
   1.262 -                case bc_fload_2:
   1.263 -                case bc_dload_2:
   1.264 +                case opc_aload_2:
   1.265 +                case opc_iload_2:
   1.266 +                case opc_lload_2:
   1.267 +                case opc_fload_2:
   1.268 +                case opc_dload_2:
   1.269                      out.append("stack.push(arg2);");
   1.270                      break;
   1.271 -                case bc_aload_3:
   1.272 -                case bc_iload_3:
   1.273 -                case bc_lload_3:
   1.274 -                case bc_fload_3:
   1.275 -                case bc_dload_3:
   1.276 +                case opc_aload_3:
   1.277 +                case opc_iload_3:
   1.278 +                case opc_lload_3:
   1.279 +                case opc_fload_3:
   1.280 +                case opc_dload_3:
   1.281                      out.append("stack.push(arg3);");
   1.282                      break;
   1.283 -                case bc_iload:
   1.284 -                case bc_lload:
   1.285 -                case bc_fload:
   1.286 -                case bc_dload:
   1.287 -                case bc_aload: {
   1.288 +                case opc_iload:
   1.289 +                case opc_lload:
   1.290 +                case opc_fload:
   1.291 +                case opc_dload:
   1.292 +                case opc_aload: {
   1.293                      final int indx = readByte(byteCodes, ++i);
   1.294                      out.append("stack.push(arg").append(indx + ");");
   1.295                      break;
   1.296                  }
   1.297 -                case bc_istore:
   1.298 -                case bc_lstore:
   1.299 -                case bc_fstore:
   1.300 -                case bc_dstore:
   1.301 -                case bc_astore: {
   1.302 +                case opc_istore:
   1.303 +                case opc_lstore:
   1.304 +                case opc_fstore:
   1.305 +                case opc_dstore:
   1.306 +                case opc_astore: {
   1.307                      final int indx = readByte(byteCodes, ++i);
   1.308 -                    out.append("arg" + indx).append(" = stack.pop()");
   1.309 +                    out.append("arg" + indx).append(" = stack.pop();");
   1.310                      break;
   1.311                  }
   1.312 -                case bc_astore_0:
   1.313 -                case bc_istore_0:
   1.314 -                case bc_lstore_0:
   1.315 -                case bc_fstore_0:
   1.316 -                case bc_dstore_0:
   1.317 +                case opc_astore_0:
   1.318 +                case opc_istore_0:
   1.319 +                case opc_lstore_0:
   1.320 +                case opc_fstore_0:
   1.321 +                case opc_dstore_0:
   1.322                      out.append("arg0 = stack.pop();");
   1.323                      break;
   1.324 -                case bc_astore_1:
   1.325 -                case bc_istore_1:
   1.326 -                case bc_lstore_1:
   1.327 -                case bc_fstore_1:
   1.328 -                case bc_dstore_1:
   1.329 +                case opc_astore_1:
   1.330 +                case opc_istore_1:
   1.331 +                case opc_lstore_1:
   1.332 +                case opc_fstore_1:
   1.333 +                case opc_dstore_1:
   1.334                      out.append("arg1 = stack.pop();");
   1.335                      break;
   1.336 -                case bc_astore_2:
   1.337 -                case bc_istore_2:
   1.338 -                case bc_lstore_2:
   1.339 -                case bc_fstore_2:
   1.340 -                case bc_dstore_2:
   1.341 +                case opc_astore_2:
   1.342 +                case opc_istore_2:
   1.343 +                case opc_lstore_2:
   1.344 +                case opc_fstore_2:
   1.345 +                case opc_dstore_2:
   1.346                      out.append("arg2 = stack.pop();");
   1.347                      break;
   1.348 -                case bc_astore_3:
   1.349 -                case bc_istore_3:
   1.350 -                case bc_lstore_3:
   1.351 -                case bc_fstore_3:
   1.352 -                case bc_dstore_3:
   1.353 +                case opc_astore_3:
   1.354 +                case opc_istore_3:
   1.355 +                case opc_lstore_3:
   1.356 +                case opc_fstore_3:
   1.357 +                case opc_dstore_3:
   1.358                      out.append("arg3 = stack.pop();");
   1.359                      break;
   1.360 -                case bc_iadd:
   1.361 -                case bc_ladd:
   1.362 -                case bc_fadd:
   1.363 -                case bc_dadd:
   1.364 +                case opc_iadd:
   1.365 +                case opc_ladd:
   1.366 +                case opc_fadd:
   1.367 +                case opc_dadd:
   1.368                      out.append("stack.push(stack.pop() + stack.pop());");
   1.369                      break;
   1.370 -                case bc_isub:
   1.371 -                case bc_lsub:
   1.372 -                case bc_fsub:
   1.373 -                case bc_dsub:
   1.374 +                case opc_isub:
   1.375 +                case opc_lsub:
   1.376 +                case opc_fsub:
   1.377 +                case opc_dsub:
   1.378                      out.append("{ var tmp = stack.pop(); stack.push(stack.pop() - tmp); }");
   1.379                      break;
   1.380 -                case bc_imul:
   1.381 -                case bc_lmul:
   1.382 -                case bc_fmul:
   1.383 -                case bc_dmul:
   1.384 +                case opc_imul:
   1.385 +                case opc_lmul:
   1.386 +                case opc_fmul:
   1.387 +                case opc_dmul:
   1.388                      out.append("stack.push(stack.pop() * stack.pop());");
   1.389                      break;
   1.390 -                case bc_idiv:
   1.391 -                case bc_ldiv:
   1.392 +                case opc_idiv:
   1.393 +                case opc_ldiv:
   1.394                      out.append("{ var tmp = stack.pop(); stack.push(Math.floor(stack.pop() / tmp)); }");
   1.395                      break;
   1.396 -                case bc_fdiv:
   1.397 -                case bc_ddiv:
   1.398 +                case opc_fdiv:
   1.399 +                case opc_ddiv:
   1.400                      out.append("{ var tmp = stack.pop(); stack.push(stack.pop() / tmp); }");
   1.401                      break;
   1.402 -                case bc_iand:
   1.403 -                case bc_land:
   1.404 +                case opc_iand:
   1.405 +                case opc_land:
   1.406                      out.append("stack.push(stack.pop() & stack.pop());");
   1.407                      break;
   1.408 -                case bc_ior:
   1.409 -                case bc_lor:
   1.410 +                case opc_ior:
   1.411 +                case opc_lor:
   1.412                      out.append("stack.push(stack.pop() | stack.pop());");
   1.413                      break;
   1.414 -                case bc_ixor:
   1.415 -                case bc_lxor:
   1.416 +                case opc_ixor:
   1.417 +                case opc_lxor:
   1.418                      out.append("stack.push(stack.pop() ^ stack.pop());");
   1.419                      break;
   1.420 -                case bc_ineg:
   1.421 -                case bc_lneg:
   1.422 -                case bc_fneg:
   1.423 -                case bc_dneg:
   1.424 +                case opc_ineg:
   1.425 +                case opc_lneg:
   1.426 +                case opc_fneg:
   1.427 +                case opc_dneg:
   1.428                      out.append("stack.push(- stack.pop());");
   1.429                      break;
   1.430 -                case bc_ishl:
   1.431 -                case bc_lshl:
   1.432 +                case opc_ishl:
   1.433 +                case opc_lshl:
   1.434                      out.append("{ var v = stack.pop(); stack.push(stack.pop() << v); }");
   1.435                      break;
   1.436 -                case bc_ishr:
   1.437 -                case bc_lshr:
   1.438 +                case opc_ishr:
   1.439 +                case opc_lshr:
   1.440                      out.append("{ var v = stack.pop(); stack.push(stack.pop() >> v); }");
   1.441                      break;
   1.442 -                case bc_iushr:
   1.443 -                case bc_lushr:
   1.444 +                case opc_iushr:
   1.445 +                case opc_lushr:
   1.446                      out.append("{ var v = stack.pop(); stack.push(stack.pop() >>> v); }");
   1.447                      break;
   1.448 -                case bc_iinc: {
   1.449 +                case opc_iinc: {
   1.450                      final int varIndx = readByte(byteCodes, ++i);
   1.451                      final int incrBy = byteCodes[++i];
   1.452                      if (incrBy == 1) {
   1.453 @@ -381,181 +370,179 @@
   1.454                      }
   1.455                      break;
   1.456                  }
   1.457 -                case bc_return:
   1.458 +                case opc_return:
   1.459                      out.append("return;");
   1.460                      break;
   1.461 -                case bc_ireturn:
   1.462 -                case bc_lreturn:
   1.463 -                case bc_freturn:
   1.464 -                case bc_dreturn:
   1.465 -                case bc_areturn:
   1.466 +                case opc_ireturn:
   1.467 +                case opc_lreturn:
   1.468 +                case opc_freturn:
   1.469 +                case opc_dreturn:
   1.470 +                case opc_areturn:
   1.471                      out.append("return stack.pop();");
   1.472                      break;
   1.473 -                case bc_i2l:
   1.474 -                case bc_i2f:
   1.475 -                case bc_i2d:
   1.476 -                case bc_l2i:
   1.477 +                case opc_i2l:
   1.478 +                case opc_i2f:
   1.479 +                case opc_i2d:
   1.480 +                case opc_l2i:
   1.481                      // max int check?
   1.482 -                case bc_l2f:
   1.483 -                case bc_l2d:
   1.484 -                case bc_f2d:
   1.485 -                case bc_d2f:
   1.486 +                case opc_l2f:
   1.487 +                case opc_l2d:
   1.488 +                case opc_f2d:
   1.489 +                case opc_d2f:
   1.490                      out.append("/* number conversion */");
   1.491                      break;
   1.492 -                case bc_f2i:
   1.493 -                case bc_f2l:
   1.494 -                case bc_d2i:
   1.495 -                case bc_d2l:
   1.496 +                case opc_f2i:
   1.497 +                case opc_f2l:
   1.498 +                case opc_d2i:
   1.499 +                case opc_d2l:
   1.500                      out.append("stack.push(Math.floor(stack.pop()));");
   1.501                      break;
   1.502 -                case bc_i2b:
   1.503 -                case bc_i2c:
   1.504 -                case bc_i2s:
   1.505 +                case opc_i2b:
   1.506 +                case opc_i2c:
   1.507 +                case opc_i2s:
   1.508                      out.append("/* number conversion */");
   1.509                      break;
   1.510 -                case bc_aconst_null:
   1.511 +                case opc_aconst_null:
   1.512                      out.append("stack.push(null);");
   1.513                      break;
   1.514 -                case bc_iconst_m1:
   1.515 +                case opc_iconst_m1:
   1.516                      out.append("stack.push(-1);");
   1.517                      break;
   1.518 -                case bc_iconst_0:
   1.519 -                case bc_dconst_0:
   1.520 -                case bc_lconst_0:
   1.521 -                case bc_fconst_0:
   1.522 +                case opc_iconst_0:
   1.523 +                case opc_dconst_0:
   1.524 +                case opc_lconst_0:
   1.525 +                case opc_fconst_0:
   1.526                      out.append("stack.push(0);");
   1.527                      break;
   1.528 -                case bc_iconst_1:
   1.529 -                case bc_lconst_1:
   1.530 -                case bc_fconst_1:
   1.531 -                case bc_dconst_1:
   1.532 +                case opc_iconst_1:
   1.533 +                case opc_lconst_1:
   1.534 +                case opc_fconst_1:
   1.535 +                case opc_dconst_1:
   1.536                      out.append("stack.push(1);");
   1.537                      break;
   1.538 -                case bc_iconst_2:
   1.539 -                case bc_fconst_2:
   1.540 +                case opc_iconst_2:
   1.541 +                case opc_fconst_2:
   1.542                      out.append("stack.push(2);");
   1.543                      break;
   1.544 -                case bc_iconst_3:
   1.545 +                case opc_iconst_3:
   1.546                      out.append("stack.push(3);");
   1.547                      break;
   1.548 -                case bc_iconst_4:
   1.549 +                case opc_iconst_4:
   1.550                      out.append("stack.push(4);");
   1.551                      break;
   1.552 -                case bc_iconst_5:
   1.553 +                case opc_iconst_5:
   1.554                      out.append("stack.push(5);");
   1.555                      break;
   1.556 -                case bc_ldc: {
   1.557 +                case opc_ldc: {
   1.558                      int indx = readByte(byteCodes, ++i);
   1.559 -                    CPEntry entry = jc.getConstantPool().get(indx);
   1.560 -                    String v = encodeConstant(entry);
   1.561 +                    String v = encodeConstant(indx);
   1.562                      out.append("stack.push(").append(v).append(");");
   1.563                      break;
   1.564                  }
   1.565 -                case bc_ldc_w:
   1.566 -                case bc_ldc2_w: {
   1.567 +                case opc_ldc_w:
   1.568 +                case opc_ldc2_w: {
   1.569                      int indx = readIntArg(byteCodes, i);
   1.570 -                    CPEntry entry = jc.getConstantPool().get(indx);
   1.571                      i += 2;
   1.572 -                    String v = encodeConstant(entry);
   1.573 +                    String v = encodeConstant(indx);
   1.574                      out.append("stack.push(").append(v).append(");");
   1.575                      break;
   1.576                  }
   1.577 -                case bc_lcmp:
   1.578 -                case bc_fcmpl:
   1.579 -                case bc_fcmpg:
   1.580 -                case bc_dcmpl:
   1.581 -                case bc_dcmpg: {
   1.582 +                case opc_lcmp:
   1.583 +                case opc_fcmpl:
   1.584 +                case opc_fcmpg:
   1.585 +                case opc_dcmpl:
   1.586 +                case opc_dcmpg: {
   1.587                      out.append("{ var delta = stack.pop() - stack.pop(); stack.push(delta < 0 ?-1 : (delta == 0 ? 0 : 1)); }");
   1.588                      break;
   1.589                  }
   1.590 -                case bc_if_acmpeq:
   1.591 +                case opc_if_acmpeq:
   1.592                      i = generateIf(byteCodes, i, "===");
   1.593                      break;
   1.594 -                case bc_if_acmpne:
   1.595 +                case opc_if_acmpne:
   1.596                      i = generateIf(byteCodes, i, "!=");
   1.597                      break;
   1.598 -                case bc_if_icmpeq: {
   1.599 +                case opc_if_icmpeq: {
   1.600                      i = generateIf(byteCodes, i, "==");
   1.601                      break;
   1.602                  }
   1.603 -                case bc_ifeq: {
   1.604 +                case opc_ifeq: {
   1.605                      int indx = i + readIntArg(byteCodes, i);
   1.606                      out.append("if (stack.pop() == 0) { gt = " + indx);
   1.607                      out.append("; continue; }");
   1.608                      i += 2;
   1.609                      break;
   1.610                  }
   1.611 -                case bc_ifne: {
   1.612 +                case opc_ifne: {
   1.613                      int indx = i + readIntArg(byteCodes, i);
   1.614                      out.append("if (stack.pop() != 0) { gt = " + indx);
   1.615                      out.append("; continue; }");
   1.616                      i += 2;
   1.617                      break;
   1.618                  }
   1.619 -                case bc_iflt: {
   1.620 +                case opc_iflt: {
   1.621                      int indx = i + readIntArg(byteCodes, i);
   1.622                      out.append("if (stack.pop() < 0) { gt = " + indx);
   1.623                      out.append("; continue; }");
   1.624                      i += 2;
   1.625                      break;
   1.626                  }
   1.627 -                case bc_ifle: {
   1.628 +                case opc_ifle: {
   1.629                      int indx = i + readIntArg(byteCodes, i);
   1.630                      out.append("if (stack.pop() <= 0) { gt = " + indx);
   1.631                      out.append("; continue; }");
   1.632                      i += 2;
   1.633                      break;
   1.634                  }
   1.635 -                case bc_ifgt: {
   1.636 +                case opc_ifgt: {
   1.637                      int indx = i + readIntArg(byteCodes, i);
   1.638                      out.append("if (stack.pop() > 0) { gt = " + indx);
   1.639                      out.append("; continue; }");
   1.640                      i += 2;
   1.641                      break;
   1.642                  }
   1.643 -                case bc_ifge: {
   1.644 +                case opc_ifge: {
   1.645                      int indx = i + readIntArg(byteCodes, i);
   1.646                      out.append("if (stack.pop() >= 0) { gt = " + indx);
   1.647                      out.append("; continue; }");
   1.648                      i += 2;
   1.649                      break;
   1.650                  }
   1.651 -                case bc_ifnonnull: {
   1.652 +                case opc_ifnonnull: {
   1.653                      int indx = i + readIntArg(byteCodes, i);
   1.654                      out.append("if (stack.pop()) { gt = " + indx);
   1.655                      out.append("; continue; }");
   1.656                      i += 2;
   1.657                      break;
   1.658                  }
   1.659 -                case bc_ifnull: {
   1.660 +                case opc_ifnull: {
   1.661                      int indx = i + readIntArg(byteCodes, i);
   1.662                      out.append("if (!stack.pop()) { gt = " + indx);
   1.663                      out.append("; continue; }");
   1.664                      i += 2;
   1.665                      break;
   1.666                  }
   1.667 -                case bc_if_icmpne:
   1.668 +                case opc_if_icmpne:
   1.669                      i = generateIf(byteCodes, i, "!=");
   1.670                      break;
   1.671 -                case bc_if_icmplt:
   1.672 +                case opc_if_icmplt:
   1.673                      i = generateIf(byteCodes, i, ">");
   1.674                      break;
   1.675 -                case bc_if_icmple:
   1.676 +                case opc_if_icmple:
   1.677                      i = generateIf(byteCodes, i, ">=");
   1.678                      break;
   1.679 -                case bc_if_icmpgt:
   1.680 +                case opc_if_icmpgt:
   1.681                      i = generateIf(byteCodes, i, "<");
   1.682                      break;
   1.683 -                case bc_if_icmpge:
   1.684 +                case opc_if_icmpge:
   1.685                      i = generateIf(byteCodes, i, "<=");
   1.686                      break;
   1.687 -                case bc_goto: {
   1.688 +                case opc_goto: {
   1.689                      int indx = i + readIntArg(byteCodes, i);
   1.690                      out.append("gt = " + indx).append("; continue;");
   1.691                      i += 2;
   1.692                      break;
   1.693                  }
   1.694 -                case bc_lookupswitch: {
   1.695 +                case opc_lookupswitch: {
   1.696                      int table = i / 4 * 4 + 4;
   1.697                      int dflt = i + readInt4(byteCodes, table);
   1.698                      table += 4;
   1.699 @@ -573,7 +560,7 @@
   1.700                      i = table - 1;
   1.701                      break;
   1.702                  }
   1.703 -                case bc_tableswitch: {
   1.704 +                case opc_tableswitch: {
   1.705                      int table = i / 4 * 4 + 4;
   1.706                      int dflt = i + readInt4(byteCodes, table);
   1.707                      table += 4;
   1.708 @@ -592,40 +579,40 @@
   1.709                      i = table - 1;
   1.710                      break;
   1.711                  }
   1.712 -                case bc_invokeinterface: {
   1.713 +                case opc_invokeinterface: {
   1.714                      i = invokeVirtualMethod(byteCodes, i) + 2;
   1.715                      break;
   1.716                  }
   1.717 -                case bc_invokevirtual:
   1.718 +                case opc_invokevirtual:
   1.719                      i = invokeVirtualMethod(byteCodes, i);
   1.720                      break;
   1.721 -                case bc_invokespecial:
   1.722 +                case opc_invokespecial:
   1.723                      i = invokeStaticMethod(byteCodes, i, false);
   1.724                      break;
   1.725 -                case bc_invokestatic:
   1.726 +                case opc_invokestatic:
   1.727                      i = invokeStaticMethod(byteCodes, i, true);
   1.728                      break;
   1.729 -                case bc_new: {
   1.730 +                case opc_new: {
   1.731                      int indx = readIntArg(byteCodes, i);
   1.732 -                    CPClassInfo ci = jc.getConstantPool().getClass(indx);
   1.733 +                    String ci = jc.getClassName(indx);
   1.734                      out.append("stack.push(");
   1.735 -                    out.append("new ").append(ci.getClassName().getInternalName().replace('/','_'));
   1.736 +                    out.append("new ").append(ci.replace('/','_'));
   1.737                      out.append(");");
   1.738 -                    addReference(ci.getClassName().getInternalName());
   1.739 +                    addReference(ci);
   1.740                      i += 2;
   1.741                      break;
   1.742                  }
   1.743 -                case bc_newarray: {
   1.744 +                case opc_newarray: {
   1.745                      int type = byteCodes[i++];
   1.746                      out.append("stack.push(new Array(stack.pop()));");
   1.747                      break;
   1.748                  }
   1.749 -                case bc_anewarray: {
   1.750 +                case opc_anewarray: {
   1.751                      i += 2; // skip type of array
   1.752                      out.append("stack.push(new Array(stack.pop()));");
   1.753                      break;
   1.754                  }
   1.755 -                case bc_multianewarray: {
   1.756 +                case opc_multianewarray: {
   1.757                      i += 2;
   1.758                      int dim = readByte(byteCodes, ++i);
   1.759                      out.append("{ var a0 = new Array(stack.pop());");
   1.760 @@ -645,86 +632,83 @@
   1.761                      out.append("\nstack.push(a0); }");
   1.762                      break;
   1.763                  }
   1.764 -                case bc_arraylength:
   1.765 +                case opc_arraylength:
   1.766                      out.append("stack.push(stack.pop().length);");
   1.767                      break;
   1.768 -                case bc_iastore:
   1.769 -                case bc_lastore:
   1.770 -                case bc_fastore:
   1.771 -                case bc_dastore:
   1.772 -                case bc_aastore:
   1.773 -                case bc_bastore:
   1.774 -                case bc_castore:
   1.775 -                case bc_sastore: {
   1.776 +                case opc_iastore:
   1.777 +                case opc_lastore:
   1.778 +                case opc_fastore:
   1.779 +                case opc_dastore:
   1.780 +                case opc_aastore:
   1.781 +                case opc_bastore:
   1.782 +                case opc_castore:
   1.783 +                case opc_sastore: {
   1.784                      out.append("{ var value = stack.pop(); var indx = stack.pop(); stack.pop()[indx] = value; }");
   1.785                      break;
   1.786                  }
   1.787 -                case bc_iaload:
   1.788 -                case bc_laload:
   1.789 -                case bc_faload:
   1.790 -                case bc_daload:
   1.791 -                case bc_aaload:
   1.792 -                case bc_baload:
   1.793 -                case bc_caload:
   1.794 -                case bc_saload: {
   1.795 +                case opc_iaload:
   1.796 +                case opc_laload:
   1.797 +                case opc_faload:
   1.798 +                case opc_daload:
   1.799 +                case opc_aaload:
   1.800 +                case opc_baload:
   1.801 +                case opc_caload:
   1.802 +                case opc_saload: {
   1.803                      out.append("{ var indx = stack.pop(); stack.push(stack.pop()[indx]); }");
   1.804                      break;
   1.805                  }
   1.806 -                case bc_pop2:
   1.807 +                case opc_pop2:
   1.808                      out.append("stack.pop();");
   1.809 -                case bc_pop:
   1.810 +                case opc_pop:
   1.811                      out.append("stack.pop();");
   1.812                      break;
   1.813 -                case bc_dup:
   1.814 +                case opc_dup:
   1.815                      out.append("stack.push(stack[stack.length - 1]);");
   1.816                      break;
   1.817 -                case bc_bipush:
   1.818 +                case opc_bipush:
   1.819                      out.append("stack.push(" + byteCodes[++i] + ");");
   1.820                      break;
   1.821 -                case bc_sipush:
   1.822 +                case opc_sipush:
   1.823                      out.append("stack.push(" + readIntArg(byteCodes, i) + ");");
   1.824                      i += 2;
   1.825                      break;
   1.826 -                case bc_getfield: {
   1.827 +                case opc_getfield: {
   1.828                      int indx = readIntArg(byteCodes, i);
   1.829 -                    CPFieldInfo fi = (CPFieldInfo) jc.getConstantPool().get(indx);
   1.830 +                    String[] fi = jc.getFieldInfoName(indx);
   1.831                      out.append("stack.push(stack.pop().fld_").
   1.832 -                        append(fi.getFieldName()).append(");");
   1.833 +                        append(fi[1]).append(");");
   1.834                      i += 2;
   1.835                      break;
   1.836                  }
   1.837 -                case bc_getstatic: {
   1.838 +                case opc_getstatic: {
   1.839                      int indx = readIntArg(byteCodes, i);
   1.840 -                    CPFieldInfo fi = (CPFieldInfo) jc.getConstantPool().get(indx);
   1.841 -                    final String in = fi.getClassName().getInternalName();
   1.842 -                    out.append("stack.push(").append(in.replace('/', '_'));
   1.843 -                    out.append('_').append(fi.getFieldName()).append(");");
   1.844 +                    String[] fi = jc.getFieldInfoName(indx);
   1.845 +                    out.append("stack.push(").append(fi[0].replace('/', '_'));
   1.846 +                    out.append('_').append(fi[1]).append(");");
   1.847                      i += 2;
   1.848 -                    addReference(in);
   1.849 +                    addReference(fi[0]);
   1.850                      break;
   1.851                  }
   1.852 -                case bc_putstatic: {
   1.853 +                case opc_putstatic: {
   1.854                      int indx = readIntArg(byteCodes, i);
   1.855 -                    CPFieldInfo fi = (CPFieldInfo) jc.getConstantPool().get(indx);
   1.856 -                    final String in = fi.getClassName().getInternalName();
   1.857 -                    out.append(in.replace('/', '_'));
   1.858 -                    out.append('_').append(fi.getFieldName()).append(" = stack.pop();");
   1.859 +                    String[] fi = jc.getFieldInfoName(indx);
   1.860 +                    out.append(fi[0].replace('/', '_'));
   1.861 +                    out.append('_').append(fi[1]).append(" = stack.pop();");
   1.862                      i += 2;
   1.863 -                    addReference(in);
   1.864 +                    addReference(fi[0]);
   1.865                      break;
   1.866                  }
   1.867 -                case bc_putfield: {
   1.868 +                case opc_putfield: {
   1.869                      int indx = readIntArg(byteCodes, i);
   1.870 -                    CPFieldInfo fi = (CPFieldInfo) jc.getConstantPool().get(indx);
   1.871 +                    String[] fi = jc.getFieldInfoName(indx);
   1.872                      out.append("{ var v = stack.pop(); stack.pop().fld_")
   1.873 -                       .append(fi.getFieldName()).append(" = v; }");
   1.874 +                       .append(fi[1]).append(" = v; }");
   1.875                      i += 2;
   1.876                      break;
   1.877                  }
   1.878 -                case bc_checkcast: {
   1.879 +                case opc_checkcast: {
   1.880                      int indx = readIntArg(byteCodes, i);
   1.881 -                    CPClassInfo ci = jc.getConstantPool().getClass(indx);
   1.882 -                    final String type = ci.getClassName().getType();
   1.883 +                    final String type = jc.getClassName(indx);
   1.884                      if (!type.startsWith("[")) {
   1.885                          // no way to check arrays right now
   1.886                          out.append("if(stack[stack.length - 1].$instOf_")
   1.887 @@ -734,16 +718,16 @@
   1.888                      i += 2;
   1.889                      break;
   1.890                  }
   1.891 -                case bc_instanceof: {
   1.892 +                case opc_instanceof: {
   1.893                      int indx = readIntArg(byteCodes, i);
   1.894 -                    CPClassInfo ci = jc.getConstantPool().getClass(indx);
   1.895 +                    final String type = jc.getClassName(indx);
   1.896                      out.append("stack.push(stack.pop().$instOf_")
   1.897 -                       .append(ci.getClassName().getInternalName().replace('/', '_'))
   1.898 +                       .append(type.replace('/', '_'))
   1.899                         .append(" ? 1 : 0);");
   1.900                      i += 2;
   1.901                      break;
   1.902                  }
   1.903 -                case bc_athrow: {
   1.904 +                case opc_athrow: {
   1.905                      out.append("{ var t = stack.pop(); stack = new Array(1); stack[0] = t; throw t; }");
   1.906                      break;
   1.907                  }
   1.908 @@ -861,15 +845,14 @@
   1.909          return cnt;
   1.910      }
   1.911  
   1.912 -    private void generateStaticField(Variable v) throws IOException {
   1.913 +    private void generateStaticField(FieldData v) throws IOException {
   1.914          out.append("\nvar ")
   1.915 -           .append(jc.getName().getInternalName().replace('/', '_'))
   1.916 +           .append(className(jc))
   1.917             .append('_').append(v.getName()).append(" = 0;");
   1.918      }
   1.919  
   1.920 -    private String findMethodName(Method m) {
   1.921 +    private String findMethodName(MethodData m, int[] cnt) {
   1.922          StringBuilder name = new StringBuilder();
   1.923 -        String descr = m.getDescriptor();
   1.924          if ("<init>".equals(m.getName())) { // NOI18N
   1.925              name.append("cons"); // NOI18N
   1.926          } else if ("<clinit>".equals(m.getName())) { // NOI18N
   1.927 @@ -879,26 +862,30 @@
   1.928          } 
   1.929          
   1.930          boolean hasReturn[] = { false };
   1.931 -        countArgs(findDescriptor(m.getDescriptor()), hasReturn, name);
   1.932 +        int argsCnt = countArgs(findDescriptor(m.getInternalSig()), hasReturn, name);
   1.933 +        if (cnt != null) {
   1.934 +            cnt[0] = argsCnt;
   1.935 +        }
   1.936          return name.toString();
   1.937      }
   1.938  
   1.939 -    private String findMethodName(CPMethodInfo mi, int[] cnt, boolean[] hasReturn) {
   1.940 +    private String findMethodName(String[] mi, int[] cnt, boolean[] hasReturn) {
   1.941          StringBuilder name = new StringBuilder();
   1.942 -        String descr = mi.getDescriptor();
   1.943 -        if ("<init>".equals(mi.getName())) { // NOI18N
   1.944 +        String descr = mi[2];//mi.getDescriptor();
   1.945 +        String nm= mi[1];
   1.946 +        if ("<init>".equals(nm)) { // NOI18N
   1.947              name.append("cons"); // NOI18N
   1.948          } else {
   1.949 -            name.append(mi.getName());
   1.950 +            name.append(nm);
   1.951          }
   1.952 -        cnt[0] = countArgs(findDescriptor(mi.getDescriptor()), hasReturn, name);
   1.953 +        cnt[0] = countArgs(findDescriptor(descr), hasReturn, name);
   1.954          return name.toString();
   1.955      }
   1.956  
   1.957      private int invokeStaticMethod(byte[] byteCodes, int i, boolean isStatic)
   1.958      throws IOException {
   1.959          int methodIndex = readIntArg(byteCodes, i);
   1.960 -        CPMethodInfo mi = (CPMethodInfo) jc.getConstantPool().get(methodIndex);
   1.961 +        String[] mi = jc.getFieldInfoName(methodIndex);
   1.962          boolean[] hasReturn = { false };
   1.963          int[] cnt = { 0 };
   1.964          String mn = findMethodName(mi, cnt, hasReturn);
   1.965 @@ -910,7 +897,7 @@
   1.966          if (hasReturn[0]) {
   1.967              out.append("stack.push(");
   1.968          }
   1.969 -        final String in = mi.getClassName().getInternalName();
   1.970 +        final String in = mi[0];
   1.971          out.append(in.replace('/', '_'));
   1.972          if (isStatic) {
   1.973              out.append(".prototype.");
   1.974 @@ -941,7 +928,7 @@
   1.975      private int invokeVirtualMethod(byte[] byteCodes, int i)
   1.976      throws IOException {
   1.977          int methodIndex = readIntArg(byteCodes, i);
   1.978 -        CPMethodInfo mi = (CPMethodInfo) jc.getConstantPool().get(methodIndex);
   1.979 +        String[] mi = jc.getFieldInfoName(methodIndex);
   1.980          boolean[] hasReturn = { false };
   1.981          int[] cnt = { 0 };
   1.982          String mn = findMethodName(mi, cnt, hasReturn);
   1.983 @@ -992,29 +979,18 @@
   1.984          }
   1.985      }
   1.986  
   1.987 -    private String encodeConstant(CPEntry entry) {
   1.988 -        final String v;
   1.989 -        if (entry instanceof CPClassInfo) {
   1.990 -            v = "new java_lang_Class";
   1.991 -        } else if (entry instanceof CPStringInfo) {
   1.992 -            v = "\"" + entry.getValue().toString().
   1.993 -                replace("\\", "\\\\").
   1.994 -                replace("\n", "\\n").
   1.995 -                replace("\r", "\\r").
   1.996 -                replace("\t", "\\t").
   1.997 -                replace("\"", "\\\"")
   1.998 -                + "\"";
   1.999 -        } else {
  1.1000 -            v = entry.getValue().toString();
  1.1001 -        }
  1.1002 -        return v;
  1.1003 +    private String encodeConstant(int entryIndex) {
  1.1004 +        String s = jc.stringValue(entryIndex, true);
  1.1005 +        return s;
  1.1006      }
  1.1007  
  1.1008      private String findDescriptor(String d) {
  1.1009          return d.replace('[', 'A');
  1.1010      }
  1.1011  
  1.1012 -    private boolean javaScriptBody(Method m, boolean isStatic) throws IOException {
  1.1013 +    private boolean javaScriptBody(MethodData m, boolean isStatic) throws IOException {
  1.1014 +        return false;
  1.1015 +        /*
  1.1016          final ClassName extraAnn = ClassName.getClassName(JavaScriptBody.class.getName().replace('.', '/'));
  1.1017          Annotation a = m.getAnnotation(extraAnn);
  1.1018          if (a != null) {
  1.1019 @@ -1054,5 +1030,10 @@
  1.1020              return true;
  1.1021          }
  1.1022          return false;
  1.1023 +        */
  1.1024 +    }
  1.1025 +    private static String className(ClassData jc) {
  1.1026 +        //return jc.getName().getInternalName().replace('/', '_');
  1.1027 +        return jc.getClassName().replace('/', '_');
  1.1028      }
  1.1029  }