# HG changeset patch # User Jaroslav Tulach # Date 1405490242 -7200 # Node ID c178e0bdce5d16555956d5174ad74aad75b3aa3e # Parent 2111057af3b2fad4f49a44b4afceb7cc8cf8c8ee Keeping and printing the information about bootmethods diff -r 2111057af3b2 -r c178e0bdce5d rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeParser.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeParser.java Thu Jul 10 08:17:52 2014 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeParser.java Wed Jul 16 07:57:22 2014 +0200 @@ -499,7 +499,7 @@ */ private static class CPX { - int cpx; + final int cpx; CPX(int cpx) { this.cpx = cpx; @@ -511,9 +511,9 @@ * * @author Sucheta Dambalkar (Adopted code from jdis) */ - private static class CPX2 { + static class CPX2 { - int cpx1, cpx2; + final int cpx1, cpx2; CPX2(int cpx1, int cpx2) { this.cpx1 = cpx1; @@ -542,6 +542,7 @@ private FieldData[] fields; private MethodData[] methods; private InnerClassData[] innerClasses; + private BootMethodData[] bootMethods; private int attributes_count; private AttrData[] attrs; private int source_cpx = 0; @@ -628,7 +629,7 @@ } else if (getTag(name_cpx) == CONSTANT_UTF8 && getString(name_cpx).equals("BootstrapMethods")) { AttrData attr = new AttrData(this); - readBootstrapMethods(in); + bootMethods = readBootstrapMethods(in); attr.read(name_cpx); attrs[k] = attr; } else { @@ -640,9 +641,10 @@ in.close(); } // end ClassData.read() - void readBootstrapMethods(DataInputStream in) throws IOException { - int attr_len = in.readInt(); //attr_length + BootMethodData[] readBootstrapMethods(DataInputStream in) throws IOException { + int attr_len = in.readInt(); //attr_lengt int number = in.readShort(); + BootMethodData[] arr = new BootMethodData[number]; for (int i = 0; i < number; i++) { int ref = in.readShort(); int len = in.readShort(); @@ -650,13 +652,9 @@ for (int j = 0; j < len; j++) { args[j] = in.readShort(); } - - System.err.print("ref: " + ref + " len: " + len + ":"); - for (int j = 0; j < len; j++) { - System.err.print(" " + args[j]); - } - System.err.println(); + arr[i] = new BootMethodData(this, ref, args); } + return arr; } /** @@ -1144,8 +1142,12 @@ case CONSTANT_NAMEANDTYPE: return getName(((CPX2) x).cpx1) + ":" + StringValue(((CPX2) x).cpx2); + case CONSTANT_METHODHANDLE: + return "K" + ((CPX2)x).cpx1 + "@" + stringValue(((CPX2)x).cpx2, textual); + case CONSTANT_METHODTYPE: + return stringValue(((CPX)x).cpx, true); default: - return "UnknownTag"; //TBD + return "UnknownTag" + tag; //TBD } } @@ -1228,6 +1230,10 @@ return null; } } + + public String getBootMethod(int indx) { + return bootMethods != null ? bootMethods[indx].toString() : null; + } /** * Returns total constant pool entry count. @@ -1586,6 +1592,31 @@ return accflags; } } // end InnerClassData + + private static class BootMethodData { + private final ClassData clazz; + private final int method; + private final int[] args; + + private BootMethodData(ClassData clazz, int method, int[] args) { + this.clazz = clazz; + this.method = method; + this.args = args; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(clazz.stringValue(method, true)); + sb.append('('); + for (int indx : args) { + sb.append("\n "); + sb.append(clazz.stringValue(indx, true)); + } + sb.append(')'); + return sb.toString(); + } + } /** * Strores LineNumberTable data information. diff -r 2111057af3b2 -r c178e0bdce5d rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu Jul 10 08:17:52 2014 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Wed Jul 16 07:57:22 2014 +0200 @@ -1054,6 +1054,9 @@ case opc_invokedynamic: { int indx = readUShortArg(byteCodes, i); System.err.println("invoke dynamic: " + indx); + ByteCodeParser.CPX2 c2 = jc.getCpoolEntry(indx); + System.err.println(" bootmethod: " + jc.getBootMethod(c2.cpx1)); + System.err.println(" name and type: " + jc.stringValue(c2.cpx2, true)); emit(smapper, this, "throw 'Invoke dynamic: ' + @1;", "" + indx); i += 4; break;