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