# HG changeset patch # User Jaroslav Tulach # Date 1404972713 -7200 # Node ID f61e9984adffadd496f509d36cce254b7c0724d1 # Parent 4b09a4b689a49160a48287879104fa8692c5d191 First steps towards parsing invokeDynamic diff -r 4b09a4b689a4 -r f61e9984adff rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeParser.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeParser.java Thu Jun 26 23:54:17 2014 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeParser.java Thu Jul 10 08:11:53 2014 +0200 @@ -28,6 +28,7 @@ import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; +import java.util.Arrays; import org.apidesign.bck2brwsr.core.JavaScriptBody; import org.apidesign.bck2brwsr.core.JavaScriptPrototype; @@ -290,7 +291,7 @@ public static final int opc_invokespecial = 183; public static final int opc_invokestatic = 184; public static final int opc_invokeinterface = 185; -// public static final int opc_xxxunusedxxx = 186; + public static final int opc_invokedynamic = 186; public static final int opc_new = 187; public static final int opc_newarray = 188; public static final int opc_anewarray = 189; @@ -624,6 +625,12 @@ AttrData attr = new AttrData(this); attr.read(name_cpx); attrs[k] = attr; + } else if (getTag(name_cpx) == CONSTANT_UTF8 + && getString(name_cpx).equals("BootstrapMethods")) { + AttrData attr = new AttrData(this); + readBootstrapMethods(in); + attr.read(name_cpx); + attrs[k] = attr; } else { AttrData attr = new AttrData(this); attr.read(name_cpx, in); @@ -633,6 +640,25 @@ in.close(); } // end ClassData.read() + void readBootstrapMethods(DataInputStream in) throws IOException { + int attr_len = in.readInt(); //attr_length + int number = in.readShort(); + for (int i = 0; i < number; i++) { + int ref = in.readShort(); + int len = in.readShort(); + int[] args = new int[len]; + 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(); + } + } + /** * Reads and stores constant pool info. */ @@ -1813,7 +1839,7 @@ stackMap[i] = new StackMapData(in, this); } } - + /** * Return access of the method. */ diff -r 4b09a4b689a4 -r f61e9984adff rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu Jun 26 23:54:17 2014 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu Jul 10 08:11:53 2014 +0200 @@ -1051,6 +1051,13 @@ case opc_invokestatic: i = invokeStaticMethod(byteCodes, i, smapper, true); break; + case opc_invokedynamic: { + int indx = readUShortArg(byteCodes, i); + System.err.println("invoke dynamic: " + indx); + emit(smapper, this, "throw 'Invoke dynamic: ' + @1;", "" + indx); + i += 4; + break; + } case opc_new: { int indx = readUShortArg(byteCodes, i); String ci = jc.getClassName(indx);