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 }