# HG changeset patch # User Jaroslav Tulach # Date 1352636632 -3600 # Node ID 40f95fe90cdcc1bc3079c6fe6477f92456432394 # Parent 945817561b9ae3c06aa01255a0a815d0b47c1069 Almost rewritten to javap: @JavaScriptBody and double/long may not yet be supported diff -r 945817561b9a -r 40f95fe90cdc javap/pom.xml --- a/javap/pom.xml Sat Nov 10 20:31:39 2012 +0100 +++ b/javap/pom.xml Sun Nov 11 13:23:52 2012 +0100 @@ -25,8 +25,8 @@ non-existing - 1.7 - 1.7 + 1.6 + 1.6 diff -r 945817561b9a -r 40f95fe90cdc javap/src/main/java/sun/tools/javap/ClassData.java --- a/javap/src/main/java/sun/tools/javap/ClassData.java Sat Nov 10 20:31:39 2012 +0100 +++ b/javap/src/main/java/sun/tools/javap/ClassData.java Sun Nov 11 13:23:52 2012 +0100 @@ -26,7 +26,6 @@ package sun.tools.javap; -import java.util.*; import java.io.*; /** @@ -35,7 +34,7 @@ * * @author Sucheta Dambalkar (Adopted code from jdis) */ -public class ClassData implements RuntimeConstants { +public final class ClassData implements RuntimeConstants { private int magic; private int minor_version; @@ -220,7 +219,11 @@ * get a string */ public String getString(int n) { - return (n == 0) ? null : (String)cpool[n]; + if (n == 0) { + return null; + } else { + return (String)cpool[n]; + } } /** @@ -481,6 +484,9 @@ * Returns string at that index. */ public String StringValue(int cpx) { + return stringValue(cpx, false); + } + public String stringValue(int cpx, boolean textual) { if (cpx==0) return "#0"; int tag; Object x; @@ -512,15 +518,24 @@ case CONSTANT_DOUBLE: { Double d=(Double)x; String sd=d.toString(); + if (textual) { + return sd; + } return sd+"d"; } case CONSTANT_FLOAT: { Float f=(Float)x; String sf=(f).toString(); + if (textual) { + return sf; + } return sf+"f"; } case CONSTANT_LONG: { Long ln = (Long)x; + if (textual) { + return ln.toString(); + } return ln.toString()+'l'; } case CONSTANT_INTEGER: { @@ -528,9 +543,17 @@ return in.toString(); } case CONSTANT_CLASS: + if (textual) { + return "new java_lang_Class"; // XXX temporary JS + } return javaName(getClassName(cpx)); case CONSTANT_STRING: - return StringValue(((CPX)x).cpx); + String sv = StringValue(((CPX)x).cpx); + if (textual) { + return '"' + sv + '"'; + } else { + return sv; + } case CONSTANT_FIELD: case CONSTANT_METHOD: case CONSTANT_INTERFACEMETHOD: @@ -654,4 +677,22 @@ private boolean isJavaIdentifierPart(int cp) { return isJavaIdentifierStart(cp) || ('0' <= cp && cp <= '9'); } + + public String[] getNameAndType(int indx) { + return getNameAndType(indx, 0, new String[2]); + } + + private String[] getNameAndType(int indx, int at, String[] arr) { + CPX2 c2 = getCpoolEntry(indx); + arr[at] = StringValue(c2.cpx1); + arr[at + 1] = StringValue(c2.cpx2); + return arr; + } + + public String[] getFieldInfoName(int indx) { + CPX2 c2 = getCpoolEntry(indx); + String[] arr = new String[3]; + arr[0] = getClassName(c2.cpx1); + return getNameAndType(c2.cpx2, 1, arr); + } } diff -r 945817561b9a -r 40f95fe90cdc javap/src/main/java/sun/tools/javap/FieldData.java --- a/javap/src/main/java/sun/tools/javap/FieldData.java Sat Nov 10 20:31:39 2012 +0100 +++ b/javap/src/main/java/sun/tools/javap/FieldData.java Sun Nov 11 13:23:52 2012 +0100 @@ -95,6 +95,10 @@ } // end read + public boolean isStatic() { + return (access & ACC_STATIC) != 0; + } + /** * Returns access of a field. */ diff -r 945817561b9a -r 40f95fe90cdc javap/src/main/java/sun/tools/javap/Vector.java --- a/javap/src/main/java/sun/tools/javap/Vector.java Sat Nov 10 20:31:39 2012 +0100 +++ b/javap/src/main/java/sun/tools/javap/Vector.java Sun Nov 11 13:23:52 2012 +0100 @@ -22,8 +22,9 @@ addElement(objectType); } void addElement(Object obj) { - setSize(size() + 1); - setElementAt(obj, size()); + final int s = size(); + setSize(s + 1); + setElementAt(obj, s); } int size() { diff -r 945817561b9a -r 40f95fe90cdc vm/pom.xml --- a/vm/pom.xml Sat Nov 10 20:31:39 2012 +0100 +++ b/vm/pom.xml Sun Nov 11 13:23:52 2012 +0100 @@ -59,6 +59,15 @@ + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + @@ -74,11 +83,6 @@ - org.netbeans.api - org-netbeans-modules-classfile - jar - - org.apidesign.bck2brwsr core 1.0-SNAPSHOT @@ -90,5 +94,10 @@ 1.0-SNAPSHOT test + + ${project.groupId} + javap + 1.0-SNAPSHOT + diff -r 945817561b9a -r 40f95fe90cdc vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Nov 10 20:31:39 2012 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Nov 11 13:23:52 2012 +0100 @@ -24,35 +24,22 @@ import java.util.List; import org.apidesign.bck2brwsr.core.ExtraJavaScript; import org.apidesign.bck2brwsr.core.JavaScriptBody; -import org.netbeans.modules.classfile.Annotation; -import org.netbeans.modules.classfile.AnnotationComponent; -import org.netbeans.modules.classfile.ArrayElementValue; -import static org.netbeans.modules.classfile.ByteCodes.*; -import org.netbeans.modules.classfile.CPClassInfo; -import org.netbeans.modules.classfile.CPEntry; -import org.netbeans.modules.classfile.CPFieldInfo; -import org.netbeans.modules.classfile.CPMethodInfo; -import org.netbeans.modules.classfile.CPStringInfo; -import org.netbeans.modules.classfile.ClassFile; -import org.netbeans.modules.classfile.ClassName; -import org.netbeans.modules.classfile.Code; -import org.netbeans.modules.classfile.ElementValue; -import org.netbeans.modules.classfile.Method; -import org.netbeans.modules.classfile.Parameter; -import org.netbeans.modules.classfile.PrimitiveElementValue; -import org.netbeans.modules.classfile.Variable; +import sun.tools.javap.ClassData; +import sun.tools.javap.FieldData; +import sun.tools.javap.MethodData; +import static sun.tools.javap.RuntimeConstants.*; /** Translator of the code inside class files to JavaScript. * * @author Jaroslav Tulach */ public final class ByteCodeToJavaScript { - private final ClassFile jc; + private final ClassData jc; private final Appendable out; private final Collection references; private ByteCodeToJavaScript( - ClassFile jc, Appendable out, Collection references + ClassData jc, Appendable out, Collection references ) { this.jc = jc; this.out = out; @@ -80,7 +67,8 @@ Collection references, Collection scripts ) throws IOException { - ClassFile jc = new ClassFile(classFile, true); + ClassData jc = new ClassData(classFile); + /* final ClassName extraAnn = ClassName.getClassName(ExtraJavaScript.class.getName().replace('.', '/')); Annotation a = jc.getAnnotation(extraAnn); if (a != null) { @@ -92,28 +80,28 @@ return null; } } - + */ ByteCodeToJavaScript compiler = new ByteCodeToJavaScript( jc, out, references ); List toInitilize = new ArrayList(); - for (Method m : jc.getMethods()) { + for (MethodData m : jc.getMethods()) { if (m.isStatic()) { compiler.generateStaticMethod(m, toInitilize); } else { compiler.generateInstanceMethod(m); } } - for (Variable v : jc.getVariables()) { + for (FieldData v : jc.getFields()) { if (v.isStatic()) { compiler.generateStaticField(v); } } - final String className = jc.getName().getInternalName().replace('/', '_'); + final String className = className(jc); out.append("\nfunction ").append(className); out.append("() {"); - for (Variable v : jc.getVariables()) { + for (FieldData v : jc.getFields()) { if (!v.isStatic()) { out.append("\n this.fld_"). append(v.getName()).append(" = 0;"); @@ -124,22 +112,23 @@ append(".prototype.$instOf_").append(className).append(") {"); out.append("\n return new ").append(className).append(";"); out.append("\n }"); - ClassName sc = jc.getSuperClass(); + // ClassName sc = jc.getSuperClass(); + String sc = jc.getSuperClassName(); // with _ if (sc != null) { out.append("\n var p = ").append(className) .append(".prototype = "). - append(sc.getInternalName().replace('/', '_')).append("_proto();"); + append(sc.replace('/', '_')).append("_proto();"); } else { out.append("\n var p = ").append(className).append(".prototype;"); } - for (Method m : jc.getMethods()) { + for (MethodData m : jc.getMethods()) { if (!m.getName().contains("") && !m.getName().contains("")) { compiler.generateMethodReference("\n p.", m); } } out.append("\n p.$instOf_").append(className).append(" = true;"); - for (ClassName superInterface : jc.getInterfaces()) { - out.append("\n p.$instOf_").append(superInterface.getInternalName().replace('/', '_')).append(" = true;"); + for (String superInterface : jc.getSuperInterfaces()) { + out.append("\n p.$instOf_").append(superInterface.replace('/', '_')).append(" = true;"); } out.append("\n return new ").append(className).append(";"); out.append("\n}"); @@ -150,25 +139,25 @@ } return sb.toString(); } - private void generateStaticMethod(Method m, List toInitilize) throws IOException { + private void generateStaticMethod(MethodData m, List toInitilize) throws IOException { if (javaScriptBody(m, true)) { return; } - final String mn = findMethodName(m); + int[] argsCnt = { -1 }; + final String mn = findMethodName(m, argsCnt); out.append("\nfunction ").append( - jc.getName().getInternalName().replace('/', '_') + className(jc) ).append('_').append(mn); if (mn.equals("classV")) { - toInitilize.add(jc.getName().getInternalName().replace('/', '_') + '_' + mn); + toInitilize.add(className(jc) + '_' + mn); } out.append('('); String space = ""; - List args = m.getParameters(); - for (int index = 0, i = 0; i < args.size(); i++) { + for (int index = 0, i = 0; i < argsCnt[0]; i++) { out.append(space); out.append("arg").append(String.valueOf(index)); space = ","; - final String desc = findDescriptor(args.get(i).getDescriptor()); + final String desc = null;// XXX findDescriptor(args.get(i).getDescriptor()); if ("D".equals(desc) || "J".equals(desc)) { index += 2; } else { @@ -176,42 +165,42 @@ } } out.append(") {").append("\n"); - final Code code = m.getCode(); + final byte[] code = m.getCode(); if (code != null) { - int len = code.getMaxLocals(); - for (int index = args.size(), i = args.size(); i < len; i++) { + int len = m.getMaxLocals(); + for (int index = argsCnt[0], i = argsCnt[0]; i < len; i++) { out.append(" var "); out.append("arg").append(String.valueOf(i)).append(";\n"); } out.append(" var stack = new Array();\n"); - produceCode(code.getByteCodes()); + produceCode(code); } else { - out.append(" /* no code found for ").append(m.getTypeSignature()).append(" */\n"); + out.append(" /* no code found for ").append(m.getInternalSig()).append(" */\n"); } out.append("}"); } - private void generateMethodReference(String prefix, Method m) throws IOException { - final String name = findMethodName(m); + private void generateMethodReference(String prefix, MethodData m) throws IOException { + final String name = findMethodName(m, null); out.append(prefix).append(name).append(" = ") - .append(jc.getName().getInternalName().replace('/', '_')) + .append(className(jc)) .append('_').append(name).append(";"); } - private void generateInstanceMethod(Method m) throws IOException { + private void generateInstanceMethod(MethodData m) throws IOException { if (javaScriptBody(m, false)) { return; } + int[] argsCnt = { -1 }; out.append("\nfunction ").append( - jc.getName().getInternalName().replace('/', '_') - ).append('_').append(findMethodName(m)); + className(jc) + ).append('_').append(findMethodName(m, argsCnt)); out.append("(arg0"); String space = ","; - List args = m.getParameters(); - for (int index = 1, i = 0; i < args.size(); i++) { + for (int index = 1, i = 0; i < argsCnt[0]; i++) { out.append(space); out.append("arg").append(String.valueOf(index)); - final String desc = findDescriptor(args.get(i).getDescriptor()); + final String desc = null;// XXX findDescriptor(args.get(i).getDescriptor()); if ("D".equals(desc) || "J".equals(desc)) { index += 2; } else { @@ -219,17 +208,17 @@ } } out.append(") {").append("\n"); - final Code code = m.getCode(); + final byte[] code = m.getCode(); if (code != null) { - int len = code.getMaxLocals(); - for (int index = args.size(), i = args.size(); i < len; i++) { + int len = m.getMaxLocals(); + for (int index = argsCnt[0], i = argsCnt[0]; i < len; i++) { out.append(" var "); out.append("arg").append(String.valueOf(i + 1)).append(";\n"); } out.append(";\n var stack = new Array();\n"); - produceCode(code.getByteCodes()); + produceCode(code); } else { - out.append(" /* no code found for ").append(m.getTypeSignature()).append(" */\n"); + out.append(" /* no code found for ").append(m.getInternalSig()).append(" */\n"); } out.append("}"); } @@ -241,137 +230,137 @@ out.append(" case " + i).append(": "); final int c = readByte(byteCodes, i); switch (c) { - case bc_aload_0: - case bc_iload_0: - case bc_lload_0: - case bc_fload_0: - case bc_dload_0: + case opc_aload_0: + case opc_iload_0: + case opc_lload_0: + case opc_fload_0: + case opc_dload_0: out.append("stack.push(arg0);"); break; - case bc_aload_1: - case bc_iload_1: - case bc_lload_1: - case bc_fload_1: - case bc_dload_1: + case opc_aload_1: + case opc_iload_1: + case opc_lload_1: + case opc_fload_1: + case opc_dload_1: out.append("stack.push(arg1);"); break; - case bc_aload_2: - case bc_iload_2: - case bc_lload_2: - case bc_fload_2: - case bc_dload_2: + case opc_aload_2: + case opc_iload_2: + case opc_lload_2: + case opc_fload_2: + case opc_dload_2: out.append("stack.push(arg2);"); break; - case bc_aload_3: - case bc_iload_3: - case bc_lload_3: - case bc_fload_3: - case bc_dload_3: + case opc_aload_3: + case opc_iload_3: + case opc_lload_3: + case opc_fload_3: + case opc_dload_3: out.append("stack.push(arg3);"); break; - case bc_iload: - case bc_lload: - case bc_fload: - case bc_dload: - case bc_aload: { + case opc_iload: + case opc_lload: + case opc_fload: + case opc_dload: + case opc_aload: { final int indx = readByte(byteCodes, ++i); out.append("stack.push(arg").append(indx + ");"); break; } - case bc_istore: - case bc_lstore: - case bc_fstore: - case bc_dstore: - case bc_astore: { + case opc_istore: + case opc_lstore: + case opc_fstore: + case opc_dstore: + case opc_astore: { final int indx = readByte(byteCodes, ++i); - out.append("arg" + indx).append(" = stack.pop()"); + out.append("arg" + indx).append(" = stack.pop();"); break; } - case bc_astore_0: - case bc_istore_0: - case bc_lstore_0: - case bc_fstore_0: - case bc_dstore_0: + case opc_astore_0: + case opc_istore_0: + case opc_lstore_0: + case opc_fstore_0: + case opc_dstore_0: out.append("arg0 = stack.pop();"); break; - case bc_astore_1: - case bc_istore_1: - case bc_lstore_1: - case bc_fstore_1: - case bc_dstore_1: + case opc_astore_1: + case opc_istore_1: + case opc_lstore_1: + case opc_fstore_1: + case opc_dstore_1: out.append("arg1 = stack.pop();"); break; - case bc_astore_2: - case bc_istore_2: - case bc_lstore_2: - case bc_fstore_2: - case bc_dstore_2: + case opc_astore_2: + case opc_istore_2: + case opc_lstore_2: + case opc_fstore_2: + case opc_dstore_2: out.append("arg2 = stack.pop();"); break; - case bc_astore_3: - case bc_istore_3: - case bc_lstore_3: - case bc_fstore_3: - case bc_dstore_3: + case opc_astore_3: + case opc_istore_3: + case opc_lstore_3: + case opc_fstore_3: + case opc_dstore_3: out.append("arg3 = stack.pop();"); break; - case bc_iadd: - case bc_ladd: - case bc_fadd: - case bc_dadd: + case opc_iadd: + case opc_ladd: + case opc_fadd: + case opc_dadd: out.append("stack.push(stack.pop() + stack.pop());"); break; - case bc_isub: - case bc_lsub: - case bc_fsub: - case bc_dsub: + case opc_isub: + case opc_lsub: + case opc_fsub: + case opc_dsub: out.append("{ var tmp = stack.pop(); stack.push(stack.pop() - tmp); }"); break; - case bc_imul: - case bc_lmul: - case bc_fmul: - case bc_dmul: + case opc_imul: + case opc_lmul: + case opc_fmul: + case opc_dmul: out.append("stack.push(stack.pop() * stack.pop());"); break; - case bc_idiv: - case bc_ldiv: + case opc_idiv: + case opc_ldiv: out.append("{ var tmp = stack.pop(); stack.push(Math.floor(stack.pop() / tmp)); }"); break; - case bc_fdiv: - case bc_ddiv: + case opc_fdiv: + case opc_ddiv: out.append("{ var tmp = stack.pop(); stack.push(stack.pop() / tmp); }"); break; - case bc_iand: - case bc_land: + case opc_iand: + case opc_land: out.append("stack.push(stack.pop() & stack.pop());"); break; - case bc_ior: - case bc_lor: + case opc_ior: + case opc_lor: out.append("stack.push(stack.pop() | stack.pop());"); break; - case bc_ixor: - case bc_lxor: + case opc_ixor: + case opc_lxor: out.append("stack.push(stack.pop() ^ stack.pop());"); break; - case bc_ineg: - case bc_lneg: - case bc_fneg: - case bc_dneg: + case opc_ineg: + case opc_lneg: + case opc_fneg: + case opc_dneg: out.append("stack.push(- stack.pop());"); break; - case bc_ishl: - case bc_lshl: + case opc_ishl: + case opc_lshl: out.append("{ var v = stack.pop(); stack.push(stack.pop() << v); }"); break; - case bc_ishr: - case bc_lshr: + case opc_ishr: + case opc_lshr: out.append("{ var v = stack.pop(); stack.push(stack.pop() >> v); }"); break; - case bc_iushr: - case bc_lushr: + case opc_iushr: + case opc_lushr: out.append("{ var v = stack.pop(); stack.push(stack.pop() >>> v); }"); break; - case bc_iinc: { + case opc_iinc: { final int varIndx = readByte(byteCodes, ++i); final int incrBy = byteCodes[++i]; if (incrBy == 1) { @@ -381,181 +370,179 @@ } break; } - case bc_return: + case opc_return: out.append("return;"); break; - case bc_ireturn: - case bc_lreturn: - case bc_freturn: - case bc_dreturn: - case bc_areturn: + case opc_ireturn: + case opc_lreturn: + case opc_freturn: + case opc_dreturn: + case opc_areturn: out.append("return stack.pop();"); break; - case bc_i2l: - case bc_i2f: - case bc_i2d: - case bc_l2i: + case opc_i2l: + case opc_i2f: + case opc_i2d: + case opc_l2i: // max int check? - case bc_l2f: - case bc_l2d: - case bc_f2d: - case bc_d2f: + case opc_l2f: + case opc_l2d: + case opc_f2d: + case opc_d2f: out.append("/* number conversion */"); break; - case bc_f2i: - case bc_f2l: - case bc_d2i: - case bc_d2l: + case opc_f2i: + case opc_f2l: + case opc_d2i: + case opc_d2l: out.append("stack.push(Math.floor(stack.pop()));"); break; - case bc_i2b: - case bc_i2c: - case bc_i2s: + case opc_i2b: + case opc_i2c: + case opc_i2s: out.append("/* number conversion */"); break; - case bc_aconst_null: + case opc_aconst_null: out.append("stack.push(null);"); break; - case bc_iconst_m1: + case opc_iconst_m1: out.append("stack.push(-1);"); break; - case bc_iconst_0: - case bc_dconst_0: - case bc_lconst_0: - case bc_fconst_0: + case opc_iconst_0: + case opc_dconst_0: + case opc_lconst_0: + case opc_fconst_0: out.append("stack.push(0);"); break; - case bc_iconst_1: - case bc_lconst_1: - case bc_fconst_1: - case bc_dconst_1: + case opc_iconst_1: + case opc_lconst_1: + case opc_fconst_1: + case opc_dconst_1: out.append("stack.push(1);"); break; - case bc_iconst_2: - case bc_fconst_2: + case opc_iconst_2: + case opc_fconst_2: out.append("stack.push(2);"); break; - case bc_iconst_3: + case opc_iconst_3: out.append("stack.push(3);"); break; - case bc_iconst_4: + case opc_iconst_4: out.append("stack.push(4);"); break; - case bc_iconst_5: + case opc_iconst_5: out.append("stack.push(5);"); break; - case bc_ldc: { + case opc_ldc: { int indx = readByte(byteCodes, ++i); - CPEntry entry = jc.getConstantPool().get(indx); - String v = encodeConstant(entry); + String v = encodeConstant(indx); out.append("stack.push(").append(v).append(");"); break; } - case bc_ldc_w: - case bc_ldc2_w: { + case opc_ldc_w: + case opc_ldc2_w: { int indx = readIntArg(byteCodes, i); - CPEntry entry = jc.getConstantPool().get(indx); i += 2; - String v = encodeConstant(entry); + String v = encodeConstant(indx); out.append("stack.push(").append(v).append(");"); break; } - case bc_lcmp: - case bc_fcmpl: - case bc_fcmpg: - case bc_dcmpl: - case bc_dcmpg: { + case opc_lcmp: + case opc_fcmpl: + case opc_fcmpg: + case opc_dcmpl: + case opc_dcmpg: { out.append("{ var delta = stack.pop() - stack.pop(); stack.push(delta < 0 ?-1 : (delta == 0 ? 0 : 1)); }"); break; } - case bc_if_acmpeq: + case opc_if_acmpeq: i = generateIf(byteCodes, i, "==="); break; - case bc_if_acmpne: + case opc_if_acmpne: i = generateIf(byteCodes, i, "!="); break; - case bc_if_icmpeq: { + case opc_if_icmpeq: { i = generateIf(byteCodes, i, "=="); break; } - case bc_ifeq: { + case opc_ifeq: { int indx = i + readIntArg(byteCodes, i); out.append("if (stack.pop() == 0) { gt = " + indx); out.append("; continue; }"); i += 2; break; } - case bc_ifne: { + case opc_ifne: { int indx = i + readIntArg(byteCodes, i); out.append("if (stack.pop() != 0) { gt = " + indx); out.append("; continue; }"); i += 2; break; } - case bc_iflt: { + case opc_iflt: { int indx = i + readIntArg(byteCodes, i); out.append("if (stack.pop() < 0) { gt = " + indx); out.append("; continue; }"); i += 2; break; } - case bc_ifle: { + case opc_ifle: { int indx = i + readIntArg(byteCodes, i); out.append("if (stack.pop() <= 0) { gt = " + indx); out.append("; continue; }"); i += 2; break; } - case bc_ifgt: { + case opc_ifgt: { int indx = i + readIntArg(byteCodes, i); out.append("if (stack.pop() > 0) { gt = " + indx); out.append("; continue; }"); i += 2; break; } - case bc_ifge: { + case opc_ifge: { int indx = i + readIntArg(byteCodes, i); out.append("if (stack.pop() >= 0) { gt = " + indx); out.append("; continue; }"); i += 2; break; } - case bc_ifnonnull: { + case opc_ifnonnull: { int indx = i + readIntArg(byteCodes, i); out.append("if (stack.pop()) { gt = " + indx); out.append("; continue; }"); i += 2; break; } - case bc_ifnull: { + case opc_ifnull: { int indx = i + readIntArg(byteCodes, i); out.append("if (!stack.pop()) { gt = " + indx); out.append("; continue; }"); i += 2; break; } - case bc_if_icmpne: + case opc_if_icmpne: i = generateIf(byteCodes, i, "!="); break; - case bc_if_icmplt: + case opc_if_icmplt: i = generateIf(byteCodes, i, ">"); break; - case bc_if_icmple: + case opc_if_icmple: i = generateIf(byteCodes, i, ">="); break; - case bc_if_icmpgt: + case opc_if_icmpgt: i = generateIf(byteCodes, i, "<"); break; - case bc_if_icmpge: + case opc_if_icmpge: i = generateIf(byteCodes, i, "<="); break; - case bc_goto: { + case opc_goto: { int indx = i + readIntArg(byteCodes, i); out.append("gt = " + indx).append("; continue;"); i += 2; break; } - case bc_lookupswitch: { + case opc_lookupswitch: { int table = i / 4 * 4 + 4; int dflt = i + readInt4(byteCodes, table); table += 4; @@ -573,7 +560,7 @@ i = table - 1; break; } - case bc_tableswitch: { + case opc_tableswitch: { int table = i / 4 * 4 + 4; int dflt = i + readInt4(byteCodes, table); table += 4; @@ -592,40 +579,40 @@ i = table - 1; break; } - case bc_invokeinterface: { + case opc_invokeinterface: { i = invokeVirtualMethod(byteCodes, i) + 2; break; } - case bc_invokevirtual: + case opc_invokevirtual: i = invokeVirtualMethod(byteCodes, i); break; - case bc_invokespecial: + case opc_invokespecial: i = invokeStaticMethod(byteCodes, i, false); break; - case bc_invokestatic: + case opc_invokestatic: i = invokeStaticMethod(byteCodes, i, true); break; - case bc_new: { + case opc_new: { int indx = readIntArg(byteCodes, i); - CPClassInfo ci = jc.getConstantPool().getClass(indx); + String ci = jc.getClassName(indx); out.append("stack.push("); - out.append("new ").append(ci.getClassName().getInternalName().replace('/','_')); + out.append("new ").append(ci.replace('/','_')); out.append(");"); - addReference(ci.getClassName().getInternalName()); + addReference(ci); i += 2; break; } - case bc_newarray: { + case opc_newarray: { int type = byteCodes[i++]; out.append("stack.push(new Array(stack.pop()));"); break; } - case bc_anewarray: { + case opc_anewarray: { i += 2; // skip type of array out.append("stack.push(new Array(stack.pop()));"); break; } - case bc_multianewarray: { + case opc_multianewarray: { i += 2; int dim = readByte(byteCodes, ++i); out.append("{ var a0 = new Array(stack.pop());"); @@ -645,86 +632,83 @@ out.append("\nstack.push(a0); }"); break; } - case bc_arraylength: + case opc_arraylength: out.append("stack.push(stack.pop().length);"); break; - case bc_iastore: - case bc_lastore: - case bc_fastore: - case bc_dastore: - case bc_aastore: - case bc_bastore: - case bc_castore: - case bc_sastore: { + case opc_iastore: + case opc_lastore: + case opc_fastore: + case opc_dastore: + case opc_aastore: + case opc_bastore: + case opc_castore: + case opc_sastore: { out.append("{ var value = stack.pop(); var indx = stack.pop(); stack.pop()[indx] = value; }"); break; } - case bc_iaload: - case bc_laload: - case bc_faload: - case bc_daload: - case bc_aaload: - case bc_baload: - case bc_caload: - case bc_saload: { + case opc_iaload: + case opc_laload: + case opc_faload: + case opc_daload: + case opc_aaload: + case opc_baload: + case opc_caload: + case opc_saload: { out.append("{ var indx = stack.pop(); stack.push(stack.pop()[indx]); }"); break; } - case bc_pop2: + case opc_pop2: out.append("stack.pop();"); - case bc_pop: + case opc_pop: out.append("stack.pop();"); break; - case bc_dup: + case opc_dup: out.append("stack.push(stack[stack.length - 1]);"); break; - case bc_bipush: + case opc_bipush: out.append("stack.push(" + byteCodes[++i] + ");"); break; - case bc_sipush: + case opc_sipush: out.append("stack.push(" + readIntArg(byteCodes, i) + ");"); i += 2; break; - case bc_getfield: { + case opc_getfield: { int indx = readIntArg(byteCodes, i); - CPFieldInfo fi = (CPFieldInfo) jc.getConstantPool().get(indx); + String[] fi = jc.getFieldInfoName(indx); out.append("stack.push(stack.pop().fld_"). - append(fi.getFieldName()).append(");"); + append(fi[1]).append(");"); i += 2; break; } - case bc_getstatic: { + case opc_getstatic: { int indx = readIntArg(byteCodes, i); - CPFieldInfo fi = (CPFieldInfo) jc.getConstantPool().get(indx); - final String in = fi.getClassName().getInternalName(); - out.append("stack.push(").append(in.replace('/', '_')); - out.append('_').append(fi.getFieldName()).append(");"); + String[] fi = jc.getFieldInfoName(indx); + out.append("stack.push(").append(fi[0].replace('/', '_')); + out.append('_').append(fi[1]).append(");"); i += 2; - addReference(in); + addReference(fi[0]); break; } - case bc_putstatic: { + case opc_putstatic: { int indx = readIntArg(byteCodes, i); - CPFieldInfo fi = (CPFieldInfo) jc.getConstantPool().get(indx); - final String in = fi.getClassName().getInternalName(); - out.append(in.replace('/', '_')); - out.append('_').append(fi.getFieldName()).append(" = stack.pop();"); + String[] fi = jc.getFieldInfoName(indx); + out.append(fi[0].replace('/', '_')); + out.append('_').append(fi[1]).append(" = stack.pop();"); i += 2; - addReference(in); + addReference(fi[0]); break; } - case bc_putfield: { + case opc_putfield: { int indx = readIntArg(byteCodes, i); - CPFieldInfo fi = (CPFieldInfo) jc.getConstantPool().get(indx); + String[] fi = jc.getFieldInfoName(indx); out.append("{ var v = stack.pop(); stack.pop().fld_") - .append(fi.getFieldName()).append(" = v; }"); + .append(fi[1]).append(" = v; }"); i += 2; break; } - case bc_checkcast: { + case opc_checkcast: { int indx = readIntArg(byteCodes, i); - CPClassInfo ci = jc.getConstantPool().getClass(indx); - final String type = ci.getClassName().getType(); + final String type = jc.getClassName(indx); if (!type.startsWith("[")) { // no way to check arrays right now out.append("if(stack[stack.length - 1].$instOf_") @@ -734,16 +718,16 @@ i += 2; break; } - case bc_instanceof: { + case opc_instanceof: { int indx = readIntArg(byteCodes, i); - CPClassInfo ci = jc.getConstantPool().getClass(indx); + final String type = jc.getClassName(indx); out.append("stack.push(stack.pop().$instOf_") - .append(ci.getClassName().getInternalName().replace('/', '_')) + .append(type.replace('/', '_')) .append(" ? 1 : 0);"); i += 2; break; } - case bc_athrow: { + case opc_athrow: { out.append("{ var t = stack.pop(); stack = new Array(1); stack[0] = t; throw t; }"); break; } @@ -861,15 +845,14 @@ return cnt; } - private void generateStaticField(Variable v) throws IOException { + private void generateStaticField(FieldData v) throws IOException { out.append("\nvar ") - .append(jc.getName().getInternalName().replace('/', '_')) + .append(className(jc)) .append('_').append(v.getName()).append(" = 0;"); } - private String findMethodName(Method m) { + private String findMethodName(MethodData m, int[] cnt) { StringBuilder name = new StringBuilder(); - String descr = m.getDescriptor(); if ("".equals(m.getName())) { // NOI18N name.append("cons"); // NOI18N } else if ("".equals(m.getName())) { // NOI18N @@ -879,26 +862,30 @@ } boolean hasReturn[] = { false }; - countArgs(findDescriptor(m.getDescriptor()), hasReturn, name); + int argsCnt = countArgs(findDescriptor(m.getInternalSig()), hasReturn, name); + if (cnt != null) { + cnt[0] = argsCnt; + } return name.toString(); } - private String findMethodName(CPMethodInfo mi, int[] cnt, boolean[] hasReturn) { + private String findMethodName(String[] mi, int[] cnt, boolean[] hasReturn) { StringBuilder name = new StringBuilder(); - String descr = mi.getDescriptor(); - if ("".equals(mi.getName())) { // NOI18N + String descr = mi[2];//mi.getDescriptor(); + String nm= mi[1]; + if ("".equals(nm)) { // NOI18N name.append("cons"); // NOI18N } else { - name.append(mi.getName()); + name.append(nm); } - cnt[0] = countArgs(findDescriptor(mi.getDescriptor()), hasReturn, name); + cnt[0] = countArgs(findDescriptor(descr), hasReturn, name); return name.toString(); } private int invokeStaticMethod(byte[] byteCodes, int i, boolean isStatic) throws IOException { int methodIndex = readIntArg(byteCodes, i); - CPMethodInfo mi = (CPMethodInfo) jc.getConstantPool().get(methodIndex); + String[] mi = jc.getFieldInfoName(methodIndex); boolean[] hasReturn = { false }; int[] cnt = { 0 }; String mn = findMethodName(mi, cnt, hasReturn); @@ -910,7 +897,7 @@ if (hasReturn[0]) { out.append("stack.push("); } - final String in = mi.getClassName().getInternalName(); + final String in = mi[0]; out.append(in.replace('/', '_')); if (isStatic) { out.append(".prototype."); @@ -941,7 +928,7 @@ private int invokeVirtualMethod(byte[] byteCodes, int i) throws IOException { int methodIndex = readIntArg(byteCodes, i); - CPMethodInfo mi = (CPMethodInfo) jc.getConstantPool().get(methodIndex); + String[] mi = jc.getFieldInfoName(methodIndex); boolean[] hasReturn = { false }; int[] cnt = { 0 }; String mn = findMethodName(mi, cnt, hasReturn); @@ -992,29 +979,18 @@ } } - private String encodeConstant(CPEntry entry) { - final String v; - if (entry instanceof CPClassInfo) { - v = "new java_lang_Class"; - } else if (entry instanceof CPStringInfo) { - v = "\"" + entry.getValue().toString(). - replace("\\", "\\\\"). - replace("\n", "\\n"). - replace("\r", "\\r"). - replace("\t", "\\t"). - replace("\"", "\\\"") - + "\""; - } else { - v = entry.getValue().toString(); - } - return v; + private String encodeConstant(int entryIndex) { + String s = jc.stringValue(entryIndex, true); + return s; } private String findDescriptor(String d) { return d.replace('[', 'A'); } - private boolean javaScriptBody(Method m, boolean isStatic) throws IOException { + private boolean javaScriptBody(MethodData m, boolean isStatic) throws IOException { + return false; + /* final ClassName extraAnn = ClassName.getClassName(JavaScriptBody.class.getName().replace('.', '/')); Annotation a = m.getAnnotation(extraAnn); if (a != null) { @@ -1054,5 +1030,10 @@ return true; } return false; + */ + } + private static String className(ClassData jc) { + //return jc.getName().getInternalName().replace('/', '_'); + return jc.getClassName().replace('/', '_'); } } diff -r 945817561b9a -r 40f95fe90cdc vm/src/main/java/org/apidesign/vm4brwsr/GenJS.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/GenJS.java Sat Nov 10 20:31:39 2012 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/GenJS.java Sun Nov 11 13:23:52 2012 +0100 @@ -86,7 +86,7 @@ if (out instanceof CharSequence) { CharSequence seq = (CharSequence)out; int lastBlock = seq.length(); - while (lastBlock-- >= 0) { + while (lastBlock-- > 0) { if (seq.charAt(lastBlock) == '{') { break; }