Merge "dx: Add support for invoke-custom"
diff --git a/dx/src/com/android/dx/Version.java b/dx/src/com/android/dx/Version.java
index 88225e6..02d8364 100644
--- a/dx/src/com/android/dx/Version.java
+++ b/dx/src/com/android/dx/Version.java
@@ -21,5 +21,5 @@
  */
 public class Version {
     /** {@code non-null;} version string */
-    public static final String VERSION = "1.13";
+    public static final String VERSION = "1.14";
 }
diff --git a/dx/src/com/android/dx/cf/attrib/AttBootstrapMethods.java b/dx/src/com/android/dx/cf/attrib/AttBootstrapMethods.java
new file mode 100644
index 0000000..acb2f54
--- /dev/null
+++ b/dx/src/com/android/dx/cf/attrib/AttBootstrapMethods.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dx.cf.attrib;
+
+import com.android.dx.cf.code.BootstrapMethodsList;
+
+/**
+ * Attribute class for standard {@code AttBootstrapMethods} attributes.
+ */
+public class AttBootstrapMethods extends BaseAttribute {
+    /** {@code non-null;} attribute name for attributes of this type */
+    public static final String ATTRIBUTE_NAME = "BootstrapMethods";
+
+    private static final int ATTRIBUTE_HEADER_BYTES = 8;
+    private static final int BOOTSTRAP_METHOD_BYTES = 4;
+    private static final int BOOTSTRAP_ARGUMENT_BYTES = 2;
+
+    private final BootstrapMethodsList bootstrapMethods;
+
+    private final int byteLength;
+
+    public AttBootstrapMethods(BootstrapMethodsList bootstrapMethods) {
+        super(ATTRIBUTE_NAME);
+        this.bootstrapMethods = bootstrapMethods;
+
+        int bytes = ATTRIBUTE_HEADER_BYTES + bootstrapMethods.size() * BOOTSTRAP_METHOD_BYTES;
+        for (int i = 0; i < bootstrapMethods.size(); ++i) {
+            int numberOfArguments = bootstrapMethods.get(i).getBootstrapMethodArguments().size();
+            bytes += numberOfArguments * BOOTSTRAP_ARGUMENT_BYTES;
+        }
+        this.byteLength = bytes;
+    }
+
+    @Override
+    public int byteLength() {
+        return byteLength;
+    }
+
+    /**
+     * Get the bootstrap methods present in attribute.
+     * @return bootstrap methods list
+     */
+    public BootstrapMethodsList getBootstrapMethods() {
+        return bootstrapMethods;
+    }
+}
diff --git a/dx/src/com/android/dx/cf/code/BasicBlocker.java b/dx/src/com/android/dx/cf/code/BasicBlocker.java
index 8fb9560..bf575f9 100644
--- a/dx/src/com/android/dx/cf/code/BasicBlocker.java
+++ b/dx/src/com/android/dx/cf/code/BasicBlocker.java
@@ -17,6 +17,7 @@
 package com.android.dx.cf.code;
 
 import com.android.dx.rop.cst.Constant;
+import com.android.dx.rop.cst.CstCallSiteRef;
 import com.android.dx.rop.cst.CstMemberRef;
 import com.android.dx.rop.cst.CstString;
 import com.android.dx.rop.cst.CstType;
@@ -200,7 +201,7 @@
         visitCommon(offset, length, true);
 
         if ((cst instanceof CstMemberRef) || (cst instanceof CstType) ||
-            (cst instanceof CstString)) {
+            (cst instanceof CstString) || (cst instanceof CstCallSiteRef)) {
             /*
              * Instructions with these sorts of constants have the
              * possibility of throwing, so this instruction needs to
diff --git a/dx/src/com/android/dx/cf/code/BootstrapMethodArgumentsList.java b/dx/src/com/android/dx/cf/code/BootstrapMethodArgumentsList.java
new file mode 100644
index 0000000..27c8078
--- /dev/null
+++ b/dx/src/com/android/dx/cf/code/BootstrapMethodArgumentsList.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dx.cf.code;
+
+import com.android.dx.rop.cst.Constant;
+import com.android.dx.rop.cst.CstDouble;
+import com.android.dx.rop.cst.CstFloat;
+import com.android.dx.rop.cst.CstInteger;
+import com.android.dx.rop.cst.CstLong;
+import com.android.dx.rop.cst.CstMethodHandle;
+import com.android.dx.rop.cst.CstMethodType;
+import com.android.dx.rop.cst.CstString;
+import com.android.dx.rop.cst.CstType;
+import com.android.dx.util.FixedSizeList;
+
+/**
+ * List of bootstrap method arguments, which are part of the contents of
+ * {@code BootstrapMethods} attributes.
+ */
+public class BootstrapMethodArgumentsList extends FixedSizeList {
+    /**
+     * Constructs an instance.
+     *
+     * @param count the number of elements to be in the list
+     */
+    public BootstrapMethodArgumentsList(int count) {
+        super(count);
+    }
+
+    /**
+     * Gets the bootstrap argument from the indicated position.
+     *
+     * @param n position of argument to get
+     * @return {@code Constant} instance
+     */
+    public Constant get(int n) {
+        return (Constant) get0(n);
+    }
+
+    /**
+     * Sets the bootstrap argument at the indicated position.
+     *
+     * @param n position of argument to set
+     * @param cst {@code Constant} instance
+     */
+    public void set(int n, Constant cst) {
+        // The set of permitted types is defined by the JVMS 8, section 4.7.23.
+        if (cst instanceof CstString ||
+            cst instanceof CstType ||
+            cst instanceof CstInteger ||
+            cst instanceof CstLong ||
+            cst instanceof CstFloat ||
+            cst instanceof CstDouble ||
+            cst instanceof CstMethodHandle ||
+            cst instanceof CstMethodType) {
+            set0(n, cst);
+        } else {
+            Class<?> klass = cst.getClass();
+            throw new IllegalArgumentException("bad type for bootstrap argument: " + klass);
+        }
+    }
+}
diff --git a/dx/src/com/android/dx/cf/code/BootstrapMethodsList.java b/dx/src/com/android/dx/cf/code/BootstrapMethodsList.java
new file mode 100644
index 0000000..c586949
--- /dev/null
+++ b/dx/src/com/android/dx/cf/code/BootstrapMethodsList.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dx.cf.code;
+
+import com.android.dx.rop.cst.CstMethodHandle;
+import com.android.dx.rop.cst.CstType;
+import com.android.dx.util.FixedSizeList;
+
+/**
+ * List of bootstrap method entries, which are the contents of
+ * {@code BootstrapMethods} attributes.
+ */
+public class BootstrapMethodsList extends FixedSizeList {
+    /** {@code non-null;} zero-size instance */
+    public static final BootstrapMethodsList EMPTY = new BootstrapMethodsList(0);
+
+    /**
+     * Constructs an instance.
+     *
+     * @param count the number of elements to be in the list
+     */
+    public BootstrapMethodsList(int count) {
+        super(count);
+    }
+
+    /**
+     * Gets the indicated item.
+     *
+     * @param n {@code >= 0;} which item
+     * @return {@code null-ok;} the indicated item
+     */
+    public Item get(int n) {
+        return (Item) get0(n);
+    }
+
+    /**
+     * Sets the item at the given index.
+     *
+     * @param n {@code >= 0, < size();} which element
+     * @param item {@code non-null;} the item
+     */
+    public void set(int n, Item item) {
+        if (item == null) {
+            throw new NullPointerException("item == null");
+        }
+
+        set0(n, item);
+    }
+
+    /**
+     * Sets the item at the given index.
+     *
+     * @param n {@code >= 0, < size();} which element
+     * @param declaringClass {@code non-null;} the class declaring bootstrap method.
+     * @param bootstrapMethodHandle {@code non-null;} the bootstrap method handle
+     * @param arguments {@code non-null;} the arguments of the bootstrap method
+     */
+    public void set(int n, CstType declaringClass, CstMethodHandle bootstrapMethodHandle,
+                    BootstrapMethodArgumentsList arguments) {
+        set(n, new Item(declaringClass, bootstrapMethodHandle, arguments));
+    }
+
+    /**
+     * Returns an instance which is the concatenation of the two given
+     * instances.
+     *
+     * @param list1 {@code non-null;} first instance
+     * @param list2 {@code non-null;} second instance
+     * @return {@code non-null;} combined instance
+     */
+    public static BootstrapMethodsList concat(BootstrapMethodsList list1,
+                                              BootstrapMethodsList list2) {
+        if (list1 == EMPTY) {
+            return list2;
+        } else if (list2 == EMPTY) {
+            return list1;
+        }
+
+        int sz1 = list1.size();
+        int sz2 = list2.size();
+        BootstrapMethodsList result = new BootstrapMethodsList(sz1 + sz2);
+
+        for (int i = 0; i < sz1; i++) {
+            result.set(i, list1.get(i));
+        }
+
+        for (int i = 0; i < sz2; i++) {
+            result.set(sz1 + i, list2.get(i));
+        }
+
+        return result;
+    }
+
+    public static class Item {
+        private final BootstrapMethodArgumentsList bootstrapMethodArgumentsList;
+        private final CstMethodHandle bootstrapMethodHandle;
+        private final CstType declaringClass;
+
+        public Item(CstType declaringClass, CstMethodHandle bootstrapMethodHandle,
+                    BootstrapMethodArgumentsList bootstrapMethodArguments) {
+            if (declaringClass == null) {
+                throw new NullPointerException("declaringClass == null");
+            }
+            if (bootstrapMethodHandle == null) {
+                throw new NullPointerException("bootstrapMethodHandle == null");
+            }
+            if (bootstrapMethodArguments == null) {
+                throw new NullPointerException("bootstrapMethodArguments == null");
+            }
+            this.bootstrapMethodHandle = bootstrapMethodHandle;
+            this.bootstrapMethodArgumentsList = bootstrapMethodArguments;
+            this.declaringClass = declaringClass;
+        }
+
+        public CstMethodHandle getBootstrapMethodHandle() {
+            return bootstrapMethodHandle;
+        }
+
+        public BootstrapMethodArgumentsList getBootstrapMethodArguments() {
+            return bootstrapMethodArgumentsList;
+        }
+
+        public CstType getDeclaringClass() {
+            return declaringClass;
+        }
+    }
+}
diff --git a/dx/src/com/android/dx/cf/code/BytecodeArray.java b/dx/src/com/android/dx/cf/code/BytecodeArray.java
index 424b971..30d62fb 100644
--- a/dx/src/com/android/dx/cf/code/BytecodeArray.java
+++ b/dx/src/com/android/dx/cf/code/BytecodeArray.java
@@ -16,12 +16,13 @@
 
 package com.android.dx.cf.code;
 
-import com.android.dx.cf.iface.ParseException;
 import com.android.dx.rop.cst.Constant;
 import com.android.dx.rop.cst.ConstantPool;
+import com.android.dx.rop.cst.CstCallSiteRef;
 import com.android.dx.rop.cst.CstDouble;
 import com.android.dx.rop.cst.CstFloat;
 import com.android.dx.rop.cst.CstInteger;
+import com.android.dx.rop.cst.CstInvokeDynamic;
 import com.android.dx.rop.cst.CstKnownNull;
 import com.android.dx.rop.cst.CstLiteralBits;
 import com.android.dx.rop.cst.CstLong;
@@ -774,7 +775,12 @@
                     return 5;
                 }
                 case ByteOps.INVOKEDYNAMIC: {
-                  throw new ParseException("invokedynamic not supported");
+                    int idx = bytes.getUnsignedShort(offset + 1);
+                    // Skip to must-be-zero bytes at offsets 3 and 4
+                    CstInvokeDynamic cstInvokeDynamic = (CstInvokeDynamic) pool.get(idx);
+                    CstCallSiteRef ref = cstInvokeDynamic.addReference();
+                    visitor.visitConstant(opcode, offset, 5, ref, 0);
+                    return 5;
                 }
                 case ByteOps.NEWARRAY: {
                     return parseNewarray(offset, visitor);
diff --git a/dx/src/com/android/dx/cf/code/RopperMachine.java b/dx/src/com/android/dx/cf/code/RopperMachine.java
index 67d7ab2..f0d5fdd 100644
--- a/dx/src/com/android/dx/cf/code/RopperMachine.java
+++ b/dx/src/com/android/dx/cf/code/RopperMachine.java
@@ -35,6 +35,7 @@
 import com.android.dx.rop.code.ThrowingInsn;
 import com.android.dx.rop.code.TranslationAdvice;
 import com.android.dx.rop.cst.Constant;
+import com.android.dx.rop.cst.CstCallSiteRef;
 import com.android.dx.rop.cst.CstFieldRef;
 import com.android.dx.rop.cst.CstInteger;
 import com.android.dx.rop.cst.CstMethodRef;
@@ -498,9 +499,14 @@
              */
             extraBlockCount++;
 
-            moveResult = new PlainInsn(
-                    Rops.opMoveResult(((CstMethodRef) cst).getPrototype()
-                    .getReturnType()), pos, dest, RegisterSpecList.EMPTY);
+            Type returnType;
+            if (rop.getOpcode() == RegOps.INVOKE_CUSTOM) {
+                returnType = ((CstCallSiteRef) cst).getReturnType();
+            } else {
+                returnType = ((CstMethodRef) cst).getPrototype().getReturnType();
+            }
+            moveResult = new PlainInsn(Rops.opMoveResult(returnType),
+                                       pos, dest, RegisterSpecList.EMPTY);
 
             dest = null;
         } else if (dest != null && rop.canThrow()) {
@@ -985,6 +991,9 @@
             case ByteOps.INVOKEINTERFACE: {
                 return RegOps.INVOKE_INTERFACE;
             }
+            case ByteOps.INVOKEDYNAMIC: {
+                return RegOps.INVOKE_CUSTOM;
+            }
             case ByteOps.NEW: {
                 return RegOps.NEW_INSTANCE;
             }
diff --git a/dx/src/com/android/dx/cf/code/Simulator.java b/dx/src/com/android/dx/cf/code/Simulator.java
index 5b77082..7aeca7c 100644
--- a/dx/src/com/android/dx/cf/code/Simulator.java
+++ b/dx/src/com/android/dx/cf/code/Simulator.java
@@ -20,6 +20,7 @@
 import com.android.dx.dex.DexOptions;
 import com.android.dx.rop.code.LocalItem;
 import com.android.dx.rop.cst.Constant;
+import com.android.dx.rop.cst.CstCallSiteRef;
 import com.android.dx.rop.cst.CstFieldRef;
 import com.android.dx.rop.cst.CstInteger;
 import com.android.dx.rop.cst.CstInterfaceMethodRef;
@@ -703,6 +704,18 @@
                     machine.popArgs(frame, prototype);
                     break;
                 }
+                case ByteOps.INVOKEDYNAMIC: {
+                    if (!dexOptions.canUseInvokeCustom()) {
+                        throw new SimException(
+                            "invalid opcode " + Hex.u1(opcode) +
+                            " (invokedynamic requires --min-sdk-version >= " +
+                            DexFormat.API_INVOKE_POLYMORPHIC + ")");
+                    }
+                    CstCallSiteRef invokeDynamicRef = (CstCallSiteRef) cst;
+                    Prototype prototype = invokeDynamicRef.getPrototype();
+                    machine.popArgs(frame, prototype);
+                    break;
+                }
                 case ByteOps.MULTIANEWARRAY: {
                     /*
                      * The "value" here is the count of dimensions to
diff --git a/dx/src/com/android/dx/cf/code/ValueAwareMachine.java b/dx/src/com/android/dx/cf/code/ValueAwareMachine.java
index de75db5..c2c93f7 100644
--- a/dx/src/com/android/dx/cf/code/ValueAwareMachine.java
+++ b/dx/src/com/android/dx/cf/code/ValueAwareMachine.java
@@ -16,6 +16,7 @@
 
 package com.android.dx.cf.code;
 
+import com.android.dx.rop.cst.CstCallSiteRef;
 import com.android.dx.rop.cst.CstType;
 import com.android.dx.rop.type.Prototype;
 import com.android.dx.rop.type.Type;
@@ -167,6 +168,15 @@
                 }
                 break;
             }
+            case ByteOps.INVOKEDYNAMIC: {
+                Type type = ((CstCallSiteRef) getAuxCst()).getReturnType();
+                if (type == Type.VOID) {
+                    clearResult();
+                } else {
+                    setResult(type);
+                }
+                break;
+            }
             case ByteOps.NEW: {
                 Type type = ((CstType) getAuxCst()).getClassType();
                 setResult(type.asUninitialized(offset));
diff --git a/dx/src/com/android/dx/cf/cst/ConstantPoolParser.java b/dx/src/com/android/dx/cf/cst/ConstantPoolParser.java
index 147edf3..9015b8f 100644
--- a/dx/src/com/android/dx/cf/cst/ConstantPoolParser.java
+++ b/dx/src/com/android/dx/cf/cst/ConstantPoolParser.java
@@ -336,24 +336,22 @@
                     break;
                 }
                 case CONSTANT_MethodHandle: {
-                    int kind = bytes.getUnsignedByte(at + 1);
-                    int constantIndex = bytes.getUnsignedShort(at + 2);
-                    Constant ref;
+                    final int kind = bytes.getUnsignedByte(at + 1);
+                    final int constantIndex = bytes.getUnsignedShort(at + 2);
+                    final Constant ref;
                     switch (kind) {
-                        case CstMethodHandle.KIND_GETFIELD:
-                        case CstMethodHandle.KIND_GETSTATIC:
-                        case CstMethodHandle.KIND_PUTFIELD:
-                        case CstMethodHandle.KIND_PUTSTATIC:
-                            CstFieldRef field = (CstFieldRef) parse0(constantIndex, wasUtf8);
-                            ref = field;
+                        case MethodHandleKind.REF_getField:
+                        case MethodHandleKind.REF_getStatic:
+                        case MethodHandleKind.REF_putField:
+                        case MethodHandleKind.REF_putStatic:
+                            ref = (CstFieldRef) parse0(constantIndex, wasUtf8);
                             break;
-                        case CstMethodHandle.KIND_INVOKEVIRTUAL:
-                        case CstMethodHandle.KIND_NEWINVOKESPECIAL:
-                            CstMethodRef method = (CstMethodRef) parse0(constantIndex, wasUtf8);
-                            ref = method;
+                        case MethodHandleKind.REF_invokeVirtual:
+                        case MethodHandleKind.REF_newInvokeSpecial:
+                            ref = (CstMethodRef) parse0(constantIndex, wasUtf8);
                             break;
-                        case CstMethodHandle.KIND_INVOKESTATIC:
-                        case CstMethodHandle.KIND_INVOKESPECIAL:
+                        case MethodHandleKind.REF_invokeStatic:
+                        case MethodHandleKind.REF_invokeSpecial:
                             ref = parse0(constantIndex, wasUtf8);
                             if (!(ref instanceof CstMethodRef
                                 || ref instanceof CstInterfaceMethodRef)) {
@@ -362,15 +360,15 @@
                                   + ref.getClass());
                             }
                             break;
-                        case CstMethodHandle.KIND_INVOKEINTERFACE:
-                            CstInterfaceMethodRef interfaceMethod =
-                                (CstInterfaceMethodRef) parse0(constantIndex, wasUtf8);
-                            ref = interfaceMethod;
+                        case MethodHandleKind.REF_invokeInterface:
+                            ref = (CstInterfaceMethodRef) parse0(constantIndex, wasUtf8);
                             break;
                         default:
                             throw new ParseException("Unsupported MethodHandle kind: " + kind);
                     }
-                    cst = CstMethodHandle.make(kind, ref);
+
+                    final int methodHandleType = getMethodHandleTypeForKind(kind);
+                    cst = CstMethodHandle.make(methodHandleType, ref);
                     break;
                 }
                 case CONSTANT_MethodType: {
@@ -425,4 +423,28 @@
             throw new ParseException(ex);
         }
     }
+
+    private static int getMethodHandleTypeForKind(int kind) {
+        switch (kind) {
+            case MethodHandleKind.REF_getField:
+                return CstMethodHandle.METHOD_HANDLE_TYPE_INSTANCE_GET;
+            case MethodHandleKind.REF_getStatic:
+                return CstMethodHandle.METHOD_HANDLE_TYPE_STATIC_GET;
+            case MethodHandleKind.REF_putField:
+                return CstMethodHandle.METHOD_HANDLE_TYPE_INSTANCE_PUT;
+            case MethodHandleKind.REF_putStatic:
+                return CstMethodHandle.METHOD_HANDLE_TYPE_STATIC_PUT;
+            case MethodHandleKind.REF_invokeVirtual:
+                return CstMethodHandle.METHOD_HANDLE_TYPE_INVOKE_INSTANCE;
+            case MethodHandleKind.REF_invokeStatic:
+                return CstMethodHandle.METHOD_HANDLE_TYPE_INVOKE_STATIC;
+            case MethodHandleKind.REF_invokeSpecial:
+                return CstMethodHandle.METHOD_HANDLE_TYPE_INVOKE_DIRECT;
+            case MethodHandleKind.REF_newInvokeSpecial:
+                return CstMethodHandle.METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR;
+            case MethodHandleKind.REF_invokeInterface:
+                return CstMethodHandle.METHOD_HANDLE_TYPE_INVOKE_INTERFACE;
+        }
+        throw new IllegalArgumentException("invalid kind: " + kind);
+    }
 }
diff --git a/dx/src/com/android/dx/cf/cst/MethodHandleKind.java b/dx/src/com/android/dx/cf/cst/MethodHandleKind.java
new file mode 100644
index 0000000..e92dbf2
--- /dev/null
+++ b/dx/src/com/android/dx/cf/cst/MethodHandleKind.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dx.cf.cst;
+
+/**
+ * Method Handle kinds for {@code CONSTANT_MethodHandle_info} constants.
+ */
+public interface MethodHandleKind {
+    /** A method handle that gets an instance field. */
+    int REF_getField = 1;
+
+    /** A method handle that gets a static field. */
+    int REF_getStatic = 2;
+
+    /** A method handle that sets an instance field. */
+    int REF_putField = 3;
+
+    /** A method handle that sets a static field. */
+    int REF_putStatic = 4;
+
+    /** A method handle for {@code invokevirtual}. */
+    int REF_invokeVirtual = 5;
+
+    /** A method handle for {@code invokestatic}. */
+    int REF_invokeStatic = 6;
+
+    /** A method handle for {@code invokespecial}. */
+    int REF_invokeSpecial = 7;
+
+    /** A method handle for invoking a constructor. */
+    int REF_newInvokeSpecial = 8;
+
+    /** A method handle for {@code invokeinterface}. */
+    int REF_invokeInterface = 9;
+}
diff --git a/dx/src/com/android/dx/cf/direct/DirectClassFile.java b/dx/src/com/android/dx/cf/direct/DirectClassFile.java
index 043da75..623c303 100644
--- a/dx/src/com/android/dx/cf/direct/DirectClassFile.java
+++ b/dx/src/com/android/dx/cf/direct/DirectClassFile.java
@@ -16,7 +16,9 @@
 
 package com.android.dx.cf.direct;
 
+import com.android.dx.cf.attrib.AttBootstrapMethods;
 import com.android.dx.cf.attrib.AttSourceFile;
+import com.android.dx.cf.code.BootstrapMethodsList;
 import com.android.dx.cf.cst.ConstantPoolParser;
 import com.android.dx.cf.iface.Attribute;
 import com.android.dx.cf.iface.AttributeList;
@@ -313,6 +315,18 @@
     }
 
     /** {@inheritDoc} */
+    @Override
+    public BootstrapMethodsList getBootstrapMethods() {
+        AttBootstrapMethods bootstrapMethodsAttribute =
+                (AttBootstrapMethods) getAttributes().findFirst(AttBootstrapMethods.ATTRIBUTE_NAME);
+        if (bootstrapMethodsAttribute != null) {
+            return bootstrapMethodsAttribute.getBootstrapMethods();
+        } else {
+            return BootstrapMethodsList.EMPTY;
+        }
+    }
+
+    /** {@inheritDoc} */
     public CstString getSourceFile() {
         AttributeList attribs = getAttributes();
         Attribute attSf = attribs.findFirst(AttSourceFile.ATTRIBUTE_NAME);
diff --git a/dx/src/com/android/dx/cf/direct/StdAttributeFactory.java b/dx/src/com/android/dx/cf/direct/StdAttributeFactory.java
index 710ba57..2c58e0b 100644
--- a/dx/src/com/android/dx/cf/direct/StdAttributeFactory.java
+++ b/dx/src/com/android/dx/cf/direct/StdAttributeFactory.java
@@ -17,6 +17,7 @@
 package com.android.dx.cf.direct;
 
 import com.android.dx.cf.attrib.AttAnnotationDefault;
+import com.android.dx.cf.attrib.AttBootstrapMethods;
 import com.android.dx.cf.attrib.AttCode;
 import com.android.dx.cf.attrib.AttConstantValue;
 import com.android.dx.cf.attrib.AttDeprecated;
@@ -35,6 +36,8 @@
 import com.android.dx.cf.attrib.AttSourceFile;
 import com.android.dx.cf.attrib.AttSynthetic;
 import com.android.dx.cf.attrib.InnerClassList;
+import com.android.dx.cf.code.BootstrapMethodArgumentsList;
+import com.android.dx.cf.code.BootstrapMethodsList;
 import com.android.dx.cf.code.ByteCatchList;
 import com.android.dx.cf.code.BytecodeArray;
 import com.android.dx.cf.code.LineNumberList;
@@ -49,6 +52,7 @@
 import com.android.dx.rop.code.AccessFlags;
 import com.android.dx.rop.cst.Constant;
 import com.android.dx.rop.cst.ConstantPool;
+import com.android.dx.rop.cst.CstMethodHandle;
 import com.android.dx.rop.cst.CstNat;
 import com.android.dx.rop.cst.CstString;
 import com.android.dx.rop.cst.CstType;
@@ -81,6 +85,9 @@
             int offset, int length, ParseObserver observer) {
         switch (context) {
             case CTX_CLASS: {
+                if (name == AttBootstrapMethods.ATTRIBUTE_NAME) {
+                    return bootstrapMethods(cf, offset, length, observer);
+                }
                 if (name == AttDeprecated.ATTRIBUTE_NAME) {
                     return deprecated(cf, offset, length, observer);
                 }
@@ -209,6 +216,31 @@
     }
 
     /**
+     * Parses a {@code BootstrapMethods} attribute.
+     */
+    private Attribute bootstrapMethods(DirectClassFile cf, int offset, int length,
+            ParseObserver observer) {
+        if (length < 2) {
+            return throwSeverelyTruncated();
+        }
+
+        ByteArray bytes = cf.getBytes();
+        int numMethods = bytes.getUnsignedShort(offset);
+        if (observer != null) {
+            observer.parsed(bytes, offset, 2,
+                            "num_boostrap_methods: " + Hex.u2(numMethods));
+        }
+
+        offset += 2;
+        length -= 2;
+
+        BootstrapMethodsList methods = parseBootstrapMethods(bytes, cf.getConstantPool(),
+                                                             cf.getThisClass(), numMethods,
+                                                             offset, length, observer);
+        return new AttBootstrapMethods(methods);
+    }
+
+    /**
      * Parses a {@code Code} attribute.
      */
     private Attribute code(DirectClassFile cf, int offset, int length,
@@ -780,4 +812,50 @@
         throw new ParseException("bad attribute length; expected length " +
                                  Hex.u4(expected));
     }
+
+    private BootstrapMethodsList parseBootstrapMethods(ByteArray bytes, ConstantPool constantPool,
+            CstType declaringClass, int numMethods, int offset, int length, ParseObserver observer)
+        throws ParseException {
+        BootstrapMethodsList methods = new BootstrapMethodsList(numMethods);
+        for (int methodIndex = 0; methodIndex < numMethods; ++methodIndex) {
+            if (length < 4) {
+                throwTruncated();
+            }
+
+            int methodRef = bytes.getUnsignedShort(offset);
+            int numArguments = bytes.getUnsignedShort(offset + 2);
+
+            if (observer != null) {
+                observer.parsed(bytes, offset, 2, "bootstrap_method_ref: " + Hex.u2(methodRef));
+                observer.parsed(bytes, offset + 2, 2,
+                                "num_bootstrap_arguments: " + Hex.u2(numArguments));
+            }
+
+            offset += 4;
+            length -= 4;
+            if (length < numArguments * 2) {
+                throwTruncated();
+            }
+
+            BootstrapMethodArgumentsList arguments = new BootstrapMethodArgumentsList(numArguments);
+            for (int argIndex = 0; argIndex < numArguments; ++argIndex, offset += 2, length -= 2) {
+                int argumentRef = bytes.getUnsignedShort(offset);
+                if (observer != null) {
+                    observer.parsed(bytes, offset, 2,
+                                    "bootstrap_arguments[" + argIndex + "]" + Hex.u2(argumentRef));
+                }
+                arguments.set(argIndex, constantPool.get(argumentRef));
+            }
+            arguments.setImmutable();
+            Constant cstMethodRef = constantPool.get(methodRef);
+            methods.set(methodIndex, declaringClass, (CstMethodHandle) cstMethodRef, arguments);
+        }
+        methods.setImmutable();
+
+        if (length != 0) {
+            throwBadLength(length);
+        }
+
+        return methods;
+    }
 }
diff --git a/dx/src/com/android/dx/cf/iface/ClassFile.java b/dx/src/com/android/dx/cf/iface/ClassFile.java
index d6c9ed0..f7e5d7e 100644
--- a/dx/src/com/android/dx/cf/iface/ClassFile.java
+++ b/dx/src/com/android/dx/cf/iface/ClassFile.java
@@ -16,6 +16,7 @@
 
 package com.android.dx.cf.iface;
 
+import com.android.dx.cf.code.BootstrapMethodsList;
 import com.android.dx.rop.cst.ConstantPool;
 import com.android.dx.rop.cst.CstString;
 import com.android.dx.rop.cst.CstType;
@@ -113,6 +114,12 @@
     public AttributeList getAttributes();
 
     /**
+     * Gets the bootstrap method {@code attributes}.
+     * @return {@code non-null;} the list of bootstrap methods
+     */
+    public BootstrapMethodsList getBootstrapMethods();
+
+    /**
      * Gets the name out of the {@code SourceFile} attribute of this
      * file, if any. This is a convenient shorthand for scrounging around
      * the class's attributes.
diff --git a/dx/src/com/android/dx/dex/DexOptions.java b/dx/src/com/android/dx/dex/DexOptions.java
index 19dd84e..2e2755a 100644
--- a/dx/src/com/android/dx/dex/DexOptions.java
+++ b/dx/src/com/android/dx/dex/DexOptions.java
@@ -74,4 +74,16 @@
     public boolean canUseInvokePolymorphic() {
         return minSdkVersion >= DexFormat.API_INVOKE_POLYMORPHIC;
     }
+
+    /**
+     * Returns whether invoke-custom can be used.
+     *
+     * This became allowed as of the Android O release (SDK version 26).
+     *
+     * @return true if supported on the currently selected SDK.
+     */
+    public boolean canUseInvokeCustom() {
+        // invoke-custom and invoke-polymorphic are both covered by the same API level.
+        return minSdkVersion >= DexFormat.API_INVOKE_POLYMORPHIC;
+    }
 }
diff --git a/dx/src/com/android/dx/dex/cf/CfTranslator.java b/dx/src/com/android/dx/dex/cf/CfTranslator.java
index 5b797d4..9a1e13a 100644
--- a/dx/src/com/android/dx/dex/cf/CfTranslator.java
+++ b/dx/src/com/android/dx/dex/cf/CfTranslator.java
@@ -17,6 +17,7 @@
 package com.android.dx.dex.cf;
 
 import com.android.dex.util.ExceptionWithContext;
+import com.android.dx.cf.code.BootstrapMethodsList;
 import com.android.dx.cf.code.ConcreteMethod;
 import com.android.dx.cf.code.Ropper;
 import com.android.dx.cf.direct.DirectClassFile;
@@ -29,11 +30,13 @@
 import com.android.dx.dex.code.DalvCode;
 import com.android.dx.dex.code.PositionList;
 import com.android.dx.dex.code.RopTranslator;
+import com.android.dx.dex.file.CallSiteIdsSection;
 import com.android.dx.dex.file.ClassDefItem;
 import com.android.dx.dex.file.DexFile;
 import com.android.dx.dex.file.EncodedField;
 import com.android.dx.dex.file.EncodedMethod;
 import com.android.dx.dex.file.FieldIdsSection;
+import com.android.dx.dex.file.MethodHandlesSection;
 import com.android.dx.dex.file.MethodIdsSection;
 import com.android.dx.rop.annotation.Annotations;
 import com.android.dx.rop.annotation.AnnotationsList;
@@ -48,11 +51,15 @@
 import com.android.dx.rop.cst.CstBaseMethodRef;
 import com.android.dx.rop.cst.CstBoolean;
 import com.android.dx.rop.cst.CstByte;
+import com.android.dx.rop.cst.CstCallSite;
+import com.android.dx.rop.cst.CstCallSiteRef;
 import com.android.dx.rop.cst.CstChar;
 import com.android.dx.rop.cst.CstEnumRef;
 import com.android.dx.rop.cst.CstFieldRef;
 import com.android.dx.rop.cst.CstInteger;
 import com.android.dx.rop.cst.CstInterfaceMethodRef;
+import com.android.dx.rop.cst.CstInvokeDynamic;
+import com.android.dx.rop.cst.CstMethodHandle;
 import com.android.dx.rop.cst.CstMethodRef;
 import com.android.dx.rop.cst.CstShort;
 import com.android.dx.rop.cst.CstString;
@@ -137,6 +144,8 @@
 
         FieldIdsSection fieldIdsSection = dexFile.getFieldIds();
         MethodIdsSection methodIdsSection = dexFile.getMethodIds();
+        MethodHandlesSection methodHandlesSection = dexFile.getMethodHandles();
+        CallSiteIdsSection callSiteIds = dexFile.getCallSiteIds();
         processFields(cf, out, dexFile);
         processMethods(context, cf, cfOptions, dexOptions, out, dexFile);
 
@@ -154,6 +163,21 @@
                 fieldIdsSection.intern((CstFieldRef) constant);
             } else if (constant instanceof CstEnumRef) {
                 fieldIdsSection.intern(((CstEnumRef) constant).getFieldRef());
+            } else if (constant instanceof CstMethodHandle) {
+                methodHandlesSection.intern((CstMethodHandle) constant);
+            } else if (constant instanceof CstInvokeDynamic) {
+                CstInvokeDynamic cstInvokeDynamic = (CstInvokeDynamic) constant;
+                int index = cstInvokeDynamic.getBootstrapMethodIndex();
+                BootstrapMethodsList.Item bootstrapMethod = cf.getBootstrapMethods().get(index);
+                CstCallSite callSite =
+                        CstCallSite.make(bootstrapMethod.getBootstrapMethodHandle(),
+                                         cstInvokeDynamic.getNat(),
+                                         bootstrapMethod.getBootstrapMethodArguments());
+                cstInvokeDynamic.setDeclaringClass(cf.getThisClass());
+                cstInvokeDynamic.setCallSite(callSite);
+                for (CstCallSiteRef ref : cstInvokeDynamic.getReferences()) {
+                    callSiteIds.intern(ref);
+                }
             }
         }
 
diff --git a/dx/src/com/android/dx/dex/code/DalvInsnList.java b/dx/src/com/android/dx/dex/code/DalvInsnList.java
index ac8ba48..a83b545 100644
--- a/dx/src/com/android/dx/dex/code/DalvInsnList.java
+++ b/dx/src/com/android/dx/dex/code/DalvInsnList.java
@@ -20,6 +20,7 @@
 import com.android.dx.io.Opcodes;
 import com.android.dx.rop.cst.Constant;
 import com.android.dx.rop.cst.CstBaseMethodRef;
+import com.android.dx.rop.cst.CstCallSiteRef;
 import com.android.dx.rop.cst.CstProtoRef;
 import com.android.dx.util.AnnotatedOutput;
 import com.android.dx.util.FixedSizeList;
@@ -201,6 +202,9 @@
                     boolean isStatic =
                         (insn.getOpcode().getFamily() == Opcodes.INVOKE_STATIC);
                     count = methodRef.getParameterWordCount(isStatic);
+                } else if (cst instanceof CstCallSiteRef) {
+                    CstCallSiteRef invokeDynamicRef = (CstCallSiteRef) cst;
+                    count = invokeDynamicRef.getPrototype().getParameterTypes().getWordCount();
                 }
             } else if (insn instanceof MultiCstInsn) {
                 if (insn.getOpcode().getFamily() != Opcodes.INVOKE_POLYMORPHIC) {
diff --git a/dx/src/com/android/dx/dex/code/RopToDop.java b/dx/src/com/android/dx/dex/code/RopToDop.java
index 65c5fab..1f1d131 100644
--- a/dx/src/com/android/dx/dex/code/RopToDop.java
+++ b/dx/src/com/android/dx/dex/code/RopToDop.java
@@ -492,6 +492,7 @@
             case RegOps.INVOKE_DIRECT:      return Dops.INVOKE_DIRECT;
             case RegOps.INVOKE_INTERFACE:   return Dops.INVOKE_INTERFACE;
             case RegOps.INVOKE_POLYMORPHIC: return Dops.INVOKE_POLYMORPHIC;
+            case RegOps.INVOKE_CUSTOM:      return Dops.INVOKE_CUSTOM;
             case RegOps.NEW_ARRAY:          return Dops.NEW_ARRAY;
             case RegOps.FILLED_NEW_ARRAY:   return Dops.FILLED_NEW_ARRAY;
             case RegOps.FILL_ARRAY_DATA:    return Dops.FILL_ARRAY_DATA;
diff --git a/dx/src/com/android/dx/dex/code/form/Form35c.java b/dx/src/com/android/dx/dex/code/form/Form35c.java
index 208d4a7..7d05395 100644
--- a/dx/src/com/android/dx/dex/code/form/Form35c.java
+++ b/dx/src/com/android/dx/dex/code/form/Form35c.java
@@ -22,6 +22,7 @@
 import com.android.dx.rop.code.RegisterSpec;
 import com.android.dx.rop.code.RegisterSpecList;
 import com.android.dx.rop.cst.Constant;
+import com.android.dx.rop.cst.CstCallSiteRef;
 import com.android.dx.rop.cst.CstMethodRef;
 import com.android.dx.rop.cst.CstType;
 import com.android.dx.rop.type.Type;
@@ -86,7 +87,8 @@
 
         Constant cst = ci.getConstant();
         if (!((cst instanceof CstMethodRef) ||
-              (cst instanceof CstType))) {
+              (cst instanceof CstType) ||
+              (cst instanceof CstCallSiteRef))) {
             return false;
         }
 
diff --git a/dx/src/com/android/dx/dex/code/form/Form3rc.java b/dx/src/com/android/dx/dex/code/form/Form3rc.java
index c1b21b6..732214a 100644
--- a/dx/src/com/android/dx/dex/code/form/Form3rc.java
+++ b/dx/src/com/android/dx/dex/code/form/Form3rc.java
@@ -21,6 +21,7 @@
 import com.android.dx.dex.code.InsnFormat;
 import com.android.dx.rop.code.RegisterSpecList;
 import com.android.dx.rop.cst.Constant;
+import com.android.dx.rop.cst.CstCallSiteRef;
 import com.android.dx.rop.cst.CstMethodRef;
 import com.android.dx.rop.cst.CstType;
 import com.android.dx.util.AnnotatedOutput;
@@ -80,7 +81,8 @@
         }
 
         if (!((cst instanceof CstMethodRef) ||
-              (cst instanceof CstType))) {
+              (cst instanceof CstType) ||
+              (cst instanceof CstCallSiteRef))) {
             return false;
         }
 
diff --git a/dx/src/com/android/dx/dex/file/CallSiteIdItem.java b/dx/src/com/android/dx/dex/file/CallSiteIdItem.java
new file mode 100644
index 0000000..cf0bb24
--- /dev/null
+++ b/dx/src/com/android/dx/dex/file/CallSiteIdItem.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dx.dex.file;
+
+import com.android.dx.rop.cst.CstCallSite;
+import com.android.dx.rop.cst.CstCallSiteRef;
+import com.android.dx.util.AnnotatedOutput;
+import com.android.dx.util.Hex;
+
+/**
+ * Representation of a call site reference in a DEX file.
+ */
+public final class CallSiteIdItem extends IndexedItem implements Comparable {
+
+    /** The item size when placed in a DEX file. */
+    private static final int ITEM_SIZE = 4;
+
+    /** {@code non-null;} The call site represented by this identifier. */
+    final CstCallSiteRef invokeDynamicRef;
+
+    CallSiteItem data;
+
+    /**
+     * Constructs an instance.
+     *
+     * @param invokeDynamicRef {@code non-null;} The call site to represent in the DEX file.
+     */
+    public CallSiteIdItem(CstCallSiteRef invokeDynamicRef) {
+        this.invokeDynamicRef = invokeDynamicRef;
+        this.data = null;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public ItemType itemType() {
+        return ItemType.TYPE_CALL_SITE_ID_ITEM;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public int writeSize() {
+        return ITEM_SIZE;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void addContents(DexFile file) {
+        CstCallSite callSite = invokeDynamicRef.getCallSite();
+        CallSiteIdsSection callSiteIds = file.getCallSiteIds();
+        CallSiteItem callSiteItem = callSiteIds.getCallSiteItem(callSite);
+        if (callSiteItem == null) {
+            MixedItemSection byteData = file.getByteData();
+            callSiteItem = new CallSiteItem(callSite);
+            byteData.add(callSiteItem);
+            callSiteIds.addCallSiteItem(callSite, callSiteItem);
+        }
+        this.data = callSiteItem;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void writeTo(DexFile file, AnnotatedOutput out) {
+        int offset = data.getAbsoluteOffset();
+        if (out.annotates()) {
+            out.annotate(0, indexString() + ' ' + invokeDynamicRef.toString());
+            out.annotate(4, "call_site_off: " + Hex.u4(offset));
+        }
+        out.writeInt(offset);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public int compareTo(Object o) {
+        CallSiteIdItem other = (CallSiteIdItem) o;
+        return invokeDynamicRef.compareTo(other.invokeDynamicRef);
+    }
+}
diff --git a/dx/src/com/android/dx/dex/file/CallSiteIdsSection.java b/dx/src/com/android/dx/dex/file/CallSiteIdsSection.java
new file mode 100644
index 0000000..0a0e781
--- /dev/null
+++ b/dx/src/com/android/dx/dex/file/CallSiteIdsSection.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dx.dex.file;
+
+import com.android.dx.rop.cst.Constant;
+import com.android.dx.rop.cst.CstCallSite;
+import com.android.dx.rop.cst.CstCallSiteRef;
+import java.util.Collection;
+import java.util.TreeMap;
+
+/**
+ * A section in the DEX file for call site identifiers.
+ */
+public final class CallSiteIdsSection extends UniformItemSection {
+
+    /** A map from call site references to their DEX file identifier. */
+    private final TreeMap<CstCallSiteRef, CallSiteIdItem> callSiteIds = new TreeMap<>();
+
+    /** A map from call site instances to their DEX file item. */
+    private final TreeMap<CstCallSite, CallSiteItem> callSites = new TreeMap<>();
+
+    /**
+     * Constructs an instance.
+     *
+     * @param dexFile {@code non-null;} file that this instance is part of
+     */
+    public CallSiteIdsSection(DexFile dexFile) {
+        super("call_site_ids", dexFile, 4);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public IndexedItem get(Constant cst) {
+        if (cst == null) {
+            throw new NullPointerException("cst == null");
+        }
+        throwIfNotPrepared();
+
+        IndexedItem result = callSiteIds.get((CstCallSiteRef) cst);
+        if (result == null) {
+            throw new IllegalArgumentException("not found");
+        }
+        return result;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected void orderItems() {
+        int index = 0;
+        for (CallSiteIdItem callSiteId : callSiteIds.values()) {
+            callSiteId.setIndex(index++);
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public Collection<? extends Item> items() {
+        return callSiteIds.values();
+    }
+
+    /**
+     * Interns a call site into this instance.
+     *
+     * This method is synchronized as it is called during class file translation which runs
+     * concurrently on a per class basis.
+     *
+     * @param cstRef
+     */
+    public synchronized void intern(CstCallSiteRef cstRef) {
+        if (cstRef == null) {
+            throw new NullPointerException("cstRef");
+        }
+
+        throwIfPrepared();
+
+        CallSiteIdItem result = callSiteIds.get(cstRef);
+        if (result == null) {
+            result = new CallSiteIdItem(cstRef);
+            callSiteIds.put(cstRef, result);
+        }
+    }
+
+    /**
+     * Adds an association between call site constant and its DEX file representation.
+     *
+     * This method is not synchronized as it is called during DEX file writing which happens
+     * concurrently on a per DEX file basis and this information per DEX file.
+     *
+     * @param callSite {@code non-null;} a constant call site
+     * @param callSiteItem {@code non-null;} a call site item as represented in a DEX file
+     */
+    void addCallSiteItem(CstCallSite callSite, CallSiteItem callSiteItem) {
+        if (callSite == null) {
+            throw new NullPointerException("callSite == null");
+        }
+        if (callSiteItem == null) {
+            throw new NullPointerException("callSiteItem == null");
+        }
+        callSites.put(callSite, callSiteItem);
+    }
+
+    /**
+     * Gets the DEX file representation of a call site associated with a call site constant.
+     *
+     * This method is not synchronized as it is called during DEX file writing which happens
+     * concurrently on a per DEX file basis and this information per DEX file.
+     *
+     * @param callSite {@code non-null;} a constant call site
+     * @return {@code non-null;} a call site item as represented in a DEX file
+     */
+    CallSiteItem getCallSiteItem(CstCallSite callSite) {
+        if (callSite == null) {
+            throw new NullPointerException("callSite == null");
+        }
+        return callSites.get(callSite);
+    }
+}
diff --git a/dx/src/com/android/dx/dex/file/CallSiteItem.java b/dx/src/com/android/dx/dex/file/CallSiteItem.java
new file mode 100644
index 0000000..a740ebf
--- /dev/null
+++ b/dx/src/com/android/dx/dex/file/CallSiteItem.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dx.dex.file;
+
+import com.android.dx.rop.cst.CstCallSite;
+import com.android.dx.rop.cst.CstProtoRef;
+import com.android.dx.util.AnnotatedOutput;
+import com.android.dx.util.ByteArrayAnnotatedOutput;
+
+/**
+ * Representation of a call site in a DEX file.
+ */
+public final class CallSiteItem extends OffsettedItem {
+
+    /** {@code non-null;} the call site value */
+    private final CstCallSite value;
+
+    /** {@code null-ok;} the encoded representation of the call site value */
+    private byte[] encodedForm;
+
+    /**
+     * Constructs an instance.
+     *
+     * @param value {@code non-null;} the string value
+     */
+    public CallSiteItem(CstCallSite value) {
+        super(1, writeSize(value));
+
+        this.value = value;
+    }
+
+    /**
+     * Gets the write size for a given value.
+     *
+     * @param value {@code non-null;} the call site value
+     * @return {@code >= 2}; the write size, in bytes
+     */
+    private static int writeSize(CstCallSite value) {
+        return -1;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected void place0(Section addedTo, int offset) {
+        // Encode the data and note the size.
+
+        ByteArrayAnnotatedOutput out = new ByteArrayAnnotatedOutput();
+        ValueEncoder encoder = new ValueEncoder(addedTo.getFile(), out);
+
+        encoder.writeArray(value, true);
+        encodedForm = out.toByteArray();
+        setWriteSize(encodedForm.length);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public String toHuman() {
+        return value.toHuman();
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public String toString() {
+        return value.toString();
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected void writeTo0(DexFile file, AnnotatedOutput out) {
+        if (out.annotates()) {
+            out.annotate(0, offsetString() + " call site");
+            ValueEncoder encoder = new ValueEncoder(file, out);
+            encoder.writeArray(value, true);
+        } else {
+            out.write(encodedForm);
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public ItemType itemType() {
+        // A call site is an encoded array with additional constraints
+        // on the element kinds. It is not listed separately in the
+        // DEX file's table of contents.
+        return ItemType.TYPE_ENCODED_ARRAY_ITEM;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void addContents(DexFile file) {
+        ProtoIdsSection protoIds = file.getProtoIds();
+        CstProtoRef cstProtoRef = (CstProtoRef) this.value.getList().get(2);
+        protoIds.intern(cstProtoRef.getPrototype());
+    }
+}
diff --git a/dx/src/com/android/dx/dex/file/DexFile.java b/dx/src/com/android/dx/dex/file/DexFile.java
index 9b9d70f..76a6174 100644
--- a/dx/src/com/android/dx/dex/file/DexFile.java
+++ b/dx/src/com/android/dx/dex/file/DexFile.java
@@ -21,6 +21,7 @@
 import com.android.dx.dex.file.MixedItemSection.SortType;
 import com.android.dx.rop.cst.Constant;
 import com.android.dx.rop.cst.CstBaseMethodRef;
+import com.android.dx.rop.cst.CstCallSiteRef;
 import com.android.dx.rop.cst.CstEnumRef;
 import com.android.dx.rop.cst.CstFieldRef;
 import com.android.dx.rop.cst.CstProtoRef;
@@ -43,7 +44,7 @@
  */
 public final class DexFile {
     /** options controlling the creation of the file */
-    private DexOptions dexOptions;
+    private final DexOptions dexOptions;
 
     /** {@code non-null;} word data section */
     private final MixedItemSection wordData;
@@ -86,6 +87,12 @@
     /** {@code non-null;} class data section */
     private final MixedItemSection classData;
 
+    /** {@code null-ok;} call site identifiers section, only exists for SDK >= 26 */
+    private final CallSiteIdsSection callSiteIds;
+
+    /** {@code null-ok;} method handles section, only exists for SDK >= 26 */
+    private final MethodHandlesSection methodHandles;
+
     /** {@code non-null;} byte data section */
     private final MixedItemSection byteData;
 
@@ -106,8 +113,10 @@
 
     /**
      * Constructs an instance. It is initially empty.
+     *
+     * @param dexOptions {@code non-null;} DEX file generations options to apply
      */
-    public DexFile(DexOptions dexOptions) {
+    public DexFile(final DexOptions dexOptions) {
         this.dexOptions = dexOptions;
 
         header = new HeaderSection(this);
@@ -126,13 +135,31 @@
         map = new MixedItemSection("map", this, 4, SortType.NONE);
 
         /*
-         * This is the list of sections in the order they appear in
+         * Prepare the list of sections in the order they appear in
          * the final output.
          */
-        sections = new Section[] {
-            header, stringIds, typeIds, protoIds, fieldIds, methodIds,
-            classDefs, wordData, typeLists, stringData, byteData,
-            classData, map };
+        if (dexOptions.canUseInvokeCustom()) {
+            /*
+             * Method handles and call sites only visible in DEX files
+             * from SDK version 26 onwards. Do not create or add sections unless
+             * version true. This is conditional to avoid churn in the dx tests
+             * that look at annotated output.
+             */
+            callSiteIds = new CallSiteIdsSection(this);
+            methodHandles = new MethodHandlesSection(this);
+
+            sections = new Section[] {
+                header, stringIds, typeIds, protoIds, fieldIds, methodIds, classDefs,
+                callSiteIds, methodHandles,
+                wordData, typeLists, stringData, byteData, classData, map };
+        } else {
+            callSiteIds = null;
+            methodHandles = null;
+
+            sections = new Section[] {
+                header, stringIds, typeIds, protoIds, fieldIds, methodIds, classDefs,
+                wordData, typeLists, stringData, byteData, classData, map };
+        }
 
         fileSize = -1;
         dumpWidth = 79;
@@ -394,6 +421,32 @@
     }
 
     /**
+     * Gets the method handles section.
+     *
+     * <p>This is public in order to allow
+     * the various {@link Item} instances to add items to the
+     * instance and help early counting of method handles.</p>
+     *
+     * @return {@code non-null;} the method handles section
+     */
+    public MethodHandlesSection getMethodHandles() {
+        return methodHandles;
+    }
+
+    /**
+     * Gets the call site identifiers section.
+     *
+     * <p>This is public in order to allow
+     * the various {@link Item} instances to add items to the
+     * instance and help early counting of call site identifiers.</p>
+     *
+     * @return {@code non-null;} the call site identifiers section
+     */
+    public CallSiteIdsSection getCallSiteIds() {
+        return callSiteIds;
+    }
+
+    /**
      * Gets the byte data section.
      *
      * <p>This is package-scope in order to allow
@@ -479,6 +532,8 @@
             return fieldIds.get(cst);
         } else if (cst instanceof CstProtoRef) {
             return protoIds.get(cst);
+        } else if (cst instanceof CstCallSiteRef) {
+            return callSiteIds.get(cst);
         } else {
             return null;
         }
@@ -499,7 +554,10 @@
          * add items happen before the calls to the sections that get
          * added to.
          */
-
+        if (dexOptions.canUseInvokePolymorphic()) {
+            callSiteIds.prepare();
+            methodHandles.prepare();
+        }
         classDefs.prepare();
         classData.prepare();
         wordData.prepare();
@@ -520,6 +578,15 @@
 
         for (int i = 0; i < count; i++) {
             Section one = sections[i];
+            if ((one == callSiteIds || one == methodHandles) && one.items().isEmpty()) {
+                /*
+                 * Skip call site or method handles sections if they have no items as
+                 * they may change the alignment of what follows even if empty as
+                 * Section.setFileOffset() always ensures appropriate alignment for the section.
+                 */
+                continue;
+            }
+
             int placedAt = one.setFileOffset(offset);
             if (placedAt < offset) {
                 throw new RuntimeException("bogus placement for section " + i);
@@ -563,13 +630,16 @@
 
         for (int i = 0; i < count; i++) {
             try {
-                Section one = sections[i];
-                int zeroCount = one.getFileOffset() - out.getCursor();
+                final Section one = sections[i];
+                if ((one == callSiteIds || one == methodHandles) && one.items().isEmpty()) {
+                   continue;
+                }
+                final int zeroCount = one.getFileOffset() - out.getCursor();
                 if (zeroCount < 0) {
                     throw new ExceptionWithContext("excess write of " +
                             (-zeroCount));
                 }
-                out.writeZeroes(one.getFileOffset() - out.getCursor());
+                out.writeZeroes(zeroCount);
                 one.writeTo(out);
             } catch (RuntimeException ex) {
                 ExceptionWithContext ec;
diff --git a/dx/src/com/android/dx/dex/file/ItemType.java b/dx/src/com/android/dx/dex/file/ItemType.java
index 2fe97ab..31f8d03 100644
--- a/dx/src/com/android/dx/dex/file/ItemType.java
+++ b/dx/src/com/android/dx/dex/file/ItemType.java
@@ -29,6 +29,8 @@
     TYPE_FIELD_ID_ITEM(             0x0004, "field_id_item"),
     TYPE_METHOD_ID_ITEM(            0x0005, "method_id_item"),
     TYPE_CLASS_DEF_ITEM(            0x0006, "class_def_item"),
+    TYPE_CALL_SITE_ID_ITEM(         0x0007, "call_site_id_item"),
+    TYPE_METHOD_HANDLE_ITEM(        0x0008, "method_handle_item"),
     TYPE_MAP_LIST(                  0x1000, "map_list"),
     TYPE_TYPE_LIST(                 0x1001, "type_list"),
     TYPE_ANNOTATION_SET_REF_LIST(   0x1002, "annotation_set_ref_list"),
diff --git a/dx/src/com/android/dx/dex/file/MethodHandleItem.java b/dx/src/com/android/dx/dex/file/MethodHandleItem.java
new file mode 100644
index 0000000..8e5f01e
--- /dev/null
+++ b/dx/src/com/android/dx/dex/file/MethodHandleItem.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dx.dex.file;
+
+import com.android.dx.rop.cst.Constant;
+import com.android.dx.rop.cst.CstBaseMethodRef;
+import com.android.dx.rop.cst.CstFieldRef;
+import com.android.dx.rop.cst.CstInterfaceMethodRef;
+import com.android.dx.rop.cst.CstMethodHandle;
+import com.android.dx.util.AnnotatedOutput;
+import com.android.dx.util.Hex;
+
+/**
+ * Representation of a method handle in a DEX file.
+ */
+public final class MethodHandleItem extends IndexedItem {
+
+    /** The item size when placed in a DEX file. */
+    private final int ITEM_SIZE = 8;
+
+    /** {@code non-null;} The method handle represented by this item. */
+    private final CstMethodHandle methodHandle;
+
+    /**
+     * Constructs an instance.
+     *
+     * @param methodHandle {@code non-null;} The method handle to represent in the DEX file.
+     */
+    public MethodHandleItem(CstMethodHandle methodHandle) {
+        this.methodHandle = methodHandle;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public ItemType itemType() {
+        return ItemType.TYPE_METHOD_HANDLE_ITEM;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public int writeSize() {
+        return ITEM_SIZE;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void addContents(DexFile file) {
+        MethodHandlesSection methodHandles = file.getMethodHandles();
+        methodHandles.intern(methodHandle);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void writeTo(DexFile file, AnnotatedOutput out) {
+        int targetIndex = getTargetIndex(file);
+        if (out.annotates()) {
+            out.annotate(2, "kind: " + Hex.u2(methodHandle.getType()));
+            out.annotate(2, "reserved:" + Hex.u2(0));
+            if (methodHandle.isAccessor()) {
+                out.annotate(2, "fieldId: " + targetIndex);
+            } else {
+                out.annotate(2, "methodId: " + targetIndex);
+            }
+            out.annotate(2, "reserved:" + Hex.u2(0));
+        }
+        out.writeShort(methodHandle.getType());
+        out.writeShort(0);
+        out.writeShort(getTargetIndex(file));
+        out.writeShort(0);
+    }
+
+    private int getTargetIndex(DexFile file) {
+        Constant ref = methodHandle.getRef();
+        if (methodHandle.isAccessor()) {
+            FieldIdsSection fieldIds = file.getFieldIds();
+            return fieldIds.indexOf((CstFieldRef) ref);
+        } else if (methodHandle.isInvocation()) {
+            if (ref instanceof CstInterfaceMethodRef) {
+                ref = ((CstInterfaceMethodRef)ref).toMethodRef();
+            }
+            MethodIdsSection methodIds = file.getMethodIds();
+            return methodIds.indexOf((CstBaseMethodRef) ref);
+        } else {
+            throw new IllegalStateException("Unhandled invocation type");
+        }
+    }
+}
diff --git a/dx/src/com/android/dx/dex/file/MethodHandlesSection.java b/dx/src/com/android/dx/dex/file/MethodHandlesSection.java
new file mode 100644
index 0000000..f293d05
--- /dev/null
+++ b/dx/src/com/android/dx/dex/file/MethodHandlesSection.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dx.dex.file;
+
+import com.android.dx.rop.cst.Constant;
+import com.android.dx.rop.cst.CstMethodHandle;
+import java.util.Collection;
+import java.util.TreeMap;
+
+public final class MethodHandlesSection extends UniformItemSection {
+
+    private final TreeMap<CstMethodHandle, MethodHandleItem> methodHandles = new TreeMap<>();
+
+    public MethodHandlesSection(DexFile dexFile) {
+        super("method_handles", dexFile, 8);
+    }
+
+    @Override
+    public IndexedItem get(Constant cst) {
+        if (cst == null) {
+            throw new NullPointerException("cst == null");
+        }
+        throwIfNotPrepared();
+
+        IndexedItem result = methodHandles.get((CstMethodHandle) cst);
+        if (result == null) {
+            throw new IllegalArgumentException("not found");
+        }
+        return result;
+    }
+
+    @Override
+    protected void orderItems() {
+        int index = 0;
+        for (MethodHandleItem item : methodHandles.values()) {
+            item.setIndex(index++);
+        }
+    }
+
+    @Override
+    public Collection<? extends Item> items() {
+        return methodHandles.values();
+    }
+
+    public void intern(CstMethodHandle methodHandle) {
+        if (methodHandle == null) {
+            throw new NullPointerException("methodHandle == null");
+        }
+
+        throwIfPrepared();
+
+        MethodHandleItem result = methodHandles.get(methodHandle);
+        if (result == null) {
+            result = new MethodHandleItem(methodHandle);
+            methodHandles.put(methodHandle, result);
+        }
+    }
+
+    int indexOf(CstMethodHandle cstMethodHandle) {
+        return methodHandles.get(cstMethodHandle).getIndex();
+    }
+}
diff --git a/dx/src/com/android/dx/dex/file/ValueEncoder.java b/dx/src/com/android/dx/dex/file/ValueEncoder.java
index fa807a7..c6634ff 100644
--- a/dx/src/com/android/dx/dex/file/ValueEncoder.java
+++ b/dx/src/com/android/dx/dex/file/ValueEncoder.java
@@ -24,6 +24,7 @@
 import com.android.dx.rop.cst.CstArray;
 import com.android.dx.rop.cst.CstBoolean;
 import com.android.dx.rop.cst.CstByte;
+import com.android.dx.rop.cst.CstCallSite;
 import com.android.dx.rop.cst.CstChar;
 import com.android.dx.rop.cst.CstDouble;
 import com.android.dx.rop.cst.CstEnumRef;
@@ -33,7 +34,9 @@
 import com.android.dx.rop.cst.CstKnownNull;
 import com.android.dx.rop.cst.CstLiteralBits;
 import com.android.dx.rop.cst.CstLong;
+import com.android.dx.rop.cst.CstMethodHandle;
 import com.android.dx.rop.cst.CstMethodRef;
+import com.android.dx.rop.cst.CstProtoRef;
 import com.android.dx.rop.cst.CstShort;
 import com.android.dx.rop.cst.CstString;
 import com.android.dx.rop.cst.CstType;
@@ -67,6 +70,12 @@
     /** annotation value type constant: {@code double} */
     private static final int VALUE_DOUBLE = 0x11;
 
+    /** annotation value type constant: {@code method type} */
+    private static final int VALUE_METHOD_TYPE = 0x15;
+
+    /** annotation value type constant: {@code method handle} */
+    private static final int VALUE_METHOD_HANDLE = 0x16;
+
     /** annotation value type constant: {@code string} */
     private static final int VALUE_STRING = 0x17;
 
@@ -153,6 +162,16 @@
                 EncodedValueCodec.writeRightZeroExtendedValue(out, type, value);
                 break;
             }
+            case VALUE_METHOD_TYPE: {
+                int index = file.getProtoIds().indexOf(((CstProtoRef) cst).getPrototype());
+                EncodedValueCodec.writeUnsignedIntegralValue(out, type, (long) index);
+                break;
+            }
+            case VALUE_METHOD_HANDLE: {
+                int index = file.getMethodHandles().indexOf((CstMethodHandle) cst);
+                EncodedValueCodec.writeUnsignedIntegralValue(out, type, (long) index);
+                break;
+            }
             case VALUE_STRING: {
                 int index = file.getStringIds().indexOf((CstString) cst);
                 EncodedValueCodec.writeUnsignedIntegralValue(out, type, (long) index);
@@ -231,6 +250,10 @@
             return VALUE_FLOAT;
         } else if (cst instanceof CstDouble) {
             return VALUE_DOUBLE;
+        } else if (cst instanceof CstProtoRef) {
+            return VALUE_METHOD_TYPE;
+        } else if (cst instanceof CstMethodHandle) {
+           return VALUE_METHOD_HANDLE;
         } else if (cst instanceof CstString) {
             return VALUE_STRING;
         } else if (cst instanceof CstType) {
diff --git a/dx/src/com/android/dx/rop/code/RegOps.java b/dx/src/com/android/dx/rop/code/RegOps.java
index 6b51f08..ff10691 100644
--- a/dx/src/com/android/dx/rop/code/RegOps.java
+++ b/dx/src/com/android/dx/rop/code/RegOps.java
@@ -305,6 +305,14 @@
     public static final int INVOKE_POLYMORPHIC = 58;
 
     /**
+     * {@Code Tr, T0, T1...: any types; r: Tr; m: method spec;
+     * y0: T0; y1: T1 ... :: r = m(y0, y1, ...)
+     * <b>Note:</b> The signature of the invoked target is determined by the
+     * dynamic invocation call site information.
+     */
+    public static final int INVOKE_CUSTOM = 59;
+
+    /**
      * This class is uninstantiable.
      */
     private RegOps() {
@@ -376,6 +384,7 @@
             case MOVE_RESULT_PSEUDO: return "move-result-pseudo";
             case FILL_ARRAY_DATA: return "fill-array-data";
             case INVOKE_POLYMORPHIC: return "invoke-polymorphic";
+            case INVOKE_CUSTOM: return "invoke-custom";
         }
 
         return "unknown-" + Hex.u1(opcode);
diff --git a/dx/src/com/android/dx/rop/code/Rops.java b/dx/src/com/android/dx/rop/code/Rops.java
index dfe4619..66d0ed9 100644
--- a/dx/src/com/android/dx/rop/code/Rops.java
+++ b/dx/src/com/android/dx/rop/code/Rops.java
@@ -18,6 +18,7 @@
 
 import com.android.dx.rop.cst.Constant;
 import com.android.dx.rop.cst.CstBaseMethodRef;
+import com.android.dx.rop.cst.CstCallSiteRef;
 import com.android.dx.rop.cst.CstMethodRef;
 import com.android.dx.rop.cst.CstType;
 import com.android.dx.rop.type.Prototype;
@@ -1238,6 +1239,11 @@
                 Prototype meth = proto.withFirstParameter(definer.getClassType());
                 return opInvokePolymorphic(meth);
             }
+            case RegOps.INVOKE_CUSTOM: {
+                CstCallSiteRef cstInvokeDynamicRef = (CstCallSiteRef) cst;
+                Prototype proto = cstInvokeDynamicRef.getPrototype();
+                return opInvokeCustom(proto);
+            }
         }
 
         throw new RuntimeException("unknown opcode " + RegOps.opName(opcode));
@@ -2064,6 +2070,20 @@
     }
 
     /**
+     * Returns the appropriate {@code invoke-dynamic} rop for the
+     * given type. The result is typically a newly-allocated instance.
+     *
+     * @param meth {@code non-null;} descriptor of the method, including the
+     * {@code this} parameter
+     * @return {@code non-null;} an appropriate instance
+     */
+    private static Rop opInvokeCustom(Prototype meth) {
+        return new Rop(RegOps.INVOKE_CUSTOM,
+                       meth.getParameterFrameTypes(),
+                       StdTypeList.THROWABLE);
+    }
+
+    /**
      * Returns the appropriate {@code mark-local} rop for the given type.
      * The result is a shared instance.
      *
diff --git a/dx/src/com/android/dx/rop/cst/CstArray.java b/dx/src/com/android/dx/rop/cst/CstArray.java
index 5644b2f..3aa7ab4 100644
--- a/dx/src/com/android/dx/rop/cst/CstArray.java
+++ b/dx/src/com/android/dx/rop/cst/CstArray.java
@@ -21,7 +21,7 @@
 /**
  * Constant type to represent a fixed array of other constants.
  */
-public final class CstArray extends Constant {
+public class CstArray extends Constant {
     /** {@code non-null;} the actual list of contents */
     private final List list;
 
diff --git a/dx/src/com/android/dx/rop/cst/CstCallSite.java b/dx/src/com/android/dx/rop/cst/CstCallSite.java
new file mode 100644
index 0000000..df7de9a
--- /dev/null
+++ b/dx/src/com/android/dx/rop/cst/CstCallSite.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dx.rop.cst;
+
+import com.android.dx.cf.code.BootstrapMethodArgumentsList;
+import com.android.dx.rop.type.Prototype;
+
+/**
+ * Constant type to represent a call site.
+ */
+public final class CstCallSite extends CstArray {
+    /**
+     * Creates an instance of a {@code CstCallSite}.
+     *
+     * @param bootstrapHandle {@code non-null;} the bootstrap method handle to invoke
+     * @param nat {@code non-null;} the name and type to be resolved by the bootstrap method handle
+     * @param optionalArguments {@code null-ok;} optional arguments to provide to the bootstrap
+     *     method
+     * @return a new {@code CstCallSite} instance
+     */
+    public static CstCallSite make(CstMethodHandle bootstrapHandle, CstNat nat,
+                                   BootstrapMethodArgumentsList optionalArguments) {
+        if (bootstrapHandle == null) {
+            throw new NullPointerException("bootstrapMethodHandle == null");
+        } else if (nat == null) {
+            throw new NullPointerException("nat == null");
+        }
+
+        List list = new List(3 + optionalArguments.size());
+        list.set(0, bootstrapHandle);
+        list.set(1, nat.getName());
+        list.set(2, new CstProtoRef(Prototype.fromDescriptor(nat.getDescriptor().getString())));
+        if (optionalArguments != null) {
+            for (int i = 0; i < optionalArguments.size(); ++i) {
+                list.set(i + 3, optionalArguments.get(i));
+            }
+        }
+        list.setImmutable();
+        return new CstCallSite(list);
+    }
+
+    /**
+     * Constructs an instance.
+     *
+     * @param list {@code non-null;} the actual list of contents
+     */
+    private CstCallSite(List list) {
+        super(list);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public boolean equals(Object other) {
+        if (other instanceof CstCallSite) {
+            return getList().equals(((CstCallSite) other).getList());
+        } else {
+            return false;
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public int hashCode() {
+        return getList().hashCode();
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected int compareTo0(Constant other) {
+        return getList().compareTo(((CstCallSite) other).getList());
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public String toString() {
+        return getList().toString("call site{", ", ", "}");
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public String typeName() {
+        return "call site";
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public boolean isCategory2() {
+        return false;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public String toHuman() {
+        return getList().toHuman("{", ", ", "}");
+    }
+}
diff --git a/dx/src/com/android/dx/rop/cst/CstCallSiteRef.java b/dx/src/com/android/dx/rop/cst/CstCallSiteRef.java
new file mode 100644
index 0000000..2d7c63f
--- /dev/null
+++ b/dx/src/com/android/dx/rop/cst/CstCallSiteRef.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dx.rop.cst;
+
+import com.android.dx.rop.type.Prototype;
+import com.android.dx.rop.type.Type;
+
+/**
+ * Reference to a call site. Each instance of the invoke-custom bytecode uses a unique call site
+ * reference. The call site reference becomes a call site id in the DEX file and multiple call
+ * site id's can refer to the same call site data.
+ */
+public class CstCallSiteRef extends Constant {
+
+    /** {@code non-null;} The invokedynamic constant from the classfile */
+    private final CstInvokeDynamic invokeDynamic;
+
+    /** A unique identifier to ensure the uniqueness of {@code CstCallSiteRef} instances. */
+    private final int id;
+
+    /**
+     * Constructs an instance.
+     *
+     * @param invokeDynamic {@code non-null;} an instance of invokeDynamic for reference
+     * @param id a distinguishing integer for instances referring to the same
+     *      {@code CstInvokeDynamic} instance
+     */
+    CstCallSiteRef(CstInvokeDynamic invokeDynamic, int id) {
+        if (invokeDynamic == null) {
+            throw new NullPointerException("invokeDynamic == null");
+        }
+        this.invokeDynamic = invokeDynamic;
+        this.id = id;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public boolean isCategory2() {
+        return false;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public String typeName() {
+        return "CallSiteRef";
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected int compareTo0(Constant other) {
+        CstCallSiteRef o = (CstCallSiteRef) other;
+        int result = invokeDynamic.compareTo(o.invokeDynamic);
+        if (result != 0) {
+            return result;
+        }
+        return Integer.compare(id, o.id);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public String toHuman() {
+        return getCallSite().toHuman();
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public String toString() {
+        return getCallSite().toString();
+    }
+
+    /**
+     * Gets the prototype of the method handle resolved at the call site.
+     *
+     * @return the prototype associated with the call site invocation
+     */
+    public Prototype getPrototype() {
+        return invokeDynamic.getPrototype();
+    }
+
+    /**
+     * Gets the return type of the method handle resolved at the call site.
+     *
+     * @return the return type associated with the call site invocation
+     */
+    public Type getReturnType() {
+        return invokeDynamic.getReturnType();
+    }
+
+    /**
+     * Gets the {@code CstCallSite} that this instance refers to.
+     *
+     * @return {@code null-ok;} the call site associated with this instance
+     */
+    public CstCallSite getCallSite() {
+        return invokeDynamic.getCallSite();
+    }
+}
diff --git a/dx/src/com/android/dx/rop/cst/CstInvokeDynamic.java b/dx/src/com/android/dx/rop/cst/CstInvokeDynamic.java
index 7d4f97a..2ef0b2c 100644
--- a/dx/src/com/android/dx/rop/cst/CstInvokeDynamic.java
+++ b/dx/src/com/android/dx/rop/cst/CstInvokeDynamic.java
@@ -16,16 +16,33 @@
 
 package com.android.dx.rop.cst;
 
+import com.android.dx.rop.type.Prototype;
+import com.android.dx.rop.type.Type;
+import java.util.ArrayList;
+import java.util.List;
+
 /**
- * Constants of type {@code InvokeDynamic}.
+ * Constants of type {@code InvokeDynamic}. These are present in the class file.
  */
 public final class CstInvokeDynamic extends Constant {
 
     /** The index of the bootstrap method in the bootstrap method table */
     private final int bootstrapMethodIndex;
+
     /** {@code non-null;} the name and type */
     private final CstNat nat;
 
+    /** {@code non-null;} the prototype derived from {@code nat} */
+    private final Prototype prototype;
+
+    /** {@code null-ok;} the class declaring invoke dynamic instance */
+    private CstType declaringClass;
+
+    /** {@code null-ok;} the associated call site */
+    private CstCallSite callSite;
+
+    /** {@code non-null;} list of references to this {@code CstInvokeDynamic} constant */
+    private final List<CstCallSiteRef> references;
 
     /**
      * Makes an instance for the given value. This may (but does not
@@ -48,8 +65,31 @@
     private CstInvokeDynamic(int bootstrapMethodIndex, CstNat nat) {
         this.bootstrapMethodIndex = bootstrapMethodIndex;
         this.nat = nat;
+        this.prototype = Prototype.fromDescriptor(nat.getDescriptor().toHuman());
+        this.references = new ArrayList<>();
     }
 
+    /**
+     * Creates a {@code CstCallSiteRef} that refers to this instance.
+     *
+     * @return {@code non-null;} a reference to this instance
+     */
+    public CstCallSiteRef addReference() {
+        CstCallSiteRef ref = new CstCallSiteRef(this, references.size());
+        references.add(ref);
+        return ref;
+    }
+
+    /**
+     * Gets the list of references to this instance.
+     *
+     * @return {@code non-null;} the list of references to this instance
+     */
+    public List<CstCallSiteRef> getReferences() {
+        return references;
+    }
+
+    /** {@inheritDoc} */
     @Override
     public String toString() {
         return toHuman();
@@ -64,7 +104,36 @@
     /** {@inheritDoc} */
     @Override
     public String toHuman() {
-        return "InvokeDynamic(" + bootstrapMethodIndex + ", " + nat.toHuman() + ")";
+        String klass = (declaringClass != null) ? declaringClass.toHuman() : "Unknown";
+        return "InvokeDynamic(" + klass + ":" + bootstrapMethodIndex + ", " + nat.toHuman() + ")";
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public boolean isCategory2() {
+        return false;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected int compareTo0(Constant other) {
+        CstInvokeDynamic otherInvoke = (CstInvokeDynamic) other;
+        int result = Integer.compare(bootstrapMethodIndex, otherInvoke.getBootstrapMethodIndex());
+        if (result != 0) {
+            return result;
+        }
+
+        result = nat.compareTo(otherInvoke.getNat());
+        if (result != 0) {
+            return result;
+        }
+
+        result = declaringClass.compareTo(otherInvoke.getDeclaringClass());
+        if (result != 0) {
+            return result;
+        }
+
+        return callSite.compareTo(otherInvoke.getCallSite());
     }
 
     /**
@@ -73,7 +142,7 @@
      * @return the bootstrap method index
      */
     public int getBootstrapMethodIndex() {
-      return bootstrapMethodIndex;
+        return bootstrapMethodIndex;
     }
 
     /**
@@ -82,21 +151,74 @@
      * @return the name and type
      */
     public CstNat getNat() {
-      return nat;
+        return nat;
     }
 
-    @Override
-    public boolean isCategory2() {
-        return false;
+    /**
+     * Gets the {@code Prototype} of the {@code invokedynamic} call site.
+     *
+     * @return the {@code invokedynamic} call site prototype
+     */
+    public Prototype getPrototype() {
+        return prototype;
     }
 
-    @Override
-    protected int compareTo0(Constant other) {
-        CstInvokeDynamic otherInvoke = (CstInvokeDynamic) other;
-        if (bootstrapMethodIndex == otherInvoke.getBootstrapMethodIndex()) {
-            return nat.compareTo(otherInvoke.getNat());
-        } else {
-            return Integer.compare(bootstrapMethodIndex, otherInvoke.getBootstrapMethodIndex());
+    /**
+     * Gets the return type.
+     *
+     * @return {@code non-null;} the return type
+     */
+    public Type getReturnType() {
+        return prototype.getReturnType();
+    }
+
+    /**
+     * Sets the declaring class of this instance.
+     *
+     * This is a set-once property.
+     *
+     * @param declaringClass {@code non-null;} the declaring class
+     */
+    public void setDeclaringClass(CstType declaringClass) {
+        if (this.declaringClass != null) {
+            throw new IllegalArgumentException("already added declaring class");
+        } else if (declaringClass == null) {
+            throw new NullPointerException("declaringClass == null");
         }
+        this.declaringClass = declaringClass;
+    }
+
+    /**
+     * Gets the declaring class of this instance.
+     *
+     * @return the declaring class
+     */
+    public CstType getDeclaringClass() {
+        return declaringClass;
+    }
+
+    /**
+     * Sets the call site associated with this instance.
+     *
+     * This is set-once property.
+     *
+     * @param callSite {@code non-null;} the call site created for this instance
+     */
+    public void setCallSite(CstCallSite callSite) {
+        if (this.callSite != null) {
+            throw new IllegalArgumentException("already added call site");
+        } else if (callSite == null) {
+            throw new NullPointerException("callSite == null");
+        }
+        this.callSite = callSite;
+    }
+
+    /**
+     * Gets the call site associated with this instance.
+     *
+     * @return the call site associated with this instance
+     */
+    public CstCallSite getCallSite() {
+        return callSite;
     }
 }
diff --git a/dx/src/com/android/dx/rop/cst/CstMethodHandle.java b/dx/src/com/android/dx/rop/cst/CstMethodHandle.java
index d5e0f73..d571b5e 100644
--- a/dx/src/com/android/dx/rop/cst/CstMethodHandle.java
+++ b/dx/src/com/android/dx/rop/cst/CstMethodHandle.java
@@ -21,62 +21,63 @@
  */
 public final class CstMethodHandle extends Constant {
 
-    public static final int KIND_GETFIELD = 1;
-    public static final int KIND_GETSTATIC = 2;
-    public static final int KIND_PUTFIELD = 3;
-    public static final int KIND_PUTSTATIC = 4;
-    public static final int KIND_INVOKEVIRTUAL = 5;
-    public static final int KIND_INVOKESTATIC = 6;
-    public static final int KIND_INVOKESPECIAL = 7;
-    public static final int KIND_NEWINVOKESPECIAL = 8;
-    public static final int KIND_INVOKEINTERFACE = 9;
+    public static final int METHOD_HANDLE_TYPE_STATIC_PUT = 0;
+    public static final int METHOD_HANDLE_TYPE_STATIC_GET = 1;
+    public static final int METHOD_HANDLE_TYPE_INSTANCE_PUT = 2;
+    public static final int METHOD_HANDLE_TYPE_INSTANCE_GET = 3;
 
-    /** The kind of MethodHandle */
-    private int kind;
+    public static final int METHOD_HANDLE_TYPE_INVOKE_STATIC = 4;
+    public static final int METHOD_HANDLE_TYPE_INVOKE_INSTANCE = 5;
+    public static final int METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR = 6;
+    public static final int METHOD_HANDLE_TYPE_INVOKE_DIRECT = 7;
+    public static final int METHOD_HANDLE_TYPE_INVOKE_INTERFACE = 8;
+
+    private static final String [] TYPE_NAMES = {
+        "static-put", "static-get", "instance-put", "instance-get",
+        "invoke-static", "invoke-instance", "invoke-constructor", "invoke-direct",
+        "invoke-interface"
+    };
+
+    /** The type of MethodHandle */
+    private final int type;
+
     /** {@code non-null;} the referenced constant */
     private final Constant ref;
 
-
     /**
      * Makes an instance for the given value. This may (but does not
      * necessarily) return an already-allocated instance.
      *
-     * @param kind the kind of this handle
-     * @param ref the actual referenced constant
+     * @param type the type of this handle
+     * @param ref {@code non-null;} the referenced field or method constant
      * @return {@code non-null;} the appropriate instance
      */
-    public static CstMethodHandle make(int kind, Constant ref) {
-        return new CstMethodHandle(kind, ref);
+    public static CstMethodHandle make(int type, Constant ref) {
+        if (isAccessor(type)) {
+            if (!(ref instanceof CstFieldRef)) {
+                throw new IllegalArgumentException("ref has wrong type: " + ref.getClass());
+            }
+        } else if (isInvocation(type)) {
+            if (!(ref instanceof CstBaseMethodRef)) {
+                throw new IllegalArgumentException("ref has wrong type: " + ref.getClass());
+            }
+        } else {
+            throw new IllegalArgumentException("type is out of range: " + type);
+        }
+        return new CstMethodHandle(type, ref);
     }
 
     /**
      * Constructs an instance. This constructor is private; use {@link #make}.
      *
-     * @param kind the kind of this handle
+     * @param type the type of this handle
      * @param ref the actual referenced constant
      */
-    private CstMethodHandle(int kind, Constant ref) {
-        this.kind = kind;
+    private CstMethodHandle(int type, Constant ref) {
+        this.type = type;
         this.ref = ref;
     }
 
-    @Override
-    public String toString() {
-        return ref.toString();
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public String typeName() {
-        return "method handle";
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public String toHuman() {
-        return toString();
-    }
-
     /**
      * Gets the actual constant.
      *
@@ -87,26 +88,111 @@
     }
 
     /**
-     * Gets the kind of this method handle.
+     * Gets the type of this method handle.
      *
-     * @return the kind
+     * @return the type
      */
-    public int getKind() {
-        return kind;
+    public int getType() {
+        return type;
     }
 
+    /**
+     * Reports whether the method handle type is a field accessor.
+     *
+     * @param type the method handle type
+     * @return true if the method handle type is a field accessor, false otherwise
+     */
+    public static boolean isAccessor(int type) {
+        switch (type) {
+            case METHOD_HANDLE_TYPE_STATIC_PUT:
+            case METHOD_HANDLE_TYPE_STATIC_GET:
+            case METHOD_HANDLE_TYPE_INSTANCE_PUT:
+            case METHOD_HANDLE_TYPE_INSTANCE_GET:
+                return true;
+            default:
+                return false;
+        }
+    }
+
+    /**
+     * Reports whether the method handle is a field accessor.
+     *
+     * @return true if the method handle is a field accessor, false otherwise
+     */
+    public boolean isAccessor() {
+        return isAccessor(type);
+    }
+
+    /**
+     * Reports whether the method handle type is a method invocation.
+     *
+     * @param type the method handle type
+     * @return true if the method handle type is a method invocation, false otherwise
+     */
+    public static boolean isInvocation(int type) {
+        switch (type) {
+            case METHOD_HANDLE_TYPE_INVOKE_STATIC:
+            case METHOD_HANDLE_TYPE_INVOKE_INSTANCE:
+            case METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR:
+            case METHOD_HANDLE_TYPE_INVOKE_DIRECT:
+            case METHOD_HANDLE_TYPE_INVOKE_INTERFACE:
+                return true;
+            default:
+                return false;
+        }
+    }
+
+    /**
+     * Reports whether the method handle is a method invocation.
+     *
+     * @return true if the method handle is a method invocation, false otherwise
+     */
+    public boolean isInvocation() {
+        return isInvocation(type);
+    }
+
+    /**
+     * Gets a human readable name for a method handle type.
+     *
+     * @param type the method handle type
+     * @return the string representation of the type
+     */
+    private static String getTypeName(final int type) {
+        return TYPE_NAMES[type];
+    }
+
+    /** {@inheritDoc} */
     @Override
     public boolean isCategory2() {
         return false;
     }
 
+    /** {@inheritDoc} */
     @Override
     protected int compareTo0(Constant other) {
         CstMethodHandle otherHandle = (CstMethodHandle) other;
-        if (getKind() == otherHandle.getKind()) {
+        if (getType() == otherHandle.getType()) {
             return getRef().compareTo(otherHandle.getRef());
         } else {
-            return Integer.compare(getKind(), otherHandle.getKind());
+            return Integer.compare(getType(), otherHandle.getType());
         }
     }
+
+    /** {@inheritDoc} */
+    @Override
+    public String toString() {
+        return "method-handle{" + toHuman() + "}";
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public String typeName() {
+        return "method handle";
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public String toHuman() {
+        return getTypeName(type)+ "," + ref.toString();
+    }
 }
diff --git a/dx/tests/135-invoke-custom/build b/dx/tests/135-invoke-custom/build
new file mode 100755
index 0000000..4d7c400
--- /dev/null
+++ b/dx/tests/135-invoke-custom/build
@@ -0,0 +1,38 @@
+#!/bin/bash
+#
+# Copyright (C) 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+function fail() {
+  echo Build failed: $1 1>&2
+  exit 1
+}
+
+if [[ -z "${ANDROID_BUILD_TOP}" ]]; then
+  fail "ANDROID_BUILD_TOP is not defined. Try running 'lunch' first."
+fi
+
+SCRIPT_PATH=$( cd $(dirname $0) ; pwd -P )
+ASM_CLASSPATH="${ANDROID_BUILD_TOP}/prebuilts/misc/common/asm/asm-5.2.jar"
+SRC_PATH="${SCRIPT_PATH}/src"
+BUILD_PATH="${SCRIPT_PATH}/classes"
+JAR_FILE="${SCRIPT_PATH}/invokecustom.jar"
+
+if [[ ! -d "${BUILD_PATH}" ]]; then
+    mkdir "$BUILD_PATH" || exit 1
+fi
+
+(cd "${SRC_PATH}" && javac -cp "${ASM_CLASSPATH}" -d "${BUILD_PATH}" invokecustom/*.java) || fail "javac error"
+(cd "${SCRIPT_PATH}" && java -cp "${ASM_CLASSPATH}:${BUILD_PATH}" invokecustom.TestGenerator "${BUILD_PATH}") || fail "generator failure"
+(cd "${BUILD_PATH}" && jar cf "${JAR_FILE}" invokecustom/InvokeCustom.class invokecustom/Super.class ) || fail "jar creation error"
diff --git a/dx/tests/135-invoke-custom/expected.txt b/dx/tests/135-invoke-custom/expected.txt
new file mode 100644
index 0000000..b640ab6
--- /dev/null
+++ b/dx/tests/135-invoke-custom/expected.txt
@@ -0,0 +1,5653 @@
+Trying SDK version 25 with invoke-custom.
+Uncaught translation error: com.android.dx.cf.code.SimException: signature-polymorphic method called without --min-sdk-version >= 26
+1 error; aborting
+Trying SDK version 26 with invoke-custom.
+000000: 6465 780a 3033 3800     |magic: "dex\n038\0"
+000008: 30cb 876b               |checksum
+00000c: 3330 23e0 aced ea8b 1c55|signature
+000016: 185c 9748 1d8e cdae 8efd|
+000020: 981e 0000               |file_size:       00001e98
+000024: 7000 0000               |header_size:     00000070
+000028: 7856 3412               |endian_tag:      12345678
+00002c: 0000 0000               |link_size:       0
+000030: 0000 0000               |link_off:        0
+000034: b01d 0000               |map_off:         00001db0
+000038: 8700 0000               |string_ids_size: 00000087
+00003c: 7000 0000               |string_ids_off:  00000070
+000040: 1e00 0000               |type_ids_size:   0000001e
+000044: 8c02 0000               |type_ids_off:    0000028c
+000048: 2400 0000               |proto_ids_size:  00000024
+00004c: 0403 0000               |proto_ids_off:   00000304
+000050: 0300 0000               |field_ids_size:  00000003
+000054: b404 0000               |field_ids_off:   000004b4
+000058: 4100 0000               |method_ids_size: 00000041
+00005c: cc04 0000               |method_ids_off:  000004cc
+000060: 0200 0000               |class_defs_size: 00000002
+000064: d406 0000               |class_defs_off:  000006d4
+000068: c816 0000               |data_size:       000016c8
+00006c: d007 0000               |data_off:        000007d0
+                                |
+                                |string_ids:
+                                |[0] " "
+000070: e613 0000               |  string_data_off: 000013e6
+                                |[1] " != "
+000074: e913 0000               |  string_data_off: 000013e9
+                                |[2] " * "
+000078: ef13 0000               |  string_data_off: 000013ef
+                                |[3] " + "
+00007c: f413 0000               |  string_data_off: 000013f4
+                                |[4] " = "
+000080: f913 0000               |  string_data_off: 000013f9
+                                |[5] " expected "
+000084: fe13 0000               |  string_data_off: 000013fe
+                                |[6] " new "
+000088: 0a14 0000               |  string_data_off: 0000140a
+                                |[7] ")"
+00008c: 1114 0000               |  string_data_off: 00001411
+                                |[8] ", "
+000090: 1414 0000               |  string_data_off: 00001414
+                                |[9] "<clinit>"
+000094: 1814 0000               |  string_data_off: 00001418
+                                |[a] "<init>"
+000098: 2214 0000               |  string_data_off: 00001422
+                                |[b] "B"
+00009c: 2a14 0000               |  string_data_off: 0000142a
+                                |[c] "C"
+0000a0: 2d14 0000               |  string_data_off: 0000142d
+                                |[d] "D"
+0000a4: 3014 0000               |  string_data_off: 00001430
+                                |[e] "DFFD"
+0000a8: 3314 0000               |  string_data_off: 00001433
+                                |[f] "Dupe first invokedynamic invocation"
+0000ac: 3914 0000               |  string_data_off: 00001439
+                                |[10] "ERROR"
+0000b0: 5e14 0000               |  string_data_off: 0000145e
+                                |[11] "F"
+0000b4: 6514 0000               |  string_data_off: 00001465
+                                |[12] "FL"
+0000b8: 6814 0000               |  string_data_off: 00001468
+                                |[13] "Failed "
+0000bc: 6c14 0000               |  string_data_off: 0000146c
+                                |[14] "First invokedynamic invocation"
+0000c0: 7514 0000               |  string_data_off: 00001475
+                                |[15] "Hello World!"
+0000c4: 9514 0000               |  string_data_off: 00001495
+                                |[16] "I"
+0000c8: a314 0000               |  string_data_off: 000014a3
+                                |[17] "IIII"
+0000cc: a614 0000               |  string_data_off: 000014a6
+                                |[18] "InvokeCustom.<init>("
+0000d0: ac14 0000               |  string_data_off: 000014ac
+                                |[19] "InvokeCustom.java"
+0000d4: c214 0000               |  string_data_off: 000014c2
+                                |[1a] "J"
+0000d8: d514 0000               |  string_data_off: 000014d5
+                                |[1b] "JJJJ"
+0000dc: d814 0000               |  string_data_off: 000014d8
+                                |[1c] "L"
+0000e0: de14 0000               |  string_data_off: 000014de
+                                |[1d] "LD"
+0000e4: e114 0000               |  string_data_off: 000014e1
+                                |[1e] "LF"
+0000e8: e514 0000               |  string_data_off: 000014e5
+                                |[1f] "LI"
+0000ec: e914 0000               |  string_data_off: 000014e9
+                                |[20] "LJ"
+0000f0: ed14 0000               |  string_data_off: 000014ed
+                                |[21] "LL"
+0000f4: f114 0000               |  string_data_off: 000014f1
+                                |[22] "LLLL"
+0000f8: f514 0000               |  string_data_off: 000014f5
+                                |[23] "LLLLIJFD"
+0000fc: fb14 0000               |  string_data_off: 000014fb
+                                |[24] "LLLLL"
+000100: 0515 0000               |  string_data_off: 00001505
+                                |[25] "LLLLLLLLLLL"
+000104: 0c15 0000               |  string_data_off: 0000150c
+                                |[26] "Ldalvik/annotation/Throws;"
+000108: 1915 0000               |  string_data_off: 00001519
+                                |[27] "Linvokecustom/InvokeCustom;"
+00010c: 3515 0000               |  string_data_off: 00001535
+                                |[28] "Linvokecustom/Super;"
+000110: 5215 0000               |  string_data_off: 00001552
+                                |[29] "Ljava/io/PrintStream;"
+000114: 6815 0000               |  string_data_off: 00001568
+                                |[2a] "Ljava/lang/Class;"
+000118: 7f15 0000               |  string_data_off: 0000157f
+                                |[2b] "Ljava/lang/IllegalAccessException;"
+00011c: 9215 0000               |  string_data_off: 00001592
+                                |[2c] "Ljava/lang/NoSuchMethodException;"
+000120: b615 0000               |  string_data_off: 000015b6
+                                |[2d] "Ljava/lang/Object;"
+000124: d915 0000               |  string_data_off: 000015d9
+                                |[2e] "Ljava/lang/Runnable;"
+000128: ed15 0000               |  string_data_off: 000015ed
+                                |[2f] "Ljava/lang/String;"
+00012c: 0316 0000               |  string_data_off: 00001603
+                                |[30] "Ljava/lang/StringBuilder;"
+000130: 1716 0000               |  string_data_off: 00001617
+                                |[31] "Ljava/lang/System;"
+000134: 3216 0000               |  string_data_off: 00001632
+                                |[32] "Ljava/lang/Throwable;"
+000138: 4616 0000               |  string_data_off: 00001646
+                                |[33] "Ljava/lang/invoke/CallSite;"
+00013c: 5d16 0000               |  string_data_off: 0000165d
+                                |[34] "Ljava/lang/invoke/ConstantCallSite;"
+000140: 7a16 0000               |  string_data_off: 0000167a
+                                |[35] "Ljava/lang/invoke/MethodHandle;"
+000144: 9f16 0000               |  string_data_off: 0000169f
+                                |[36] "Ljava/lang/invoke/MethodHandles$Lookup;"
+000148: c016 0000               |  string_data_off: 000016c0
+                                |[37] "Ljava/lang/invoke/MethodHandles;"
+00014c: e916 0000               |  string_data_off: 000016e9
+                                |[38] "Ljava/lang/invoke/MethodType;"
+000150: 0b17 0000               |  string_data_off: 0000170b
+                                |[39] "OK"
+000154: 2a17 0000               |  string_data_off: 0000172a
+                                |[3a] "S"
+000158: 2e17 0000               |  string_data_off: 0000172e
+                                |[3b] "Second invokedynamic invocation"
+00015c: 3117 0000               |  string_data_off: 00001731
+                                |[3c] "String"
+000160: 5217 0000               |  string_data_off: 00001752
+                                |[3d] "V"
+000164: 5a17 0000               |  string_data_off: 0000175a
+                                |[3e] "VC"
+000168: 5d17 0000               |  string_data_off: 0000175d
+                                |[3f] "VD"
+00016c: 6117 0000               |  string_data_off: 00001761
+                                |[40] "VF"
+000170: 6517 0000               |  string_data_off: 00001765
+                                |[41] "VI"
+000174: 6917 0000               |  string_data_off: 00001769
+                                |[42] "VJ"
+000178: 6d17 0000               |  string_data_off: 0000176d
+                                |[43] "VL"
+00017c: 7117 0000               |  string_data_off: 00001771
+                                |[44] "VLF"
+000180: 7517 0000               |  string_data_off: 00001775
+                                |[45] "VLL"
+000184: 7a17 0000               |  string_data_off: 0000177a
+                                |[46] "VZ"
+000188: 7f17 0000               |  string_data_off: 0000177f
+                                |[47] "VZBCSIFJDL"
+00018c: 8317 0000               |  string_data_off: 00001783
+                                |[48] "Z"
+000190: 8f17 0000               |  string_data_off: 0000178f
+                                |[49] "[Ljava/lang/Object;"
+000194: 9217 0000               |  string_data_off: 00001792
+                                |[4a] "[Ljava/lang/String;"
+000198: a717 0000               |  string_data_off: 000017a7
+                                |[4b] "]"
+00019c: bc17 0000               |  string_data_off: 000017bc
+                                |[4c] "append"
+0001a0: bf17 0000               |  string_data_off: 000017bf
+                                |[4d] "asType"
+0001a4: c717 0000               |  string_data_off: 000017c7
+                                |[4e] "bsmCreateCallSite"
+0001a8: cf17 0000               |  string_data_off: 000017cf
+                                |[4f] "bsmCreateCallSite ["
+0001ac: e217 0000               |  string_data_off: 000017e2
+                                |[50] "bsmLookupStatic"
+0001b0: f717 0000               |  string_data_off: 000017f7
+                                |[51] "bsmLookupStatic []"
+0001b4: 0818 0000               |  string_data_off: 00001808
+                                |[52] "bsmLookupStaticWithExtraArgs"
+0001b8: 1c18 0000               |  string_data_off: 0000181c
+                                |[53] "bsmLookupStaticWithExtraArgs ["
+0001bc: 3a18 0000               |  string_data_off: 0000183a
+                                |[54] "bsmLookupTest9"
+0001c0: 5a18 0000               |  string_data_off: 0000185a
+                                |[55] "bsmLookupTest9 ["
+0001c4: 6a18 0000               |  string_data_off: 0000186a
+                                |[56] "checkFieldTest9"
+0001c8: 7c18 0000               |  string_data_off: 0000187c
+                                |[57] "checkFieldTest9: old "
+0001cc: 8d18 0000               |  string_data_off: 0000188d
+                                |[58] "checkStaticFieldTest9"
+0001d0: a418 0000               |  string_data_off: 000018a4
+                                |[59] "checkStaticFieldTest9: old "
+0001d4: bb18 0000               |  string_data_off: 000018bb
+                                |[5a] "fieldTest9"
+0001d8: d818 0000               |  string_data_off: 000018d8
+                                |[5b] "findStatic"
+0001dc: e418 0000               |  string_data_off: 000018e4
+                                |[5c] "helperMethodTest9"
+0001e0: f018 0000               |  string_data_off: 000018f0
+                                |[5d] "helperMethodTest9 in "
+0001e4: 0319 0000               |  string_data_off: 00001903
+                                |[5e] "invoke"
+0001e8: 1a19 0000               |  string_data_off: 0000191a
+                                |[5f] "invokeExact"
+0001ec: 2219 0000               |  string_data_off: 00001922
+                                |[60] "lookup"
+0001f0: 2f19 0000               |  string_data_off: 0000192f
+                                |[61] "lookupClass"
+0001f4: 3719 0000               |  string_data_off: 00001937
+                                |[62] "main"
+0001f8: 4419 0000               |  string_data_off: 00001944
+                                |[63] "out"
+0001fc: 4a19 0000               |  string_data_off: 0000194a
+                                |[64] "print"
+000200: 4f19 0000               |  string_data_off: 0000194f
+                                |[65] "println"
+000204: 5619 0000               |  string_data_off: 00001956
+                                |[66] "run"
+000208: 5f19 0000               |  string_data_off: 0000195f
+                                |[67] "run() for Test9"
+00020c: 6419 0000               |  string_data_off: 00001964
+                                |[68] "staticFieldTest9"
+000210: 7519 0000               |  string_data_off: 00001975
+                                |[69] "targetMethodTest1"
+000214: 8719 0000               |  string_data_off: 00001987
+                                |[6a] "targetMethodTest2"
+000218: 9a19 0000               |  string_data_off: 0000199a
+                                |[6b] "targetMethodTest3"
+00021c: ad19 0000               |  string_data_off: 000019ad
+                                |[6c] "targetMethodTest3 from InvokeCustom"
+000220: c019 0000               |  string_data_off: 000019c0
+                                |[6d] "targetMethodTest4"
+000224: e519 0000               |  string_data_off: 000019e5
+                                |[6e] "targetMethodTest4 from InvokeCustom (oops!)"
+000228: f819 0000               |  string_data_off: 000019f8
+                                |[6f] "targetMethodTest4 from Super"
+00022c: 251a 0000               |  string_data_off: 00001a25
+                                |[70] "targetMethodTest5"
+000230: 431a 0000               |  string_data_off: 00001a43
+                                |[71] "targetMethodTest5 "
+000234: 561a 0000               |  string_data_off: 00001a56
+                                |[72] "targetMethodTest5 returned: "
+000238: 6a1a 0000               |  string_data_off: 00001a6a
+                                |[73] "targetMethodTest6"
+00023c: 881a 0000               |  string_data_off: 00001a88
+                                |[74] "targetMethodTest6 "
+000240: 9b1a 0000               |  string_data_off: 00001a9b
+                                |[75] "targetMethodTest6 returned: "
+000244: af1a 0000               |  string_data_off: 00001aaf
+                                |[76] "targetMethodTest7"
+000248: cd1a 0000               |  string_data_off: 00001acd
+                                |[77] "targetMethodTest7 "
+00024c: e01a 0000               |  string_data_off: 00001ae0
+                                |[78] "targetMethodTest8"
+000250: f41a 0000               |  string_data_off: 00001af4
+                                |[79] "targetMethodTest8 "
+000254: 071b 0000               |  string_data_off: 00001b07
+                                |[7a] "targetMethodTest9"
+000258: 1b1b 0000               |  string_data_off: 00001b1b
+                                |[7b] "targetMethodTest9()"
+00025c: 2e1b 0000               |  string_data_off: 00001b2e
+                                |[7c] "test1"
+000260: 431b 0000               |  string_data_off: 00001b43
+                                |[7d] "test2"
+000264: 4a1b 0000               |  string_data_off: 00001b4a
+                                |[7e] "test3"
+000268: 511b 0000               |  string_data_off: 00001b51
+                                |[7f] "test4"
+00026c: 581b 0000               |  string_data_off: 00001b58
+                                |[80] "test5"
+000270: 5f1b 0000               |  string_data_off: 00001b5f
+                                |[81] "test6"
+000274: 661b 0000               |  string_data_off: 00001b66
+                                |[82] "test7"
+000278: 6d1b 0000               |  string_data_off: 00001b6d
+                                |[83] "test8"
+00027c: 741b 0000               |  string_data_off: 00001b74
+                                |[84] "test9"
+000280: 7b1b 0000               |  string_data_off: 00001b7b
+                                |[85] "toString"
+000284: 821b 0000               |  string_data_off: 00001b82
+                                |[86] "value"
+000288: 8c1b 0000               |  string_data_off: 00001b8c
+                                |
+                                |type_ids:
+                                |[0] B
+00028c: 0b00 0000               |  descriptor_idx: 0000000b
+                                |[1] C
+000290: 0c00 0000               |  descriptor_idx: 0000000c
+                                |[2] D
+000294: 0d00 0000               |  descriptor_idx: 0000000d
+                                |[3] F
+000298: 1100 0000               |  descriptor_idx: 00000011
+                                |[4] I
+00029c: 1600 0000               |  descriptor_idx: 00000016
+                                |[5] J
+0002a0: 1a00 0000               |  descriptor_idx: 0000001a
+                                |[6] Ldalvik/annotation/Throws;
+0002a4: 2600 0000               |  descriptor_idx: 00000026
+                                |[7] Linvokecustom/InvokeCustom;
+0002a8: 2700 0000               |  descriptor_idx: 00000027
+                                |[8] Linvokecustom/Super;
+0002ac: 2800 0000               |  descriptor_idx: 00000028
+                                |[9] Ljava/io/PrintStream;
+0002b0: 2900 0000               |  descriptor_idx: 00000029
+                                |[a] Ljava/lang/Class;
+0002b4: 2a00 0000               |  descriptor_idx: 0000002a
+                                |[b] Ljava/lang/IllegalAccessException;
+0002b8: 2b00 0000               |  descriptor_idx: 0000002b
+                                |[c] Ljava/lang/NoSuchMethodException;
+0002bc: 2c00 0000               |  descriptor_idx: 0000002c
+                                |[d] Ljava/lang/Object;
+0002c0: 2d00 0000               |  descriptor_idx: 0000002d
+                                |[e] Ljava/lang/Runnable;
+0002c4: 2e00 0000               |  descriptor_idx: 0000002e
+                                |[f] Ljava/lang/String;
+0002c8: 2f00 0000               |  descriptor_idx: 0000002f
+                                |[10] Ljava/lang/StringBuilder;
+0002cc: 3000 0000               |  descriptor_idx: 00000030
+                                |[11] Ljava/lang/System;
+0002d0: 3100 0000               |  descriptor_idx: 00000031
+                                |[12] Ljava/lang/Throwable;
+0002d4: 3200 0000               |  descriptor_idx: 00000032
+                                |[13] Ljava/lang/invoke/CallSite;
+0002d8: 3300 0000               |  descriptor_idx: 00000033
+                                |[14] Ljava/lang/invoke/ConstantCallSite;
+0002dc: 3400 0000               |  descriptor_idx: 00000034
+                                |[15] Ljava/lang/invoke/MethodHandle;
+0002e0: 3500 0000               |  descriptor_idx: 00000035
+                                |[16] Ljava/lang/invoke/MethodHandles$Lookup;
+0002e4: 3600 0000               |  descriptor_idx: 00000036
+                                |[17] Ljava/lang/invoke/MethodHandles;
+0002e8: 3700 0000               |  descriptor_idx: 00000037
+                                |[18] Ljava/lang/invoke/MethodType;
+0002ec: 3800 0000               |  descriptor_idx: 00000038
+                                |[19] S
+0002f0: 3a00 0000               |  descriptor_idx: 0000003a
+                                |[1a] V
+0002f4: 3d00 0000               |  descriptor_idx: 0000003d
+                                |[1b] Z
+0002f8: 4800 0000               |  descriptor_idx: 00000048
+                                |[1c] [Ljava/lang/Object;
+0002fc: 4900 0000               |  descriptor_idx: 00000049
+                                |[1d] [Ljava/lang/String;
+000300: 4a00 0000               |  descriptor_idx: 0000004a
+                                |
+                                |proto_ids:
+                                |[0] double proto(float, float, double)
+000304: 0e00 0000               |  shorty_idx:      0000000e // "DFFD"
+000308: 0200 0000               |  return_type_idx: 00000002 // double
+00030c: e412 0000               |  parameters_off:  000012e4
+                                |[1] float proto(invokecustom.InvokeCustom)
+000310: 1200 0000               |  shorty_idx:      00000012 // "FL"
+000314: 0300 0000               |  return_type_idx: 00000003 // float
+000318: f012 0000               |  parameters_off:  000012f0
+                                |[2] int proto()
+00031c: 1600 0000               |  shorty_idx:      00000016 // "I"
+000320: 0400 0000               |  return_type_idx: 00000004 // int
+000324: 0000 0000               |  parameters_off:  00000000
+                                |[3] int proto(int, int, int)
+000328: 1700 0000               |  shorty_idx:      00000017 // "IIII"
+00032c: 0400 0000               |  return_type_idx: 00000004 // int
+000330: f812 0000               |  parameters_off:  000012f8
+                                |[4] long proto(long, long, long)
+000334: 1b00 0000               |  shorty_idx:      0000001b // "JJJJ"
+000338: 0500 0000               |  return_type_idx: 00000005 // long
+00033c: 0413 0000               |  parameters_off:  00001304
+                                |[5] invokecustom.InvokeCustom proto(int)
+000340: 1f00 0000               |  shorty_idx:      0000001f // "LI"
+000344: 0700 0000               |  return_type_idx: 00000007 // invokecustom.InvokeCustom
+000348: 1013 0000               |  parameters_off:  00001310
+                                |[6] java.lang.Class proto()
+00034c: 1c00 0000               |  shorty_idx:      0000001c // "L"
+000350: 0a00 0000               |  return_type_idx: 0000000a // java.lang.Class
+000354: 0000 0000               |  parameters_off:  00000000
+                                |[7] java.lang.Object proto(java.lang.Object[])
+000358: 2100 0000               |  shorty_idx:      00000021 // "LL"
+00035c: 0d00 0000               |  return_type_idx: 0000000d // java.lang.Object
+000360: 1813 0000               |  parameters_off:  00001318
+                                |[8] java.lang.String proto()
+000364: 1c00 0000               |  shorty_idx:      0000001c // "L"
+000368: 0f00 0000               |  return_type_idx: 0000000f // java.lang.String
+00036c: 0000 0000               |  parameters_off:  00000000
+                                |[9] java.lang.StringBuilder proto(double)
+000370: 1d00 0000               |  shorty_idx:      0000001d // "LD"
+000374: 1000 0000               |  return_type_idx: 00000010 // java.lang.StringBuilder
+000378: 2013 0000               |  parameters_off:  00001320
+                                |[a] java.lang.StringBuilder proto(float)
+00037c: 1e00 0000               |  shorty_idx:      0000001e // "LF"
+000380: 1000 0000               |  return_type_idx: 00000010 // java.lang.StringBuilder
+000384: 2813 0000               |  parameters_off:  00001328
+                                |[b] java.lang.StringBuilder proto(int)
+000388: 1f00 0000               |  shorty_idx:      0000001f // "LI"
+00038c: 1000 0000               |  return_type_idx: 00000010 // java.lang.StringBuilder
+000390: 1013 0000               |  parameters_off:  00001310
+                                |[c] java.lang.StringBuilder proto(long)
+000394: 2000 0000               |  shorty_idx:      00000020 // "LJ"
+000398: 1000 0000               |  return_type_idx: 00000010 // java.lang.StringBuilder
+00039c: 3013 0000               |  parameters_off:  00001330
+                                |[d] java.lang.StringBuilder proto(java.lang.Object)
+0003a0: 2100 0000               |  shorty_idx:      00000021 // "LL"
+0003a4: 1000 0000               |  return_type_idx: 00000010 // java.lang.StringBuilder
+0003a8: 3813 0000               |  parameters_off:  00001338
+                                |[e] java.lang.StringBuilder proto(java.lang.String)
+0003ac: 2100 0000               |  shorty_idx:      00000021 // "LL"
+0003b0: 1000 0000               |  return_type_idx: 00000010 // java.lang.StringBuilder
+0003b4: 4013 0000               |  parameters_off:  00001340
+                                |[f] java.lang.invoke.CallSite proto(java.lang.invoke.MethodHandles$Lookup, java.lang.String, java.lang.invoke.MethodType)
+0003b8: 2200 0000               |  shorty_idx:      00000022 // "LLLL"
+0003bc: 1300 0000               |  return_type_idx: 00000013 // java.lang.invoke.CallSite
+0003c0: 4813 0000               |  parameters_off:  00001348
+                                |[10] java.lang.invoke.CallSite proto(java.lang.invoke.MethodHandles$Lookup, java.lang.String, java.lang.invoke.MethodType, int, long, float, double)
+0003c4: 2300 0000               |  shorty_idx:      00000023 // "LLLLIJFD"
+0003c8: 1300 0000               |  return_type_idx: 00000013 // java.lang.invoke.CallSite
+0003cc: 5413 0000               |  parameters_off:  00001354
+                                |[11] java.lang.invoke.CallSite proto(java.lang.invoke.MethodHandles$Lookup, java.lang.String, java.lang.invoke.MethodType, java.lang.invoke.MethodHandle)
+0003d0: 2400 0000               |  shorty_idx:      00000024 // "LLLLL"
+0003d4: 1300 0000               |  return_type_idx: 00000013 // java.lang.invoke.CallSite
+0003d8: 6813 0000               |  parameters_off:  00001368
+                                |[12] java.lang.invoke.CallSite proto(java.lang.invoke.MethodHandles$Lookup, java.lang.String, java.lang.invoke.MethodType, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)
+0003dc: 2500 0000               |  shorty_idx:      00000025 // "LLLLLLLLLLL"
+0003e0: 1300 0000               |  return_type_idx: 00000013 // java.lang.invoke.CallSite
+0003e4: 7413 0000               |  parameters_off:  00001374
+                                |[13] java.lang.invoke.MethodHandle proto(java.lang.Class, java.lang.String, java.lang.invoke.MethodType)
+0003e8: 2200 0000               |  shorty_idx:      00000022 // "LLLL"
+0003ec: 1500 0000               |  return_type_idx: 00000015 // java.lang.invoke.MethodHandle
+0003f0: 8c13 0000               |  parameters_off:  0000138c
+                                |[14] java.lang.invoke.MethodHandle proto(java.lang.invoke.MethodType)
+0003f4: 2100 0000               |  shorty_idx:      00000021 // "LL"
+0003f8: 1500 0000               |  return_type_idx: 00000015 // java.lang.invoke.MethodHandle
+0003fc: 9813 0000               |  parameters_off:  00001398
+                                |[15] java.lang.invoke.MethodHandles$Lookup proto()
+000400: 1c00 0000               |  shorty_idx:      0000001c // "L"
+000404: 1600 0000               |  return_type_idx: 00000016 // java.lang.invoke.MethodHandles$Lookup
+000408: 0000 0000               |  parameters_off:  00000000
+                                |[16] void proto()
+00040c: 3d00 0000               |  shorty_idx:      0000003d // "V"
+000410: 1a00 0000               |  return_type_idx: 0000001a // void
+000414: 0000 0000               |  parameters_off:  00000000
+                                |[17] void proto(char)
+000418: 3e00 0000               |  shorty_idx:      0000003e // "VC"
+00041c: 1a00 0000               |  return_type_idx: 0000001a // void
+000420: a013 0000               |  parameters_off:  000013a0
+                                |[18] void proto(double)
+000424: 3f00 0000               |  shorty_idx:      0000003f // "VD"
+000428: 1a00 0000               |  return_type_idx: 0000001a // void
+00042c: 2013 0000               |  parameters_off:  00001320
+                                |[19] void proto(float)
+000430: 4000 0000               |  shorty_idx:      00000040 // "VF"
+000434: 1a00 0000               |  return_type_idx: 0000001a // void
+000438: 2813 0000               |  parameters_off:  00001328
+                                |[1a] void proto(int)
+00043c: 4100 0000               |  shorty_idx:      00000041 // "VI"
+000440: 1a00 0000               |  return_type_idx: 0000001a // void
+000444: 1013 0000               |  parameters_off:  00001310
+                                |[1b] void proto(long)
+000448: 4200 0000               |  shorty_idx:      00000042 // "VJ"
+00044c: 1a00 0000               |  return_type_idx: 0000001a // void
+000450: 3013 0000               |  parameters_off:  00001330
+                                |[1c] void proto(invokecustom.InvokeCustom)
+000454: 4300 0000               |  shorty_idx:      00000043 // "VL"
+000458: 1a00 0000               |  return_type_idx: 0000001a // void
+00045c: f012 0000               |  parameters_off:  000012f0
+                                |[1d] void proto(invokecustom.InvokeCustom, float)
+000460: 4400 0000               |  shorty_idx:      00000044 // "VLF"
+000464: 1a00 0000               |  return_type_idx: 0000001a // void
+000468: a813 0000               |  parameters_off:  000013a8
+                                |[1e] void proto(java.lang.String)
+00046c: 4300 0000               |  shorty_idx:      00000043 // "VL"
+000470: 1a00 0000               |  return_type_idx: 0000001a // void
+000474: 4013 0000               |  parameters_off:  00001340
+                                |[1f] void proto(java.lang.invoke.MethodHandle)
+000478: 4300 0000               |  shorty_idx:      00000043 // "VL"
+00047c: 1a00 0000               |  return_type_idx: 0000001a // void
+000480: b013 0000               |  parameters_off:  000013b0
+                                |[20] void proto(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)
+000484: 4500 0000               |  shorty_idx:      00000045 // "VLL"
+000488: 1a00 0000               |  return_type_idx: 0000001a // void
+00048c: b813 0000               |  parameters_off:  000013b8
+                                |[21] void proto(boolean)
+000490: 4600 0000               |  shorty_idx:      00000046 // "VZ"
+000494: 1a00 0000               |  return_type_idx: 0000001a // void
+000498: c013 0000               |  parameters_off:  000013c0
+                                |[22] void proto(boolean, byte, char, short, int, float, long, double, java.lang.String)
+00049c: 4700 0000               |  shorty_idx:      00000047 // "VZBCSIFJDL"
+0004a0: 1a00 0000               |  return_type_idx: 0000001a // void
+0004a4: c813 0000               |  parameters_off:  000013c8
+                                |[23] void proto(java.lang.String[])
+0004a8: 4300 0000               |  shorty_idx:      00000043 // "VL"
+0004ac: 1a00 0000               |  return_type_idx: 0000001a // void
+0004b0: e013 0000               |  parameters_off:  000013e0
+                                |
+                                |field_ids:
+                                |[0] invokecustom.InvokeCustom.fieldTest9:F
+0004b4: 0700                    |  class_idx: 0007
+0004b6: 0300                    |  type_idx:  0003
+0004b8: 5a00 0000               |  name_idx:  0000005a
+                                |[1] invokecustom.InvokeCustom.staticFieldTest9:I
+0004bc: 0700                    |  class_idx: 0007
+0004be: 0400                    |  type_idx:  0004
+0004c0: 6800 0000               |  name_idx:  00000068
+                                |[2] java.lang.System.out:Ljava/io/PrintStream;
+0004c4: 1100                    |  class_idx: 0011
+0004c6: 0900                    |  type_idx:  0009
+0004c8: 6300 0000               |  name_idx:  00000063
+                                |
+                                |method_ids:
+                                |[0] invokecustom.InvokeCustom.<clinit>:()V
+0004cc: 0700                    |  class_idx: 0007
+0004ce: 1600                    |  proto_idx: 0016
+0004d0: 0900 0000               |  name_idx:  00000009
+                                |[1] invokecustom.InvokeCustom.<init>:()V
+0004d4: 0700                    |  class_idx: 0007
+0004d6: 1600                    |  proto_idx: 0016
+0004d8: 0a00 0000               |  name_idx:  0000000a
+                                |[2] invokecustom.InvokeCustom.<init>:(I)V
+0004dc: 0700                    |  class_idx: 0007
+0004de: 1a00                    |  proto_idx: 001a
+0004e0: 0a00 0000               |  name_idx:  0000000a
+                                |[3] invokecustom.InvokeCustom.bsmCreateCallSite:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+0004e4: 0700                    |  class_idx: 0007
+0004e6: 1100                    |  proto_idx: 0011
+0004e8: 4e00 0000               |  name_idx:  0000004e
+                                |[4] invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
+0004ec: 0700                    |  class_idx: 0007
+0004ee: 0f00                    |  proto_idx: 000f
+0004f0: 5000 0000               |  name_idx:  00000050
+                                |[5] invokecustom.InvokeCustom.bsmLookupStaticWithExtraArgs:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;
+0004f4: 0700                    |  class_idx: 0007
+0004f6: 1000                    |  proto_idx: 0010
+0004f8: 5200 0000               |  name_idx:  00000052
+                                |[6] invokecustom.InvokeCustom.bsmLookupTest9:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+0004fc: 0700                    |  class_idx: 0007
+0004fe: 1200                    |  proto_idx: 0012
+000500: 5400 0000               |  name_idx:  00000054
+                                |[7] invokecustom.InvokeCustom.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+000504: 0700                    |  class_idx: 0007
+000506: 2000                    |  proto_idx: 0020
+000508: 5600 0000               |  name_idx:  00000056
+                                |[8] invokecustom.InvokeCustom.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+00050c: 0700                    |  class_idx: 0007
+00050e: 2000                    |  proto_idx: 0020
+000510: 5800 0000               |  name_idx:  00000058
+                                |[9] invokecustom.InvokeCustom.helperMethodTest9:()V
+000514: 0700                    |  class_idx: 0007
+000516: 1600                    |  proto_idx: 0016
+000518: 5c00 0000               |  name_idx:  0000005c
+                                |[a] invokecustom.InvokeCustom.main:([Ljava/lang/String;)V
+00051c: 0700                    |  class_idx: 0007
+00051e: 2300                    |  proto_idx: 0023
+000520: 6200 0000               |  name_idx:  00000062
+                                |[b] invokecustom.InvokeCustom.run:()V
+000524: 0700                    |  class_idx: 0007
+000526: 1600                    |  proto_idx: 0016
+000528: 6600 0000               |  name_idx:  00000066
+                                |[c] invokecustom.InvokeCustom.targetMethodTest1:()V
+00052c: 0700                    |  class_idx: 0007
+00052e: 1600                    |  proto_idx: 0016
+000530: 6900 0000               |  name_idx:  00000069
+                                |[d] invokecustom.InvokeCustom.targetMethodTest2:(ZBCSIFJDLjava/lang/String;)V
+000534: 0700                    |  class_idx: 0007
+000536: 2200                    |  proto_idx: 0022
+000538: 6a00 0000               |  name_idx:  0000006a
+                                |[e] invokecustom.InvokeCustom.targetMethodTest3:()V
+00053c: 0700                    |  class_idx: 0007
+00053e: 1600                    |  proto_idx: 0016
+000540: 6b00 0000               |  name_idx:  0000006b
+                                |[f] invokecustom.InvokeCustom.targetMethodTest4:()V
+000544: 0700                    |  class_idx: 0007
+000546: 1600                    |  proto_idx: 0016
+000548: 6d00 0000               |  name_idx:  0000006d
+                                |[10] invokecustom.InvokeCustom.targetMethodTest5:(III)I
+00054c: 0700                    |  class_idx: 0007
+00054e: 0300                    |  proto_idx: 0003
+000550: 7000 0000               |  name_idx:  00000070
+                                |[11] invokecustom.InvokeCustom.targetMethodTest6:(JJJ)J
+000554: 0700                    |  class_idx: 0007
+000556: 0400                    |  proto_idx: 0004
+000558: 7300 0000               |  name_idx:  00000073
+                                |[12] invokecustom.InvokeCustom.targetMethodTest7:(FFD)D
+00055c: 0700                    |  class_idx: 0007
+00055e: 0000                    |  proto_idx: 0000
+000560: 7600 0000               |  name_idx:  00000076
+                                |[13] invokecustom.InvokeCustom.targetMethodTest8:(Ljava/lang/String;)V
+000564: 0700                    |  class_idx: 0007
+000566: 1e00                    |  proto_idx: 001e
+000568: 7800 0000               |  name_idx:  00000078
+                                |[14] invokecustom.InvokeCustom.targetMethodTest9:()V
+00056c: 0700                    |  class_idx: 0007
+00056e: 1600                    |  proto_idx: 0016
+000570: 7a00 0000               |  name_idx:  0000007a
+                                |[15] invokecustom.InvokeCustom.test1:()V
+000574: 0700                    |  class_idx: 0007
+000576: 1600                    |  proto_idx: 0016
+000578: 7c00 0000               |  name_idx:  0000007c
+                                |[16] invokecustom.InvokeCustom.test2:()V
+00057c: 0700                    |  class_idx: 0007
+00057e: 1600                    |  proto_idx: 0016
+000580: 7d00 0000               |  name_idx:  0000007d
+                                |[17] invokecustom.InvokeCustom.test3:()V
+000584: 0700                    |  class_idx: 0007
+000586: 1600                    |  proto_idx: 0016
+000588: 7e00 0000               |  name_idx:  0000007e
+                                |[18] invokecustom.InvokeCustom.test4:()V
+00058c: 0700                    |  class_idx: 0007
+00058e: 1600                    |  proto_idx: 0016
+000590: 7f00 0000               |  name_idx:  0000007f
+                                |[19] invokecustom.InvokeCustom.test5:()V
+000594: 0700                    |  class_idx: 0007
+000596: 1600                    |  proto_idx: 0016
+000598: 8000 0000               |  name_idx:  00000080
+                                |[1a] invokecustom.InvokeCustom.test6:()V
+00059c: 0700                    |  class_idx: 0007
+00059e: 1600                    |  proto_idx: 0016
+0005a0: 8100 0000               |  name_idx:  00000081
+                                |[1b] invokecustom.InvokeCustom.test7:()V
+0005a4: 0700                    |  class_idx: 0007
+0005a6: 1600                    |  proto_idx: 0016
+0005a8: 8200 0000               |  name_idx:  00000082
+                                |[1c] invokecustom.InvokeCustom.test8:()V
+0005ac: 0700                    |  class_idx: 0007
+0005ae: 1600                    |  proto_idx: 0016
+0005b0: 8300 0000               |  name_idx:  00000083
+                                |[1d] invokecustom.InvokeCustom.test9:()V
+0005b4: 0700                    |  class_idx: 0007
+0005b6: 1600                    |  proto_idx: 0016
+0005b8: 8400 0000               |  name_idx:  00000084
+                                |[1e] invokecustom.Super.<init>:()V
+0005bc: 0800                    |  class_idx: 0008
+0005be: 1600                    |  proto_idx: 0016
+0005c0: 0a00 0000               |  name_idx:  0000000a
+                                |[1f] invokecustom.Super.helperMethodTest9:()V
+0005c4: 0800                    |  class_idx: 0008
+0005c6: 1600                    |  proto_idx: 0016
+0005c8: 5c00 0000               |  name_idx:  0000005c
+                                |[20] invokecustom.Super.targetMethodTest4:()V
+0005cc: 0800                    |  class_idx: 0008
+0005ce: 1600                    |  proto_idx: 0016
+0005d0: 6d00 0000               |  name_idx:  0000006d
+                                |[21] java.io.PrintStream.print:(Ljava/lang/String;)V
+0005d4: 0900                    |  class_idx: 0009
+0005d6: 1e00                    |  proto_idx: 001e
+0005d8: 6400 0000               |  name_idx:  00000064
+                                |[22] java.io.PrintStream.println:(C)V
+0005dc: 0900                    |  class_idx: 0009
+0005de: 1700                    |  proto_idx: 0017
+0005e0: 6500 0000               |  name_idx:  00000065
+                                |[23] java.io.PrintStream.println:(D)V
+0005e4: 0900                    |  class_idx: 0009
+0005e6: 1800                    |  proto_idx: 0018
+0005e8: 6500 0000               |  name_idx:  00000065
+                                |[24] java.io.PrintStream.println:(F)V
+0005ec: 0900                    |  class_idx: 0009
+0005ee: 1900                    |  proto_idx: 0019
+0005f0: 6500 0000               |  name_idx:  00000065
+                                |[25] java.io.PrintStream.println:(I)V
+0005f4: 0900                    |  class_idx: 0009
+0005f6: 1a00                    |  proto_idx: 001a
+0005f8: 6500 0000               |  name_idx:  00000065
+                                |[26] java.io.PrintStream.println:(J)V
+0005fc: 0900                    |  class_idx: 0009
+0005fe: 1b00                    |  proto_idx: 001b
+000600: 6500 0000               |  name_idx:  00000065
+                                |[27] java.io.PrintStream.println:(Ljava/lang/String;)V
+000604: 0900                    |  class_idx: 0009
+000606: 1e00                    |  proto_idx: 001e
+000608: 6500 0000               |  name_idx:  00000065
+                                |[28] java.io.PrintStream.println:(Z)V
+00060c: 0900                    |  class_idx: 0009
+00060e: 2100                    |  proto_idx: 0021
+000610: 6500 0000               |  name_idx:  00000065
+                                |[29] java.lang.Object.<init>:()V
+000614: 0d00                    |  class_idx: 000d
+000616: 1600                    |  proto_idx: 0016
+000618: 0a00 0000               |  name_idx:  0000000a
+                                |[2a] java.lang.Runnable.run:()V
+00061c: 0e00                    |  class_idx: 000e
+00061e: 1600                    |  proto_idx: 0016
+000620: 6600 0000               |  name_idx:  00000066
+                                |[2b] java.lang.StringBuilder.<init>:()V
+000624: 1000                    |  class_idx: 0010
+000626: 1600                    |  proto_idx: 0016
+000628: 0a00 0000               |  name_idx:  0000000a
+                                |[2c] java.lang.StringBuilder.append:(D)Ljava/lang/StringBuilder;
+00062c: 1000                    |  class_idx: 0010
+00062e: 0900                    |  proto_idx: 0009
+000630: 4c00 0000               |  name_idx:  0000004c
+                                |[2d] java.lang.StringBuilder.append:(F)Ljava/lang/StringBuilder;
+000634: 1000                    |  class_idx: 0010
+000636: 0a00                    |  proto_idx: 000a
+000638: 4c00 0000               |  name_idx:  0000004c
+                                |[2e] java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder;
+00063c: 1000                    |  class_idx: 0010
+00063e: 0b00                    |  proto_idx: 000b
+000640: 4c00 0000               |  name_idx:  0000004c
+                                |[2f] java.lang.StringBuilder.append:(J)Ljava/lang/StringBuilder;
+000644: 1000                    |  class_idx: 0010
+000646: 0c00                    |  proto_idx: 000c
+000648: 4c00 0000               |  name_idx:  0000004c
+                                |[30] java.lang.StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
+00064c: 1000                    |  class_idx: 0010
+00064e: 0d00                    |  proto_idx: 000d
+000650: 4c00 0000               |  name_idx:  0000004c
+                                |[31] java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
+000654: 1000                    |  class_idx: 0010
+000656: 0e00                    |  proto_idx: 000e
+000658: 4c00 0000               |  name_idx:  0000004c
+                                |[32] java.lang.StringBuilder.toString:()Ljava/lang/String;
+00065c: 1000                    |  class_idx: 0010
+00065e: 0800                    |  proto_idx: 0008
+000660: 8500 0000               |  name_idx:  00000085
+                                |[33] java.lang.invoke.ConstantCallSite.<init>:(Ljava/lang/invoke/MethodHandle;)V
+000664: 1400                    |  class_idx: 0014
+000666: 1f00                    |  proto_idx: 001f
+000668: 0a00 0000               |  name_idx:  0000000a
+                                |[34] java.lang.invoke.MethodHandle.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;
+00066c: 1500                    |  class_idx: 0015
+00066e: 1400                    |  proto_idx: 0014
+000670: 4d00 0000               |  name_idx:  0000004d
+                                |[35] java.lang.invoke.MethodHandle.invoke:([Ljava/lang/Object;)Ljava/lang/Object;
+000674: 1500                    |  class_idx: 0015
+000676: 0700                    |  proto_idx: 0007
+000678: 5e00 0000               |  name_idx:  0000005e
+                                |[36] java.lang.invoke.MethodHandle.invoke:(Linvokecustom/InvokeCustom;)V
+00067c: 1500                    |  class_idx: 0015
+00067e: 1c00                    |  proto_idx: 001c
+000680: 5e00 0000               |  name_idx:  0000005e
+                                |[37] java.lang.invoke.MethodHandle.invokeExact:(Linvokecustom/InvokeCustom;)F
+000684: 1500                    |  class_idx: 0015
+000686: 0100                    |  proto_idx: 0001
+000688: 5f00 0000               |  name_idx:  0000005f
+                                |[38] java.lang.invoke.MethodHandle.invokeExact:()I
+00068c: 1500                    |  class_idx: 0015
+00068e: 0200                    |  proto_idx: 0002
+000690: 5f00 0000               |  name_idx:  0000005f
+                                |[39] java.lang.invoke.MethodHandle.invokeExact:(I)Linvokecustom/InvokeCustom;
+000694: 1500                    |  class_idx: 0015
+000696: 0500                    |  proto_idx: 0005
+000698: 5f00 0000               |  name_idx:  0000005f
+                                |[3a] java.lang.invoke.MethodHandle.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;
+00069c: 1500                    |  class_idx: 0015
+00069e: 0700                    |  proto_idx: 0007
+0006a0: 5f00 0000               |  name_idx:  0000005f
+                                |[3b] java.lang.invoke.MethodHandle.invokeExact:(I)V
+0006a4: 1500                    |  class_idx: 0015
+0006a6: 1a00                    |  proto_idx: 001a
+0006a8: 5f00 0000               |  name_idx:  0000005f
+                                |[3c] java.lang.invoke.MethodHandle.invokeExact:(Linvokecustom/InvokeCustom;)V
+0006ac: 1500                    |  class_idx: 0015
+0006ae: 1c00                    |  proto_idx: 001c
+0006b0: 5f00 0000               |  name_idx:  0000005f
+                                |[3d] java.lang.invoke.MethodHandle.invokeExact:(Linvokecustom/InvokeCustom;F)V
+0006b4: 1500                    |  class_idx: 0015
+0006b6: 1d00                    |  proto_idx: 001d
+0006b8: 5f00 0000               |  name_idx:  0000005f
+                                |[3e] java.lang.invoke.MethodHandles$Lookup.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;
+0006bc: 1600                    |  class_idx: 0016
+0006be: 1300                    |  proto_idx: 0013
+0006c0: 5b00 0000               |  name_idx:  0000005b
+                                |[3f] java.lang.invoke.MethodHandles$Lookup.lookupClass:()Ljava/lang/Class;
+0006c4: 1600                    |  class_idx: 0016
+0006c6: 0600                    |  proto_idx: 0006
+0006c8: 6100 0000               |  name_idx:  00000061
+                                |[40] java.lang.invoke.MethodHandles.lookup:()Ljava/lang/invoke/MethodHandles$Lookup;
+0006cc: 1700                    |  class_idx: 0017
+0006ce: 1500                    |  proto_idx: 0015
+0006d0: 6000 0000               |  name_idx:  00000060
+                                |
+                                |class_defs:
+                                |[0] invokecustom.Super
+0006d4: 0800 0000               |  class_idx:           00000008
+0006d8: 0004 0000               |  access_flags:        abstract
+0006dc: 0d00 0000               |  superclass_idx:      0000000d // java.lang.Object
+0006e0: 0000 0000               |  interfaces_off:      00000000
+0006e4: 1900 0000               |  source_file_idx:     00000019 // InvokeCustom.java
+0006e8: 0000 0000               |  annotations_off:     00000000
+0006ec: 181d 0000               |  class_data_off:      00001d18
+0006f0: 0000 0000               |  static_values_off:   00000000
+                                |[1] invokecustom.InvokeCustom
+0006f4: 0700 0000               |  class_idx:           00000007
+0006f8: 0100 0000               |  access_flags:        public
+0006fc: 0800 0000               |  superclass_idx:      00000008 // invokecustom.Super
+000700: dc12 0000               |  interfaces_off:      000012dc
+                                |    java.lang.Runnable
+000704: 1900 0000               |  source_file_idx:     00000019 // InvokeCustom.java
+000708: 9c12 0000               |  annotations_off:     0000129c
+00070c: 2a1d 0000               |  class_data_off:      00001d2a
+000710: 0000 0000               |  static_values_off:   00000000
+                                |
+                                |call_site_ids:
+                                |[0] call site{method-handle{invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}}, string{"targetMethodTest1"}, proto{()V}}
+000714: b41c 0000               |call_site_off: 00001cb4
+                                |[1] call site{method-handle{invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}}, string{"targetMethodTest1"}, proto{()V}}
+000718: b41c 0000               |call_site_off: 00001cb4
+                                |[2] call site{method-handle{invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}}, string{"targetMethodTest2"}, proto{(ZBCSIFJDLjava/lang/String;)V}}
+00071c: bb1c 0000               |call_site_off: 00001cbb
+                                |[3] call site{method-handle{invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}}, string{"targetMethodTest2"}, proto{(ZBCSIFJDLjava/lang/String;)V}}
+000720: bb1c 0000               |call_site_off: 00001cbb
+                                |[4] call site{method-handle{invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}}, string{"targetMethodTest5"}, proto{(III)I}}
+000724: c21c 0000               |call_site_off: 00001cc2
+                                |[5] call site{method-handle{invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}}, string{"targetMethodTest5"}, proto{(III)I}}
+000728: c21c 0000               |call_site_off: 00001cc2
+                                |[6] call site{method-handle{invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}}, string{"targetMethodTest6"}, proto{(JJJ)J}}
+00072c: c91c 0000               |call_site_off: 00001cc9
+                                |[7] call site{method-handle{invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}}, string{"targetMethodTest6"}, proto{(JJJ)J}}
+000730: c91c 0000               |call_site_off: 00001cc9
+                                |[8] call site{method-handle{invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}}, string{"targetMethodTest7"}, proto{(FFD)D}}
+000734: d01c 0000               |call_site_off: 00001cd0
+                                |[9] call site{method-handle{invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}}, string{"targetMethodTest7"}, proto{(FFD)D}}
+000738: d01c 0000               |call_site_off: 00001cd0
+                                |[a] call site{method-handle{invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}}, string{"targetMethodTest8"}, proto{(Ljava/lang/String;)V}}
+00073c: d71c 0000               |call_site_off: 00001cd7
+                                |[b] call site{method-handle{invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}}, string{"targetMethodTest8"}, proto{(Ljava/lang/String;)V}}
+000740: d71c 0000               |call_site_off: 00001cd7
+                                |[c] call site{method-handle{invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}}, string{"targetMethodTest8"}, proto{(Ljava/lang/String;)V}}
+000744: d71c 0000               |call_site_off: 00001cd7
+                                |[d] call site{method-handle{invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}}, string{"targetMethodTest8"}, proto{(Ljava/lang/String;)V}}
+000748: d71c 0000               |call_site_off: 00001cd7
+                                |[e] call site{method-handle{invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}}, string{"targetMethodTest8"}, proto{(Ljava/lang/String;)V}}
+00074c: d71c 0000               |call_site_off: 00001cd7
+                                |[f] call site{method-handle{invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}}, string{"targetMethodTest8"}, proto{(Ljava/lang/String;)V}}
+000750: d71c 0000               |call_site_off: 00001cd7
+                                |[10] call site{method-handle{invoke-static,method{invokecustom.InvokeCustom.bsmLookupStaticWithExtraArgs:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;}}, string{"targetMethodTest3"}, proto{()V}, int{0x00000001 / 1}, long{0x00000000075bcd15 / 123456789}, float{0x42f6e979 / 123.456}, double{0x40fe240ca03f7058 / 123456.789123}}
+000754: de1c 0000               |call_site_off: 00001cde
+                                |[11] call site{method-handle{invoke-static,method{invokecustom.InvokeCustom.bsmLookupStaticWithExtraArgs:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;}}, string{"targetMethodTest3"}, proto{()V}, int{0x00000001 / 1}, long{0x00000000075bcd15 / 123456789}, float{0x42f6e979 / 123.456}, double{0x40fe240ca03f7058 / 123456.789123}}
+000758: de1c 0000               |call_site_off: 00001cde
+                                |[12] call site{method-handle{invoke-static,method{invokecustom.InvokeCustom.bsmCreateCallSite:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;}}, string{"targetMethodTest4"}, proto{(Linvokecustom/InvokeCustom;)V}, method-handle{invoke-direct,method{invokecustom.Super.targetMethodTest4:()V}}}
+00075c: fa1c 0000               |call_site_off: 00001cfa
+                                |[13] call site{method-handle{invoke-static,method{invokecustom.InvokeCustom.bsmCreateCallSite:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;}}, string{"targetMethodTest4"}, proto{(Linvokecustom/InvokeCustom;)V}, method-handle{invoke-direct,method{invokecustom.Super.targetMethodTest4:()V}}}
+000760: fa1c 0000               |call_site_off: 00001cfa
+                                |[14] call site{method-handle{invoke-static,method{invokecustom.InvokeCustom.bsmLookupTest9:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;}}, string{"targetMethodTest9"}, proto{()V}, method-handle{static-get,field{invokecustom.InvokeCustom.staticFieldTest9:I}}, method-handle{static-put,field{invokecustom.InvokeCustom.staticFieldTest9:I}}, method-handle{instance-get,field{invokecustom.InvokeCustom.fieldTest9:F}}, method-handle{instance-put,field{invokecustom.InvokeCustom.fieldTest9:F}}, method-handle{invoke-instance,method{invokecustom.InvokeCustom.helperMethodTest9:()V}}, method-handle{invoke-constructor,method{invokecustom.InvokeCustom.<init>:(I)V}}, method-handle{invoke-i
+                                |nterface,ifaceMethod{java.lang.Runnable.run:()V}}}
+000764: 031d 0000               |call_site_off: 00001d03
+                                |[15] call site{method-handle{invoke-static,method{invokecustom.InvokeCustom.bsmLookupTest9:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;}}, string{"targetMethodTest9"}, proto{()V}, method-handle{static-get,field{invokecustom.InvokeCustom.staticFieldTest9:I}}, method-handle{static-put,field{invokecustom.InvokeCustom.staticFieldTest9:I}}, method-handle{instance-get,field{invokecustom.InvokeCustom.fieldTest9:F}}, method-handle{instance-put,field{invokecustom.InvokeCustom.fieldTest9:F}}, method-handle{invoke-instance,method{invokecustom.InvokeCustom.helperMethodTest9:()V}}, method-handle{invoke-constructor,method{invokecustom.InvokeCustom.<init>:(I)V}}, method-handle{invoke-i
+                                |nterface,ifaceMethod{java.lang.Runnable.run:()V}}}
+000768: 031d 0000               |call_site_off: 00001d03
+00076c: 0000 0000               |
+                                |
+                                |method_handles:
+000770: 0000                    |kind: 0000
+000772: 0000                    |reserved:0000
+000774: 0100                    |fieldId: 1
+000776: 0000                    |reserved:0000
+000778: 0100                    |kind: 0001
+00077a: 0000                    |reserved:0000
+00077c: 0100                    |fieldId: 1
+00077e: 0000                    |reserved:0000
+000780: 0200                    |kind: 0002
+000782: 0000                    |reserved:0000
+000784: 0000                    |fieldId: 0
+000786: 0000                    |reserved:0000
+000788: 0300                    |kind: 0003
+00078a: 0000                    |reserved:0000
+00078c: 0000                    |fieldId: 0
+00078e: 0000                    |reserved:0000
+000790: 0400                    |kind: 0004
+000792: 0000                    |reserved:0000
+000794: 0300                    |methodId: 3
+000796: 0000                    |reserved:0000
+000798: 0400                    |kind: 0004
+00079a: 0000                    |reserved:0000
+00079c: 0400                    |methodId: 4
+00079e: 0000                    |reserved:0000
+0007a0: 0400                    |kind: 0004
+0007a2: 0000                    |reserved:0000
+0007a4: 0500                    |methodId: 5
+0007a6: 0000                    |reserved:0000
+0007a8: 0400                    |kind: 0004
+0007aa: 0000                    |reserved:0000
+0007ac: 0600                    |methodId: 6
+0007ae: 0000                    |reserved:0000
+0007b0: 0500                    |kind: 0005
+0007b2: 0000                    |reserved:0000
+0007b4: 0900                    |methodId: 9
+0007b6: 0000                    |reserved:0000
+0007b8: 0600                    |kind: 0006
+0007ba: 0000                    |reserved:0000
+0007bc: 0200                    |methodId: 2
+0007be: 0000                    |reserved:0000
+0007c0: 0700                    |kind: 0007
+0007c2: 0000                    |reserved:0000
+0007c4: 2000                    |methodId: 32
+0007c6: 0000                    |reserved:0000
+0007c8: 0800                    |kind: 0008
+0007ca: 0000                    |reserved:0000
+0007cc: 2a00                    |methodId: 42
+0007ce: 0000                    |reserved:0000
+                                |
+                                |word_data:
+                                |[7d0] annotation set
+0007d0: 0100 0000               |  size: 00000001
+0007d4: a01c 0000               |  entries[0]: 00001ca0
+                                |    visibility: system
+                                |    type: dalvik.annotation.Throws
+                                |    value: array {java.lang.Throwable}
+                                |
+                                |[7d8] annotation set
+0007d8: 0100 0000               |  size: 00000001
+0007dc: a91c 0000               |  entries[0]: 00001ca9
+                                |    visibility: system
+                                |    type: dalvik.annotation.Throws
+                                |    value: array {java.lang.NoSuchMethodException, java.lang.IllegalAccessException}
+                                |
+                                |[7e0] invokecustom.Super.<init>:()V
+0007e0: 0100                    |  registers_size: 0001
+0007e2: 0100                    |  ins_size:       0001
+0007e4: 0100                    |  outs_size:      0001
+0007e6: 0000                    |  tries_size:     0000
+0007e8: 931b 0000               |  debug_off:      00001b93
+0007ec: 0400 0000               |  insns_size:     00000004
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+0007f0: 7010 2900 0000          |  0000: invoke-direct {v0}, java.lang.Object.<init>:()V // method@0029
+                                |  0003: code-address
+                                |  0003: code-address
+                                |  0003: local-snapshot
+0007f6: 0e00                    |  0003: return-void
+                                |  0004: code-address
+                                |  debug info
+                                |    line_start: 25
+                                |    parameters_size: 0000
+                                |    0000: prologue end
+                                |    0000: line 25
+                                |    end sequence
+                                |
+                                |[7f8] invokecustom.Super.targetMethodTest4:()V
+0007f8: 0300                    |  registers_size: 0003
+0007fa: 0100                    |  ins_size:       0001
+0007fc: 0200                    |  outs_size:      0002
+0007fe: 0000                    |  tries_size:     0000
+000800: 981b 0000               |  debug_off:      00001b98
+000804: 0800 0000               |  insns_size:     00000008
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+000808: 6200 0200               |  0000: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+00080c: 1a01 6f00               |  0002: const-string v1, "targetMethodTest4 from Super" // utf8@006f
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+000810: 6e20 2700 1000          |  0004: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  0007: code-address
+                                |  0007: code-address
+                                |  0007: local-snapshot
+000816: 0e00                    |  0007: return-void
+                                |  0008: code-address
+                                |  debug info
+                                |    line_start: 27
+                                |    parameters_size: 0000
+                                |    0000: prologue end
+                                |    0000: line 27
+                                |    0007: line 28
+                                |    end sequence
+                                |
+                                |[818] invokecustom.InvokeCustom.<clinit>:()V
+000818: 0100                    |  registers_size: 0001
+00081a: 0000                    |  ins_size:       0000
+00081c: 0000                    |  outs_size:      0000
+00081e: 0000                    |  tries_size:     0000
+000820: 9e1b 0000               |  debug_off:      00001b9e
+000824: 0400 0000               |  insns_size:     00000004
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+000828: 1200                    |  0000: const/4 v0, #int 0 // #0
+                                |  0001: code-address
+00082a: 6700 0100               |  0001: sput v0, invokecustom.InvokeCustom.staticFieldTest9:I // field@0001
+                                |  0003: code-address
+                                |  0003: code-address
+                                |  0003: local-snapshot
+00082e: 0e00                    |  0003: return-void
+                                |  0004: code-address
+                                |  debug info
+                                |    line_start: 98
+                                |    parameters_size: 0000
+                                |    0000: prologue end
+                                |    0000: line 98
+                                |    end sequence
+                                |
+                                |[830] invokecustom.InvokeCustom.<init>:()V
+000830: 0200                    |  registers_size: 0002
+000832: 0100                    |  ins_size:       0001
+000834: 0100                    |  outs_size:      0001
+000836: 0000                    |  tries_size:     0000
+000838: a31b 0000               |  debug_off:      00001ba3
+00083c: 0700 0000               |  insns_size:     00000007
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+000840: 7010 1e00 0100          |  0000: invoke-direct {v1}, invokecustom.Super.<init>:()V // method@001e
+                                |  0003: code-address
+                                |  0003: code-address
+                                |  0003: local-snapshot
+000846: 1200                    |  0003: const/4 v0, #float 0.0 // #0
+                                |  0004: code-address
+000848: 5910 0000               |  0004: iput v0, v1, invokecustom.InvokeCustom.fieldTest9:F // field@0000
+                                |  0006: code-address
+                                |  0006: code-address
+                                |  0006: local-snapshot
+00084c: 0e00                    |  0006: return-void
+                                |  0007: code-address
+                                |  debug info
+                                |    line_start: 35
+                                |    parameters_size: 0000
+                                |    0000: prologue end
+                                |    0000: line 35
+                                |    line = 111
+                                |    0003: line 111
+                                |    line = 35
+                                |    0006: line 35
+                                |    end sequence
+                                |
+00084e: 0000                    |
+                                |[850] invokecustom.InvokeCustom.<init>:(I)V
+000850: 0500                    |  registers_size: 0005
+000852: 0200                    |  ins_size:       0002
+000854: 0200                    |  outs_size:      0002
+000856: 0000                    |  tries_size:     0000
+000858: b01b 0000               |  debug_off:      00001bb0
+00085c: 2500 0000               |  insns_size:     00000025
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+000860: 7010 1e00 0300          |  0000: invoke-direct {v3}, invokecustom.Super.<init>:()V // method@001e
+                                |  0003: code-address
+                                |  0003: code-address
+                                |  0003: local-snapshot
+000866: 1200                    |  0003: const/4 v0, #float 0.0 // #0
+                                |  0004: code-address
+000868: 5930 0000               |  0004: iput v0, v3, invokecustom.InvokeCustom.fieldTest9:F // field@0000
+                                |  0006: code-address
+                                |  0006: code-address
+                                |  0006: local-snapshot
+                                |  0006: code-address
+00086c: 6200 0200               |  0006: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0008: code-address
+                                |  0008: code-address
+                                |  0008: local-snapshot
+                                |  0008: code-address
+                                |  0008: code-address
+                                |  0008: local-snapshot
+                                |  0008: code-address
+000870: 2201 1000               |  0008: new-instance v1, java.lang.StringBuilder // type@0010
+                                |  000a: code-address
+                                |  000a: code-address
+                                |  000a: local-snapshot
+                                |  000a: code-address
+                                |  000a: code-address
+                                |  000a: local-snapshot
+                                |  000a: code-address
+000874: 7010 2b00 0100          |  000a: invoke-direct {v1}, java.lang.StringBuilder.<init>:()V // method@002b
+                                |  000d: code-address
+                                |  000d: code-address
+                                |  000d: local-snapshot
+                                |  000d: code-address
+00087a: 1a02 1800               |  000d: const-string v2, "InvokeCustom.<init>(" // utf8@0018
+                                |  000f: code-address
+                                |  000f: code-address
+                                |  000f: local-snapshot
+                                |  000f: code-address
+                                |  000f: code-address
+                                |  000f: local-snapshot
+                                |  000f: code-address
+00087e: 6e20 3100 2100          |  000f: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0012: code-address
+                                |  0012: code-address
+                                |  0012: local-snapshot
+000884: 0c01                    |  0012: move-result-object v1
+                                |  0013: code-address
+                                |  0013: code-address
+                                |  0013: local-snapshot
+                                |  0013: code-address
+000886: 6e20 2e00 4100          |  0013: invoke-virtual {v1, v4}, java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder; // method@002e
+                                |  0016: code-address
+                                |  0016: code-address
+                                |  0016: local-snapshot
+00088c: 0c01                    |  0016: move-result-object v1
+                                |  0017: code-address
+                                |  0017: code-address
+                                |  0017: local-snapshot
+                                |  0017: code-address
+00088e: 1a02 0700               |  0017: const-string v2, ")" // utf8@0007
+                                |  0019: code-address
+                                |  0019: code-address
+                                |  0019: local-snapshot
+                                |  0019: code-address
+                                |  0019: code-address
+                                |  0019: local-snapshot
+                                |  0019: code-address
+000892: 6e20 3100 2100          |  0019: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  001c: code-address
+                                |  001c: code-address
+                                |  001c: local-snapshot
+000898: 0c01                    |  001c: move-result-object v1
+                                |  001d: code-address
+                                |  001d: code-address
+                                |  001d: local-snapshot
+                                |  001d: code-address
+00089a: 6e10 3200 0100          |  001d: invoke-virtual {v1}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0032
+                                |  0020: code-address
+                                |  0020: code-address
+                                |  0020: local-snapshot
+0008a0: 0c01                    |  0020: move-result-object v1
+                                |  0021: code-address
+                                |  0021: code-address
+                                |  0021: local-snapshot
+                                |  0021: code-address
+0008a2: 6e20 2700 1000          |  0021: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  0024: code-address
+                                |  0024: code-address
+                                |  0024: local-snapshot
+0008a8: 0e00                    |  0024: return-void
+                                |  0025: code-address
+                                |  debug info
+                                |    line_start: 36
+                                |    parameters_size: 0001
+                                |    parameter <unnamed> v4
+                                |    0000: prologue end
+                                |    0000: line 36
+                                |    line = 111
+                                |    0003: line 111
+                                |    line = 37
+                                |    0006: line 37
+                                |    0024: advance pc
+                                |    0024: line 38
+                                |    end sequence
+                                |
+0008aa: 0000                    |
+                                |[8ac] invokecustom.InvokeCustom.bsmCreateCallSite:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+0008ac: 0700                    |  registers_size: 0007
+0008ae: 0400                    |  ins_size:       0004
+0008b0: 0200                    |  outs_size:      0002
+0008b2: 0000                    |  tries_size:     0000
+0008b4: c11b 0000               |  debug_off:      00001bc1
+0008b8: 2400 0000               |  insns_size:     00000024
+                                |  throws java.lang.Throwable
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+0008bc: 6200 0200               |  0000: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+0008c0: 2201 1000               |  0002: new-instance v1, java.lang.StringBuilder // type@0010
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+0008c4: 7010 2b00 0100          |  0004: invoke-direct {v1}, java.lang.StringBuilder.<init>:()V // method@002b
+                                |  0007: code-address
+                                |  0007: code-address
+                                |  0007: local-snapshot
+                                |  0007: code-address
+0008ca: 1a02 4f00               |  0007: const-string v2, "bsmCreateCallSite [" // utf8@004f
+                                |  0009: code-address
+                                |  0009: code-address
+                                |  0009: local-snapshot
+                                |  0009: code-address
+                                |  0009: code-address
+                                |  0009: local-snapshot
+                                |  0009: code-address
+0008ce: 6e20 3100 2100          |  0009: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  000c: code-address
+                                |  000c: code-address
+                                |  000c: local-snapshot
+0008d4: 0c01                    |  000c: move-result-object v1
+                                |  000d: code-address
+                                |  000d: code-address
+                                |  000d: local-snapshot
+                                |  000d: code-address
+0008d6: 6e20 3000 6100          |  000d: invoke-virtual {v1, v6}, java.lang.StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@0030
+                                |  0010: code-address
+                                |  0010: code-address
+                                |  0010: local-snapshot
+0008dc: 0c01                    |  0010: move-result-object v1
+                                |  0011: code-address
+                                |  0011: code-address
+                                |  0011: local-snapshot
+                                |  0011: code-address
+0008de: 1a02 4b00               |  0011: const-string v2, "]" // utf8@004b
+                                |  0013: code-address
+                                |  0013: code-address
+                                |  0013: local-snapshot
+                                |  0013: code-address
+                                |  0013: code-address
+                                |  0013: local-snapshot
+                                |  0013: code-address
+0008e2: 6e20 3100 2100          |  0013: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0016: code-address
+                                |  0016: code-address
+                                |  0016: local-snapshot
+0008e8: 0c01                    |  0016: move-result-object v1
+                                |  0017: code-address
+                                |  0017: code-address
+                                |  0017: local-snapshot
+                                |  0017: code-address
+0008ea: 6e10 3200 0100          |  0017: invoke-virtual {v1}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0032
+                                |  001a: code-address
+                                |  001a: code-address
+                                |  001a: local-snapshot
+0008f0: 0c01                    |  001a: move-result-object v1
+                                |  001b: code-address
+                                |  001b: code-address
+                                |  001b: local-snapshot
+                                |  001b: code-address
+0008f2: 6e20 2700 1000          |  001b: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  001e: code-address
+                                |  001e: code-address
+                                |  001e: local-snapshot
+                                |  001e: code-address
+0008f8: 2200 1400               |  001e: new-instance v0, java.lang.invoke.ConstantCallSite // type@0014
+                                |  0020: code-address
+                                |  0020: code-address
+                                |  0020: local-snapshot
+                                |  0020: code-address
+                                |  0020: code-address
+                                |  0020: local-snapshot
+                                |  0020: code-address
+0008fc: 7020 3300 6000          |  0020: invoke-direct {v0, v6}, java.lang.invoke.ConstantCallSite.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@0033
+                                |  0023: code-address
+                                |  0023: code-address
+                                |  0023: local-snapshot
+000902: 1100                    |  0023: return-object v0
+                                |  0024: code-address
+                                |  debug info
+                                |    line_start: 156
+                                |    parameters_size: 0004
+                                |    parameter <unnamed> v3
+                                |    parameter <unnamed> v4
+                                |    parameter <unnamed> v5
+                                |    parameter <unnamed> v6
+                                |    0000: prologue end
+                                |    0000: line 156
+                                |    001e: advance pc
+                                |    001e: line 157
+                                |    end sequence
+                                |
+                                |[904] invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
+000904: 0500                    |  registers_size: 0005
+000906: 0300                    |  ins_size:       0003
+000908: 0400                    |  outs_size:      0004
+00090a: 0000                    |  tries_size:     0000
+00090c: ce1b 0000               |  debug_off:      00001bce
+000910: 1d00 0000               |  insns_size:     0000001d
+                                |  throws java.lang.NoSuchMethodException, java.lang.IllegalAccessException
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+000914: 6200 0200               |  0000: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+000918: 1a01 5100               |  0002: const-string v1, "bsmLookupStatic []" // utf8@0051
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+00091c: 6e20 2700 1000          |  0004: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  0007: code-address
+                                |  0007: code-address
+                                |  0007: local-snapshot
+                                |  0007: code-address
+000922: 7100 4000 0000          |  0007: invoke-static {}, java.lang.invoke.MethodHandles.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@0040
+                                |  000a: code-address
+                                |  000a: code-address
+                                |  000a: local-snapshot
+000928: 0c00                    |  000a: move-result-object v0
+                                |  000b: code-address
+                                |  000b: code-address
+                                |  000b: local-snapshot
+                                |  000b: code-address
+00092a: 6e10 3f00 0000          |  000b: invoke-virtual {v0}, java.lang.invoke.MethodHandles$Lookup.lookupClass:()Ljava/lang/Class; // method@003f
+                                |  000e: code-address
+                                |  000e: code-address
+                                |  000e: local-snapshot
+000930: 0c01                    |  000e: move-result-object v1
+                                |  000f: code-address
+                                |  000f: code-address
+                                |  000f: local-snapshot
+                                |  000f: code-address
+000932: 6e40 3e00 1043          |  000f: invoke-virtual {v0, v1, v3, v4}, java.lang.invoke.MethodHandles$Lookup.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@003e
+                                |  0012: code-address
+                                |  0012: code-address
+                                |  0012: local-snapshot
+000938: 0c00                    |  0012: move-result-object v0
+                                |  0013: code-address
+                                |  0013: code-address
+                                |  0013: local-snapshot
+                                |  0013: code-address
+00093a: 2201 1400               |  0013: new-instance v1, java.lang.invoke.ConstantCallSite // type@0014
+                                |  0015: code-address
+                                |  0015: code-address
+                                |  0015: local-snapshot
+                                |  0015: code-address
+                                |  0015: code-address
+                                |  0015: local-snapshot
+                                |  0015: code-address
+00093e: 6e20 3400 4000          |  0015: invoke-virtual {v0, v4}, java.lang.invoke.MethodHandle.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@0034
+                                |  0018: code-address
+                                |  0018: code-address
+                                |  0018: local-snapshot
+000944: 0c00                    |  0018: move-result-object v0
+                                |  0019: code-address
+                                |  0019: code-address
+                                |  0019: local-snapshot
+                                |  0019: code-address
+000946: 7020 3300 0100          |  0019: invoke-direct {v1, v0}, java.lang.invoke.ConstantCallSite.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@0033
+                                |  001c: code-address
+                                |  001c: code-address
+                                |  001c: local-snapshot
+00094c: 1101                    |  001c: return-object v1
+                                |  001d: code-address
+                                |  debug info
+                                |    line_start: 138
+                                |    parameters_size: 0003
+                                |    parameter <unnamed> v2
+                                |    parameter <unnamed> v3
+                                |    parameter <unnamed> v4
+                                |    0000: prologue end
+                                |    0000: line 138
+                                |    0007: line 139
+                                |    000b: line 140
+                                |    0013: line 141
+                                |    end sequence
+                                |
+00094e: 0000                    |
+                                |[950] invokecustom.InvokeCustom.bsmLookupStaticWithExtraArgs:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;
+000950: 0c00                    |  registers_size: 000c
+000952: 0900                    |  ins_size:       0009
+000954: 0400                    |  outs_size:      0004
+000956: 0000                    |  tries_size:     0000
+000958: da1b 0000               |  debug_off:      00001bda
+00095c: 5200 0000               |  insns_size:     00000052
+                                |  throws java.lang.NoSuchMethodException, java.lang.IllegalAccessException
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+000960: 6200 0200               |  0000: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+000964: 2201 1000               |  0002: new-instance v1, java.lang.StringBuilder // type@0010
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+000968: 7010 2b00 0100          |  0004: invoke-direct {v1}, java.lang.StringBuilder.<init>:()V // method@002b
+                                |  0007: code-address
+                                |  0007: code-address
+                                |  0007: local-snapshot
+                                |  0007: code-address
+00096e: 1a02 5300               |  0007: const-string v2, "bsmLookupStaticWithExtraArgs [" // utf8@0053
+                                |  0009: code-address
+                                |  0009: code-address
+                                |  0009: local-snapshot
+                                |  0009: code-address
+                                |  0009: code-address
+                                |  0009: local-snapshot
+                                |  0009: code-address
+000972: 6e20 3100 2100          |  0009: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  000c: code-address
+                                |  000c: code-address
+                                |  000c: local-snapshot
+000978: 0c01                    |  000c: move-result-object v1
+                                |  000d: code-address
+                                |  000d: code-address
+                                |  000d: local-snapshot
+                                |  000d: code-address
+00097a: 6e20 2e00 6100          |  000d: invoke-virtual {v1, v6}, java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder; // method@002e
+                                |  0010: code-address
+                                |  0010: code-address
+                                |  0010: local-snapshot
+000980: 0c01                    |  0010: move-result-object v1
+                                |  0011: code-address
+                                |  0011: code-address
+                                |  0011: local-snapshot
+                                |  0011: code-address
+000982: 1a02 0800               |  0011: const-string v2, ", " // utf8@0008
+                                |  0013: code-address
+                                |  0013: code-address
+                                |  0013: local-snapshot
+                                |  0013: code-address
+                                |  0013: code-address
+                                |  0013: local-snapshot
+                                |  0013: code-address
+000986: 6e20 3100 2100          |  0013: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0016: code-address
+                                |  0016: code-address
+                                |  0016: local-snapshot
+00098c: 0c01                    |  0016: move-result-object v1
+                                |  0017: code-address
+                                |  0017: code-address
+                                |  0017: local-snapshot
+                                |  0017: code-address
+00098e: 6e30 2f00 7108          |  0017: invoke-virtual {v1, v7, v8}, java.lang.StringBuilder.append:(J)Ljava/lang/StringBuilder; // method@002f
+                                |  001a: code-address
+                                |  001a: code-address
+                                |  001a: local-snapshot
+000994: 0c01                    |  001a: move-result-object v1
+                                |  001b: code-address
+                                |  001b: code-address
+                                |  001b: local-snapshot
+                                |  001b: code-address
+000996: 1a02 0800               |  001b: const-string v2, ", " // utf8@0008
+                                |  001d: code-address
+                                |  001d: code-address
+                                |  001d: local-snapshot
+                                |  001d: code-address
+                                |  001d: code-address
+                                |  001d: local-snapshot
+                                |  001d: code-address
+00099a: 6e20 3100 2100          |  001d: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0020: code-address
+                                |  0020: code-address
+                                |  0020: local-snapshot
+0009a0: 0c01                    |  0020: move-result-object v1
+                                |  0021: code-address
+                                |  0021: code-address
+                                |  0021: local-snapshot
+                                |  0021: code-address
+0009a2: 6e20 2d00 9100          |  0021: invoke-virtual {v1, v9}, java.lang.StringBuilder.append:(F)Ljava/lang/StringBuilder; // method@002d
+                                |  0024: code-address
+                                |  0024: code-address
+                                |  0024: local-snapshot
+0009a8: 0c01                    |  0024: move-result-object v1
+                                |  0025: code-address
+                                |  0025: code-address
+                                |  0025: local-snapshot
+                                |  0025: code-address
+0009aa: 1a02 0800               |  0025: const-string v2, ", " // utf8@0008
+                                |  0027: code-address
+                                |  0027: code-address
+                                |  0027: local-snapshot
+                                |  0027: code-address
+                                |  0027: code-address
+                                |  0027: local-snapshot
+                                |  0027: code-address
+0009ae: 6e20 3100 2100          |  0027: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  002a: code-address
+                                |  002a: code-address
+                                |  002a: local-snapshot
+0009b4: 0c01                    |  002a: move-result-object v1
+                                |  002b: code-address
+                                |  002b: code-address
+                                |  002b: local-snapshot
+                                |  002b: code-address
+0009b6: 6e30 2c00 a10b          |  002b: invoke-virtual {v1, v10, v11}, java.lang.StringBuilder.append:(D)Ljava/lang/StringBuilder; // method@002c
+                                |  002e: code-address
+                                |  002e: code-address
+                                |  002e: local-snapshot
+0009bc: 0c01                    |  002e: move-result-object v1
+                                |  002f: code-address
+                                |  002f: code-address
+                                |  002f: local-snapshot
+                                |  002f: code-address
+0009be: 1a02 4b00               |  002f: const-string v2, "]" // utf8@004b
+                                |  0031: code-address
+                                |  0031: code-address
+                                |  0031: local-snapshot
+                                |  0031: code-address
+                                |  0031: code-address
+                                |  0031: local-snapshot
+                                |  0031: code-address
+0009c2: 6e20 3100 2100          |  0031: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0034: code-address
+                                |  0034: code-address
+                                |  0034: local-snapshot
+0009c8: 0c01                    |  0034: move-result-object v1
+                                |  0035: code-address
+                                |  0035: code-address
+                                |  0035: local-snapshot
+                                |  0035: code-address
+0009ca: 6e10 3200 0100          |  0035: invoke-virtual {v1}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0032
+                                |  0038: code-address
+                                |  0038: code-address
+                                |  0038: local-snapshot
+0009d0: 0c01                    |  0038: move-result-object v1
+                                |  0039: code-address
+                                |  0039: code-address
+                                |  0039: local-snapshot
+                                |  0039: code-address
+0009d2: 6e20 2700 1000          |  0039: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  003c: code-address
+                                |  003c: code-address
+                                |  003c: local-snapshot
+                                |  003c: code-address
+0009d8: 7100 4000 0000          |  003c: invoke-static {}, java.lang.invoke.MethodHandles.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@0040
+                                |  003f: code-address
+                                |  003f: code-address
+                                |  003f: local-snapshot
+0009de: 0c00                    |  003f: move-result-object v0
+                                |  0040: code-address
+                                |  0040: code-address
+                                |  0040: local-snapshot
+                                |  0040: code-address
+0009e0: 6e10 3f00 0000          |  0040: invoke-virtual {v0}, java.lang.invoke.MethodHandles$Lookup.lookupClass:()Ljava/lang/Class; // method@003f
+                                |  0043: code-address
+                                |  0043: code-address
+                                |  0043: local-snapshot
+0009e6: 0c01                    |  0043: move-result-object v1
+                                |  0044: code-address
+                                |  0044: code-address
+                                |  0044: local-snapshot
+                                |  0044: code-address
+0009e8: 6e40 3e00 1054          |  0044: invoke-virtual {v0, v1, v4, v5}, java.lang.invoke.MethodHandles$Lookup.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@003e
+                                |  0047: code-address
+                                |  0047: code-address
+                                |  0047: local-snapshot
+0009ee: 0c00                    |  0047: move-result-object v0
+                                |  0048: code-address
+                                |  0048: code-address
+                                |  0048: local-snapshot
+                                |  0048: code-address
+0009f0: 2201 1400               |  0048: new-instance v1, java.lang.invoke.ConstantCallSite // type@0014
+                                |  004a: code-address
+                                |  004a: code-address
+                                |  004a: local-snapshot
+                                |  004a: code-address
+                                |  004a: code-address
+                                |  004a: local-snapshot
+                                |  004a: code-address
+0009f4: 6e20 3400 5000          |  004a: invoke-virtual {v0, v5}, java.lang.invoke.MethodHandle.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@0034
+                                |  004d: code-address
+                                |  004d: code-address
+                                |  004d: local-snapshot
+0009fa: 0c00                    |  004d: move-result-object v0
+                                |  004e: code-address
+                                |  004e: code-address
+                                |  004e: local-snapshot
+                                |  004e: code-address
+0009fc: 7020 3300 0100          |  004e: invoke-direct {v1, v0}, java.lang.invoke.ConstantCallSite.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@0033
+                                |  0051: code-address
+                                |  0051: code-address
+                                |  0051: local-snapshot
+000a02: 1101                    |  0051: return-object v1
+                                |  0052: code-address
+                                |  debug info
+                                |    line_start: 147
+                                |    parameters_size: 0007
+                                |    parameter <unnamed> v3
+                                |    parameter <unnamed> v4
+                                |    parameter <unnamed> v5
+                                |    parameter <unnamed> v6
+                                |    parameter <unnamed> v7
+                                |    parameter <unnamed> v9
+                                |    parameter <unnamed> v10
+                                |    0000: prologue end
+                                |    0000: line 147
+                                |    003c: advance pc
+                                |    003c: line 148
+                                |    0040: line 149
+                                |    0048: line 150
+                                |    end sequence
+                                |
+                                |[a04] invokecustom.InvokeCustom.bsmLookupTest9:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+000a04: 0d00                    |  registers_size: 000d
+000a06: 0a00                    |  ins_size:       000a
+000a08: 0400                    |  outs_size:      0004
+000a0a: 0000                    |  tries_size:     0000
+000a0c: ec1b 0000               |  debug_off:      00001bec
+000a10: 8700 0000               |  insns_size:     00000087
+                                |  throws java.lang.Throwable
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+000a14: 6200 0200               |  0000: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+000a18: 2201 1000               |  0002: new-instance v1, java.lang.StringBuilder // type@0010
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+000a1c: 7010 2b00 0100          |  0004: invoke-direct {v1}, java.lang.StringBuilder.<init>:()V // method@002b
+                                |  0007: code-address
+                                |  0007: code-address
+                                |  0007: local-snapshot
+                                |  0007: code-address
+000a22: 1a02 5500               |  0007: const-string v2, "bsmLookupTest9 [" // utf8@0055
+                                |  0009: code-address
+                                |  0009: code-address
+                                |  0009: local-snapshot
+                                |  0009: code-address
+                                |  0009: code-address
+                                |  0009: local-snapshot
+                                |  0009: code-address
+000a26: 6e20 3100 2100          |  0009: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  000c: code-address
+                                |  000c: code-address
+                                |  000c: local-snapshot
+000a2c: 0c01                    |  000c: move-result-object v1
+                                |  000d: code-address
+                                |  000d: code-address
+                                |  000d: local-snapshot
+                                |  000d: code-address
+000a2e: 6e20 3000 6100          |  000d: invoke-virtual {v1, v6}, java.lang.StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@0030
+                                |  0010: code-address
+                                |  0010: code-address
+                                |  0010: local-snapshot
+000a34: 0c01                    |  0010: move-result-object v1
+                                |  0011: code-address
+                                |  0011: code-address
+                                |  0011: local-snapshot
+                                |  0011: code-address
+000a36: 1a02 0800               |  0011: const-string v2, ", " // utf8@0008
+                                |  0013: code-address
+                                |  0013: code-address
+                                |  0013: local-snapshot
+                                |  0013: code-address
+                                |  0013: code-address
+                                |  0013: local-snapshot
+                                |  0013: code-address
+000a3a: 6e20 3100 2100          |  0013: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0016: code-address
+                                |  0016: code-address
+                                |  0016: local-snapshot
+000a40: 0c01                    |  0016: move-result-object v1
+                                |  0017: code-address
+                                |  0017: code-address
+                                |  0017: local-snapshot
+                                |  0017: code-address
+000a42: 6e20 3000 7100          |  0017: invoke-virtual {v1, v7}, java.lang.StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@0030
+                                |  001a: code-address
+                                |  001a: code-address
+                                |  001a: local-snapshot
+000a48: 0c01                    |  001a: move-result-object v1
+                                |  001b: code-address
+                                |  001b: code-address
+                                |  001b: local-snapshot
+                                |  001b: code-address
+000a4a: 1a02 0800               |  001b: const-string v2, ", " // utf8@0008
+                                |  001d: code-address
+                                |  001d: code-address
+                                |  001d: local-snapshot
+                                |  001d: code-address
+                                |  001d: code-address
+                                |  001d: local-snapshot
+                                |  001d: code-address
+000a4e: 6e20 3100 2100          |  001d: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0020: code-address
+                                |  0020: code-address
+                                |  0020: local-snapshot
+000a54: 0c01                    |  0020: move-result-object v1
+                                |  0021: code-address
+                                |  0021: code-address
+                                |  0021: local-snapshot
+                                |  0021: code-address
+000a56: 6e20 3000 8100          |  0021: invoke-virtual {v1, v8}, java.lang.StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@0030
+                                |  0024: code-address
+                                |  0024: code-address
+                                |  0024: local-snapshot
+000a5c: 0c01                    |  0024: move-result-object v1
+                                |  0025: code-address
+                                |  0025: code-address
+                                |  0025: local-snapshot
+                                |  0025: code-address
+000a5e: 1a02 0800               |  0025: const-string v2, ", " // utf8@0008
+                                |  0027: code-address
+                                |  0027: code-address
+                                |  0027: local-snapshot
+                                |  0027: code-address
+                                |  0027: code-address
+                                |  0027: local-snapshot
+                                |  0027: code-address
+000a62: 6e20 3100 2100          |  0027: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  002a: code-address
+                                |  002a: code-address
+                                |  002a: local-snapshot
+000a68: 0c01                    |  002a: move-result-object v1
+                                |  002b: code-address
+                                |  002b: code-address
+                                |  002b: local-snapshot
+                                |  002b: code-address
+000a6a: 6e20 3000 9100          |  002b: invoke-virtual {v1, v9}, java.lang.StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@0030
+                                |  002e: code-address
+                                |  002e: code-address
+                                |  002e: local-snapshot
+000a70: 0c01                    |  002e: move-result-object v1
+                                |  002f: code-address
+                                |  002f: code-address
+                                |  002f: local-snapshot
+                                |  002f: code-address
+000a72: 1a02 4b00               |  002f: const-string v2, "]" // utf8@004b
+                                |  0031: code-address
+                                |  0031: code-address
+                                |  0031: local-snapshot
+                                |  0031: code-address
+                                |  0031: code-address
+                                |  0031: local-snapshot
+                                |  0031: code-address
+000a76: 6e20 3100 2100          |  0031: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0034: code-address
+                                |  0034: code-address
+                                |  0034: local-snapshot
+000a7c: 0c01                    |  0034: move-result-object v1
+                                |  0035: code-address
+                                |  0035: code-address
+                                |  0035: local-snapshot
+                                |  0035: code-address
+000a7e: 6e10 3200 0100          |  0035: invoke-virtual {v1}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0032
+                                |  0038: code-address
+                                |  0038: code-address
+                                |  0038: local-snapshot
+000a84: 0c01                    |  0038: move-result-object v1
+                                |  0039: code-address
+                                |  0039: code-address
+                                |  0039: local-snapshot
+                                |  0039: code-address
+000a86: 6e20 2700 1000          |  0039: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  003c: code-address
+                                |  003c: code-address
+                                |  003c: local-snapshot
+                                |  003c: code-address
+000a8c: 6200 0200               |  003c: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  003e: code-address
+                                |  003e: code-address
+                                |  003e: local-snapshot
+                                |  003e: code-address
+                                |  003e: code-address
+                                |  003e: local-snapshot
+                                |  003e: code-address
+000a90: 2201 1000               |  003e: new-instance v1, java.lang.StringBuilder // type@0010
+                                |  0040: code-address
+                                |  0040: code-address
+                                |  0040: local-snapshot
+                                |  0040: code-address
+                                |  0040: code-address
+                                |  0040: local-snapshot
+                                |  0040: code-address
+000a94: 7010 2b00 0100          |  0040: invoke-direct {v1}, java.lang.StringBuilder.<init>:()V // method@002b
+                                |  0043: code-address
+                                |  0043: code-address
+                                |  0043: local-snapshot
+                                |  0043: code-address
+000a9a: 6e20 3100 4100          |  0043: invoke-virtual {v1, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0046: code-address
+                                |  0046: code-address
+                                |  0046: local-snapshot
+000aa0: 0c01                    |  0046: move-result-object v1
+                                |  0047: code-address
+                                |  0047: code-address
+                                |  0047: local-snapshot
+                                |  0047: code-address
+000aa2: 1a02 0000               |  0047: const-string v2, " " // utf8@0000
+                                |  0049: code-address
+                                |  0049: code-address
+                                |  0049: local-snapshot
+                                |  0049: code-address
+                                |  0049: code-address
+                                |  0049: local-snapshot
+                                |  0049: code-address
+000aa6: 6e20 3100 2100          |  0049: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  004c: code-address
+                                |  004c: code-address
+                                |  004c: local-snapshot
+000aac: 0c01                    |  004c: move-result-object v1
+                                |  004d: code-address
+                                |  004d: code-address
+                                |  004d: local-snapshot
+                                |  004d: code-address
+000aae: 6e20 3000 5100          |  004d: invoke-virtual {v1, v5}, java.lang.StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@0030
+                                |  0050: code-address
+                                |  0050: code-address
+                                |  0050: local-snapshot
+000ab4: 0c01                    |  0050: move-result-object v1
+                                |  0051: code-address
+                                |  0051: code-address
+                                |  0051: local-snapshot
+                                |  0051: code-address
+000ab6: 6e10 3200 0100          |  0051: invoke-virtual {v1}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0032
+                                |  0054: code-address
+                                |  0054: code-address
+                                |  0054: local-snapshot
+000abc: 0c01                    |  0054: move-result-object v1
+                                |  0055: code-address
+                                |  0055: code-address
+                                |  0055: local-snapshot
+                                |  0055: code-address
+000abe: 6e20 2700 1000          |  0055: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  0058: code-address
+                                |  0058: code-address
+                                |  0058: local-snapshot
+                                |  0058: code-address
+000ac4: 7120 0800 7600          |  0058: invoke-static {v6, v7}, invokecustom.InvokeCustom.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V // method@0008
+                                |  005b: code-address
+                                |  005b: code-address
+                                |  005b: local-snapshot
+                                |  005b: code-address
+000aca: 2200 0700               |  005b: new-instance v0, invokecustom.InvokeCustom // type@0007
+                                |  005d: code-address
+                                |  005d: code-address
+                                |  005d: local-snapshot
+                                |  005d: code-address
+                                |  005d: code-address
+                                |  005d: local-snapshot
+                                |  005d: code-address
+000ace: 7010 0100 0000          |  005d: invoke-direct {v0}, invokecustom.InvokeCustom.<init>:()V // method@0001
+                                |  0060: code-address
+                                |  0060: code-address
+                                |  0060: local-snapshot
+                                |  0060: code-address
+000ad4: 7030 0700 8009          |  0060: invoke-direct {v0, v8, v9}, invokecustom.InvokeCustom.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V // method@0007
+                                |  0063: code-address
+                                |  0063: code-address
+                                |  0063: local-snapshot
+                                |  0063: code-address
+000ada: fa20 3a00 0a00 1c00     |  0063: invoke-polymorphic {v10, v0}, java.lang.invoke.MethodHandle.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)V // method@003a, proto@001c
+                                |  0067: code-address
+                                |  0067: code-address
+                                |  0067: local-snapshot
+000ae2: 1230                    |  0067: const/4 v0, #int 3 // #3
+                                |  0068: code-address
+000ae4: fa20 3a00 0b00 0500     |  0068: invoke-polymorphic {v11, v0}, java.lang.invoke.MethodHandle.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (I)Linvokecustom/InvokeCustom; // method@003a, proto@0005
+                                |  006c: code-address
+                                |  006c: code-address
+                                |  006c: local-snapshot
+000aec: 0c00                    |  006c: move-result-object v0
+                                |  006d: code-address
+                                |  006d: code-address
+                                |  006d: local-snapshot
+                                |  006d: code-address
+000aee: fa20 3500 0c00 1c00     |  006d: invoke-polymorphic {v12, v0}, java.lang.invoke.MethodHandle.invoke:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)V // method@0035, proto@001c
+                                |  0071: code-address
+                                |  0071: code-address
+                                |  0071: local-snapshot
+                                |  0071: code-address
+000af6: 7100 4000 0000          |  0071: invoke-static {}, java.lang.invoke.MethodHandles.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@0040
+                                |  0074: code-address
+                                |  0074: code-address
+                                |  0074: local-snapshot
+000afc: 0c00                    |  0074: move-result-object v0
+                                |  0075: code-address
+                                |  0075: code-address
+                                |  0075: local-snapshot
+                                |  0075: code-address
+000afe: 6e10 3f00 0000          |  0075: invoke-virtual {v0}, java.lang.invoke.MethodHandles$Lookup.lookupClass:()Ljava/lang/Class; // method@003f
+                                |  0078: code-address
+                                |  0078: code-address
+                                |  0078: local-snapshot
+000b04: 0c01                    |  0078: move-result-object v1
+                                |  0079: code-address
+                                |  0079: code-address
+                                |  0079: local-snapshot
+                                |  0079: code-address
+000b06: 6e40 3e00 1054          |  0079: invoke-virtual {v0, v1, v4, v5}, java.lang.invoke.MethodHandles$Lookup.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@003e
+                                |  007c: code-address
+                                |  007c: code-address
+                                |  007c: local-snapshot
+000b0c: 0c00                    |  007c: move-result-object v0
+                                |  007d: code-address
+                                |  007d: code-address
+                                |  007d: local-snapshot
+                                |  007d: code-address
+000b0e: 2201 1400               |  007d: new-instance v1, java.lang.invoke.ConstantCallSite // type@0014
+                                |  007f: code-address
+                                |  007f: code-address
+                                |  007f: local-snapshot
+                                |  007f: code-address
+                                |  007f: code-address
+                                |  007f: local-snapshot
+                                |  007f: code-address
+000b12: 6e20 3400 5000          |  007f: invoke-virtual {v0, v5}, java.lang.invoke.MethodHandle.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@0034
+                                |  0082: code-address
+                                |  0082: code-address
+                                |  0082: local-snapshot
+000b18: 0c00                    |  0082: move-result-object v0
+                                |  0083: code-address
+                                |  0083: code-address
+                                |  0083: local-snapshot
+                                |  0083: code-address
+000b1a: 7020 3300 0100          |  0083: invoke-direct {v1, v0}, java.lang.invoke.ConstantCallSite.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@0033
+                                |  0086: code-address
+                                |  0086: code-address
+                                |  0086: local-snapshot
+000b20: 1101                    |  0086: return-object v1
+                                |  0087: code-address
+                                |  debug info
+                                |    line_start: 166
+                                |    parameters_size: 000a
+                                |    parameter <unnamed> v3
+                                |    parameter <unnamed> v4
+                                |    parameter <unnamed> v5
+                                |    parameter <unnamed> v6
+                                |    parameter <unnamed> v7
+                                |    parameter <unnamed> v8
+                                |    parameter <unnamed> v9
+                                |    parameter <unnamed> v10
+                                |    parameter <unnamed> v11
+                                |    parameter <unnamed> v12
+                                |    0000: prologue end
+                                |    0000: line 166
+                                |    003c: advance pc
+                                |    003c: line 168
+                                |    0058: advance pc
+                                |    0058: line 171
+                                |    005b: line 172
+                                |    0060: line 173
+                                |    0063: line 176
+                                |    0067: line 178
+                                |    006d: line 179
+                                |    0071: line 181
+                                |    0075: line 182
+                                |    007d: line 183
+                                |    end sequence
+                                |
+000b22: 0000                    |
+                                |[b24] invokecustom.InvokeCustom.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+000b24: 0900                    |  registers_size: 0009
+000b26: 0300                    |  ins_size:       0003
+000b28: 0300                    |  outs_size:      0003
+000b2a: 0000                    |  tries_size:     0000
+000b2c: 0a1c 0000               |  debug_off:      00001c0a
+000b30: 5200 0000               |  insns_size:     00000052
+                                |  throws java.lang.Throwable
+                                |  0000: code-address
+                                |  0000: local-snapshot
+000b34: 1405 0ff0 6a20          |  0000: const v5, #float 1.99E-19 // #206af00f
+                                |  0003: code-address
+                                |  0003: code-address
+                                |  0003: local-snapshot
+                                |  0003: code-address
+                                |  0003: code-address
+                                |  0003: local-snapshot
+                                |  0003: code-address
+000b3a: fa20 3a00 6700 0100     |  0003: invoke-polymorphic {v7, v6}, java.lang.invoke.MethodHandle.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)F // method@003a, proto@0001
+                                |  0007: code-address
+                                |  0007: code-address
+                                |  0007: local-snapshot
+000b42: 0a00                    |  0007: move-result v0
+                                |  0008: code-address
+                                |  0008: code-address
+                                |  0008: local-snapshot
+                                |  0008: code-address
+000b44: fa30 3a00 6805 1d00     |  0008: invoke-polymorphic {v8, v6, v5}, java.lang.invoke.MethodHandle.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;F)V // method@003a, proto@001d
+                                |  000c: code-address
+                                |  000c: code-address
+                                |  000c: local-snapshot
+                                |  000c: code-address
+000b4c: fa20 3a00 6700 0100     |  000c: invoke-polymorphic {v7, v6}, java.lang.invoke.MethodHandle.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)F // method@003a, proto@0001
+                                |  0010: code-address
+                                |  0010: code-address
+                                |  0010: local-snapshot
+000b54: 0a01                    |  0010: move-result v1
+                                |  0011: code-address
+                                |  0011: code-address
+                                |  0011: local-snapshot
+                                |  0011: code-address
+000b56: 6202 0200               |  0011: sget-object v2, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0013: code-address
+                                |  0013: code-address
+                                |  0013: local-snapshot
+                                |  0013: code-address
+                                |  0013: code-address
+                                |  0013: local-snapshot
+                                |  0013: code-address
+000b5a: 2203 1000               |  0013: new-instance v3, java.lang.StringBuilder // type@0010
+                                |  0015: code-address
+                                |  0015: code-address
+                                |  0015: local-snapshot
+                                |  0015: code-address
+                                |  0015: code-address
+                                |  0015: local-snapshot
+                                |  0015: code-address
+000b5e: 7010 2b00 0300          |  0015: invoke-direct {v3}, java.lang.StringBuilder.<init>:()V // method@002b
+                                |  0018: code-address
+                                |  0018: code-address
+                                |  0018: local-snapshot
+                                |  0018: code-address
+000b64: 1a04 5700               |  0018: const-string v4, "checkFieldTest9: old " // utf8@0057
+                                |  001a: code-address
+                                |  001a: code-address
+                                |  001a: local-snapshot
+                                |  001a: code-address
+                                |  001a: code-address
+                                |  001a: local-snapshot
+                                |  001a: code-address
+000b68: 6e20 3100 4300          |  001a: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  001d: code-address
+                                |  001d: code-address
+                                |  001d: local-snapshot
+000b6e: 0c03                    |  001d: move-result-object v3
+                                |  001e: code-address
+                                |  001e: code-address
+                                |  001e: local-snapshot
+                                |  001e: code-address
+000b70: 6e20 2d00 0300          |  001e: invoke-virtual {v3, v0}, java.lang.StringBuilder.append:(F)Ljava/lang/StringBuilder; // method@002d
+                                |  0021: code-address
+                                |  0021: code-address
+                                |  0021: local-snapshot
+000b76: 0c00                    |  0021: move-result-object v0
+                                |  0022: code-address
+                                |  0022: code-address
+                                |  0022: local-snapshot
+                                |  0022: code-address
+000b78: 1a03 0600               |  0022: const-string v3, " new " // utf8@0006
+                                |  0024: code-address
+                                |  0024: code-address
+                                |  0024: local-snapshot
+                                |  0024: code-address
+                                |  0024: code-address
+                                |  0024: local-snapshot
+                                |  0024: code-address
+000b7c: 6e20 3100 3000          |  0024: invoke-virtual {v0, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0027: code-address
+                                |  0027: code-address
+                                |  0027: local-snapshot
+000b82: 0c00                    |  0027: move-result-object v0
+                                |  0028: code-address
+                                |  0028: code-address
+                                |  0028: local-snapshot
+                                |  0028: code-address
+000b84: 6e20 2d00 1000          |  0028: invoke-virtual {v0, v1}, java.lang.StringBuilder.append:(F)Ljava/lang/StringBuilder; // method@002d
+                                |  002b: code-address
+                                |  002b: code-address
+                                |  002b: local-snapshot
+000b8a: 0c00                    |  002b: move-result-object v0
+                                |  002c: code-address
+                                |  002c: code-address
+                                |  002c: local-snapshot
+                                |  002c: code-address
+000b8c: 1a03 0500               |  002c: const-string v3, " expected " // utf8@0005
+                                |  002e: code-address
+                                |  002e: code-address
+                                |  002e: local-snapshot
+                                |  002e: code-address
+                                |  002e: code-address
+                                |  002e: local-snapshot
+                                |  002e: code-address
+000b90: 6e20 3100 3000          |  002e: invoke-virtual {v0, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0031: code-address
+                                |  0031: code-address
+                                |  0031: local-snapshot
+000b96: 0c00                    |  0031: move-result-object v0
+                                |  0032: code-address
+                                |  0032: code-address
+                                |  0032: local-snapshot
+                                |  0032: code-address
+000b98: 6e20 2d00 5000          |  0032: invoke-virtual {v0, v5}, java.lang.StringBuilder.append:(F)Ljava/lang/StringBuilder; // method@002d
+                                |  0035: code-address
+                                |  0035: code-address
+                                |  0035: local-snapshot
+000b9e: 0c00                    |  0035: move-result-object v0
+                                |  0036: code-address
+                                |  0036: code-address
+                                |  0036: local-snapshot
+                                |  0036: code-address
+000ba0: 1a03 0000               |  0036: const-string v3, " " // utf8@0000
+                                |  0038: code-address
+                                |  0038: code-address
+                                |  0038: local-snapshot
+                                |  0038: code-address
+                                |  0038: code-address
+                                |  0038: local-snapshot
+                                |  0038: code-address
+000ba4: 6e20 3100 3000          |  0038: invoke-virtual {v0, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  003b: code-address
+                                |  003b: code-address
+                                |  003b: local-snapshot
+000baa: 0c00                    |  003b: move-result-object v0
+                                |  003c: code-address
+                                |  003c: code-address
+                                |  003c: local-snapshot
+                                |  003c: code-address
+000bac: 6e10 3200 0000          |  003c: invoke-virtual {v0}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0032
+                                |  003f: code-address
+                                |  003f: code-address
+                                |  003f: local-snapshot
+000bb2: 0c00                    |  003f: move-result-object v0
+                                |  0040: code-address
+                                |  0040: code-address
+                                |  0040: local-snapshot
+                                |  0040: code-address
+000bb4: 6e20 2100 0200          |  0040: invoke-virtual {v2, v0}, java.io.PrintStream.print:(Ljava/lang/String;)V // method@0021
+                                |  0043: code-address
+                                |  0043: code-address
+                                |  0043: local-snapshot
+                                |  0043: code-address
+000bba: 6202 0200               |  0043: sget-object v2, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0045: code-address
+                                |  0045: code-address
+                                |  0045: local-snapshot
+                                |  0045: code-address
+                                |  0045: code-address
+                                |  0045: local-snapshot
+000bbe: 2d00 0105               |  0045: cmpl-float v0, v1, v5
+000bc2: 3900 0800               |  0047: if-nez v0, 004f // +0008
+                                |  0049: code-address
+                                |  0049: code-address
+                                |  0049: local-snapshot
+                                |  0049: code-address
+000bc6: 1a00 3900               |  0049: const-string v0, "OK" // utf8@0039
+                                |  004b: code-address
+                                |  004b: code-address
+                                |  004b: local-snapshot
+                                |  004b: code-address
+                                |  004b: code-address
+                                |  004b: local-snapshot
+                                |  004b: code-address
+000bca: 6e20 2700 0200          |  004b: invoke-virtual {v2, v0}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  004e: code-address
+                                |  004e: code-address
+                                |  004e: local-snapshot
+000bd0: 0e00                    |  004e: return-void
+                                |  004f: code-address
+                                |  004f: code-address
+                                |  004f: local-snapshot
+                                |  004f: code-address
+000bd2: 1a00 1000               |  004f: const-string v0, "ERROR" // utf8@0010
+                                |  0051: code-address
+                                |  0051: code-address
+                                |  0051: local-snapshot
+                                |  0051: code-address
+000bd6: 28fa                    |  0051: goto 004b // -0006
+                                |  debug info
+                                |    line_start: 116
+                                |    parameters_size: 0002
+                                |    parameter <unnamed> v7
+                                |    parameter <unnamed> v8
+                                |    0000: prologue end
+                                |    0003: line 116
+                                |    0008: line 117
+                                |    000c: line 118
+                                |    0011: line 119
+                                |    0043: advance pc
+                                |    0043: line 121
+                                |    004e: line 122
+                                |    004f: line 121
+                                |    end sequence
+                                |
+                                |[bd8] invokecustom.InvokeCustom.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+000bd8: 0800                    |  registers_size: 0008
+000bda: 0200                    |  ins_size:       0002
+000bdc: 0200                    |  outs_size:      0002
+000bde: 0000                    |  tries_size:     0000
+000be0: 191c 0000               |  debug_off:      00001c19
+000be4: 5000 0000               |  insns_size:     00000050
+                                |  throws java.lang.Throwable
+                                |  0000: code-address
+                                |  0000: local-snapshot
+000be8: 1405 1032 5476          |  0000: const v5, #int 1985229328 // #76543210
+                                |  0003: code-address
+                                |  0003: code-address
+                                |  0003: local-snapshot
+                                |  0003: code-address
+                                |  0003: code-address
+                                |  0003: local-snapshot
+                                |  0003: code-address
+000bee: fa10 3a00 0600 0200     |  0003: invoke-polymorphic {v6}, java.lang.invoke.MethodHandle.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, ()I // method@003a, proto@0002
+                                |  0007: code-address
+                                |  0007: code-address
+                                |  0007: local-snapshot
+000bf6: 0a00                    |  0007: move-result v0
+                                |  0008: code-address
+                                |  0008: code-address
+                                |  0008: local-snapshot
+                                |  0008: code-address
+000bf8: fa20 3a00 5700 1a00     |  0008: invoke-polymorphic {v7, v5}, java.lang.invoke.MethodHandle.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (I)V // method@003a, proto@001a
+                                |  000c: code-address
+                                |  000c: code-address
+                                |  000c: local-snapshot
+                                |  000c: code-address
+000c00: fa10 3a00 0600 0200     |  000c: invoke-polymorphic {v6}, java.lang.invoke.MethodHandle.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, ()I // method@003a, proto@0002
+                                |  0010: code-address
+                                |  0010: code-address
+                                |  0010: local-snapshot
+000c08: 0a01                    |  0010: move-result v1
+                                |  0011: code-address
+                                |  0011: code-address
+                                |  0011: local-snapshot
+                                |  0011: code-address
+000c0a: 6202 0200               |  0011: sget-object v2, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0013: code-address
+                                |  0013: code-address
+                                |  0013: local-snapshot
+                                |  0013: code-address
+                                |  0013: code-address
+                                |  0013: local-snapshot
+                                |  0013: code-address
+000c0e: 2203 1000               |  0013: new-instance v3, java.lang.StringBuilder // type@0010
+                                |  0015: code-address
+                                |  0015: code-address
+                                |  0015: local-snapshot
+                                |  0015: code-address
+                                |  0015: code-address
+                                |  0015: local-snapshot
+                                |  0015: code-address
+000c12: 7010 2b00 0300          |  0015: invoke-direct {v3}, java.lang.StringBuilder.<init>:()V // method@002b
+                                |  0018: code-address
+                                |  0018: code-address
+                                |  0018: local-snapshot
+                                |  0018: code-address
+000c18: 1a04 5900               |  0018: const-string v4, "checkStaticFieldTest9: old " // utf8@0059
+                                |  001a: code-address
+                                |  001a: code-address
+                                |  001a: local-snapshot
+                                |  001a: code-address
+                                |  001a: code-address
+                                |  001a: local-snapshot
+                                |  001a: code-address
+000c1c: 6e20 3100 4300          |  001a: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  001d: code-address
+                                |  001d: code-address
+                                |  001d: local-snapshot
+000c22: 0c03                    |  001d: move-result-object v3
+                                |  001e: code-address
+                                |  001e: code-address
+                                |  001e: local-snapshot
+                                |  001e: code-address
+000c24: 6e20 2e00 0300          |  001e: invoke-virtual {v3, v0}, java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder; // method@002e
+                                |  0021: code-address
+                                |  0021: code-address
+                                |  0021: local-snapshot
+000c2a: 0c00                    |  0021: move-result-object v0
+                                |  0022: code-address
+                                |  0022: code-address
+                                |  0022: local-snapshot
+                                |  0022: code-address
+000c2c: 1a03 0600               |  0022: const-string v3, " new " // utf8@0006
+                                |  0024: code-address
+                                |  0024: code-address
+                                |  0024: local-snapshot
+                                |  0024: code-address
+                                |  0024: code-address
+                                |  0024: local-snapshot
+                                |  0024: code-address
+000c30: 6e20 3100 3000          |  0024: invoke-virtual {v0, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0027: code-address
+                                |  0027: code-address
+                                |  0027: local-snapshot
+000c36: 0c00                    |  0027: move-result-object v0
+                                |  0028: code-address
+                                |  0028: code-address
+                                |  0028: local-snapshot
+                                |  0028: code-address
+000c38: 6e20 2e00 1000          |  0028: invoke-virtual {v0, v1}, java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder; // method@002e
+                                |  002b: code-address
+                                |  002b: code-address
+                                |  002b: local-snapshot
+000c3e: 0c00                    |  002b: move-result-object v0
+                                |  002c: code-address
+                                |  002c: code-address
+                                |  002c: local-snapshot
+                                |  002c: code-address
+000c40: 1a03 0500               |  002c: const-string v3, " expected " // utf8@0005
+                                |  002e: code-address
+                                |  002e: code-address
+                                |  002e: local-snapshot
+                                |  002e: code-address
+                                |  002e: code-address
+                                |  002e: local-snapshot
+                                |  002e: code-address
+000c44: 6e20 3100 3000          |  002e: invoke-virtual {v0, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0031: code-address
+                                |  0031: code-address
+                                |  0031: local-snapshot
+000c4a: 0c00                    |  0031: move-result-object v0
+                                |  0032: code-address
+                                |  0032: code-address
+                                |  0032: local-snapshot
+                                |  0032: code-address
+000c4c: 6e20 2e00 5000          |  0032: invoke-virtual {v0, v5}, java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder; // method@002e
+                                |  0035: code-address
+                                |  0035: code-address
+                                |  0035: local-snapshot
+000c52: 0c00                    |  0035: move-result-object v0
+                                |  0036: code-address
+                                |  0036: code-address
+                                |  0036: local-snapshot
+                                |  0036: code-address
+000c54: 1a03 0000               |  0036: const-string v3, " " // utf8@0000
+                                |  0038: code-address
+                                |  0038: code-address
+                                |  0038: local-snapshot
+                                |  0038: code-address
+                                |  0038: code-address
+                                |  0038: local-snapshot
+                                |  0038: code-address
+000c58: 6e20 3100 3000          |  0038: invoke-virtual {v0, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  003b: code-address
+                                |  003b: code-address
+                                |  003b: local-snapshot
+000c5e: 0c00                    |  003b: move-result-object v0
+                                |  003c: code-address
+                                |  003c: code-address
+                                |  003c: local-snapshot
+                                |  003c: code-address
+000c60: 6e10 3200 0000          |  003c: invoke-virtual {v0}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0032
+                                |  003f: code-address
+                                |  003f: code-address
+                                |  003f: local-snapshot
+000c66: 0c00                    |  003f: move-result-object v0
+                                |  0040: code-address
+                                |  0040: code-address
+                                |  0040: local-snapshot
+                                |  0040: code-address
+000c68: 6e20 2100 0200          |  0040: invoke-virtual {v2, v0}, java.io.PrintStream.print:(Ljava/lang/String;)V // method@0021
+                                |  0043: code-address
+                                |  0043: code-address
+                                |  0043: local-snapshot
+                                |  0043: code-address
+000c6e: 6202 0200               |  0043: sget-object v2, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0045: code-address
+                                |  0045: code-address
+                                |  0045: local-snapshot
+                                |  0045: code-address
+                                |  0045: code-address
+                                |  0045: local-snapshot
+000c72: 3351 0800               |  0045: if-ne v1, v5, 004d // +0008
+                                |  0047: code-address
+                                |  0047: code-address
+                                |  0047: local-snapshot
+                                |  0047: code-address
+000c76: 1a00 3900               |  0047: const-string v0, "OK" // utf8@0039
+                                |  0049: code-address
+                                |  0049: code-address
+                                |  0049: local-snapshot
+                                |  0049: code-address
+                                |  0049: code-address
+                                |  0049: local-snapshot
+                                |  0049: code-address
+000c7a: 6e20 2700 0200          |  0049: invoke-virtual {v2, v0}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  004c: code-address
+                                |  004c: code-address
+                                |  004c: local-snapshot
+000c80: 0e00                    |  004c: return-void
+                                |  004d: code-address
+                                |  004d: code-address
+                                |  004d: local-snapshot
+                                |  004d: code-address
+000c82: 1a00 1000               |  004d: const-string v0, "ERROR" // utf8@0010
+                                |  004f: code-address
+                                |  004f: code-address
+                                |  004f: local-snapshot
+                                |  004f: code-address
+000c86: 28fa                    |  004f: goto 0049 // -0006
+                                |  debug info
+                                |    line_start: 103
+                                |    parameters_size: 0002
+                                |    parameter <unnamed> v6
+                                |    parameter <unnamed> v7
+                                |    0000: prologue end
+                                |    0003: line 103
+                                |    0008: line 104
+                                |    000c: line 105
+                                |    0011: line 106
+                                |    0043: advance pc
+                                |    0043: line 108
+                                |    004c: line 109
+                                |    004d: line 108
+                                |    end sequence
+                                |
+                                |[c88] invokecustom.InvokeCustom.main:([Ljava/lang/String;)V
+000c88: 0100                    |  registers_size: 0001
+000c8a: 0100                    |  ins_size:       0001
+000c8c: 0000                    |  outs_size:      0000
+000c8e: 0000                    |  tries_size:     0000
+000c90: 0000 0000               |  debug_off:      00000000
+000c94: 1c00 0000               |  insns_size:     0000001c
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+000c98: 7100 1500 0000          |  0000: invoke-static {}, invokecustom.InvokeCustom.test1:()V // method@0015
+                                |  0003: code-address
+                                |  0003: code-address
+                                |  0003: local-snapshot
+                                |  0003: code-address
+000c9e: 7100 1600 0000          |  0003: invoke-static {}, invokecustom.InvokeCustom.test2:()V // method@0016
+                                |  0006: code-address
+                                |  0006: code-address
+                                |  0006: local-snapshot
+                                |  0006: code-address
+000ca4: 7100 1700 0000          |  0006: invoke-static {}, invokecustom.InvokeCustom.test3:()V // method@0017
+                                |  0009: code-address
+                                |  0009: code-address
+                                |  0009: local-snapshot
+                                |  0009: code-address
+000caa: 7100 1800 0000          |  0009: invoke-static {}, invokecustom.InvokeCustom.test4:()V // method@0018
+                                |  000c: code-address
+                                |  000c: code-address
+                                |  000c: local-snapshot
+                                |  000c: code-address
+000cb0: 7100 1900 0000          |  000c: invoke-static {}, invokecustom.InvokeCustom.test5:()V // method@0019
+                                |  000f: code-address
+                                |  000f: code-address
+                                |  000f: local-snapshot
+                                |  000f: code-address
+000cb6: 7100 1a00 0000          |  000f: invoke-static {}, invokecustom.InvokeCustom.test6:()V // method@001a
+                                |  0012: code-address
+                                |  0012: code-address
+                                |  0012: local-snapshot
+                                |  0012: code-address
+000cbc: 7100 1b00 0000          |  0012: invoke-static {}, invokecustom.InvokeCustom.test7:()V // method@001b
+                                |  0015: code-address
+                                |  0015: code-address
+                                |  0015: local-snapshot
+                                |  0015: code-address
+000cc2: 7100 1c00 0000          |  0015: invoke-static {}, invokecustom.InvokeCustom.test8:()V // method@001c
+                                |  0018: code-address
+                                |  0018: code-address
+                                |  0018: local-snapshot
+                                |  0018: code-address
+000cc8: 7100 1d00 0000          |  0018: invoke-static {}, invokecustom.InvokeCustom.test9:()V // method@001d
+                                |  001b: code-address
+                                |  001b: code-address
+                                |  001b: local-snapshot
+000cce: 0e00                    |  001b: return-void
+                                |  001c: code-address
+                                |
+                                |[cd0] invokecustom.InvokeCustom.targetMethodTest1:()V
+000cd0: 0200                    |  registers_size: 0002
+000cd2: 0000                    |  ins_size:       0000
+000cd4: 0200                    |  outs_size:      0002
+000cd6: 0000                    |  tries_size:     0000
+000cd8: 281c 0000               |  debug_off:      00001c28
+000cdc: 0800 0000               |  insns_size:     00000008
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+000ce0: 6200 0200               |  0000: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+000ce4: 1a01 1500               |  0002: const-string v1, "Hello World!" // utf8@0015
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+000ce8: 6e20 2700 1000          |  0004: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  0007: code-address
+                                |  0007: code-address
+                                |  0007: local-snapshot
+000cee: 0e00                    |  0007: return-void
+                                |  0008: code-address
+                                |  debug info
+                                |    line_start: 41
+                                |    parameters_size: 0000
+                                |    0000: prologue end
+                                |    0000: line 41
+                                |    0007: line 42
+                                |    end sequence
+                                |
+                                |[cf0] invokecustom.InvokeCustom.targetMethodTest2:(ZBCSIFJDLjava/lang/String;)V
+000cf0: 0d00                    |  registers_size: 000d
+000cf2: 0b00                    |  ins_size:       000b
+000cf4: 0300                    |  outs_size:      0003
+000cf6: 0000                    |  tries_size:     0000
+000cf8: 2e1c 0000               |  debug_off:      00001c2e
+000cfc: 2e00 0000               |  insns_size:     0000002e
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+000d00: 6200 0200               |  0000: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+000d04: 6e20 2800 2000          |  0002: invoke-virtual {v0, v2}, java.io.PrintStream.println:(Z)V // method@0028
+                                |  0005: code-address
+                                |  0005: code-address
+                                |  0005: local-snapshot
+                                |  0005: code-address
+000d0a: 6200 0200               |  0005: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0007: code-address
+                                |  0007: code-address
+                                |  0007: local-snapshot
+                                |  0007: code-address
+                                |  0007: code-address
+                                |  0007: local-snapshot
+                                |  0007: code-address
+000d0e: 6e20 2500 3000          |  0007: invoke-virtual {v0, v3}, java.io.PrintStream.println:(I)V // method@0025
+                                |  000a: code-address
+                                |  000a: code-address
+                                |  000a: local-snapshot
+                                |  000a: code-address
+000d14: 6200 0200               |  000a: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  000c: code-address
+                                |  000c: code-address
+                                |  000c: local-snapshot
+                                |  000c: code-address
+                                |  000c: code-address
+                                |  000c: local-snapshot
+                                |  000c: code-address
+000d18: 6e20 2200 4000          |  000c: invoke-virtual {v0, v4}, java.io.PrintStream.println:(C)V // method@0022
+                                |  000f: code-address
+                                |  000f: code-address
+                                |  000f: local-snapshot
+                                |  000f: code-address
+000d1e: 6200 0200               |  000f: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0011: code-address
+                                |  0011: code-address
+                                |  0011: local-snapshot
+                                |  0011: code-address
+                                |  0011: code-address
+                                |  0011: local-snapshot
+                                |  0011: code-address
+000d22: 6e20 2500 5000          |  0011: invoke-virtual {v0, v5}, java.io.PrintStream.println:(I)V // method@0025
+                                |  0014: code-address
+                                |  0014: code-address
+                                |  0014: local-snapshot
+                                |  0014: code-address
+000d28: 6200 0200               |  0014: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0016: code-address
+                                |  0016: code-address
+                                |  0016: local-snapshot
+                                |  0016: code-address
+                                |  0016: code-address
+                                |  0016: local-snapshot
+                                |  0016: code-address
+000d2c: 6e20 2500 6000          |  0016: invoke-virtual {v0, v6}, java.io.PrintStream.println:(I)V // method@0025
+                                |  0019: code-address
+                                |  0019: code-address
+                                |  0019: local-snapshot
+                                |  0019: code-address
+000d32: 6200 0200               |  0019: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  001b: code-address
+                                |  001b: code-address
+                                |  001b: local-snapshot
+                                |  001b: code-address
+                                |  001b: code-address
+                                |  001b: local-snapshot
+                                |  001b: code-address
+000d36: 6e20 2400 7000          |  001b: invoke-virtual {v0, v7}, java.io.PrintStream.println:(F)V // method@0024
+                                |  001e: code-address
+                                |  001e: code-address
+                                |  001e: local-snapshot
+                                |  001e: code-address
+000d3c: 6200 0200               |  001e: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0020: code-address
+                                |  0020: code-address
+                                |  0020: local-snapshot
+                                |  0020: code-address
+                                |  0020: code-address
+                                |  0020: local-snapshot
+                                |  0020: code-address
+000d40: 6e30 2600 8009          |  0020: invoke-virtual {v0, v8, v9}, java.io.PrintStream.println:(J)V // method@0026
+                                |  0023: code-address
+                                |  0023: code-address
+                                |  0023: local-snapshot
+                                |  0023: code-address
+000d46: 6200 0200               |  0023: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0025: code-address
+                                |  0025: code-address
+                                |  0025: local-snapshot
+                                |  0025: code-address
+                                |  0025: code-address
+                                |  0025: local-snapshot
+                                |  0025: code-address
+000d4a: 6e30 2300 a00b          |  0025: invoke-virtual {v0, v10, v11}, java.io.PrintStream.println:(D)V // method@0023
+                                |  0028: code-address
+                                |  0028: code-address
+                                |  0028: local-snapshot
+                                |  0028: code-address
+000d50: 6200 0200               |  0028: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  002a: code-address
+                                |  002a: code-address
+                                |  002a: local-snapshot
+                                |  002a: code-address
+                                |  002a: code-address
+                                |  002a: local-snapshot
+                                |  002a: code-address
+000d54: 6e20 2700 c000          |  002a: invoke-virtual {v0, v12}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  002d: code-address
+                                |  002d: code-address
+                                |  002d: local-snapshot
+000d5a: 0e00                    |  002d: return-void
+                                |  002e: code-address
+                                |  debug info
+                                |    line_start: 46
+                                |    parameters_size: 0009
+                                |    parameter <unnamed> v2
+                                |    parameter <unnamed> v3
+                                |    parameter <unnamed> v4
+                                |    parameter <unnamed> v5
+                                |    parameter <unnamed> v6
+                                |    parameter <unnamed> v7
+                                |    parameter <unnamed> v8
+                                |    parameter <unnamed> v10
+                                |    parameter <unnamed> v12
+                                |    0000: prologue end
+                                |    0000: line 46
+                                |    0005: line 47
+                                |    000a: line 48
+                                |    000f: line 49
+                                |    0014: line 50
+                                |    0019: line 51
+                                |    001e: line 52
+                                |    0023: line 53
+                                |    0028: line 54
+                                |    002d: line 55
+                                |    end sequence
+                                |
+                                |[d5c] invokecustom.InvokeCustom.targetMethodTest3:()V
+000d5c: 0200                    |  registers_size: 0002
+000d5e: 0000                    |  ins_size:       0000
+000d60: 0200                    |  outs_size:      0002
+000d62: 0000                    |  tries_size:     0000
+000d64: 451c 0000               |  debug_off:      00001c45
+000d68: 0800 0000               |  insns_size:     00000008
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+000d6c: 6200 0200               |  0000: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+000d70: 1a01 6c00               |  0002: const-string v1, "targetMethodTest3 from InvokeCustom" // utf8@006c
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+000d74: 6e20 2700 1000          |  0004: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  0007: code-address
+                                |  0007: code-address
+                                |  0007: local-snapshot
+000d7a: 0e00                    |  0007: return-void
+                                |  0008: code-address
+                                |  debug info
+                                |    line_start: 58
+                                |    parameters_size: 0000
+                                |    0000: prologue end
+                                |    0000: line 58
+                                |    0007: line 59
+                                |    end sequence
+                                |
+                                |[d7c] invokecustom.InvokeCustom.targetMethodTest5:(III)I
+000d7c: 0700                    |  registers_size: 0007
+000d7e: 0300                    |  ins_size:       0003
+000d80: 0200                    |  outs_size:      0002
+000d82: 0000                    |  tries_size:     0000
+000d84: 4b1c 0000               |  debug_off:      00001c4b
+000d88: 5300 0000               |  insns_size:     00000053
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+000d8c: 9000 0405               |  0000: add-int v0, v4, v5
+                                |  0002: code-address
+000d90: 6201 0200               |  0002: sget-object v1, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+000d94: 2202 1000               |  0004: new-instance v2, java.lang.StringBuilder // type@0010
+                                |  0006: code-address
+                                |  0006: code-address
+                                |  0006: local-snapshot
+                                |  0006: code-address
+                                |  0006: code-address
+                                |  0006: local-snapshot
+                                |  0006: code-address
+000d98: 7010 2b00 0200          |  0006: invoke-direct {v2}, java.lang.StringBuilder.<init>:()V // method@002b
+                                |  0009: code-address
+                                |  0009: code-address
+                                |  0009: local-snapshot
+                                |  0009: code-address
+000d9e: 1a03 7100               |  0009: const-string v3, "targetMethodTest5 " // utf8@0071
+                                |  000b: code-address
+                                |  000b: code-address
+                                |  000b: local-snapshot
+                                |  000b: code-address
+                                |  000b: code-address
+                                |  000b: local-snapshot
+                                |  000b: code-address
+000da2: 6e20 3100 3200          |  000b: invoke-virtual {v2, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  000e: code-address
+                                |  000e: code-address
+                                |  000e: local-snapshot
+000da8: 0c02                    |  000e: move-result-object v2
+                                |  000f: code-address
+                                |  000f: code-address
+                                |  000f: local-snapshot
+                                |  000f: code-address
+000daa: 6e20 2e00 4200          |  000f: invoke-virtual {v2, v4}, java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder; // method@002e
+                                |  0012: code-address
+                                |  0012: code-address
+                                |  0012: local-snapshot
+000db0: 0c02                    |  0012: move-result-object v2
+                                |  0013: code-address
+                                |  0013: code-address
+                                |  0013: local-snapshot
+                                |  0013: code-address
+000db2: 1a03 0300               |  0013: const-string v3, " + " // utf8@0003
+                                |  0015: code-address
+                                |  0015: code-address
+                                |  0015: local-snapshot
+                                |  0015: code-address
+                                |  0015: code-address
+                                |  0015: local-snapshot
+                                |  0015: code-address
+000db6: 6e20 3100 3200          |  0015: invoke-virtual {v2, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0018: code-address
+                                |  0018: code-address
+                                |  0018: local-snapshot
+000dbc: 0c02                    |  0018: move-result-object v2
+                                |  0019: code-address
+                                |  0019: code-address
+                                |  0019: local-snapshot
+                                |  0019: code-address
+000dbe: 6e20 2e00 5200          |  0019: invoke-virtual {v2, v5}, java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder; // method@002e
+                                |  001c: code-address
+                                |  001c: code-address
+                                |  001c: local-snapshot
+000dc4: 0c02                    |  001c: move-result-object v2
+                                |  001d: code-address
+                                |  001d: code-address
+                                |  001d: local-snapshot
+                                |  001d: code-address
+000dc6: 1a03 0400               |  001d: const-string v3, " = " // utf8@0004
+                                |  001f: code-address
+                                |  001f: code-address
+                                |  001f: local-snapshot
+                                |  001f: code-address
+                                |  001f: code-address
+                                |  001f: local-snapshot
+                                |  001f: code-address
+000dca: 6e20 3100 3200          |  001f: invoke-virtual {v2, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0022: code-address
+                                |  0022: code-address
+                                |  0022: local-snapshot
+000dd0: 0c02                    |  0022: move-result-object v2
+                                |  0023: code-address
+                                |  0023: code-address
+                                |  0023: local-snapshot
+                                |  0023: code-address
+000dd2: 6e20 2e00 0200          |  0023: invoke-virtual {v2, v0}, java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder; // method@002e
+                                |  0026: code-address
+                                |  0026: code-address
+                                |  0026: local-snapshot
+000dd8: 0c02                    |  0026: move-result-object v2
+                                |  0027: code-address
+                                |  0027: code-address
+                                |  0027: local-snapshot
+                                |  0027: code-address
+000dda: 6e10 3200 0200          |  0027: invoke-virtual {v2}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0032
+                                |  002a: code-address
+                                |  002a: code-address
+                                |  002a: local-snapshot
+000de0: 0c02                    |  002a: move-result-object v2
+                                |  002b: code-address
+                                |  002b: code-address
+                                |  002b: local-snapshot
+                                |  002b: code-address
+000de2: 6e20 2700 2100          |  002b: invoke-virtual {v1, v2}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  002e: code-address
+                                |  002e: code-address
+                                |  002e: local-snapshot
+000de8: 3260 2400               |  002e: if-eq v0, v6, 0052 // +0024
+                                |  0030: code-address
+                                |  0030: code-address
+                                |  0030: local-snapshot
+                                |  0030: code-address
+000dec: 6201 0200               |  0030: sget-object v1, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0032: code-address
+                                |  0032: code-address
+                                |  0032: local-snapshot
+                                |  0032: code-address
+                                |  0032: code-address
+                                |  0032: local-snapshot
+                                |  0032: code-address
+000df0: 2202 1000               |  0032: new-instance v2, java.lang.StringBuilder // type@0010
+                                |  0034: code-address
+                                |  0034: code-address
+                                |  0034: local-snapshot
+                                |  0034: code-address
+                                |  0034: code-address
+                                |  0034: local-snapshot
+                                |  0034: code-address
+000df4: 7010 2b00 0200          |  0034: invoke-direct {v2}, java.lang.StringBuilder.<init>:()V // method@002b
+                                |  0037: code-address
+                                |  0037: code-address
+                                |  0037: local-snapshot
+                                |  0037: code-address
+000dfa: 1a03 1300               |  0037: const-string v3, "Failed " // utf8@0013
+                                |  0039: code-address
+                                |  0039: code-address
+                                |  0039: local-snapshot
+                                |  0039: code-address
+                                |  0039: code-address
+                                |  0039: local-snapshot
+                                |  0039: code-address
+000dfe: 6e20 3100 3200          |  0039: invoke-virtual {v2, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  003c: code-address
+                                |  003c: code-address
+                                |  003c: local-snapshot
+000e04: 0c02                    |  003c: move-result-object v2
+                                |  003d: code-address
+                                |  003d: code-address
+                                |  003d: local-snapshot
+                                |  003d: code-address
+000e06: 6e20 2e00 0200          |  003d: invoke-virtual {v2, v0}, java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder; // method@002e
+                                |  0040: code-address
+                                |  0040: code-address
+                                |  0040: local-snapshot
+000e0c: 0c02                    |  0040: move-result-object v2
+                                |  0041: code-address
+                                |  0041: code-address
+                                |  0041: local-snapshot
+                                |  0041: code-address
+000e0e: 1a03 0100               |  0041: const-string v3, " != " // utf8@0001
+                                |  0043: code-address
+                                |  0043: code-address
+                                |  0043: local-snapshot
+                                |  0043: code-address
+                                |  0043: code-address
+                                |  0043: local-snapshot
+                                |  0043: code-address
+000e12: 6e20 3100 3200          |  0043: invoke-virtual {v2, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0046: code-address
+                                |  0046: code-address
+                                |  0046: local-snapshot
+000e18: 0c02                    |  0046: move-result-object v2
+                                |  0047: code-address
+                                |  0047: code-address
+                                |  0047: local-snapshot
+                                |  0047: code-address
+000e1a: 6e20 2e00 6200          |  0047: invoke-virtual {v2, v6}, java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder; // method@002e
+                                |  004a: code-address
+                                |  004a: code-address
+                                |  004a: local-snapshot
+000e20: 0c02                    |  004a: move-result-object v2
+                                |  004b: code-address
+                                |  004b: code-address
+                                |  004b: local-snapshot
+                                |  004b: code-address
+000e22: 6e10 3200 0200          |  004b: invoke-virtual {v2}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0032
+                                |  004e: code-address
+                                |  004e: code-address
+                                |  004e: local-snapshot
+000e28: 0c02                    |  004e: move-result-object v2
+                                |  004f: code-address
+                                |  004f: code-address
+                                |  004f: local-snapshot
+                                |  004f: code-address
+000e2a: 6e20 2700 2100          |  004f: invoke-virtual {v1, v2}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  0052: code-address
+                                |  0052: code-address
+                                |  0052: local-snapshot
+000e30: 0f00                    |  0052: return v0
+                                |  0053: code-address
+                                |  debug info
+                                |    line_start: 68
+                                |    parameters_size: 0003
+                                |    parameter <unnamed> v4
+                                |    parameter <unnamed> v5
+                                |    parameter <unnamed> v6
+                                |    0000: prologue end
+                                |    0000: line 68
+                                |    0002: line 69
+                                |    002e: advance pc
+                                |    002e: line 70
+                                |    0030: line 71
+                                |    0052: advance pc
+                                |    0052: line 73
+                                |    end sequence
+                                |
+000e32: 0000                    |
+                                |[e34] invokecustom.InvokeCustom.targetMethodTest6:(JJJ)J
+000e34: 0c00                    |  registers_size: 000c
+000e36: 0600                    |  ins_size:       0006
+000e38: 0300                    |  outs_size:      0003
+000e3a: 0000                    |  tries_size:     0000
+000e3c: 5b1c 0000               |  debug_off:      00001c5b
+000e40: 5500 0000               |  insns_size:     00000055
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+000e44: 9b00 0608               |  0000: add-long v0, v6, v8
+                                |  0002: code-address
+000e48: 6202 0200               |  0002: sget-object v2, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+000e4c: 2203 1000               |  0004: new-instance v3, java.lang.StringBuilder // type@0010
+                                |  0006: code-address
+                                |  0006: code-address
+                                |  0006: local-snapshot
+                                |  0006: code-address
+                                |  0006: code-address
+                                |  0006: local-snapshot
+                                |  0006: code-address
+000e50: 7010 2b00 0300          |  0006: invoke-direct {v3}, java.lang.StringBuilder.<init>:()V // method@002b
+                                |  0009: code-address
+                                |  0009: code-address
+                                |  0009: local-snapshot
+                                |  0009: code-address
+000e56: 1a04 7400               |  0009: const-string v4, "targetMethodTest6 " // utf8@0074
+                                |  000b: code-address
+                                |  000b: code-address
+                                |  000b: local-snapshot
+                                |  000b: code-address
+                                |  000b: code-address
+                                |  000b: local-snapshot
+                                |  000b: code-address
+000e5a: 6e20 3100 4300          |  000b: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  000e: code-address
+                                |  000e: code-address
+                                |  000e: local-snapshot
+000e60: 0c03                    |  000e: move-result-object v3
+                                |  000f: code-address
+                                |  000f: code-address
+                                |  000f: local-snapshot
+                                |  000f: code-address
+000e62: 6e30 2f00 6307          |  000f: invoke-virtual {v3, v6, v7}, java.lang.StringBuilder.append:(J)Ljava/lang/StringBuilder; // method@002f
+                                |  0012: code-address
+                                |  0012: code-address
+                                |  0012: local-snapshot
+000e68: 0c03                    |  0012: move-result-object v3
+                                |  0013: code-address
+                                |  0013: code-address
+                                |  0013: local-snapshot
+                                |  0013: code-address
+000e6a: 1a04 0300               |  0013: const-string v4, " + " // utf8@0003
+                                |  0015: code-address
+                                |  0015: code-address
+                                |  0015: local-snapshot
+                                |  0015: code-address
+                                |  0015: code-address
+                                |  0015: local-snapshot
+                                |  0015: code-address
+000e6e: 6e20 3100 4300          |  0015: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0018: code-address
+                                |  0018: code-address
+                                |  0018: local-snapshot
+000e74: 0c03                    |  0018: move-result-object v3
+                                |  0019: code-address
+                                |  0019: code-address
+                                |  0019: local-snapshot
+                                |  0019: code-address
+000e76: 6e30 2f00 8309          |  0019: invoke-virtual {v3, v8, v9}, java.lang.StringBuilder.append:(J)Ljava/lang/StringBuilder; // method@002f
+                                |  001c: code-address
+                                |  001c: code-address
+                                |  001c: local-snapshot
+000e7c: 0c03                    |  001c: move-result-object v3
+                                |  001d: code-address
+                                |  001d: code-address
+                                |  001d: local-snapshot
+                                |  001d: code-address
+000e7e: 1a04 0400               |  001d: const-string v4, " = " // utf8@0004
+                                |  001f: code-address
+                                |  001f: code-address
+                                |  001f: local-snapshot
+                                |  001f: code-address
+                                |  001f: code-address
+                                |  001f: local-snapshot
+                                |  001f: code-address
+000e82: 6e20 3100 4300          |  001f: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0022: code-address
+                                |  0022: code-address
+                                |  0022: local-snapshot
+000e88: 0c03                    |  0022: move-result-object v3
+                                |  0023: code-address
+                                |  0023: code-address
+                                |  0023: local-snapshot
+                                |  0023: code-address
+000e8a: 6e30 2f00 0301          |  0023: invoke-virtual {v3, v0, v1}, java.lang.StringBuilder.append:(J)Ljava/lang/StringBuilder; // method@002f
+                                |  0026: code-address
+                                |  0026: code-address
+                                |  0026: local-snapshot
+000e90: 0c03                    |  0026: move-result-object v3
+                                |  0027: code-address
+                                |  0027: code-address
+                                |  0027: local-snapshot
+                                |  0027: code-address
+000e92: 6e10 3200 0300          |  0027: invoke-virtual {v3}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0032
+                                |  002a: code-address
+                                |  002a: code-address
+                                |  002a: local-snapshot
+000e98: 0c03                    |  002a: move-result-object v3
+                                |  002b: code-address
+                                |  002b: code-address
+                                |  002b: local-snapshot
+                                |  002b: code-address
+000e9a: 6e20 2700 3200          |  002b: invoke-virtual {v2, v3}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  002e: code-address
+                                |  002e: code-address
+                                |  002e: local-snapshot
+000ea0: 3102 000a               |  002e: cmp-long v2, v0, v10
+000ea4: 3802 2400               |  0030: if-eqz v2, 0054 // +0024
+                                |  0032: code-address
+                                |  0032: code-address
+                                |  0032: local-snapshot
+                                |  0032: code-address
+000ea8: 6202 0200               |  0032: sget-object v2, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0034: code-address
+                                |  0034: code-address
+                                |  0034: local-snapshot
+                                |  0034: code-address
+                                |  0034: code-address
+                                |  0034: local-snapshot
+                                |  0034: code-address
+000eac: 2203 1000               |  0034: new-instance v3, java.lang.StringBuilder // type@0010
+                                |  0036: code-address
+                                |  0036: code-address
+                                |  0036: local-snapshot
+                                |  0036: code-address
+                                |  0036: code-address
+                                |  0036: local-snapshot
+                                |  0036: code-address
+000eb0: 7010 2b00 0300          |  0036: invoke-direct {v3}, java.lang.StringBuilder.<init>:()V // method@002b
+                                |  0039: code-address
+                                |  0039: code-address
+                                |  0039: local-snapshot
+                                |  0039: code-address
+000eb6: 1a04 1300               |  0039: const-string v4, "Failed " // utf8@0013
+                                |  003b: code-address
+                                |  003b: code-address
+                                |  003b: local-snapshot
+                                |  003b: code-address
+                                |  003b: code-address
+                                |  003b: local-snapshot
+                                |  003b: code-address
+000eba: 6e20 3100 4300          |  003b: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  003e: code-address
+                                |  003e: code-address
+                                |  003e: local-snapshot
+000ec0: 0c03                    |  003e: move-result-object v3
+                                |  003f: code-address
+                                |  003f: code-address
+                                |  003f: local-snapshot
+                                |  003f: code-address
+000ec2: 6e30 2f00 0301          |  003f: invoke-virtual {v3, v0, v1}, java.lang.StringBuilder.append:(J)Ljava/lang/StringBuilder; // method@002f
+                                |  0042: code-address
+                                |  0042: code-address
+                                |  0042: local-snapshot
+000ec8: 0c03                    |  0042: move-result-object v3
+                                |  0043: code-address
+                                |  0043: code-address
+                                |  0043: local-snapshot
+                                |  0043: code-address
+000eca: 1a04 0100               |  0043: const-string v4, " != " // utf8@0001
+                                |  0045: code-address
+                                |  0045: code-address
+                                |  0045: local-snapshot
+                                |  0045: code-address
+                                |  0045: code-address
+                                |  0045: local-snapshot
+                                |  0045: code-address
+000ece: 6e20 3100 4300          |  0045: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0048: code-address
+                                |  0048: code-address
+                                |  0048: local-snapshot
+000ed4: 0c03                    |  0048: move-result-object v3
+                                |  0049: code-address
+                                |  0049: code-address
+                                |  0049: local-snapshot
+                                |  0049: code-address
+000ed6: 6e30 2f00 a30b          |  0049: invoke-virtual {v3, v10, v11}, java.lang.StringBuilder.append:(J)Ljava/lang/StringBuilder; // method@002f
+                                |  004c: code-address
+                                |  004c: code-address
+                                |  004c: local-snapshot
+000edc: 0c03                    |  004c: move-result-object v3
+                                |  004d: code-address
+                                |  004d: code-address
+                                |  004d: local-snapshot
+                                |  004d: code-address
+000ede: 6e10 3200 0300          |  004d: invoke-virtual {v3}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0032
+                                |  0050: code-address
+                                |  0050: code-address
+                                |  0050: local-snapshot
+000ee4: 0c03                    |  0050: move-result-object v3
+                                |  0051: code-address
+                                |  0051: code-address
+                                |  0051: local-snapshot
+                                |  0051: code-address
+000ee6: 6e20 2700 3200          |  0051: invoke-virtual {v2, v3}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  0054: code-address
+                                |  0054: code-address
+                                |  0054: local-snapshot
+000eec: 1000                    |  0054: return-wide v0
+                                |  0055: code-address
+                                |  debug info
+                                |    line_start: 77
+                                |    parameters_size: 0003
+                                |    parameter <unnamed> v6
+                                |    parameter <unnamed> v8
+                                |    parameter <unnamed> v10
+                                |    0000: prologue end
+                                |    0000: line 77
+                                |    0002: line 78
+                                |    002e: advance pc
+                                |    002e: line 79
+                                |    0032: line 80
+                                |    0054: advance pc
+                                |    0054: line 82
+                                |    end sequence
+                                |
+000eee: 0000                    |
+                                |[ef0] invokecustom.InvokeCustom.targetMethodTest7:(FFD)D
+000ef0: 0a00                    |  registers_size: 000a
+000ef2: 0400                    |  ins_size:       0004
+000ef4: 0300                    |  outs_size:      0003
+000ef6: 0000                    |  tries_size:     0000
+000ef8: 6b1c 0000               |  debug_off:      00001c6b
+000efc: 5600 0000               |  insns_size:     00000056
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+000f00: a800 0607               |  0000: mul-float v0, v6, v7
+000f04: 8900                    |  0002: float-to-double v0, v0
+                                |  0003: code-address
+000f06: 6202 0200               |  0003: sget-object v2, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0005: code-address
+                                |  0005: code-address
+                                |  0005: local-snapshot
+                                |  0005: code-address
+                                |  0005: code-address
+                                |  0005: local-snapshot
+                                |  0005: code-address
+000f0a: 2203 1000               |  0005: new-instance v3, java.lang.StringBuilder // type@0010
+                                |  0007: code-address
+                                |  0007: code-address
+                                |  0007: local-snapshot
+                                |  0007: code-address
+                                |  0007: code-address
+                                |  0007: local-snapshot
+                                |  0007: code-address
+000f0e: 7010 2b00 0300          |  0007: invoke-direct {v3}, java.lang.StringBuilder.<init>:()V // method@002b
+                                |  000a: code-address
+                                |  000a: code-address
+                                |  000a: local-snapshot
+                                |  000a: code-address
+000f14: 1a04 7700               |  000a: const-string v4, "targetMethodTest7 " // utf8@0077
+                                |  000c: code-address
+                                |  000c: code-address
+                                |  000c: local-snapshot
+                                |  000c: code-address
+                                |  000c: code-address
+                                |  000c: local-snapshot
+                                |  000c: code-address
+000f18: 6e20 3100 4300          |  000c: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  000f: code-address
+                                |  000f: code-address
+                                |  000f: local-snapshot
+000f1e: 0c03                    |  000f: move-result-object v3
+                                |  0010: code-address
+                                |  0010: code-address
+                                |  0010: local-snapshot
+                                |  0010: code-address
+000f20: 6e20 2d00 6300          |  0010: invoke-virtual {v3, v6}, java.lang.StringBuilder.append:(F)Ljava/lang/StringBuilder; // method@002d
+                                |  0013: code-address
+                                |  0013: code-address
+                                |  0013: local-snapshot
+000f26: 0c03                    |  0013: move-result-object v3
+                                |  0014: code-address
+                                |  0014: code-address
+                                |  0014: local-snapshot
+                                |  0014: code-address
+000f28: 1a04 0200               |  0014: const-string v4, " * " // utf8@0002
+                                |  0016: code-address
+                                |  0016: code-address
+                                |  0016: local-snapshot
+                                |  0016: code-address
+                                |  0016: code-address
+                                |  0016: local-snapshot
+                                |  0016: code-address
+000f2c: 6e20 3100 4300          |  0016: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0019: code-address
+                                |  0019: code-address
+                                |  0019: local-snapshot
+000f32: 0c03                    |  0019: move-result-object v3
+                                |  001a: code-address
+                                |  001a: code-address
+                                |  001a: local-snapshot
+                                |  001a: code-address
+000f34: 6e20 2d00 7300          |  001a: invoke-virtual {v3, v7}, java.lang.StringBuilder.append:(F)Ljava/lang/StringBuilder; // method@002d
+                                |  001d: code-address
+                                |  001d: code-address
+                                |  001d: local-snapshot
+000f3a: 0c03                    |  001d: move-result-object v3
+                                |  001e: code-address
+                                |  001e: code-address
+                                |  001e: local-snapshot
+                                |  001e: code-address
+000f3c: 1a04 0400               |  001e: const-string v4, " = " // utf8@0004
+                                |  0020: code-address
+                                |  0020: code-address
+                                |  0020: local-snapshot
+                                |  0020: code-address
+                                |  0020: code-address
+                                |  0020: local-snapshot
+                                |  0020: code-address
+000f40: 6e20 3100 4300          |  0020: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0023: code-address
+                                |  0023: code-address
+                                |  0023: local-snapshot
+000f46: 0c03                    |  0023: move-result-object v3
+                                |  0024: code-address
+                                |  0024: code-address
+                                |  0024: local-snapshot
+                                |  0024: code-address
+000f48: 6e30 2c00 0301          |  0024: invoke-virtual {v3, v0, v1}, java.lang.StringBuilder.append:(D)Ljava/lang/StringBuilder; // method@002c
+                                |  0027: code-address
+                                |  0027: code-address
+                                |  0027: local-snapshot
+000f4e: 0c03                    |  0027: move-result-object v3
+                                |  0028: code-address
+                                |  0028: code-address
+                                |  0028: local-snapshot
+                                |  0028: code-address
+000f50: 6e10 3200 0300          |  0028: invoke-virtual {v3}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0032
+                                |  002b: code-address
+                                |  002b: code-address
+                                |  002b: local-snapshot
+000f56: 0c03                    |  002b: move-result-object v3
+                                |  002c: code-address
+                                |  002c: code-address
+                                |  002c: local-snapshot
+                                |  002c: code-address
+000f58: 6e20 2700 3200          |  002c: invoke-virtual {v2, v3}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  002f: code-address
+                                |  002f: code-address
+                                |  002f: local-snapshot
+000f5e: 2f02 0008               |  002f: cmpl-double v2, v0, v8
+000f62: 3802 2400               |  0031: if-eqz v2, 0055 // +0024
+                                |  0033: code-address
+                                |  0033: code-address
+                                |  0033: local-snapshot
+                                |  0033: code-address
+000f66: 6202 0200               |  0033: sget-object v2, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0035: code-address
+                                |  0035: code-address
+                                |  0035: local-snapshot
+                                |  0035: code-address
+                                |  0035: code-address
+                                |  0035: local-snapshot
+                                |  0035: code-address
+000f6a: 2203 1000               |  0035: new-instance v3, java.lang.StringBuilder // type@0010
+                                |  0037: code-address
+                                |  0037: code-address
+                                |  0037: local-snapshot
+                                |  0037: code-address
+                                |  0037: code-address
+                                |  0037: local-snapshot
+                                |  0037: code-address
+000f6e: 7010 2b00 0300          |  0037: invoke-direct {v3}, java.lang.StringBuilder.<init>:()V // method@002b
+                                |  003a: code-address
+                                |  003a: code-address
+                                |  003a: local-snapshot
+                                |  003a: code-address
+000f74: 1a04 1300               |  003a: const-string v4, "Failed " // utf8@0013
+                                |  003c: code-address
+                                |  003c: code-address
+                                |  003c: local-snapshot
+                                |  003c: code-address
+                                |  003c: code-address
+                                |  003c: local-snapshot
+                                |  003c: code-address
+000f78: 6e20 3100 4300          |  003c: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  003f: code-address
+                                |  003f: code-address
+                                |  003f: local-snapshot
+000f7e: 0c03                    |  003f: move-result-object v3
+                                |  0040: code-address
+                                |  0040: code-address
+                                |  0040: local-snapshot
+                                |  0040: code-address
+000f80: 6e30 2c00 0301          |  0040: invoke-virtual {v3, v0, v1}, java.lang.StringBuilder.append:(D)Ljava/lang/StringBuilder; // method@002c
+                                |  0043: code-address
+                                |  0043: code-address
+                                |  0043: local-snapshot
+000f86: 0c03                    |  0043: move-result-object v3
+                                |  0044: code-address
+                                |  0044: code-address
+                                |  0044: local-snapshot
+                                |  0044: code-address
+000f88: 1a04 0100               |  0044: const-string v4, " != " // utf8@0001
+                                |  0046: code-address
+                                |  0046: code-address
+                                |  0046: local-snapshot
+                                |  0046: code-address
+                                |  0046: code-address
+                                |  0046: local-snapshot
+                                |  0046: code-address
+000f8c: 6e20 3100 4300          |  0046: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0049: code-address
+                                |  0049: code-address
+                                |  0049: local-snapshot
+000f92: 0c03                    |  0049: move-result-object v3
+                                |  004a: code-address
+                                |  004a: code-address
+                                |  004a: local-snapshot
+                                |  004a: code-address
+000f94: 6e30 2c00 8309          |  004a: invoke-virtual {v3, v8, v9}, java.lang.StringBuilder.append:(D)Ljava/lang/StringBuilder; // method@002c
+                                |  004d: code-address
+                                |  004d: code-address
+                                |  004d: local-snapshot
+000f9a: 0c03                    |  004d: move-result-object v3
+                                |  004e: code-address
+                                |  004e: code-address
+                                |  004e: local-snapshot
+                                |  004e: code-address
+000f9c: 6e10 3200 0300          |  004e: invoke-virtual {v3}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0032
+                                |  0051: code-address
+                                |  0051: code-address
+                                |  0051: local-snapshot
+000fa2: 0c03                    |  0051: move-result-object v3
+                                |  0052: code-address
+                                |  0052: code-address
+                                |  0052: local-snapshot
+                                |  0052: code-address
+000fa4: 6e20 2700 3200          |  0052: invoke-virtual {v2, v3}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  0055: code-address
+                                |  0055: code-address
+                                |  0055: local-snapshot
+000faa: 1000                    |  0055: return-wide v0
+                                |  0056: code-address
+                                |  debug info
+                                |    line_start: 86
+                                |    parameters_size: 0003
+                                |    parameter <unnamed> v6
+                                |    parameter <unnamed> v7
+                                |    parameter <unnamed> v8
+                                |    0000: prologue end
+                                |    0000: line 86
+                                |    0003: line 87
+                                |    002f: advance pc
+                                |    002f: line 88
+                                |    0033: line 89
+                                |    0055: advance pc
+                                |    0055: line 91
+                                |    end sequence
+                                |
+                                |[fac] invokecustom.InvokeCustom.targetMethodTest8:(Ljava/lang/String;)V
+000fac: 0400                    |  registers_size: 0004
+000fae: 0100                    |  ins_size:       0001
+000fb0: 0200                    |  outs_size:      0002
+000fb2: 0000                    |  tries_size:     0000
+000fb4: 7b1c 0000               |  debug_off:      00001c7b
+000fb8: 1900 0000               |  insns_size:     00000019
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+000fbc: 6200 0200               |  0000: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+000fc0: 2201 1000               |  0002: new-instance v1, java.lang.StringBuilder // type@0010
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+000fc4: 7010 2b00 0100          |  0004: invoke-direct {v1}, java.lang.StringBuilder.<init>:()V // method@002b
+                                |  0007: code-address
+                                |  0007: code-address
+                                |  0007: local-snapshot
+                                |  0007: code-address
+000fca: 1a02 7900               |  0007: const-string v2, "targetMethodTest8 " // utf8@0079
+                                |  0009: code-address
+                                |  0009: code-address
+                                |  0009: local-snapshot
+                                |  0009: code-address
+                                |  0009: code-address
+                                |  0009: local-snapshot
+                                |  0009: code-address
+000fce: 6e20 3100 2100          |  0009: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  000c: code-address
+                                |  000c: code-address
+                                |  000c: local-snapshot
+000fd4: 0c01                    |  000c: move-result-object v1
+                                |  000d: code-address
+                                |  000d: code-address
+                                |  000d: local-snapshot
+                                |  000d: code-address
+000fd6: 6e20 3100 3100          |  000d: invoke-virtual {v1, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0010: code-address
+                                |  0010: code-address
+                                |  0010: local-snapshot
+000fdc: 0c01                    |  0010: move-result-object v1
+                                |  0011: code-address
+                                |  0011: code-address
+                                |  0011: local-snapshot
+                                |  0011: code-address
+000fde: 6e10 3200 0100          |  0011: invoke-virtual {v1}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0032
+                                |  0014: code-address
+                                |  0014: code-address
+                                |  0014: local-snapshot
+000fe4: 0c01                    |  0014: move-result-object v1
+                                |  0015: code-address
+                                |  0015: code-address
+                                |  0015: local-snapshot
+                                |  0015: code-address
+000fe6: 6e20 2700 1000          |  0015: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  0018: code-address
+                                |  0018: code-address
+                                |  0018: local-snapshot
+000fec: 0e00                    |  0018: return-void
+                                |  0019: code-address
+                                |  debug info
+                                |    line_start: 95
+                                |    parameters_size: 0001
+                                |    parameter <unnamed> v3
+                                |    0000: prologue end
+                                |    0000: line 95
+                                |    0018: advance pc
+                                |    0018: line 96
+                                |    end sequence
+                                |
+000fee: 0000                    |
+                                |[ff0] invokecustom.InvokeCustom.targetMethodTest9:()V
+000ff0: 0200                    |  registers_size: 0002
+000ff2: 0000                    |  ins_size:       0000
+000ff4: 0200                    |  outs_size:      0002
+000ff6: 0000                    |  tries_size:     0000
+000ff8: 841c 0000               |  debug_off:      00001c84
+000ffc: 0800 0000               |  insns_size:     00000008
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+001000: 6200 0200               |  0000: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+001004: 1a01 7b00               |  0002: const-string v1, "targetMethodTest9()" // utf8@007b
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+001008: 6e20 2700 1000          |  0004: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  0007: code-address
+                                |  0007: code-address
+                                |  0007: local-snapshot
+00100e: 0e00                    |  0007: return-void
+                                |  0008: code-address
+                                |  debug info
+                                |    line_start: 129
+                                |    parameters_size: 0000
+                                |    0000: prologue end
+                                |    0000: line 129
+                                |    0007: line 130
+                                |    end sequence
+                                |
+                                |[1010] invokecustom.InvokeCustom.test1:()V
+001010: 0000                    |  registers_size: 0000
+001012: 0000                    |  ins_size:       0000
+001014: 0000                    |  outs_size:      0000
+001016: 0000                    |  tries_size:     0000
+001018: 0000 0000               |  debug_off:      00000000
+00101c: 0400 0000               |  insns_size:     00000004
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+001020: fc00 0100 0000          |  0000: invoke-custom {}, {invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}, targetMethodTest1, ()V} // CallSiteRef@0001
+                                |  0003: code-address
+                                |  0003: code-address
+                                |  0003: local-snapshot
+001026: 0e00                    |  0003: return-void
+                                |  0004: code-address
+                                |
+                                |[1028] invokecustom.InvokeCustom.test2:()V
+001028: 0b00                    |  registers_size: 000b
+00102a: 0000                    |  ins_size:       0000
+00102c: 0b00                    |  outs_size:      000b
+00102e: 0000                    |  tries_size:     0000
+001030: 0000 0000               |  debug_off:      00000000
+001034: 1b00 0000               |  insns_size:     0000001b
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+001038: 1210                    |  0000: const/4 v0, #int 1 // #1
+00103a: 1301 7f00               |  0001: const/16 v1, #int 127 // #007f
+00103e: 1302 6300               |  0003: const/16 v2, #int 99 // #0063
+001042: 1303 0004               |  0005: const/16 v3, #int 1024 // #0400
+001046: 1404 40e2 0100          |  0007: const v4, #int 123456 // #0001e240
+00104c: 1405 9a99 993f          |  000a: const v5, #float 1.2 // #3f99999a
+001052: 1706 15cd 5b07          |  000d: const-wide/32 v6, #long 123456789 // #075bcd15
+001058: 1808 b6fa f8b0 4819 0c40|  0010: const-wide v8, #double 3.5123456789 // #400c1948b0f8fab6
+                                |  0015: code-address
+001062: 1a0a 3c00               |  0015: const-string v10, "String" // utf8@003c
+                                |  0017: code-address
+                                |  0017: code-address
+                                |  0017: local-snapshot
+                                |  0017: code-address
+                                |  0017: code-address
+                                |  0017: local-snapshot
+                                |  0017: code-address
+001066: fd0b 0300 0000          |  0017: invoke-custom/range {v0..v10}, {invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}, targetMethodTest2, (ZBCSIFJDLjava/lang/String;)V} // CallSiteRef@0003
+                                |  001a: code-address
+                                |  001a: code-address
+                                |  001a: local-snapshot
+00106c: 0e00                    |  001a: return-void
+                                |  001b: code-address
+                                |
+00106e: 0000                    |
+                                |[1070] invokecustom.InvokeCustom.test3:()V
+001070: 0000                    |  registers_size: 0000
+001072: 0000                    |  ins_size:       0000
+001074: 0000                    |  outs_size:      0000
+001076: 0000                    |  tries_size:     0000
+001078: 0000 0000               |  debug_off:      00000000
+00107c: 0400 0000               |  insns_size:     00000004
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+001080: fc00 1100 0000          |  0000: invoke-custom {}, {invoke-static,method{invokecustom.InvokeCustom.bsmLookupStaticWithExtraArgs:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;}, targetMethodTest3, ()V, 1, 123456789, 123.456, 123456.789123} // CallSiteRef@0011
+                                |  0003: code-address
+                                |  0003: code-address
+                                |  0003: local-snapshot
+001086: 0e00                    |  0003: return-void
+                                |  0004: code-address
+                                |
+                                |[1088] invokecustom.InvokeCustom.test4:()V
+001088: 0100                    |  registers_size: 0001
+00108a: 0000                    |  ins_size:       0000
+00108c: 0100                    |  outs_size:      0001
+00108e: 0000                    |  tries_size:     0000
+001090: 0000 0000               |  debug_off:      00000000
+001094: 0900 0000               |  insns_size:     00000009
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+001098: 2200 0700               |  0000: new-instance v0, invokecustom.InvokeCustom // type@0007
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+00109c: 7010 0100 0000          |  0002: invoke-direct {v0}, invokecustom.InvokeCustom.<init>:()V // method@0001
+                                |  0005: code-address
+                                |  0005: code-address
+                                |  0005: local-snapshot
+                                |  0005: code-address
+0010a2: fc10 1300 0000          |  0005: invoke-custom {v0}, {invoke-static,method{invokecustom.InvokeCustom.bsmCreateCallSite:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;}, targetMethodTest4, (Linvokecustom/InvokeCustom;)V, invoke-direct,method{invokecustom.Super.targetMethodTest4:()V}} // CallSiteRef@0013
+                                |  0008: code-address
+                                |  0008: code-address
+                                |  0008: local-snapshot
+0010a8: 0e00                    |  0008: return-void
+                                |  0009: code-address
+                                |
+0010aa: 0000                    |
+                                |[10ac] invokecustom.InvokeCustom.test5:()V
+0010ac: 0400                    |  registers_size: 0004
+0010ae: 0000                    |  ins_size:       0000
+0010b0: 0300                    |  outs_size:      0003
+0010b2: 0000                    |  tries_size:     0000
+0010b4: 0000 0000               |  debug_off:      00000000
+0010b8: 2300 0000               |  insns_size:     00000023
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+0010bc: 1300 e803               |  0000: const/16 v0, #int 1000 // #03e8
+0010c0: 1301 65fc               |  0002: const/16 v1, #int -923 // #fc65
+0010c4: 1302 4d00               |  0004: const/16 v2, #int 77 // #004d
+                                |  0006: code-address
+0010c8: fc30 0500 1002          |  0006: invoke-custom {v0, v1, v2}, {invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}, targetMethodTest5, (III)I} // CallSiteRef@0005
+                                |  0009: code-address
+                                |  0009: code-address
+                                |  0009: local-snapshot
+0010ce: 0a00                    |  0009: move-result v0
+                                |  000a: code-address
+                                |  000a: code-address
+                                |  000a: local-snapshot
+                                |  000a: code-address
+0010d0: 6201 0200               |  000a: sget-object v1, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  000c: code-address
+                                |  000c: code-address
+                                |  000c: local-snapshot
+                                |  000c: code-address
+                                |  000c: code-address
+                                |  000c: local-snapshot
+                                |  000c: code-address
+0010d4: 2202 1000               |  000c: new-instance v2, java.lang.StringBuilder // type@0010
+                                |  000e: code-address
+                                |  000e: code-address
+                                |  000e: local-snapshot
+                                |  000e: code-address
+                                |  000e: code-address
+                                |  000e: local-snapshot
+                                |  000e: code-address
+0010d8: 7010 2b00 0200          |  000e: invoke-direct {v2}, java.lang.StringBuilder.<init>:()V // method@002b
+                                |  0011: code-address
+                                |  0011: code-address
+                                |  0011: local-snapshot
+                                |  0011: code-address
+0010de: 1a03 7200               |  0011: const-string v3, "targetMethodTest5 returned: " // utf8@0072
+                                |  0013: code-address
+                                |  0013: code-address
+                                |  0013: local-snapshot
+                                |  0013: code-address
+                                |  0013: code-address
+                                |  0013: local-snapshot
+                                |  0013: code-address
+0010e2: 6e20 3100 3200          |  0013: invoke-virtual {v2, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  0016: code-address
+                                |  0016: code-address
+                                |  0016: local-snapshot
+0010e8: 0c02                    |  0016: move-result-object v2
+                                |  0017: code-address
+                                |  0017: code-address
+                                |  0017: local-snapshot
+                                |  0017: code-address
+0010ea: 6e20 2e00 0200          |  0017: invoke-virtual {v2, v0}, java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder; // method@002e
+                                |  001a: code-address
+                                |  001a: code-address
+                                |  001a: local-snapshot
+0010f0: 0c00                    |  001a: move-result-object v0
+                                |  001b: code-address
+                                |  001b: code-address
+                                |  001b: local-snapshot
+                                |  001b: code-address
+0010f2: 6e10 3200 0000          |  001b: invoke-virtual {v0}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0032
+                                |  001e: code-address
+                                |  001e: code-address
+                                |  001e: local-snapshot
+0010f8: 0c00                    |  001e: move-result-object v0
+                                |  001f: code-address
+                                |  001f: code-address
+                                |  001f: local-snapshot
+                                |  001f: code-address
+0010fa: 6e20 2700 0100          |  001f: invoke-virtual {v1, v0}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  0022: code-address
+                                |  0022: code-address
+                                |  0022: local-snapshot
+001100: 0e00                    |  0022: return-void
+                                |  0023: code-address
+                                |
+001102: 0000                    |
+                                |[1104] invokecustom.InvokeCustom.test6:()V
+001104: 0600                    |  registers_size: 0006
+001106: 0000                    |  ins_size:       0000
+001108: 0600                    |  outs_size:      0006
+00110a: 0000                    |  tries_size:     0000
+00110c: 0000 0000               |  debug_off:      00000000
+001110: 2c00 0000               |  insns_size:     0000002c
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+001114: 1800 7777 7777 7707 0000|  0000: const-wide v0, #long 8209686820727 // #0000077777777777
+00111e: 1802 efee eeee eefe ffff|  0005: const-wide v2, #long -1172812402961 // #fffffeeeeeeeeeef
+001128: 1804 6666 6666 6606 0000|  000a: const-wide v4, #long 7036874417766 // #0000066666666666
+                                |  000f: code-address
+001132: fd06 0700 0000          |  000f: invoke-custom/range {v0..v5}, {invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}, targetMethodTest6, (JJJ)J} // CallSiteRef@0007
+                                |  0012: code-address
+                                |  0012: code-address
+                                |  0012: local-snapshot
+001138: 0b00                    |  0012: move-result-wide v0
+                                |  0013: code-address
+                                |  0013: code-address
+                                |  0013: local-snapshot
+                                |  0013: code-address
+00113a: 6202 0200               |  0013: sget-object v2, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0015: code-address
+                                |  0015: code-address
+                                |  0015: local-snapshot
+                                |  0015: code-address
+                                |  0015: code-address
+                                |  0015: local-snapshot
+                                |  0015: code-address
+00113e: 2203 1000               |  0015: new-instance v3, java.lang.StringBuilder // type@0010
+                                |  0017: code-address
+                                |  0017: code-address
+                                |  0017: local-snapshot
+                                |  0017: code-address
+                                |  0017: code-address
+                                |  0017: local-snapshot
+                                |  0017: code-address
+001142: 7010 2b00 0300          |  0017: invoke-direct {v3}, java.lang.StringBuilder.<init>:()V // method@002b
+                                |  001a: code-address
+                                |  001a: code-address
+                                |  001a: local-snapshot
+                                |  001a: code-address
+001148: 1a04 7500               |  001a: const-string v4, "targetMethodTest6 returned: " // utf8@0075
+                                |  001c: code-address
+                                |  001c: code-address
+                                |  001c: local-snapshot
+                                |  001c: code-address
+                                |  001c: code-address
+                                |  001c: local-snapshot
+                                |  001c: code-address
+00114c: 6e20 3100 4300          |  001c: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  001f: code-address
+                                |  001f: code-address
+                                |  001f: local-snapshot
+001152: 0c03                    |  001f: move-result-object v3
+                                |  0020: code-address
+                                |  0020: code-address
+                                |  0020: local-snapshot
+                                |  0020: code-address
+001154: 6e30 2f00 0301          |  0020: invoke-virtual {v3, v0, v1}, java.lang.StringBuilder.append:(J)Ljava/lang/StringBuilder; // method@002f
+                                |  0023: code-address
+                                |  0023: code-address
+                                |  0023: local-snapshot
+00115a: 0c00                    |  0023: move-result-object v0
+                                |  0024: code-address
+                                |  0024: code-address
+                                |  0024: local-snapshot
+                                |  0024: code-address
+00115c: 6e10 3200 0000          |  0024: invoke-virtual {v0}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0032
+                                |  0027: code-address
+                                |  0027: code-address
+                                |  0027: local-snapshot
+001162: 0c00                    |  0027: move-result-object v0
+                                |  0028: code-address
+                                |  0028: code-address
+                                |  0028: local-snapshot
+                                |  0028: code-address
+001164: 6e20 2700 0200          |  0028: invoke-virtual {v2, v0}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  002b: code-address
+                                |  002b: code-address
+                                |  002b: local-snapshot
+00116a: 0e00                    |  002b: return-void
+                                |  002c: code-address
+                                |
+                                |[116c] invokecustom.InvokeCustom.test7:()V
+00116c: 0500                    |  registers_size: 0005
+00116e: 0000                    |  ins_size:       0000
+001170: 0400                    |  outs_size:      0004
+001172: 0000                    |  tries_size:     0000
+001174: 0000 0000               |  debug_off:      00000000
+001178: 2800 0000               |  insns_size:     00000028
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+00117c: 1400 0040 003f          |  0000: const v0, #float 0.50097656 // #3f004000
+001182: 1401 0040 00bf          |  0003: const v1, #float -0.50097656 // #bf004000
+001188: 1802 0000 0000 0410 d0bf|  0006: const-wide v2, #double -0.2509775161743164 // #bfd0100400000000
+                                |  000b: code-address
+001192: fc40 0900 1032          |  000b: invoke-custom {v0, v1, v2, v3}, {invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}, targetMethodTest7, (FFD)D} // CallSiteRef@0009
+                                |  000e: code-address
+                                |  000e: code-address
+                                |  000e: local-snapshot
+001198: 0b00                    |  000e: move-result-wide v0
+                                |  000f: code-address
+                                |  000f: code-address
+                                |  000f: local-snapshot
+                                |  000f: code-address
+00119a: 6202 0200               |  000f: sget-object v2, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0011: code-address
+                                |  0011: code-address
+                                |  0011: local-snapshot
+                                |  0011: code-address
+                                |  0011: code-address
+                                |  0011: local-snapshot
+                                |  0011: code-address
+00119e: 2203 1000               |  0011: new-instance v3, java.lang.StringBuilder // type@0010
+                                |  0013: code-address
+                                |  0013: code-address
+                                |  0013: local-snapshot
+                                |  0013: code-address
+                                |  0013: code-address
+                                |  0013: local-snapshot
+                                |  0013: code-address
+0011a2: 7010 2b00 0300          |  0013: invoke-direct {v3}, java.lang.StringBuilder.<init>:()V // method@002b
+                                |  0016: code-address
+                                |  0016: code-address
+                                |  0016: local-snapshot
+                                |  0016: code-address
+0011a8: 1a04 7500               |  0016: const-string v4, "targetMethodTest6 returned: " // utf8@0075
+                                |  0018: code-address
+                                |  0018: code-address
+                                |  0018: local-snapshot
+                                |  0018: code-address
+                                |  0018: code-address
+                                |  0018: local-snapshot
+                                |  0018: code-address
+0011ac: 6e20 3100 4300          |  0018: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  001b: code-address
+                                |  001b: code-address
+                                |  001b: local-snapshot
+0011b2: 0c03                    |  001b: move-result-object v3
+                                |  001c: code-address
+                                |  001c: code-address
+                                |  001c: local-snapshot
+                                |  001c: code-address
+0011b4: 6e30 2c00 0301          |  001c: invoke-virtual {v3, v0, v1}, java.lang.StringBuilder.append:(D)Ljava/lang/StringBuilder; // method@002c
+                                |  001f: code-address
+                                |  001f: code-address
+                                |  001f: local-snapshot
+0011ba: 0c00                    |  001f: move-result-object v0
+                                |  0020: code-address
+                                |  0020: code-address
+                                |  0020: local-snapshot
+                                |  0020: code-address
+0011bc: 6e10 3200 0000          |  0020: invoke-virtual {v0}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0032
+                                |  0023: code-address
+                                |  0023: code-address
+                                |  0023: local-snapshot
+0011c2: 0c00                    |  0023: move-result-object v0
+                                |  0024: code-address
+                                |  0024: code-address
+                                |  0024: local-snapshot
+                                |  0024: code-address
+0011c4: 6e20 2700 0200          |  0024: invoke-virtual {v2, v0}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  0027: code-address
+                                |  0027: code-address
+                                |  0027: local-snapshot
+0011ca: 0e00                    |  0027: return-void
+                                |  0028: code-address
+                                |
+                                |[11cc] invokecustom.InvokeCustom.test8:()V
+0011cc: 0100                    |  registers_size: 0001
+0011ce: 0000                    |  ins_size:       0000
+0011d0: 0100                    |  outs_size:      0001
+0011d2: 0000                    |  tries_size:     0000
+0011d4: 0000 0000               |  debug_off:      00000000
+0011d8: 1000 0000               |  insns_size:     00000010
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+0011dc: 1a00 1400               |  0000: const-string v0, "First invokedynamic invocation" // utf8@0014
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+0011e0: fc10 0d00 0000          |  0002: invoke-custom {v0}, {invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}, targetMethodTest8, (Ljava/lang/String;)V} // CallSiteRef@000d
+                                |  0005: code-address
+                                |  0005: code-address
+                                |  0005: local-snapshot
+                                |  0005: code-address
+0011e6: 1a00 3b00               |  0005: const-string v0, "Second invokedynamic invocation" // utf8@003b
+                                |  0007: code-address
+                                |  0007: code-address
+                                |  0007: local-snapshot
+                                |  0007: code-address
+                                |  0007: code-address
+                                |  0007: local-snapshot
+                                |  0007: code-address
+0011ea: fc10 0e00 0000          |  0007: invoke-custom {v0}, {invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}, targetMethodTest8, (Ljava/lang/String;)V} // CallSiteRef@000e
+                                |  000a: code-address
+                                |  000a: code-address
+                                |  000a: local-snapshot
+                                |  000a: code-address
+0011f0: 1a00 0f00               |  000a: const-string v0, "Dupe first invokedynamic invocation" // utf8@000f
+                                |  000c: code-address
+                                |  000c: code-address
+                                |  000c: local-snapshot
+                                |  000c: code-address
+                                |  000c: code-address
+                                |  000c: local-snapshot
+                                |  000c: code-address
+0011f4: fc10 0f00 0000          |  000c: invoke-custom {v0}, {invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}, targetMethodTest8, (Ljava/lang/String;)V} // CallSiteRef@000f
+                                |  000f: code-address
+                                |  000f: code-address
+                                |  000f: local-snapshot
+0011fa: 0e00                    |  000f: return-void
+                                |  0010: code-address
+                                |
+                                |[11fc] invokecustom.InvokeCustom.test9:()V
+0011fc: 0000                    |  registers_size: 0000
+0011fe: 0000                    |  ins_size:       0000
+001200: 0000                    |  outs_size:      0000
+001202: 0000                    |  tries_size:     0000
+001204: 0000 0000               |  debug_off:      00000000
+001208: 0400 0000               |  insns_size:     00000004
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+00120c: fc00 1500 0000          |  0000: invoke-custom {}, {invoke-static,method{invokecustom.InvokeCustom.bsmLookupTest9:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;}, targetMethodTest9, ()V, static-get,field{invokecustom.InvokeCustom.staticFieldTest9:I}, static-put,field{invokecustom.InvokeCustom.staticFieldTest9:I}, instance-get,field{invokecustom.InvokeCustom.fieldTest9:F}, instance-put,field{invokecustom.InvokeCustom.fieldTest9:F}, invoke-instance,method{invokecustom.InvokeCustom.helperMethodTest9:()V}, invoke-constructor,method{invokecustom.InvokeCustom.<init>:(I)V}, invoke-interface,ifaceMethod{java.lang.Runnable.run:()V}} // CallSiteRef@0015
+                                |  0003: code-address
+                                |  0003: code-address
+                                |  0003: local-snapshot
+001212: 0e00                    |  0003: return-void
+                                |  0004: code-address
+                                |
+                                |[1214] invokecustom.InvokeCustom.helperMethodTest9:()V
+001214: 0400                    |  registers_size: 0004
+001216: 0100                    |  ins_size:       0001
+001218: 0200                    |  outs_size:      0002
+00121a: 0000                    |  tries_size:     0000
+00121c: 8b1c 0000               |  debug_off:      00001c8b
+001220: 1b00 0000               |  insns_size:     0000001b
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+001224: 6200 0200               |  0000: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+001228: 2201 1000               |  0002: new-instance v1, java.lang.StringBuilder // type@0010
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+00122c: 7010 2b00 0100          |  0004: invoke-direct {v1}, java.lang.StringBuilder.<init>:()V // method@002b
+                                |  0007: code-address
+                                |  0007: code-address
+                                |  0007: local-snapshot
+                                |  0007: code-address
+001232: 1a02 5d00               |  0007: const-string v2, "helperMethodTest9 in " // utf8@005d
+                                |  0009: code-address
+                                |  0009: code-address
+                                |  0009: local-snapshot
+                                |  0009: code-address
+                                |  0009: code-address
+                                |  0009: local-snapshot
+                                |  0009: code-address
+001236: 6e20 3100 2100          |  0009: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0031
+                                |  000c: code-address
+                                |  000c: code-address
+                                |  000c: local-snapshot
+00123c: 0c01                    |  000c: move-result-object v1
+                                |  000d: code-address
+                                |  000d: code-address
+                                |  000d: local-snapshot
+                                |  000d: code-address
+00123e: 1c02 0700               |  000d: const-class v2, invokecustom.InvokeCustom // type@0007
+                                |  000f: code-address
+                                |  000f: code-address
+                                |  000f: local-snapshot
+                                |  000f: code-address
+                                |  000f: code-address
+                                |  000f: local-snapshot
+                                |  000f: code-address
+001242: 6e20 3000 2100          |  000f: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@0030
+                                |  0012: code-address
+                                |  0012: code-address
+                                |  0012: local-snapshot
+001248: 0c01                    |  0012: move-result-object v1
+                                |  0013: code-address
+                                |  0013: code-address
+                                |  0013: local-snapshot
+                                |  0013: code-address
+00124a: 6e10 3200 0100          |  0013: invoke-virtual {v1}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0032
+                                |  0016: code-address
+                                |  0016: code-address
+                                |  0016: local-snapshot
+001250: 0c01                    |  0016: move-result-object v1
+                                |  0017: code-address
+                                |  0017: code-address
+                                |  0017: local-snapshot
+                                |  0017: code-address
+001252: 6e20 2700 1000          |  0017: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  001a: code-address
+                                |  001a: code-address
+                                |  001a: local-snapshot
+001258: 0e00                    |  001a: return-void
+                                |  001b: code-address
+                                |  debug info
+                                |    line_start: 125
+                                |    parameters_size: 0000
+                                |    0000: prologue end
+                                |    0000: line 125
+                                |    001a: advance pc
+                                |    001a: line 126
+                                |    end sequence
+                                |
+00125a: 0000                    |
+                                |[125c] invokecustom.InvokeCustom.run:()V
+00125c: 0300                    |  registers_size: 0003
+00125e: 0100                    |  ins_size:       0001
+001260: 0200                    |  outs_size:      0002
+001262: 0000                    |  tries_size:     0000
+001264: 931c 0000               |  debug_off:      00001c93
+001268: 0800 0000               |  insns_size:     00000008
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+00126c: 6200 0200               |  0000: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+001270: 1a01 6700               |  0002: const-string v1, "run() for Test9" // utf8@0067
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+001274: 6e20 2700 1000          |  0004: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  0007: code-address
+                                |  0007: code-address
+                                |  0007: local-snapshot
+00127a: 0e00                    |  0007: return-void
+                                |  0008: code-address
+                                |  debug info
+                                |    line_start: 133
+                                |    parameters_size: 0000
+                                |    0000: prologue end
+                                |    0000: line 133
+                                |    0007: line 134
+                                |    end sequence
+                                |
+                                |[127c] invokecustom.InvokeCustom.targetMethodTest4:()V
+00127c: 0300                    |  registers_size: 0003
+00127e: 0100                    |  ins_size:       0001
+001280: 0200                    |  outs_size:      0002
+001282: 0000                    |  tries_size:     0000
+001284: 9a1c 0000               |  debug_off:      00001c9a
+001288: 0800 0000               |  insns_size:     00000008
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+                                |  0000: code-address
+                                |  0000: local-snapshot
+                                |  0000: code-address
+00128c: 6200 0200               |  0000: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+                                |  0002: code-address
+                                |  0002: local-snapshot
+                                |  0002: code-address
+001290: 1a01 6e00               |  0002: const-string v1, "targetMethodTest4 from InvokeCustom (oops!)" // utf8@006e
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+                                |  0004: code-address
+                                |  0004: local-snapshot
+                                |  0004: code-address
+001294: 6e20 2700 1000          |  0004: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@0027
+                                |  0007: code-address
+                                |  0007: code-address
+                                |  0007: local-snapshot
+00129a: 0e00                    |  0007: return-void
+                                |  0008: code-address
+                                |  debug info
+                                |    line_start: 64
+                                |    parameters_size: 0000
+                                |    0000: prologue end
+                                |    0000: line 64
+                                |    0007: line 65
+                                |    end sequence
+                                |
+                                |[129c] annotations directory
+00129c: 0000 0000               |  class_annotations_off: 00000000
+0012a0: 0000 0000               |  fields_size:           00000000
+0012a4: 0600 0000               |  methods_size:          00000006
+0012a8: 0000 0000               |  parameters_size:       00000000
+                                |  methods:
+                                |    invokecustom.InvokeCustom.bsmCreateCallSite:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+0012ac: 0300 0000               |      method_idx:      00000003
+0012b0: d007 0000               |      annotations_off: 000007d0
+                                |    invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
+0012b4: 0400 0000               |      method_idx:      00000004
+0012b8: d807 0000               |      annotations_off: 000007d8
+                                |    invokecustom.InvokeCustom.bsmLookupStaticWithExtraArgs:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;
+0012bc: 0500 0000               |      method_idx:      00000005
+0012c0: d807 0000               |      annotations_off: 000007d8
+                                |    invokecustom.InvokeCustom.bsmLookupTest9:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+0012c4: 0600 0000               |      method_idx:      00000006
+0012c8: d007 0000               |      annotations_off: 000007d0
+                                |    invokecustom.InvokeCustom.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+0012cc: 0700 0000               |      method_idx:      00000007
+0012d0: d007 0000               |      annotations_off: 000007d0
+                                |    invokecustom.InvokeCustom.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+0012d4: 0800 0000               |      method_idx:      00000008
+0012d8: d007 0000               |      annotations_off: 000007d0
+                                |
+                                |[12dc] type_list
+0012dc: 0100 0000               |  size: 00000001
+0012e0: 0e00                    |  000e // java.lang.Runnable
+                                |
+0012e2: 0000                    |
+                                |[12e4] type_list
+0012e4: 0300 0000               |  size: 00000003
+0012e8: 0300                    |  0003 // float
+0012ea: 0300                    |  0003 // float
+0012ec: 0200                    |  0002 // double
+                                |
+0012ee: 0000                    |
+                                |[12f0] type_list
+0012f0: 0100 0000               |  size: 00000001
+0012f4: 0700                    |  0007 // invokecustom.InvokeCustom
+                                |
+0012f6: 0000                    |
+                                |[12f8] type_list
+0012f8: 0300 0000               |  size: 00000003
+0012fc: 0400                    |  0004 // int
+0012fe: 0400                    |  0004 // int
+001300: 0400                    |  0004 // int
+                                |
+001302: 0000                    |
+                                |[1304] type_list
+001304: 0300 0000               |  size: 00000003
+001308: 0500                    |  0005 // long
+00130a: 0500                    |  0005 // long
+00130c: 0500                    |  0005 // long
+                                |
+00130e: 0000                    |
+                                |[1310] type_list
+001310: 0100 0000               |  size: 00000001
+001314: 0400                    |  0004 // int
+                                |
+001316: 0000                    |
+                                |[1318] type_list
+001318: 0100 0000               |  size: 00000001
+00131c: 1c00                    |  001c // java.lang.Object[]
+                                |
+00131e: 0000                    |
+                                |[1320] type_list
+001320: 0100 0000               |  size: 00000001
+001324: 0200                    |  0002 // double
+                                |
+001326: 0000                    |
+                                |[1328] type_list
+001328: 0100 0000               |  size: 00000001
+00132c: 0300                    |  0003 // float
+                                |
+00132e: 0000                    |
+                                |[1330] type_list
+001330: 0100 0000               |  size: 00000001
+001334: 0500                    |  0005 // long
+                                |
+001336: 0000                    |
+                                |[1338] type_list
+001338: 0100 0000               |  size: 00000001
+00133c: 0d00                    |  000d // java.lang.Object
+                                |
+00133e: 0000                    |
+                                |[1340] type_list
+001340: 0100 0000               |  size: 00000001
+001344: 0f00                    |  000f // java.lang.String
+                                |
+001346: 0000                    |
+                                |[1348] type_list
+001348: 0300 0000               |  size: 00000003
+00134c: 1600                    |  0016 // java.lang.invoke.MethodHandles$Lookup
+00134e: 0f00                    |  000f // java.lang.String
+001350: 1800                    |  0018 // java.lang.invoke.MethodType
+                                |
+001352: 0000                    |
+                                |[1354] type_list
+001354: 0700 0000               |  size: 00000007
+001358: 1600                    |  0016 // java.lang.invoke.MethodHandles$Lookup
+00135a: 0f00                    |  000f // java.lang.String
+00135c: 1800                    |  0018 // java.lang.invoke.MethodType
+00135e: 0400                    |  0004 // int
+001360: 0500                    |  0005 // long
+001362: 0300                    |  0003 // float
+001364: 0200                    |  0002 // double
+                                |
+001366: 0000                    |
+                                |[1368] type_list
+001368: 0400 0000               |  size: 00000004
+00136c: 1600                    |  0016 // java.lang.invoke.MethodHandles$Lookup
+00136e: 0f00                    |  000f // java.lang.String
+001370: 1800                    |  0018 // java.lang.invoke.MethodType
+001372: 1500                    |  0015 // java.lang.invoke.MethodHandle
+                                |
+                                |[1374] type_list
+001374: 0a00 0000               |  size: 0000000a
+001378: 1600                    |  0016 // java.lang.invoke.MethodHandles$Lookup
+00137a: 0f00                    |  000f // java.lang.String
+00137c: 1800                    |  0018 // java.lang.invoke.MethodType
+00137e: 1500                    |  0015 // java.lang.invoke.MethodHandle
+001380: 1500                    |  0015 // java.lang.invoke.MethodHandle
+001382: 1500                    |  0015 // java.lang.invoke.MethodHandle
+001384: 1500                    |  0015 // java.lang.invoke.MethodHandle
+001386: 1500                    |  0015 // java.lang.invoke.MethodHandle
+001388: 1500                    |  0015 // java.lang.invoke.MethodHandle
+00138a: 1500                    |  0015 // java.lang.invoke.MethodHandle
+                                |
+                                |[138c] type_list
+00138c: 0300 0000               |  size: 00000003
+001390: 0a00                    |  000a // java.lang.Class
+001392: 0f00                    |  000f // java.lang.String
+001394: 1800                    |  0018 // java.lang.invoke.MethodType
+                                |
+001396: 0000                    |
+                                |[1398] type_list
+001398: 0100 0000               |  size: 00000001
+00139c: 1800                    |  0018 // java.lang.invoke.MethodType
+                                |
+00139e: 0000                    |
+                                |[13a0] type_list
+0013a0: 0100 0000               |  size: 00000001
+0013a4: 0100                    |  0001 // char
+                                |
+0013a6: 0000                    |
+                                |[13a8] type_list
+0013a8: 0200 0000               |  size: 00000002
+0013ac: 0700                    |  0007 // invokecustom.InvokeCustom
+0013ae: 0300                    |  0003 // float
+                                |
+                                |[13b0] type_list
+0013b0: 0100 0000               |  size: 00000001
+0013b4: 1500                    |  0015 // java.lang.invoke.MethodHandle
+                                |
+0013b6: 0000                    |
+                                |[13b8] type_list
+0013b8: 0200 0000               |  size: 00000002
+0013bc: 1500                    |  0015 // java.lang.invoke.MethodHandle
+0013be: 1500                    |  0015 // java.lang.invoke.MethodHandle
+                                |
+                                |[13c0] type_list
+0013c0: 0100 0000               |  size: 00000001
+0013c4: 1b00                    |  001b // boolean
+                                |
+0013c6: 0000                    |
+                                |[13c8] type_list
+0013c8: 0900 0000               |  size: 00000009
+0013cc: 1b00                    |  001b // boolean
+0013ce: 0000                    |  0000 // byte
+0013d0: 0100                    |  0001 // char
+0013d2: 1900                    |  0019 // short
+0013d4: 0400                    |  0004 // int
+0013d6: 0300                    |  0003 // float
+0013d8: 0500                    |  0005 // long
+0013da: 0200                    |  0002 // double
+0013dc: 0f00                    |  000f // java.lang.String
+                                |
+0013de: 0000                    |
+                                |[13e0] type_list
+0013e0: 0100 0000               |  size: 00000001
+0013e4: 1d00                    |  001d // java.lang.String[]
+                                |
+                                |string_data:
+0013e6: 01                      |utf16_size: 00000001
+0013e7: 2000                    |" "
+                                |
+0013e9: 04                      |utf16_size: 00000004
+0013ea: 2021 3d20 00            |" != "
+                                |
+0013ef: 03                      |utf16_size: 00000003
+0013f0: 202a 2000               |" * "
+                                |
+0013f4: 03                      |utf16_size: 00000003
+0013f5: 202b 2000               |" + "
+                                |
+0013f9: 03                      |utf16_size: 00000003
+0013fa: 203d 2000               |" = "
+                                |
+0013fe: 0a                      |utf16_size: 0000000a
+0013ff: 2065 7870 6563 7465 6420|" expected "
+001409: 00                      |
+                                |
+00140a: 05                      |utf16_size: 00000005
+00140b: 206e 6577 2000          |" new "
+                                |
+001411: 01                      |utf16_size: 00000001
+001412: 2900                    |")"
+                                |
+001414: 02                      |utf16_size: 00000002
+001415: 2c20 00                 |", "
+                                |
+001418: 08                      |utf16_size: 00000008
+001419: 3c63 6c69 6e69 743e 00  |"<clinit>"
+                                |
+001422: 06                      |utf16_size: 00000006
+001423: 3c69 6e69 743e 00       |"<init>"
+                                |
+00142a: 01                      |utf16_size: 00000001
+00142b: 4200                    |"B"
+                                |
+00142d: 01                      |utf16_size: 00000001
+00142e: 4300                    |"C"
+                                |
+001430: 01                      |utf16_size: 00000001
+001431: 4400                    |"D"
+                                |
+001433: 04                      |utf16_size: 00000004
+001434: 4446 4644 00            |"DFFD"
+                                |
+001439: 23                      |utf16_size: 00000023
+00143a: 4475 7065 2066 6972 7374|"Dupe first invokedynamic invocation"
+001444: 2069 6e76 6f6b 6564 796e|
+00144e: 616d 6963 2069 6e76 6f63|
+001458: 6174 696f 6e00          |
+                                |
+00145e: 05                      |utf16_size: 00000005
+00145f: 4552 524f 5200          |"ERROR"
+                                |
+001465: 01                      |utf16_size: 00000001
+001466: 4600                    |"F"
+                                |
+001468: 02                      |utf16_size: 00000002
+001469: 464c 00                 |"FL"
+                                |
+00146c: 07                      |utf16_size: 00000007
+00146d: 4661 696c 6564 2000     |"Failed "
+                                |
+001475: 1e                      |utf16_size: 0000001e
+001476: 4669 7273 7420 696e 766f|"First invokedynamic invocation"
+001480: 6b65 6479 6e61 6d69 6320|
+00148a: 696e 766f 6361 7469 6f6e|
+001494: 00                      |
+                                |
+001495: 0c                      |utf16_size: 0000000c
+001496: 4865 6c6c 6f20 576f 726c|"Hello World!"
+0014a0: 6421 00                 |
+                                |
+0014a3: 01                      |utf16_size: 00000001
+0014a4: 4900                    |"I"
+                                |
+0014a6: 04                      |utf16_size: 00000004
+0014a7: 4949 4949 00            |"IIII"
+                                |
+0014ac: 14                      |utf16_size: 00000014
+0014ad: 496e 766f 6b65 4375 7374|"InvokeCustom.<init>("
+0014b7: 6f6d 2e3c 696e 6974 3e28|
+0014c1: 00                      |
+                                |
+0014c2: 11                      |utf16_size: 00000011
+0014c3: 496e 766f 6b65 4375 7374|"InvokeCustom.java"
+0014cd: 6f6d 2e6a 6176 6100     |
+                                |
+0014d5: 01                      |utf16_size: 00000001
+0014d6: 4a00                    |"J"
+                                |
+0014d8: 04                      |utf16_size: 00000004
+0014d9: 4a4a 4a4a 00            |"JJJJ"
+                                |
+0014de: 01                      |utf16_size: 00000001
+0014df: 4c00                    |"L"
+                                |
+0014e1: 02                      |utf16_size: 00000002
+0014e2: 4c44 00                 |"LD"
+                                |
+0014e5: 02                      |utf16_size: 00000002
+0014e6: 4c46 00                 |"LF"
+                                |
+0014e9: 02                      |utf16_size: 00000002
+0014ea: 4c49 00                 |"LI"
+                                |
+0014ed: 02                      |utf16_size: 00000002
+0014ee: 4c4a 00                 |"LJ"
+                                |
+0014f1: 02                      |utf16_size: 00000002
+0014f2: 4c4c 00                 |"LL"
+                                |
+0014f5: 04                      |utf16_size: 00000004
+0014f6: 4c4c 4c4c 00            |"LLLL"
+                                |
+0014fb: 08                      |utf16_size: 00000008
+0014fc: 4c4c 4c4c 494a 4644 00  |"LLLLIJFD"
+                                |
+001505: 05                      |utf16_size: 00000005
+001506: 4c4c 4c4c 4c00          |"LLLLL"
+                                |
+00150c: 0b                      |utf16_size: 0000000b
+00150d: 4c4c 4c4c 4c4c 4c4c 4c4c|"LLLLLLLLLLL"
+001517: 4c00                    |
+                                |
+001519: 1a                      |utf16_size: 0000001a
+00151a: 4c64 616c 7669 6b2f 616e|"Ldalvik/annotation/Throws;"
+001524: 6e6f 7461 7469 6f6e 2f54|
+00152e: 6872 6f77 733b 00       |
+                                |
+001535: 1b                      |utf16_size: 0000001b
+001536: 4c69 6e76 6f6b 6563 7573|"Linvokecustom/InvokeCustom;"
+001540: 746f 6d2f 496e 766f 6b65|
+00154a: 4375 7374 6f6d 3b00     |
+                                |
+001552: 14                      |utf16_size: 00000014
+001553: 4c69 6e76 6f6b 6563 7573|"Linvokecustom/Super;"
+00155d: 746f 6d2f 5375 7065 723b|
+001567: 00                      |
+                                |
+001568: 15                      |utf16_size: 00000015
+001569: 4c6a 6176 612f 696f 2f50|"Ljava/io/PrintStream;"
+001573: 7269 6e74 5374 7265 616d|
+00157d: 3b00                    |
+                                |
+00157f: 11                      |utf16_size: 00000011
+001580: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/Class;"
+00158a: 2f43 6c61 7373 3b00     |
+                                |
+001592: 22                      |utf16_size: 00000022
+001593: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/IllegalAccessException;"
+00159d: 2f49 6c6c 6567 616c 4163|
+0015a7: 6365 7373 4578 6365 7074|
+0015b1: 696f 6e3b 00            |
+                                |
+0015b6: 21                      |utf16_size: 00000021
+0015b7: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/NoSuchMethodException;"
+0015c1: 2f4e 6f53 7563 684d 6574|
+0015cb: 686f 6445 7863 6570 7469|
+0015d5: 6f6e 3b00               |
+                                |
+0015d9: 12                      |utf16_size: 00000012
+0015da: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/Object;"
+0015e4: 2f4f 626a 6563 743b 00  |
+                                |
+0015ed: 14                      |utf16_size: 00000014
+0015ee: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/Runnable;"
+0015f8: 2f52 756e 6e61 626c 653b|
+001602: 00                      |
+                                |
+001603: 12                      |utf16_size: 00000012
+001604: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/String;"
+00160e: 2f53 7472 696e 673b 00  |
+                                |
+001617: 19                      |utf16_size: 00000019
+001618: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/StringBuilder;"
+001622: 2f53 7472 696e 6742 7569|
+00162c: 6c64 6572 3b00          |
+                                |
+001632: 12                      |utf16_size: 00000012
+001633: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/System;"
+00163d: 2f53 7973 7465 6d3b 00  |
+                                |
+001646: 15                      |utf16_size: 00000015
+001647: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/Throwable;"
+001651: 2f54 6872 6f77 6162 6c65|
+00165b: 3b00                    |
+                                |
+00165d: 1b                      |utf16_size: 0000001b
+00165e: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/invoke/CallSite;"
+001668: 2f69 6e76 6f6b 652f 4361|
+001672: 6c6c 5369 7465 3b00     |
+                                |
+00167a: 23                      |utf16_size: 00000023
+00167b: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/invoke/ConstantCallSite;"
+001685: 2f69 6e76 6f6b 652f 436f|
+00168f: 6e73 7461 6e74 4361 6c6c|
+001699: 5369 7465 3b00          |
+                                |
+00169f: 1f                      |utf16_size: 0000001f
+0016a0: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/invoke/MethodHandle;"
+0016aa: 2f69 6e76 6f6b 652f 4d65|
+0016b4: 7468 6f64 4861 6e64 6c65|
+0016be: 3b00                    |
+                                |
+0016c0: 27                      |utf16_size: 00000027
+0016c1: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/invoke/MethodHandles$Lookup;"
+0016cb: 2f69 6e76 6f6b 652f 4d65|
+0016d5: 7468 6f64 4861 6e64 6c65|
+0016df: 7324 4c6f 6f6b 7570 3b00|
+                                |
+0016e9: 20                      |utf16_size: 00000020
+0016ea: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/invoke/MethodHandles;"
+0016f4: 2f69 6e76 6f6b 652f 4d65|
+0016fe: 7468 6f64 4861 6e64 6c65|
+001708: 733b 00                 |
+                                |
+00170b: 1d                      |utf16_size: 0000001d
+00170c: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/invoke/MethodType;"
+001716: 2f69 6e76 6f6b 652f 4d65|
+001720: 7468 6f64 5479 7065 3b00|
+                                |
+00172a: 02                      |utf16_size: 00000002
+00172b: 4f4b 00                 |"OK"
+                                |
+00172e: 01                      |utf16_size: 00000001
+00172f: 5300                    |"S"
+                                |
+001731: 1f                      |utf16_size: 0000001f
+001732: 5365 636f 6e64 2069 6e76|"Second invokedynamic invocation"
+00173c: 6f6b 6564 796e 616d 6963|
+001746: 2069 6e76 6f63 6174 696f|
+001750: 6e00                    |
+                                |
+001752: 06                      |utf16_size: 00000006
+001753: 5374 7269 6e67 00       |"String"
+                                |
+00175a: 01                      |utf16_size: 00000001
+00175b: 5600                    |"V"
+                                |
+00175d: 02                      |utf16_size: 00000002
+00175e: 5643 00                 |"VC"
+                                |
+001761: 02                      |utf16_size: 00000002
+001762: 5644 00                 |"VD"
+                                |
+001765: 02                      |utf16_size: 00000002
+001766: 5646 00                 |"VF"
+                                |
+001769: 02                      |utf16_size: 00000002
+00176a: 5649 00                 |"VI"
+                                |
+00176d: 02                      |utf16_size: 00000002
+00176e: 564a 00                 |"VJ"
+                                |
+001771: 02                      |utf16_size: 00000002
+001772: 564c 00                 |"VL"
+                                |
+001775: 03                      |utf16_size: 00000003
+001776: 564c 4600               |"VLF"
+                                |
+00177a: 03                      |utf16_size: 00000003
+00177b: 564c 4c00               |"VLL"
+                                |
+00177f: 02                      |utf16_size: 00000002
+001780: 565a 00                 |"VZ"
+                                |
+001783: 0a                      |utf16_size: 0000000a
+001784: 565a 4243 5349 464a 444c|"VZBCSIFJDL"
+00178e: 00                      |
+                                |
+00178f: 01                      |utf16_size: 00000001
+001790: 5a00                    |"Z"
+                                |
+001792: 13                      |utf16_size: 00000013
+001793: 5b4c 6a61 7661 2f6c 616e|"[Ljava/lang/Object;"
+00179d: 672f 4f62 6a65 6374 3b00|
+                                |
+0017a7: 13                      |utf16_size: 00000013
+0017a8: 5b4c 6a61 7661 2f6c 616e|"[Ljava/lang/String;"
+0017b2: 672f 5374 7269 6e67 3b00|
+                                |
+0017bc: 01                      |utf16_size: 00000001
+0017bd: 5d00                    |"]"
+                                |
+0017bf: 06                      |utf16_size: 00000006
+0017c0: 6170 7065 6e64 00       |"append"
+                                |
+0017c7: 06                      |utf16_size: 00000006
+0017c8: 6173 5479 7065 00       |"asType"
+                                |
+0017cf: 11                      |utf16_size: 00000011
+0017d0: 6273 6d43 7265 6174 6543|"bsmCreateCallSite"
+0017da: 616c 6c53 6974 6500     |
+                                |
+0017e2: 13                      |utf16_size: 00000013
+0017e3: 6273 6d43 7265 6174 6543|"bsmCreateCallSite ["
+0017ed: 616c 6c53 6974 6520 5b00|
+                                |
+0017f7: 0f                      |utf16_size: 0000000f
+0017f8: 6273 6d4c 6f6f 6b75 7053|"bsmLookupStatic"
+001802: 7461 7469 6300          |
+                                |
+001808: 12                      |utf16_size: 00000012
+001809: 6273 6d4c 6f6f 6b75 7053|"bsmLookupStatic []"
+001813: 7461 7469 6320 5b5d 00  |
+                                |
+00181c: 1c                      |utf16_size: 0000001c
+00181d: 6273 6d4c 6f6f 6b75 7053|"bsmLookupStaticWithExtraArgs"
+001827: 7461 7469 6357 6974 6845|
+001831: 7874 7261 4172 6773 00  |
+                                |
+00183a: 1e                      |utf16_size: 0000001e
+00183b: 6273 6d4c 6f6f 6b75 7053|"bsmLookupStaticWithExtraArgs ["
+001845: 7461 7469 6357 6974 6845|
+00184f: 7874 7261 4172 6773 205b|
+001859: 00                      |
+                                |
+00185a: 0e                      |utf16_size: 0000000e
+00185b: 6273 6d4c 6f6f 6b75 7054|"bsmLookupTest9"
+001865: 6573 7439 00            |
+                                |
+00186a: 10                      |utf16_size: 00000010
+00186b: 6273 6d4c 6f6f 6b75 7054|"bsmLookupTest9 ["
+001875: 6573 7439 205b 00       |
+                                |
+00187c: 0f                      |utf16_size: 0000000f
+00187d: 6368 6563 6b46 6965 6c64|"checkFieldTest9"
+001887: 5465 7374 3900          |
+                                |
+00188d: 15                      |utf16_size: 00000015
+00188e: 6368 6563 6b46 6965 6c64|"checkFieldTest9: old "
+001898: 5465 7374 393a 206f 6c64|
+0018a2: 2000                    |
+                                |
+0018a4: 15                      |utf16_size: 00000015
+0018a5: 6368 6563 6b53 7461 7469|"checkStaticFieldTest9"
+0018af: 6346 6965 6c64 5465 7374|
+0018b9: 3900                    |
+                                |
+0018bb: 1b                      |utf16_size: 0000001b
+0018bc: 6368 6563 6b53 7461 7469|"checkStaticFieldTest9: old "
+0018c6: 6346 6965 6c64 5465 7374|
+0018d0: 393a 206f 6c64 2000     |
+                                |
+0018d8: 0a                      |utf16_size: 0000000a
+0018d9: 6669 656c 6454 6573 7439|"fieldTest9"
+0018e3: 00                      |
+                                |
+0018e4: 0a                      |utf16_size: 0000000a
+0018e5: 6669 6e64 5374 6174 6963|"findStatic"
+0018ef: 00                      |
+                                |
+0018f0: 11                      |utf16_size: 00000011
+0018f1: 6865 6c70 6572 4d65 7468|"helperMethodTest9"
+0018fb: 6f64 5465 7374 3900     |
+                                |
+001903: 15                      |utf16_size: 00000015
+001904: 6865 6c70 6572 4d65 7468|"helperMethodTest9 in "
+00190e: 6f64 5465 7374 3920 696e|
+001918: 2000                    |
+                                |
+00191a: 06                      |utf16_size: 00000006
+00191b: 696e 766f 6b65 00       |"invoke"
+                                |
+001922: 0b                      |utf16_size: 0000000b
+001923: 696e 766f 6b65 4578 6163|"invokeExact"
+00192d: 7400                    |
+                                |
+00192f: 06                      |utf16_size: 00000006
+001930: 6c6f 6f6b 7570 00       |"lookup"
+                                |
+001937: 0b                      |utf16_size: 0000000b
+001938: 6c6f 6f6b 7570 436c 6173|"lookupClass"
+001942: 7300                    |
+                                |
+001944: 04                      |utf16_size: 00000004
+001945: 6d61 696e 00            |"main"
+                                |
+00194a: 03                      |utf16_size: 00000003
+00194b: 6f75 7400               |"out"
+                                |
+00194f: 05                      |utf16_size: 00000005
+001950: 7072 696e 7400          |"print"
+                                |
+001956: 07                      |utf16_size: 00000007
+001957: 7072 696e 746c 6e00     |"println"
+                                |
+00195f: 03                      |utf16_size: 00000003
+001960: 7275 6e00               |"run"
+                                |
+001964: 0f                      |utf16_size: 0000000f
+001965: 7275 6e28 2920 666f 7220|"run() for Test9"
+00196f: 5465 7374 3900          |
+                                |
+001975: 10                      |utf16_size: 00000010
+001976: 7374 6174 6963 4669 656c|"staticFieldTest9"
+001980: 6454 6573 7439 00       |
+                                |
+001987: 11                      |utf16_size: 00000011
+001988: 7461 7267 6574 4d65 7468|"targetMethodTest1"
+001992: 6f64 5465 7374 3100     |
+                                |
+00199a: 11                      |utf16_size: 00000011
+00199b: 7461 7267 6574 4d65 7468|"targetMethodTest2"
+0019a5: 6f64 5465 7374 3200     |
+                                |
+0019ad: 11                      |utf16_size: 00000011
+0019ae: 7461 7267 6574 4d65 7468|"targetMethodTest3"
+0019b8: 6f64 5465 7374 3300     |
+                                |
+0019c0: 23                      |utf16_size: 00000023
+0019c1: 7461 7267 6574 4d65 7468|"targetMethodTest3 from InvokeCustom"
+0019cb: 6f64 5465 7374 3320 6672|
+0019d5: 6f6d 2049 6e76 6f6b 6543|
+0019df: 7573 746f 6d00          |
+                                |
+0019e5: 11                      |utf16_size: 00000011
+0019e6: 7461 7267 6574 4d65 7468|"targetMethodTest4"
+0019f0: 6f64 5465 7374 3400     |
+                                |
+0019f8: 2b                      |utf16_size: 0000002b
+0019f9: 7461 7267 6574 4d65 7468|"targetMethodTest4 from InvokeCustom (oops!)"
+001a03: 6f64 5465 7374 3420 6672|
+001a0d: 6f6d 2049 6e76 6f6b 6543|
+001a17: 7573 746f 6d20 286f 6f70|
+001a21: 7321 2900               |
+                                |
+001a25: 1c                      |utf16_size: 0000001c
+001a26: 7461 7267 6574 4d65 7468|"targetMethodTest4 from Super"
+001a30: 6f64 5465 7374 3420 6672|
+001a3a: 6f6d 2053 7570 6572 00  |
+                                |
+001a43: 11                      |utf16_size: 00000011
+001a44: 7461 7267 6574 4d65 7468|"targetMethodTest5"
+001a4e: 6f64 5465 7374 3500     |
+                                |
+001a56: 12                      |utf16_size: 00000012
+001a57: 7461 7267 6574 4d65 7468|"targetMethodTest5 "
+001a61: 6f64 5465 7374 3520 00  |
+                                |
+001a6a: 1c                      |utf16_size: 0000001c
+001a6b: 7461 7267 6574 4d65 7468|"targetMethodTest5 returned: "
+001a75: 6f64 5465 7374 3520 7265|
+001a7f: 7475 726e 6564 3a20 00  |
+                                |
+001a88: 11                      |utf16_size: 00000011
+001a89: 7461 7267 6574 4d65 7468|"targetMethodTest6"
+001a93: 6f64 5465 7374 3600     |
+                                |
+001a9b: 12                      |utf16_size: 00000012
+001a9c: 7461 7267 6574 4d65 7468|"targetMethodTest6 "
+001aa6: 6f64 5465 7374 3620 00  |
+                                |
+001aaf: 1c                      |utf16_size: 0000001c
+001ab0: 7461 7267 6574 4d65 7468|"targetMethodTest6 returned: "
+001aba: 6f64 5465 7374 3620 7265|
+001ac4: 7475 726e 6564 3a20 00  |
+                                |
+001acd: 11                      |utf16_size: 00000011
+001ace: 7461 7267 6574 4d65 7468|"targetMethodTest7"
+001ad8: 6f64 5465 7374 3700     |
+                                |
+001ae0: 12                      |utf16_size: 00000012
+001ae1: 7461 7267 6574 4d65 7468|"targetMethodTest7 "
+001aeb: 6f64 5465 7374 3720 00  |
+                                |
+001af4: 11                      |utf16_size: 00000011
+001af5: 7461 7267 6574 4d65 7468|"targetMethodTest8"
+001aff: 6f64 5465 7374 3800     |
+                                |
+001b07: 12                      |utf16_size: 00000012
+001b08: 7461 7267 6574 4d65 7468|"targetMethodTest8 "
+001b12: 6f64 5465 7374 3820 00  |
+                                |
+001b1b: 11                      |utf16_size: 00000011
+001b1c: 7461 7267 6574 4d65 7468|"targetMethodTest9"
+001b26: 6f64 5465 7374 3900     |
+                                |
+001b2e: 13                      |utf16_size: 00000013
+001b2f: 7461 7267 6574 4d65 7468|"targetMethodTest9()"
+001b39: 6f64 5465 7374 3928 2900|
+                                |
+001b43: 05                      |utf16_size: 00000005
+001b44: 7465 7374 3100          |"test1"
+                                |
+001b4a: 05                      |utf16_size: 00000005
+001b4b: 7465 7374 3200          |"test2"
+                                |
+001b51: 05                      |utf16_size: 00000005
+001b52: 7465 7374 3300          |"test3"
+                                |
+001b58: 05                      |utf16_size: 00000005
+001b59: 7465 7374 3400          |"test4"
+                                |
+001b5f: 05                      |utf16_size: 00000005
+001b60: 7465 7374 3500          |"test5"
+                                |
+001b66: 05                      |utf16_size: 00000005
+001b67: 7465 7374 3600          |"test6"
+                                |
+001b6d: 05                      |utf16_size: 00000005
+001b6e: 7465 7374 3700          |"test7"
+                                |
+001b74: 05                      |utf16_size: 00000005
+001b75: 7465 7374 3800          |"test8"
+                                |
+001b7b: 05                      |utf16_size: 00000005
+001b7c: 7465 7374 3900          |"test9"
+                                |
+001b82: 08                      |utf16_size: 00000008
+001b83: 746f 5374 7269 6e67 00  |"toString"
+                                |
+001b8c: 05                      |utf16_size: 00000005
+001b8d: 7661 6c75 6500          |"value"
+                                |
+                                |byte_data:
+                                |[1b93] debug info
+001b93: 19                      |line_start: 25
+001b94: 00                      |parameters_size: 0000
+001b95: 07                      |0000: prologue end
+001b96: 0e                      |0000: line 25
+001b97: 00                      |end sequence
+                                |
+                                |[1b98] debug info
+001b98: 1b                      |line_start: 27
+001b99: 00                      |parameters_size: 0000
+001b9a: 07                      |0000: prologue end
+001b9b: 0e                      |0000: line 27
+001b9c: 78                      |0007: line 28
+001b9d: 00                      |end sequence
+                                |
+                                |[1b9e] debug info
+001b9e: 62                      |line_start: 98
+001b9f: 00                      |parameters_size: 0000
+001ba0: 07                      |0000: prologue end
+001ba1: 0e                      |0000: line 98
+001ba2: 00                      |end sequence
+                                |
+                                |[1ba3] debug info
+001ba3: 23                      |line_start: 35
+001ba4: 00                      |parameters_size: 0000
+001ba5: 07                      |0000: prologue end
+001ba6: 0e                      |0000: line 35
+001ba7: 02cc 00                 |line = 111
+001baa: 3b                      |0003: line 111
+001bab: 02b4 7f                 |line = 35
+001bae: 3b                      |0006: line 35
+001baf: 00                      |end sequence
+                                |
+                                |[1bb0] debug info
+001bb0: 24                      |line_start: 36
+001bb1: 01                      |parameters_size: 0001
+001bb2: 00                      |parameter <unnamed> v4
+001bb3: 07                      |0000: prologue end
+001bb4: 0e                      |0000: line 36
+001bb5: 02cb 00                 |line = 111
+001bb8: 3b                      |0003: line 111
+001bb9: 02b6 7f                 |line = 37
+001bbc: 3b                      |0006: line 37
+001bbd: 011e                    |0024: advance pc
+001bbf: 0f                      |0024: line 38
+001bc0: 00                      |end sequence
+                                |
+                                |[1bc1] debug info
+001bc1: 9c01                    |line_start: 156
+001bc3: 04                      |parameters_size: 0004
+001bc4: 00                      |parameter <unnamed> v3
+001bc5: 00                      |parameter <unnamed> v4
+001bc6: 00                      |parameter <unnamed> v5
+001bc7: 00                      |parameter <unnamed> v6
+001bc8: 07                      |0000: prologue end
+001bc9: 0e                      |0000: line 156
+001bca: 011e                    |001e: advance pc
+001bcc: 0f                      |001e: line 157
+001bcd: 00                      |end sequence
+                                |
+                                |[1bce] debug info
+001bce: 8a01                    |line_start: 138
+001bd0: 03                      |parameters_size: 0003
+001bd1: 00                      |parameter <unnamed> v2
+001bd2: 00                      |parameter <unnamed> v3
+001bd3: 00                      |parameter <unnamed> v4
+001bd4: 07                      |0000: prologue end
+001bd5: 0e                      |0000: line 138
+001bd6: 78                      |0007: line 139
+001bd7: 4b                      |000b: line 140
+001bd8: 87                      |0013: line 141
+001bd9: 00                      |end sequence
+                                |
+                                |[1bda] debug info
+001bda: 9301                    |line_start: 147
+001bdc: 07                      |parameters_size: 0007
+001bdd: 00                      |parameter <unnamed> v3
+001bde: 00                      |parameter <unnamed> v4
+001bdf: 00                      |parameter <unnamed> v5
+001be0: 00                      |parameter <unnamed> v6
+001be1: 00                      |parameter <unnamed> v7
+001be2: 00                      |parameter <unnamed> v9
+001be3: 00                      |parameter <unnamed> v10
+001be4: 07                      |0000: prologue end
+001be5: 0e                      |0000: line 147
+001be6: 013c                    |003c: advance pc
+001be8: 0f                      |003c: line 148
+001be9: 4b                      |0040: line 149
+001bea: 87                      |0048: line 150
+001beb: 00                      |end sequence
+                                |
+                                |[1bec] debug info
+001bec: a601                    |line_start: 166
+001bee: 0a                      |parameters_size: 000a
+001bef: 00                      |parameter <unnamed> v3
+001bf0: 00                      |parameter <unnamed> v4
+001bf1: 00                      |parameter <unnamed> v5
+001bf2: 00                      |parameter <unnamed> v6
+001bf3: 00                      |parameter <unnamed> v7
+001bf4: 00                      |parameter <unnamed> v8
+001bf5: 00                      |parameter <unnamed> v9
+001bf6: 00                      |parameter <unnamed> v10
+001bf7: 00                      |parameter <unnamed> v11
+001bf8: 00                      |parameter <unnamed> v12
+001bf9: 07                      |0000: prologue end
+001bfa: 0e                      |0000: line 166
+001bfb: 013c                    |003c: advance pc
+001bfd: 10                      |003c: line 168
+001bfe: 011c                    |0058: advance pc
+001c00: 11                      |0058: line 171
+001c01: 3c                      |005b: line 172
+001c02: 5a                      |0060: line 173
+001c03: 3e                      |0063: line 176
+001c04: 4c                      |0067: line 178
+001c05: 69                      |006d: line 179
+001c06: 4c                      |0071: line 181
+001c07: 4b                      |0075: line 182
+001c08: 87                      |007d: line 183
+001c09: 00                      |end sequence
+                                |
+                                |[1c0a] debug info
+001c0a: 74                      |line_start: 116
+001c0b: 02                      |parameters_size: 0002
+001c0c: 00                      |parameter <unnamed> v7
+001c0d: 00                      |parameter <unnamed> v8
+001c0e: 07                      |0000: prologue end
+001c0f: 3b                      |0003: line 116
+001c10: 5a                      |0008: line 117
+001c11: 4b                      |000c: line 118
+001c12: 5a                      |0011: line 119
+001c13: 0132                    |0043: advance pc
+001c15: 10                      |0043: line 121
+001c16: b4                      |004e: line 122
+001c17: 1c                      |004f: line 121
+001c18: 00                      |end sequence
+                                |
+                                |[1c19] debug info
+001c19: 67                      |line_start: 103
+001c1a: 02                      |parameters_size: 0002
+001c1b: 00                      |parameter <unnamed> v6
+001c1c: 00                      |parameter <unnamed> v7
+001c1d: 07                      |0000: prologue end
+001c1e: 3b                      |0003: line 103
+001c1f: 5a                      |0008: line 104
+001c20: 4b                      |000c: line 105
+001c21: 5a                      |0011: line 106
+001c22: 0132                    |0043: advance pc
+001c24: 10                      |0043: line 108
+001c25: 96                      |004c: line 109
+001c26: 1c                      |004d: line 108
+001c27: 00                      |end sequence
+                                |
+                                |[1c28] debug info
+001c28: 29                      |line_start: 41
+001c29: 00                      |parameters_size: 0000
+001c2a: 07                      |0000: prologue end
+001c2b: 0e                      |0000: line 41
+001c2c: 78                      |0007: line 42
+001c2d: 00                      |end sequence
+                                |
+                                |[1c2e] debug info
+001c2e: 2e                      |line_start: 46
+001c2f: 09                      |parameters_size: 0009
+001c30: 00                      |parameter <unnamed> v2
+001c31: 00                      |parameter <unnamed> v3
+001c32: 00                      |parameter <unnamed> v4
+001c33: 00                      |parameter <unnamed> v5
+001c34: 00                      |parameter <unnamed> v6
+001c35: 00                      |parameter <unnamed> v7
+001c36: 00                      |parameter <unnamed> v8
+001c37: 00                      |parameter <unnamed> v10
+001c38: 00                      |parameter <unnamed> v12
+001c39: 07                      |0000: prologue end
+001c3a: 0e                      |0000: line 46
+001c3b: 5a                      |0005: line 47
+001c3c: 5a                      |000a: line 48
+001c3d: 5a                      |000f: line 49
+001c3e: 5a                      |0014: line 50
+001c3f: 5a                      |0019: line 51
+001c40: 5a                      |001e: line 52
+001c41: 5a                      |0023: line 53
+001c42: 5a                      |0028: line 54
+001c43: 5a                      |002d: line 55
+001c44: 00                      |end sequence
+                                |
+                                |[1c45] debug info
+001c45: 3a                      |line_start: 58
+001c46: 00                      |parameters_size: 0000
+001c47: 07                      |0000: prologue end
+001c48: 0e                      |0000: line 58
+001c49: 78                      |0007: line 59
+001c4a: 00                      |end sequence
+                                |
+                                |[1c4b] debug info
+001c4b: 44                      |line_start: 68
+001c4c: 03                      |parameters_size: 0003
+001c4d: 00                      |parameter <unnamed> v4
+001c4e: 00                      |parameter <unnamed> v5
+001c4f: 00                      |parameter <unnamed> v6
+001c50: 07                      |0000: prologue end
+001c51: 0e                      |0000: line 68
+001c52: 2d                      |0002: line 69
+001c53: 012c                    |002e: advance pc
+001c55: 0f                      |002e: line 70
+001c56: 2d                      |0030: line 71
+001c57: 0122                    |0052: advance pc
+001c59: 10                      |0052: line 73
+001c5a: 00                      |end sequence
+                                |
+                                |[1c5b] debug info
+001c5b: 4d                      |line_start: 77
+001c5c: 03                      |parameters_size: 0003
+001c5d: 00                      |parameter <unnamed> v6
+001c5e: 00                      |parameter <unnamed> v8
+001c5f: 00                      |parameter <unnamed> v10
+001c60: 07                      |0000: prologue end
+001c61: 0e                      |0000: line 77
+001c62: 2d                      |0002: line 78
+001c63: 012c                    |002e: advance pc
+001c65: 0f                      |002e: line 79
+001c66: 4b                      |0032: line 80
+001c67: 0122                    |0054: advance pc
+001c69: 10                      |0054: line 82
+001c6a: 00                      |end sequence
+                                |
+                                |[1c6b] debug info
+001c6b: 56                      |line_start: 86
+001c6c: 03                      |parameters_size: 0003
+001c6d: 00                      |parameter <unnamed> v6
+001c6e: 00                      |parameter <unnamed> v7
+001c6f: 00                      |parameter <unnamed> v8
+001c70: 07                      |0000: prologue end
+001c71: 0e                      |0000: line 86
+001c72: 3c                      |0003: line 87
+001c73: 012c                    |002f: advance pc
+001c75: 0f                      |002f: line 88
+001c76: 4b                      |0033: line 89
+001c77: 0122                    |0055: advance pc
+001c79: 10                      |0055: line 91
+001c7a: 00                      |end sequence
+                                |
+                                |[1c7b] debug info
+001c7b: 5f                      |line_start: 95
+001c7c: 01                      |parameters_size: 0001
+001c7d: 00                      |parameter <unnamed> v3
+001c7e: 07                      |0000: prologue end
+001c7f: 0e                      |0000: line 95
+001c80: 0118                    |0018: advance pc
+001c82: 0f                      |0018: line 96
+001c83: 00                      |end sequence
+                                |
+                                |[1c84] debug info
+001c84: 8101                    |line_start: 129
+001c86: 00                      |parameters_size: 0000
+001c87: 07                      |0000: prologue end
+001c88: 0e                      |0000: line 129
+001c89: 78                      |0007: line 130
+001c8a: 00                      |end sequence
+                                |
+                                |[1c8b] debug info
+001c8b: 7d                      |line_start: 125
+001c8c: 00                      |parameters_size: 0000
+001c8d: 07                      |0000: prologue end
+001c8e: 0e                      |0000: line 125
+001c8f: 011a                    |001a: advance pc
+001c91: 0f                      |001a: line 126
+001c92: 00                      |end sequence
+                                |
+                                |[1c93] debug info
+001c93: 8501                    |line_start: 133
+001c95: 00                      |parameters_size: 0000
+001c96: 07                      |0000: prologue end
+001c97: 0e                      |0000: line 133
+001c98: 78                      |0007: line 134
+001c99: 00                      |end sequence
+                                |
+                                |[1c9a] debug info
+001c9a: 40                      |line_start: 64
+001c9b: 00                      |parameters_size: 0000
+001c9c: 07                      |0000: prologue end
+001c9d: 0e                      |0000: line 64
+001c9e: 78                      |0007: line 65
+001c9f: 00                      |end sequence
+                                |
+                                |[1ca0] annotation
+001ca0: 02                      |  visibility: VISBILITY_SYSTEM
+001ca1: 06                      |  type_idx: 00000006 // dalvik.annotation.Throws
+001ca2: 01                      |  size: 00000001
+                                |  elements[0]:
+001ca3: 8601                    |    name_idx: 00000086 // value
+001ca5: 1c01 1812               |    value: array {java.lang.Throwable}
+                                |
+                                |[1ca9] annotation
+001ca9: 02                      |  visibility: VISBILITY_SYSTEM
+001caa: 06                      |  type_idx: 00000006 // dalvik.annotation.Throws
+001cab: 01                      |  size: 00000001
+                                |  elements[0]:
+001cac: 8601                    |    name_idx: 00000086 // value
+001cae: 1c02 180c 180b          |    value: array {java.lang.NoSuchMethodException, java.lang.IllegalAccessException}
+                                |
+                                |[1cb4] call site
+001cb4: 03                      |  size: 00000003
+001cb5: 1605                    |  [0] method handle invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}
+001cb7: 1769                    |  [1] utf8 targetMethodTest1
+001cb9: 1516                    |  [2] proto ()V
+                                |
+                                |[1cbb] call site
+001cbb: 03                      |  size: 00000003
+001cbc: 1605                    |  [0] method handle invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}
+001cbe: 176a                    |  [1] utf8 targetMethodTest2
+001cc0: 1522                    |  [2] proto (ZBCSIFJDLjava/lang/String;)V
+                                |
+                                |[1cc2] call site
+001cc2: 03                      |  size: 00000003
+001cc3: 1605                    |  [0] method handle invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}
+001cc5: 1770                    |  [1] utf8 targetMethodTest5
+001cc7: 1503                    |  [2] proto (III)I
+                                |
+                                |[1cc9] call site
+001cc9: 03                      |  size: 00000003
+001cca: 1605                    |  [0] method handle invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}
+001ccc: 1773                    |  [1] utf8 targetMethodTest6
+001cce: 1504                    |  [2] proto (JJJ)J
+                                |
+                                |[1cd0] call site
+001cd0: 03                      |  size: 00000003
+001cd1: 1605                    |  [0] method handle invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}
+001cd3: 1776                    |  [1] utf8 targetMethodTest7
+001cd5: 1500                    |  [2] proto (FFD)D
+                                |
+                                |[1cd7] call site
+001cd7: 03                      |  size: 00000003
+001cd8: 1605                    |  [0] method handle invoke-static,method{invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}
+001cda: 1778                    |  [1] utf8 targetMethodTest8
+001cdc: 151e                    |  [2] proto (Ljava/lang/String;)V
+                                |
+                                |[1cde] call site
+001cde: 07                      |  size: 00000007
+001cdf: 1606                    |  [0] method handle invoke-static,method{invokecustom.InvokeCustom.bsmLookupStaticWithExtraArgs:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;}
+001ce1: 176b                    |  [1] utf8 targetMethodTest3
+001ce3: 1516                    |  [2] proto ()V
+001ce5: 0401                    |  [3] int 1
+001ce7: 6615 cd5b 07            |  [4] long 123456789
+001cec: 7079 e9f6 42            |  [5] float 123.456
+001cf1: f158 703f a00c 24fe 40  |  [6] double 123456.789123
+                                |
+                                |[1cfa] call site
+001cfa: 04                      |  size: 00000004
+001cfb: 1604                    |  [0] method handle invoke-static,method{invokecustom.InvokeCustom.bsmCreateCallSite:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;}
+001cfd: 176d                    |  [1] utf8 targetMethodTest4
+001cff: 151c                    |  [2] proto (Linvokecustom/InvokeCustom;)V
+001d01: 160a                    |  [3] method handle invoke-direct,method{invokecustom.Super.targetMethodTest4:()V}
+                                |
+                                |[1d03] call site
+001d03: 0a                      |  size: 0000000a
+001d04: 1607                    |  [0] method handle invoke-static,method{invokecustom.InvokeCustom.bsmLookupTest9:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;}
+001d06: 177a                    |  [1] utf8 targetMethodTest9
+001d08: 1516                    |  [2] proto ()V
+001d0a: 1601                    |  [3] method handle static-get,field{invokecustom.InvokeCustom.staticFieldTest9:I}
+001d0c: 1600                    |  [4] method handle static-put,field{invokecustom.InvokeCustom.staticFieldTest9:I}
+001d0e: 1603                    |  [5] method handle instance-get,field{invokecustom.InvokeCustom.fieldTest9:F}
+001d10: 1602                    |  [6] method handle instance-put,field{invokecustom.InvokeCustom.fieldTest9:F}
+001d12: 1608                    |  [7] method handle invoke-instance,method{invokecustom.InvokeCustom.helperMethodTest9:()V}
+001d14: 1609                    |  [8] method handle invoke-constructor,method{invokecustom.InvokeCustom.<init>:(I)V}
+001d16: 160b                    |  [9] method handle invoke-interface,ifaceMethod{java.lang.Runnable.run:()V}
+                                |
+                                |[1d18] class data for invokecustom.Super
+001d18: 00                      |  static_fields_size:   00000000
+001d19: 00                      |  instance_fields_size: 00000000
+001d1a: 01                      |  direct_methods_size:  00000001
+001d1b: 02                      |  virtual_methods_size: 00000002
+                                |  direct_methods:
+                                |  [0] invokecustom.Super.<init>:()V
+001d1c: 1e                      |    method_idx:   0000001e
+001d1d: 8080 04                 |    access_flags: constructor
+001d20: e00f                    |    code_off:     000007e0
+                                |  virtual_methods:
+                                |  [0] invokecustom.Super.helperMethodTest9:()V
+001d22: 1f                      |    method_idx:   0000001f
+001d23: 8108                    |    access_flags: public|abstract
+001d25: 00                      |    code_off:     00000000
+                                |  [1] invokecustom.Super.targetMethodTest4:()V
+001d26: 01                      |    method_idx:   00000020
+001d27: 01                      |    access_flags: public
+001d28: f80f                    |    code_off:     000007f8
+                                |
+                                |[1d2a] class data for invokecustom.InvokeCustom
+001d2a: 01                      |  static_fields_size:   00000001
+001d2b: 01                      |  instance_fields_size: 00000001
+001d2c: 1b                      |  direct_methods_size:  0000001b
+001d2d: 03                      |  virtual_methods_size: 00000003
+                                |  static_fields:
+                                |  [0] invokecustom.InvokeCustom.staticFieldTest9:I
+001d2e: 01                      |    field_idx:    00000001
+001d2f: 0a                      |    access_flags: private|static
+                                |  instance_fields:
+                                |  [0] invokecustom.InvokeCustom.fieldTest9:F
+001d30: 00                      |    field_idx:    00000000
+001d31: 02                      |    access_flags: private
+                                |  direct_methods:
+                                |  [0] invokecustom.InvokeCustom.<clinit>:()V
+001d32: 00                      |    method_idx:   00000000
+001d33: 8880 04                 |    access_flags: static|constructor
+001d36: 9810                    |    code_off:     00000818
+                                |  [1] invokecustom.InvokeCustom.<init>:()V
+001d38: 01                      |    method_idx:   00000001
+001d39: 8180 04                 |    access_flags: public|constructor
+001d3c: b010                    |    code_off:     00000830
+                                |  [2] invokecustom.InvokeCustom.<init>:(I)V
+001d3e: 01                      |    method_idx:   00000002
+001d3f: 8180 04                 |    access_flags: public|constructor
+001d42: d010                    |    code_off:     00000850
+                                |  [3] invokecustom.InvokeCustom.bsmCreateCallSite:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+001d44: 01                      |    method_idx:   00000003
+001d45: 09                      |    access_flags: public|static
+001d46: ac11                    |    code_off:     000008ac
+                                |  [4] invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
+001d48: 01                      |    method_idx:   00000004
+001d49: 09                      |    access_flags: public|static
+001d4a: 8412                    |    code_off:     00000904
+                                |  [5] invokecustom.InvokeCustom.bsmLookupStaticWithExtraArgs:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;
+001d4c: 01                      |    method_idx:   00000005
+001d4d: 09                      |    access_flags: public|static
+001d4e: d012                    |    code_off:     00000950
+                                |  [6] invokecustom.InvokeCustom.bsmLookupTest9:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+001d50: 01                      |    method_idx:   00000006
+001d51: 09                      |    access_flags: public|static
+001d52: 8414                    |    code_off:     00000a04
+                                |  [7] invokecustom.InvokeCustom.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+001d54: 01                      |    method_idx:   00000007
+001d55: 02                      |    access_flags: private
+001d56: a416                    |    code_off:     00000b24
+                                |  [8] invokecustom.InvokeCustom.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+001d58: 01                      |    method_idx:   00000008
+001d59: 0a                      |    access_flags: private|static
+001d5a: d817                    |    code_off:     00000bd8
+                                |  [9] invokecustom.InvokeCustom.main:([Ljava/lang/String;)V
+001d5c: 02                      |    method_idx:   0000000a
+001d5d: 09                      |    access_flags: public|static
+001d5e: 8819                    |    code_off:     00000c88
+                                |  [a] invokecustom.InvokeCustom.targetMethodTest1:()V
+001d60: 02                      |    method_idx:   0000000c
+001d61: 0a                      |    access_flags: private|static
+001d62: d019                    |    code_off:     00000cd0
+                                |  [b] invokecustom.InvokeCustom.targetMethodTest2:(ZBCSIFJDLjava/lang/String;)V
+001d64: 01                      |    method_idx:   0000000d
+001d65: 0a                      |    access_flags: private|static
+001d66: f019                    |    code_off:     00000cf0
+                                |  [c] invokecustom.InvokeCustom.targetMethodTest3:()V
+001d68: 01                      |    method_idx:   0000000e
+001d69: 0a                      |    access_flags: private|static
+001d6a: dc1a                    |    code_off:     00000d5c
+                                |  [d] invokecustom.InvokeCustom.targetMethodTest5:(III)I
+001d6c: 02                      |    method_idx:   00000010
+001d6d: 09                      |    access_flags: public|static
+001d6e: fc1a                    |    code_off:     00000d7c
+                                |  [e] invokecustom.InvokeCustom.targetMethodTest6:(JJJ)J
+001d70: 01                      |    method_idx:   00000011
+001d71: 09                      |    access_flags: public|static
+001d72: b41c                    |    code_off:     00000e34
+                                |  [f] invokecustom.InvokeCustom.targetMethodTest7:(FFD)D
+001d74: 01                      |    method_idx:   00000012
+001d75: 09                      |    access_flags: public|static
+001d76: f01d                    |    code_off:     00000ef0
+                                |  [10] invokecustom.InvokeCustom.targetMethodTest8:(Ljava/lang/String;)V
+001d78: 01                      |    method_idx:   00000013
+001d79: 09                      |    access_flags: public|static
+001d7a: ac1f                    |    code_off:     00000fac
+                                |  [11] invokecustom.InvokeCustom.targetMethodTest9:()V
+001d7c: 01                      |    method_idx:   00000014
+001d7d: 0a                      |    access_flags: private|static
+001d7e: f01f                    |    code_off:     00000ff0
+                                |  [12] invokecustom.InvokeCustom.test1:()V
+001d80: 01                      |    method_idx:   00000015
+001d81: 09                      |    access_flags: public|static
+001d82: 9020                    |    code_off:     00001010
+                                |  [13] invokecustom.InvokeCustom.test2:()V
+001d84: 01                      |    method_idx:   00000016
+001d85: 09                      |    access_flags: public|static
+001d86: a820                    |    code_off:     00001028
+                                |  [14] invokecustom.InvokeCustom.test3:()V
+001d88: 01                      |    method_idx:   00000017
+001d89: 09                      |    access_flags: public|static
+001d8a: f020                    |    code_off:     00001070
+                                |  [15] invokecustom.InvokeCustom.test4:()V
+001d8c: 01                      |    method_idx:   00000018
+001d8d: 09                      |    access_flags: public|static
+001d8e: 8821                    |    code_off:     00001088
+                                |  [16] invokecustom.InvokeCustom.test5:()V
+001d90: 01                      |    method_idx:   00000019
+001d91: 09                      |    access_flags: public|static
+001d92: ac21                    |    code_off:     000010ac
+                                |  [17] invokecustom.InvokeCustom.test6:()V
+001d94: 01                      |    method_idx:   0000001a
+001d95: 09                      |    access_flags: public|static
+001d96: 8422                    |    code_off:     00001104
+                                |  [18] invokecustom.InvokeCustom.test7:()V
+001d98: 01                      |    method_idx:   0000001b
+001d99: 09                      |    access_flags: public|static
+001d9a: ec22                    |    code_off:     0000116c
+                                |  [19] invokecustom.InvokeCustom.test8:()V
+001d9c: 01                      |    method_idx:   0000001c
+001d9d: 09                      |    access_flags: public|static
+001d9e: cc23                    |    code_off:     000011cc
+                                |  [1a] invokecustom.InvokeCustom.test9:()V
+001da0: 01                      |    method_idx:   0000001d
+001da1: 09                      |    access_flags: public|static
+001da2: fc23                    |    code_off:     000011fc
+                                |  virtual_methods:
+                                |  [0] invokecustom.InvokeCustom.helperMethodTest9:()V
+001da4: 09                      |    method_idx:   00000009
+001da5: 01                      |    access_flags: public
+001da6: 9424                    |    code_off:     00001214
+                                |  [1] invokecustom.InvokeCustom.run:()V
+001da8: 02                      |    method_idx:   0000000b
+001da9: 01                      |    access_flags: public
+001daa: dc24                    |    code_off:     0000125c
+                                |  [2] invokecustom.InvokeCustom.targetMethodTest4:()V
+001dac: 04                      |    method_idx:   0000000f
+001dad: 01                      |    access_flags: public
+001dae: fc24                    |    code_off:     0000127c
+                                |
+                                |map:
+                                |[1db0] map list
+001db0: 1300 0000               |  size: 00000013
+                                |[1db4] header_item map
+001db4: 0000                    |  type:   0000 // TYPE_HEADER_ITEM
+001db6: 0000                    |  unused: 0
+001db8: 0100 0000               |  size:   00000001
+001dbc: 0000 0000               |  offset: 00000000
+                                |[1dc0] string_id_item map
+001dc0: 0100                    |  type:   0001 // TYPE_STRING_ID_ITEM
+001dc2: 0000                    |  unused: 0
+001dc4: 8700 0000               |  size:   00000087
+001dc8: 7000 0000               |  offset: 00000070
+                                |[1dcc] type_id_item map
+001dcc: 0200                    |  type:   0002 // TYPE_TYPE_ID_ITEM
+001dce: 0000                    |  unused: 0
+001dd0: 1e00 0000               |  size:   0000001e
+001dd4: 8c02 0000               |  offset: 0000028c
+                                |[1dd8] proto_id_item map
+001dd8: 0300                    |  type:   0003 // TYPE_PROTO_ID_ITEM
+001dda: 0000                    |  unused: 0
+001ddc: 2400 0000               |  size:   00000024
+001de0: 0403 0000               |  offset: 00000304
+                                |[1de4] field_id_item map
+001de4: 0400                    |  type:   0004 // TYPE_FIELD_ID_ITEM
+001de6: 0000                    |  unused: 0
+001de8: 0300 0000               |  size:   00000003
+001dec: b404 0000               |  offset: 000004b4
+                                |[1df0] method_id_item map
+001df0: 0500                    |  type:   0005 // TYPE_METHOD_ID_ITEM
+001df2: 0000                    |  unused: 0
+001df4: 4100 0000               |  size:   00000041
+001df8: cc04 0000               |  offset: 000004cc
+                                |[1dfc] class_def_item map
+001dfc: 0600                    |  type:   0006 // TYPE_CLASS_DEF_ITEM
+001dfe: 0000                    |  unused: 0
+001e00: 0200 0000               |  size:   00000002
+001e04: d406 0000               |  offset: 000006d4
+                                |[1e08] call_site_id_item map
+001e08: 0700                    |  type:   0007 // TYPE_CALL_SITE_ID_ITEM
+001e0a: 0000                    |  unused: 0
+001e0c: 1600 0000               |  size:   00000016
+001e10: 1407 0000               |  offset: 00000714
+                                |[1e14] method_handle_item map
+001e14: 0800                    |  type:   0008 // TYPE_METHOD_HANDLE_ITEM
+001e16: 0000                    |  unused: 0
+001e18: 0c00 0000               |  size:   0000000c
+001e1c: 7007 0000               |  offset: 00000770
+                                |[1e20] annotation_set_item map
+001e20: 0310                    |  type:   1003 // TYPE_ANNOTATION_SET_ITEM
+001e22: 0000                    |  unused: 0
+001e24: 0200 0000               |  size:   00000002
+001e28: d007 0000               |  offset: 000007d0
+                                |[1e2c] code_item map
+001e2c: 0120                    |  type:   2001 // TYPE_CODE_ITEM
+001e2e: 0000                    |  unused: 0
+001e30: 2000 0000               |  size:   00000020
+001e34: e007 0000               |  offset: 000007e0
+                                |[1e38] annotations_directory_item map
+001e38: 0620                    |  type:   2006 // TYPE_ANNOTATIONS_DIRECTORY_ITEM
+001e3a: 0000                    |  unused: 0
+001e3c: 0100 0000               |  size:   00000001
+001e40: 9c12 0000               |  offset: 0000129c
+                                |[1e44] type_list map
+001e44: 0110                    |  type:   1001 // TYPE_TYPE_LIST
+001e46: 0000                    |  unused: 0
+001e48: 1900 0000               |  size:   00000019
+001e4c: dc12 0000               |  offset: 000012dc
+                                |[1e50] string_data_item map
+001e50: 0220                    |  type:   2002 // TYPE_STRING_DATA_ITEM
+001e52: 0000                    |  unused: 0
+001e54: 8700 0000               |  size:   00000087
+001e58: e613 0000               |  offset: 000013e6
+                                |[1e5c] debug_info_item map
+001e5c: 0320                    |  type:   2003 // TYPE_DEBUG_INFO_ITEM
+001e5e: 0000                    |  unused: 0
+001e60: 1600 0000               |  size:   00000016
+001e64: 931b 0000               |  offset: 00001b93
+                                |[1e68] annotation_item map
+001e68: 0420                    |  type:   2004 // TYPE_ANNOTATION_ITEM
+001e6a: 0000                    |  unused: 0
+001e6c: 0200 0000               |  size:   00000002
+001e70: a01c 0000               |  offset: 00001ca0
+                                |[1e74] encoded_array_item map
+001e74: 0520                    |  type:   2005 // TYPE_ENCODED_ARRAY_ITEM
+001e76: 0000                    |  unused: 0
+001e78: 0900 0000               |  size:   00000009
+001e7c: b41c 0000               |  offset: 00001cb4
+                                |[1e80] class_data_item map
+001e80: 0020                    |  type:   2000 // TYPE_CLASS_DATA_ITEM
+001e82: 0000                    |  unused: 0
+001e84: 0200 0000               |  size:   00000002
+001e88: 181d 0000               |  offset: 00001d18
+                                |[1e8c] map_list map
+001e8c: 0010                    |  type:   1000 // TYPE_MAP_LIST
+001e8e: 0000                    |  unused: 0
+001e90: 0100 0000               |  size:   00000001
+001e94: b01d 0000               |  offset: 00001db0
+                                |
+                                |method code index:
+                                |
+                                |[818] invokecustom.InvokeCustom.<clinit>:()V
+                                |[830] invokecustom.InvokeCustom.<init>:()V
+                                |[850] invokecustom.InvokeCustom.<init>:(I)V
+                                |[8ac] invokecustom.InvokeCustom.bsmCreateCallSite:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+                                |[904] invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
+                                |[950] invokecustom.InvokeCustom.bsmLookupStaticWithExtraArgs:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;
+                                |[a04] invokecustom.InvokeCustom.bsmLookupTest9:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+                                |[b24] invokecustom.InvokeCustom.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+                                |[bd8] invokecustom.InvokeCustom.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+                                |[1214] invokecustom.InvokeCustom.helperMethodTest9:()V
+                                |[c88] invokecustom.InvokeCustom.main:([Ljava/lang/String;)V
+                                |[125c] invokecustom.InvokeCustom.run:()V
+                                |[cd0] invokecustom.InvokeCustom.targetMethodTest1:()V
+                                |[cf0] invokecustom.InvokeCustom.targetMethodTest2:(ZBCSIFJDLjava/lang/String;)V
+                                |[d5c] invokecustom.InvokeCustom.targetMethodTest3:()V
+                                |[127c] invokecustom.InvokeCustom.targetMethodTest4:()V
+                                |[d7c] invokecustom.InvokeCustom.targetMethodTest5:(III)I
+                                |[e34] invokecustom.InvokeCustom.targetMethodTest6:(JJJ)J
+                                |[ef0] invokecustom.InvokeCustom.targetMethodTest7:(FFD)D
+                                |[fac] invokecustom.InvokeCustom.targetMethodTest8:(Ljava/lang/String;)V
+                                |[ff0] invokecustom.InvokeCustom.targetMethodTest9:()V
+                                |[1010] invokecustom.InvokeCustom.test1:()V
+                                |[1028] invokecustom.InvokeCustom.test2:()V
+                                |[1070] invokecustom.InvokeCustom.test3:()V
+                                |[1088] invokecustom.InvokeCustom.test4:()V
+                                |[10ac] invokecustom.InvokeCustom.test5:()V
+                                |[1104] invokecustom.InvokeCustom.test6:()V
+                                |[116c] invokecustom.InvokeCustom.test7:()V
+                                |[11cc] invokecustom.InvokeCustom.test8:()V
+                                |[11fc] invokecustom.InvokeCustom.test9:()V
+                                |[7e0] invokecustom.Super.<init>:()V
+                                |[7f8] invokecustom.Super.targetMethodTest4:()V
+                                |
+                                |statistics:
+                                |  annotation: 2 items; 20 bytes total
+                                |    9..11 bytes/item; average 10
+                                |  annotation set: 2 items; 16 bytes total
+                                |    8 bytes/item
+                                |  annotations directory: 1 item; 64 bytes total
+                                |    64 bytes/item
+                                |  call site id: 22 items; 88 bytes total
+                                |    4 bytes/item
+                                |  class data: 2 items; 152 bytes total
+                                |    18..134 bytes/item; average 76
+                                |  class def: 2 items; 64 bytes total
+                                |    32 bytes/item
+                                |  code: 32 items; 2748 bytes total
+                                |    24..288 bytes/item; average 85
+                                |  debug info: 22 items; 269 bytes total
+                                |    5..30 bytes/item; average 12
+                                |  encoded array: 9 items; 100 bytes total
+                                |    7..28 bytes/item; average 11
+                                |  field id: 3 items; 24 bytes total
+                                |    8 bytes/item
+                                |  header: 1 item; 112 bytes total
+                                |    112 bytes/item
+                                |  map list: 1 item; 232 bytes total
+                                |    232 bytes/item
+                                |  method handle: 12 items; 96 bytes total
+                                |    8 bytes/item
+                                |  method id: 65 items; 520 bytes total
+                                |    8 bytes/item
+                                |  proto id: 36 items; 432 bytes total
+                                |    12 bytes/item
+                                |  string data: 135 items; 1965 bytes total
+                                |    3..45 bytes/item; average 14
+                                |  string id: 135 items; 540 bytes total
+                                |    4 bytes/item
+                                |  type id: 30 items; 120 bytes total
+                                |    4 bytes/item
+                                |  type list: 25 items; 226 bytes total
+                                |    6..24 bytes/item; average 9
diff --git a/dx/tests/135-invoke-custom/info.txt b/dx/tests/135-invoke-custom/info.txt
new file mode 100644
index 0000000..ad54d01
--- /dev/null
+++ b/dx/tests/135-invoke-custom/info.txt
@@ -0,0 +1,6 @@
+This test checks the conversion of invokedynamic in classfiles to
+invoke-custom in DEX files.
+
+When modifying this test please ensure that the following produce the same output:
+$ art -cp invokecustom.dex invokecustom.InvokeCustom
+$ java -cp invokecustom.jar invokecustom.InvokeCustom
diff --git a/dx/tests/135-invoke-custom/invokecustom.jar b/dx/tests/135-invoke-custom/invokecustom.jar
new file mode 100644
index 0000000..76a7ce7
--- /dev/null
+++ b/dx/tests/135-invoke-custom/invokecustom.jar
Binary files differ
diff --git a/dx/tests/135-invoke-custom/run b/dx/tests/135-invoke-custom/run
new file mode 100755
index 0000000..a661447
--- /dev/null
+++ b/dx/tests/135-invoke-custom/run
@@ -0,0 +1,35 @@
+#!/bin/bash
+#
+# Copyright (C) 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+UNSUPPORTED_SDK_VERSION=25
+SUPPORTED_SDK_VERSION=26
+
+# Expect failure with unsupported SDK version
+EXPECTED_STATUS[${UNSUPPORTED_SDK_VERSION}]=1
+
+# Expect success with supported SDK version
+EXPECTED_STATUS[${SUPPORTED_SDK_VERSION}]=0
+
+for SDK_VERSION in ${UNSUPPORTED_SDK_VERSION} ${SUPPORTED_SDK_VERSION}; do
+  echo Trying SDK version ${SDK_VERSION} with invoke-custom.
+  dx --min-sdk-version=${SDK_VERSION} --dex --output=invokecustom.dex \
+     --verbose-dump --dump-to=- --dump-width=1000 invokecustom.jar 2>&1
+  STATUS=$?
+  if [[ ${STATUS} != ${EXPECTED_STATUS[$SDK_VERSION]} ]]; then
+    echo Unexpected status ${STATUS} for SDK version ${SDK_VERSION}.
+    exit 1
+  fi
+done
diff --git a/dx/tests/135-invoke-custom/src/invokecustom/InvokeCustom.java b/dx/tests/135-invoke-custom/src/invokecustom/InvokeCustom.java
new file mode 100644
index 0000000..c6cd3c3
--- /dev/null
+++ b/dx/tests/135-invoke-custom/src/invokecustom/InvokeCustom.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package invokecustom;
+
+import java.lang.invoke.CallSite;
+import java.lang.invoke.ConstantCallSite;
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.MethodType;
+
+abstract class Super {
+  public void targetMethodTest4() {
+    System.out.println("targetMethodTest4 from Super");
+  }
+
+  public abstract void helperMethodTest9();
+}
+
+public class InvokeCustom extends Super implements Runnable {
+
+  public InvokeCustom() {}
+  public InvokeCustom(int i) {
+    System.out.println("InvokeCustom.<init>(" + i + ")");
+  }
+
+  private static void targetMethodTest1() {
+    System.out.println("Hello World!");
+  }
+
+  private static void targetMethodTest2(boolean z, byte b, char c, short s, int i, float f, long l,
+      double d, String str) {
+    System.out.println(z);
+    System.out.println(b);
+    System.out.println(c);
+    System.out.println(s);
+    System.out.println(i);
+    System.out.println(f);
+    System.out.println(l);
+    System.out.println(d);
+    System.out.println(str);
+  }
+
+  private static void targetMethodTest3() {
+    System.out.println("targetMethodTest3 from InvokeCustom");
+  }
+
+  @Override
+  public void targetMethodTest4() {
+    // The generated code should be calling Super.targetMethodTest4.
+    System.out.println("targetMethodTest4 from InvokeCustom (oops!)");
+  }
+
+  public static int targetMethodTest5(int x, int y, int total) {
+    int calculated = x + y;
+    System.out.println("targetMethodTest5 " + x + " + " + y + " = " + calculated);
+    if (calculated != total) {
+        System.out.println("Failed " + calculated + " != " + total);
+    }
+    return calculated;
+  }
+
+  public static long targetMethodTest6(long x, long y, long total) {
+    long calculated = x + y;
+    System.out.println("targetMethodTest6 " + x + " + " + y + " = " + calculated);
+    if (calculated != total) {
+        System.out.println("Failed " + calculated + " != " + total);
+    }
+    return calculated;
+  }
+
+  public static double targetMethodTest7(float x, float y, double product) {
+    double calculated = x * y;
+    System.out.println("targetMethodTest7 " + x + " * " + y + " = " + calculated);
+    if (calculated != product) {
+      System.out.println("Failed " + calculated + " != " + product);
+    }
+    return calculated;
+  }
+
+  public static void targetMethodTest8(String s) {
+    System.out.println("targetMethodTest8 " + s);
+  }
+
+  private static int staticFieldTest9 = 0;
+
+  private static void checkStaticFieldTest9(MethodHandle getter, MethodHandle setter)
+      throws Throwable {
+    final int NEW_VALUE = 0x76543210;
+    int oldValue = (int) getter.invokeExact();
+    setter.invokeExact(NEW_VALUE);
+    int newValue = (int) getter.invokeExact();
+    System.out.print("checkStaticFieldTest9: old " + oldValue + " new " + newValue +
+                     " expected " + NEW_VALUE + " ");
+    System.out.println((newValue == NEW_VALUE) ? "OK" : "ERROR");
+  }
+
+  private float fieldTest9 = 0.0f;
+
+  private void checkFieldTest9(MethodHandle getter, MethodHandle setter)
+      throws Throwable {
+    final float NEW_VALUE = 1.99e-19f;
+    float oldValue = (float) getter.invokeExact(this);
+    setter.invokeExact(this, NEW_VALUE);
+    float newValue = (float) getter.invokeExact(this);
+    System.out.print("checkFieldTest9: old " + oldValue + " new " + newValue +
+                     " expected " + NEW_VALUE + " ");
+    System.out.println((newValue == NEW_VALUE) ? "OK" : "ERROR");
+  }
+
+  public void helperMethodTest9() {
+    System.out.println("helperMethodTest9 in " + InvokeCustom.class);
+  }
+
+  private static void targetMethodTest9() {
+    System.out.println("targetMethodTest9()");
+  }
+
+  public void run() {
+    System.out.println("run() for Test9");
+  }
+
+  public static CallSite bsmLookupStatic(MethodHandles.Lookup caller, String name, MethodType type)
+      throws NoSuchMethodException, IllegalAccessException {
+    System.out.println("bsmLookupStatic []");
+    final MethodHandles.Lookup lookup = MethodHandles.lookup();
+    final MethodHandle targetMH = lookup.findStatic(lookup.lookupClass(), name, type);
+    return new ConstantCallSite(targetMH.asType(type));
+  }
+
+  public static CallSite bsmLookupStaticWithExtraArgs(
+      MethodHandles.Lookup caller, String name, MethodType type, int i, long l, float f, double d)
+      throws NoSuchMethodException, IllegalAccessException {
+    System.out.println("bsmLookupStaticWithExtraArgs [" + i + ", " + l + ", " + f + ", " + d + "]");
+    final MethodHandles.Lookup lookup = MethodHandles.lookup();
+    final MethodHandle targetMH = lookup.findStatic(lookup.lookupClass(), name, type);
+    return new ConstantCallSite(targetMH.asType(type));
+  }
+
+  public static CallSite bsmCreateCallSite(
+      MethodHandles.Lookup caller, String name, MethodType type, MethodHandle mh)
+      throws Throwable {
+    System.out.println("bsmCreateCallSite [" + mh + "]");
+    return new ConstantCallSite(mh);
+  }
+
+  public static CallSite bsmLookupTest9(MethodHandles.Lookup caller, String name, MethodType type,
+                                        MethodHandle staticGetter,  MethodHandle staticSetter,
+                                        MethodHandle fieldGetter, MethodHandle fieldSetter,
+                                        MethodHandle instanceInvoke, MethodHandle constructor,
+                                        MethodHandle interfaceInvoke)
+          throws Throwable {
+    System.out.println("bsmLookupTest9 [" + staticGetter + ", " + staticSetter + ", " +
+                       fieldGetter + ", " + fieldSetter + "]");
+    System.out.println(name + " " + type);
+
+    // Check constant method handles passed can be invoked.
+    checkStaticFieldTest9(staticGetter, staticSetter);
+    InvokeCustom instance = new InvokeCustom();
+    instance.checkFieldTest9(fieldGetter, fieldSetter);
+
+    // Check virtual method.
+    instanceInvoke.invokeExact(instance);
+
+    InvokeCustom instance2 = (InvokeCustom) constructor.invokeExact(3);
+    interfaceInvoke.invoke(instance2);
+
+    final MethodHandles.Lookup lookup = MethodHandles.lookup();
+    final MethodHandle targetMH = lookup.findStatic(lookup.lookupClass(), name, type);
+    return new ConstantCallSite(targetMH.asType(type));
+  }
+}
diff --git a/dx/tests/135-invoke-custom/src/invokecustom/TestGenerator.java b/dx/tests/135-invoke-custom/src/invokecustom/TestGenerator.java
new file mode 100644
index 0000000..a20f57d
--- /dev/null
+++ b/dx/tests/135-invoke-custom/src/invokecustom/TestGenerator.java
@@ -0,0 +1,354 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package invokecustom;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.lang.invoke.CallSite;
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.MethodType;
+import java.nio.file.OpenOption;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Handle;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+
+public class TestGenerator {
+
+  private final Path classNamePath;
+
+  public static void main(String[] args) throws IOException {
+    assert args.length == 1;
+    TestGenerator testGenerator = new TestGenerator(Paths.get(args[0],
+        TestGenerator.class.getPackage().getName(), InvokeCustom.class.getSimpleName() + ".class"));
+    testGenerator.generateTests();
+  }
+
+  public TestGenerator(Path classNamePath) {
+    this.classNamePath = classNamePath;
+  }
+
+  private void generateTests() throws IOException {
+    ClassReader cr = new ClassReader(new FileInputStream(classNamePath.toFile()));
+    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
+    cr.accept(
+        new ClassVisitor(Opcodes.ASM5, cw) {
+          @Override
+          public void visitEnd() {
+            generateMethodTest1(cw);
+            generateMethodTest2(cw);
+            generateMethodTest3(cw);
+            generateMethodTest4(cw);
+            generateMethodTest5(cw);
+            generateMethodTest6(cw);
+            generateMethodTest7(cw);
+            generateMethodTest8(cw);
+            generateMethodTest9(cw);
+            generateMethodMain(cw);
+            super.visitEnd();
+          }
+        }, 0);
+    new FileOutputStream(classNamePath.toFile()).write(cw.toByteArray());
+  }
+
+  /* generate main method that only call all test methods. */
+  private void generateMethodMain(ClassVisitor cv) {
+    MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC,
+                                      "main", "([Ljava/lang/String;)V", null, null);
+    String internalName = Type.getInternalName(InvokeCustom.class);
+    mv.visitMethodInsn(Opcodes.INVOKESTATIC, internalName, "test1", "()V", false);
+    mv.visitMethodInsn(Opcodes.INVOKESTATIC, internalName, "test2", "()V", false);
+    mv.visitMethodInsn(Opcodes.INVOKESTATIC, internalName, "test3", "()V", false);
+    mv.visitMethodInsn(Opcodes.INVOKESTATIC, internalName, "test4", "()V", false);
+    mv.visitMethodInsn(Opcodes.INVOKESTATIC, internalName, "test5", "()V", false);
+    mv.visitMethodInsn(Opcodes.INVOKESTATIC, internalName, "test6", "()V", false);
+    mv.visitMethodInsn(Opcodes.INVOKESTATIC, internalName, "test7", "()V", false);
+    mv.visitMethodInsn(Opcodes.INVOKESTATIC, internalName, "test8", "()V", false);
+    mv.visitMethodInsn(Opcodes.INVOKESTATIC, internalName, "test9", "()V", false);
+    mv.visitInsn(Opcodes.RETURN);
+    mv.visitMaxs(-1, -1);
+  }
+
+  /**
+   *  Generate test with an invokedynamic, a static bootstrap method without extra args and no arg
+   *  to the target method.
+   */
+  private void generateMethodTest1(ClassVisitor cv) {
+    MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, "test1", "()V",
+                                      null, null);
+    MethodType mt = MethodType.methodType(CallSite.class, MethodHandles.Lookup.class, String.class,
+                                          MethodType.class);
+    Handle bootstrap = new Handle(Opcodes.H_INVOKESTATIC, Type.getInternalName(InvokeCustom.class),
+                                  "bsmLookupStatic", mt.toMethodDescriptorString(), false);
+    mv.visitInvokeDynamicInsn("targetMethodTest1", "()V", bootstrap);
+    mv.visitInsn(Opcodes.RETURN);
+    mv.visitMaxs(-1, -1);
+  }
+
+  /**
+   *  Generate test with an invokedynamic, a static bootstrap method without extra args and
+   *  args to the target method.
+   */
+  private void generateMethodTest2(ClassVisitor cv) {
+    MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, "test2", "()V",
+                                      null, null);
+    MethodType mt = MethodType.methodType(CallSite.class, MethodHandles.Lookup.class, String.class,
+                                          MethodType.class);
+    Handle bootstrap = new Handle(Opcodes.H_INVOKESTATIC, Type.getInternalName(InvokeCustom.class),
+                                  "bsmLookupStatic", mt.toMethodDescriptorString(), false);
+    mv.visitLdcInsn(new Boolean(true));
+    mv.visitLdcInsn(new Byte((byte) 127));
+    mv.visitLdcInsn(new Character('c'));
+    mv.visitLdcInsn(new Short((short) 1024));
+    mv.visitLdcInsn(new Integer(123456));
+    mv.visitLdcInsn(new Float(1.2f));
+    mv.visitLdcInsn(new Long(123456789));
+    mv.visitLdcInsn(new Double(3.5123456789));
+    mv.visitLdcInsn("String");
+    mv.visitInvokeDynamicInsn("targetMethodTest2", "(ZBCSIFJDLjava/lang/String;)V", bootstrap);
+    mv.visitInsn(Opcodes.RETURN);
+    mv.visitMaxs(-1, -1);
+  }
+
+  /**
+   *  Generate test with an invokedynamic, a static bootstrap method with extra args and no arg
+   *  to the target method.
+   */
+  private void generateMethodTest3(ClassVisitor cv) {
+    MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, "test3", "()V",
+                                      null, null);
+    MethodType mt = MethodType.methodType(CallSite.class, MethodHandles.Lookup.class, String.class,
+                                          MethodType.class, int.class,
+                                          long.class, float.class, double.class);
+    Handle bootstrap = new Handle( Opcodes.H_INVOKESTATIC, Type.getInternalName(InvokeCustom.class),
+        "bsmLookupStaticWithExtraArgs", mt.toMethodDescriptorString(), false);
+    mv.visitInvokeDynamicInsn("targetMethodTest3", "()V", bootstrap, new Integer(1),
+        new Long(123456789), new Float(123.456), new Double(123456.789123));
+    mv.visitInsn(Opcodes.RETURN);
+    mv.visitMaxs(-1, -1);
+  }
+
+  /**
+   *  Generate test with an invokedynamic, a static bootstrap method with an extra arg that is a
+   *  MethodHandle of kind invokespecial.
+   */
+  private void generateMethodTest4(ClassVisitor cv) {
+    MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, "test4", "()V",
+        null, null);
+    MethodType mt =
+        MethodType.methodType(
+            CallSite.class,
+            MethodHandles.Lookup.class,
+            String.class,
+            MethodType.class,
+            MethodHandle.class);
+    Handle bootstrap = new Handle( Opcodes.H_INVOKESTATIC, Type.getInternalName(InvokeCustom.class),
+        "bsmCreateCallSite", mt.toMethodDescriptorString(), false);
+    mv.visitTypeInsn(Opcodes.NEW, Type.getInternalName(InvokeCustom.class));
+    mv.visitInsn(Opcodes.DUP);
+    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, Type.getInternalName(InvokeCustom.class),
+                       "<init>", "()V", false);
+    mv.visitInvokeDynamicInsn("targetMethodTest4", "(Linvokecustom/InvokeCustom;)V", bootstrap,
+                              new Handle(Opcodes.H_INVOKESPECIAL, Type.getInternalName(Super.class),
+                                         "targetMethodTest4", "()V", false));
+    mv.visitInsn(Opcodes.RETURN);
+    mv.visitMaxs(-1, -1);
+  }
+
+  /**
+   * Generate a test with an invokedynamic where the target generates
+   * a result that the call site prints out.
+   */
+  private void generateMethodTest5(ClassVisitor cv) {
+    MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, "test5", "()V",
+        null, null);
+    MethodType mt = MethodType.methodType(
+            CallSite.class, MethodHandles.Lookup.class, String.class, MethodType.class);
+    Handle bootstrap = new Handle(Opcodes.H_INVOKESTATIC, Type.getInternalName(InvokeCustom.class),
+                                  "bsmLookupStatic", mt.toMethodDescriptorString(), false);
+    mv.visitIntInsn(Opcodes.SIPUSH, 1000);
+    mv.visitIntInsn(Opcodes.SIPUSH, -923);
+    mv.visitIntInsn(Opcodes.SIPUSH, 77);
+    mv.visitInvokeDynamicInsn("targetMethodTest5", "(III)I", bootstrap);
+    mv.visitVarInsn(Opcodes.ISTORE, 0);
+    mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+    mv.visitTypeInsn(Opcodes.NEW, "java/lang/StringBuilder");
+    mv.visitInsn(Opcodes.DUP);
+    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V");
+    mv.visitLdcInsn("targetMethodTest5 returned: ");
+    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
+                       "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
+    mv.visitVarInsn(Opcodes.ILOAD, 0);
+    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
+                       "(I)Ljava/lang/StringBuilder;");
+    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "toString",
+                       "()Ljava/lang/String;");
+    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println",
+                       "(Ljava/lang/String;)V");
+    mv.visitInsn(Opcodes.RETURN);
+    mv.visitMaxs(-1, -1);
+  }
+
+  /**
+   * Generate a test with an invokedynamic where the call site invocation tests the summation of
+   * two long values and returns a long.
+   */
+  private void generateMethodTest6(ClassVisitor cv) {
+    MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, "test6", "()V",
+                                      null, null);
+    MethodType mt = MethodType.methodType(CallSite.class, MethodHandles.Lookup.class, String.class,
+                                          MethodType.class);
+    Handle bootstrap = new Handle(Opcodes.H_INVOKESTATIC, Type.getInternalName(InvokeCustom.class),
+                                  "bsmLookupStatic", mt.toMethodDescriptorString(), false);
+    mv.visitLdcInsn(0x77777777777l);
+    mv.visitLdcInsn(-0x11111111111l);
+    mv.visitLdcInsn(0x66666666666l);
+    mv.visitInvokeDynamicInsn("targetMethodTest6", "(JJJ)J", bootstrap);
+    mv.visitVarInsn(Opcodes.LSTORE, 0);
+    mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+    mv.visitTypeInsn(Opcodes.NEW, "java/lang/StringBuilder");
+    mv.visitInsn(Opcodes.DUP);
+    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V");
+    mv.visitLdcInsn("targetMethodTest6 returned: ");
+    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
+                       "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
+    mv.visitVarInsn(Opcodes.LLOAD, 0);
+    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
+                       "(J)Ljava/lang/StringBuilder;");
+    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "toString",
+                       "()Ljava/lang/String;");
+    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println",
+                       "(Ljava/lang/String;)V");
+    mv.visitInsn(Opcodes.RETURN);
+    mv.visitMaxs(-1, -1);
+  }
+
+  /**
+   * Generate a test with an invokedynamic where the call site invocation tests the product of
+   * two float values and returns a double.
+   */
+  private void generateMethodTest7(ClassVisitor cv) {
+    MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, "test7", "()V",
+                                      null, null);
+    MethodType mt = MethodType.methodType(CallSite.class, MethodHandles.Lookup.class, String.class,
+                                          MethodType.class);
+    Handle bootstrap = new Handle(Opcodes.H_INVOKESTATIC, Type.getInternalName(InvokeCustom.class),
+                                  "bsmLookupStatic", mt.toMethodDescriptorString(), false);
+    double x = 0.5009765625;
+    double y = -x;
+    mv.visitLdcInsn((float) x);
+    mv.visitLdcInsn((float) y);
+    mv.visitLdcInsn(x * y);
+    mv.visitInvokeDynamicInsn("targetMethodTest7", "(FFD)D", bootstrap);
+    mv.visitVarInsn(Opcodes.DSTORE, 0);
+    mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+    mv.visitTypeInsn(Opcodes.NEW, "java/lang/StringBuilder");
+    mv.visitInsn(Opcodes.DUP);
+    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V");
+    mv.visitLdcInsn("targetMethodTest6 returned: ");
+    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
+                       "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
+    mv.visitVarInsn(Opcodes.DLOAD, 0);
+    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
+                       "(D)Ljava/lang/StringBuilder;");
+    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "toString",
+                       "()Ljava/lang/String;");
+    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println",
+                       "(Ljava/lang/String;)V");
+    mv.visitInsn(Opcodes.RETURN);
+    mv.visitMaxs(-1, -1);
+  }
+
+  /**
+   * Generate a test with multiple invokedynamic bytecodes operating on the same parameters.
+   * These invocations should each produce invoke-custom bytecodes with unique call site ids.
+   */
+  private void generateMethodTest8(ClassVisitor cv) {
+    MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, "test8", "()V",
+                                      null, null);
+    MethodType mt = MethodType.methodType(CallSite.class, MethodHandles.Lookup.class, String.class,
+                                          MethodType.class);
+    // These should be two distinct call sites and both invoke the
+    // bootstrap method. An erroneous implementation might treat them
+    // as the same call site because the handle arguments are the same.
+    Handle bootstrap1 = new Handle(Opcodes.H_INVOKESTATIC, Type.getInternalName(InvokeCustom.class),
+                                   "bsmLookupStatic", mt.toMethodDescriptorString(), false);
+    mv.visitLdcInsn("First invokedynamic invocation");
+    mv.visitInvokeDynamicInsn("targetMethodTest8", "(Ljava/lang/String;)V", bootstrap1);
+
+    Handle bootstrap2 = new Handle(Opcodes.H_INVOKESTATIC, Type.getInternalName(InvokeCustom.class),
+                                   "bsmLookupStatic", mt.toMethodDescriptorString(), false);
+    mv.visitLdcInsn("Second invokedynamic invocation");
+    mv.visitInvokeDynamicInsn("targetMethodTest8", "(Ljava/lang/String;)V", bootstrap2);
+
+    // Using same handle again creates a new call site so invokes the bootstrap method.
+    mv.visitLdcInsn("Dupe first invokedynamic invocation");
+    mv.visitInvokeDynamicInsn("targetMethodTest8", "(Ljava/lang/String;)V", bootstrap1);
+    mv.visitInsn(Opcodes.RETURN);
+    mv.visitMaxs(-1, -1);
+  }
+
+  /**
+   * Generate a test with different kinds of constant method handles.
+   */
+  private void generateMethodTest9(ClassVisitor cv) {
+    MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, "test9", "()V",
+                                      null, null);
+    MethodType mt =
+        MethodType.methodType(CallSite.class,
+                              MethodHandles.Lookup.class, String.class, MethodType.class,
+                              MethodHandle.class, MethodHandle.class,
+                              MethodHandle.class, MethodHandle.class,
+                              MethodHandle.class, MethodHandle.class,
+                              MethodHandle.class);
+    String internalName = Type.getInternalName(InvokeCustom.class);
+    Handle bootstrap = new Handle(Opcodes.H_INVOKESTATIC, internalName, "bsmLookupTest9",
+                                  mt.toMethodDescriptorString(), false);
+    Handle staticSetter =
+        new Handle(Opcodes.H_GETSTATIC, internalName, "staticFieldTest9", "I", false);
+    Handle staticGetter =
+        new Handle(Opcodes.H_PUTSTATIC, internalName, "staticFieldTest9", "I", false);
+    Handle setter =
+        new Handle(Opcodes.H_GETFIELD, internalName, "fieldTest9", "F", false);
+    Handle getter =
+        new Handle(Opcodes.H_PUTFIELD, internalName, "fieldTest9", "F", false);
+    Handle instanceInvoke =
+        new Handle(Opcodes.H_INVOKEVIRTUAL, internalName, "helperMethodTest9", "()V", false);
+    // H_INVOKESTATIC and H_INVOKESPECIAL are tested elsewhere.
+    Handle constructor =
+        new Handle(Opcodes.H_NEWINVOKESPECIAL, internalName, "<init>", "(I)V", false);
+    Handle interfaceInvoke =
+        new Handle(Opcodes.H_INVOKEINTERFACE,
+                   Type.getInternalName(Runnable.class),
+                   "run", "()V", true);
+
+    mv.visitInvokeDynamicInsn("targetMethodTest9", "()V", bootstrap,
+                              staticSetter, staticGetter,
+                              setter, getter,
+                              instanceInvoke, constructor,
+                              interfaceInvoke);
+    mv.visitInsn(Opcodes.RETURN);
+    mv.visitMaxs(-1, -1);
+  }
+}
diff --git a/dx/tests/run-test b/dx/tests/run-test
index 8c8a95f..0da2e38 100755
--- a/dx/tests/run-test
+++ b/dx/tests/run-test
@@ -96,14 +96,16 @@
     exit 1
 fi
 
-td_info="$testdir"/"$info"
-td_run="$testdir"/"$run"
-td_expected="$testdir"/"$expected"
+td_info="${testdir}/${info}"
+td_run="${testdir}/${run}"
+td_expected="${testdir}/${expected}"
 
-if [ '!' '(' -r "$td_info" -a -r "$td_run" -a -r "$td_expected" ')' ]; then
-    echo "${testdir}: missing files" 1>&2
-    exit 1
-fi
+for td_file in "$td_info" "$td_run" "$td_expected"; do
+    if [[ ! -r "$td_file" ]]; then
+        echo "${testdir}: missing file $td_file" 1>&2
+        exit 1
+    fi
+done
 
 # copy the test to a temp dir and run it
 if [ -d "$tmpdir" ]; then