summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--OWNERS10
-rw-r--r--dexdump/DexDump.cpp64
-rwxr-xr-xdx/etc/mainDexClasses4
-rw-r--r--dx/src/com/android/dex/CallSiteId.java55
-rw-r--r--dx/src/com/android/dex/Dex.java17
-rw-r--r--dx/src/com/android/dex/EncodedValueReader.java20
-rw-r--r--dx/src/com/android/dex/MethodHandle.java132
-rw-r--r--dx/src/com/android/dex/SizeOf.java13
-rw-r--r--dx/src/com/android/dx/Version.java2
-rw-r--r--dx/src/com/android/dx/cf/attrib/AttBootstrapMethods.java59
-rw-r--r--dx/src/com/android/dx/cf/code/BasicBlocker.java3
-rw-r--r--dx/src/com/android/dx/cf/code/BootstrapMethodArgumentsList.java75
-rw-r--r--dx/src/com/android/dx/cf/code/BootstrapMethodsList.java140
-rw-r--r--dx/src/com/android/dx/cf/code/BytecodeArray.java9
-rw-r--r--dx/src/com/android/dx/cf/code/RopperMachine.java15
-rw-r--r--dx/src/com/android/dx/cf/code/Simulator.java17
-rw-r--r--dx/src/com/android/dx/cf/code/ValueAwareMachine.java10
-rw-r--r--dx/src/com/android/dx/cf/cst/ConstantPoolParser.java66
-rw-r--r--dx/src/com/android/dx/cf/cst/MethodHandleKind.java49
-rw-r--r--dx/src/com/android/dx/cf/direct/DirectClassFile.java14
-rw-r--r--dx/src/com/android/dx/cf/direct/StdAttributeFactory.java78
-rw-r--r--dx/src/com/android/dx/cf/iface/ClassFile.java7
-rw-r--r--dx/src/com/android/dx/dex/DexOptions.java12
-rw-r--r--dx/src/com/android/dx/dex/cf/CfTranslator.java24
-rw-r--r--dx/src/com/android/dx/dex/code/DalvInsnList.java4
-rw-r--r--dx/src/com/android/dx/dex/code/Dops.java8
-rw-r--r--dx/src/com/android/dx/dex/code/OutputFinisher.java4
-rw-r--r--dx/src/com/android/dx/dex/code/RopToDop.java1
-rw-r--r--dx/src/com/android/dx/dex/code/form/Form35c.java4
-rw-r--r--dx/src/com/android/dx/dex/code/form/Form3rc.java4
-rw-r--r--dx/src/com/android/dx/dex/file/CallSiteIdItem.java90
-rw-r--r--dx/src/com/android/dx/dex/file/CallSiteIdsSection.java130
-rw-r--r--dx/src/com/android/dx/dex/file/CallSiteItem.java105
-rw-r--r--dx/src/com/android/dx/dex/file/DexFile.java113
-rw-r--r--dx/src/com/android/dx/dex/file/ItemType.java2
-rw-r--r--dx/src/com/android/dx/dex/file/MethodHandleItem.java100
-rw-r--r--dx/src/com/android/dx/dex/file/MethodHandlesSection.java75
-rw-r--r--dx/src/com/android/dx/dex/file/ValueEncoder.java23
-rw-r--r--dx/src/com/android/dx/io/CodeReader.java24
-rw-r--r--dx/src/com/android/dx/io/instructions/DecodedInstruction.java10
-rw-r--r--dx/src/com/android/dx/io/instructions/InstructionCodec.java64
-rw-r--r--dx/src/com/android/dx/io/instructions/InvokePolymorphicDecodedInstruction.java84
-rw-r--r--dx/src/com/android/dx/io/instructions/InvokePolymorphicRangeDecodedInstruction.java78
-rw-r--r--dx/src/com/android/dx/merge/DexMerger.java61
-rw-r--r--dx/src/com/android/dx/merge/IndexMap.java57
-rw-r--r--dx/src/com/android/dx/merge/InstructionTransformer.java21
-rw-r--r--dx/src/com/android/dx/rop/code/RegOps.java9
-rw-r--r--dx/src/com/android/dx/rop/code/Rops.java20
-rw-r--r--dx/src/com/android/dx/rop/cst/CstArray.java2
-rw-r--r--dx/src/com/android/dx/rop/cst/CstCallSite.java110
-rw-r--r--dx/src/com/android/dx/rop/cst/CstCallSiteRef.java110
-rw-r--r--dx/src/com/android/dx/rop/cst/CstInvokeDynamic.java150
-rw-r--r--dx/src/com/android/dx/rop/cst/CstMethodHandle.java168
-rw-r--r--dx/src/com/android/dx/rop/cst/CstMethodType.java84
-rw-r--r--dx/src/com/android/dx/rop/cst/CstProtoRef.java14
-rw-r--r--dx/tests/029-unit-Bits/run2
-rw-r--r--dx/tests/033-unit-IntList/run2
-rw-r--r--dx/tests/115-merge/run2
-rw-r--r--dx/tests/116-leb128/run2
-rw-r--r--dx/tests/117-modified-utf8/run2
-rw-r--r--dx/tests/119-merge-conflict/run2
-rw-r--r--dx/tests/127-merge-stress/com/android/dx/merge/MergeTest.java71
-rwxr-xr-xdx/tests/127-merge-stress/run47
-rw-r--r--dx/tests/133-source-debug-extension/HelloKt.classbin0 -> 2655 bytes
-rw-r--r--dx/tests/135-invoke-custom/expected.txt6383
-rwxr-xr-xdx/tests/135-invoke-custom/generate-test38
-rw-r--r--dx/tests/135-invoke-custom/info.txt6
-rw-r--r--dx/tests/135-invoke-custom/invokecustom.jarbin0 -> 4699 bytes
-rwxr-xr-xdx/tests/135-invoke-custom/run69
-rw-r--r--dx/tests/135-invoke-custom/src/invokecustom/InvokeCustom.java201
-rw-r--r--dx/tests/135-invoke-custom/src/invokecustom/TestGenerator.java356
-rw-r--r--dx/tests/136-null-constant-debug-info/NullConstant.java25
-rw-r--r--dx/tests/136-null-constant-debug-info/expected.txt0
-rw-r--r--dx/tests/136-null-constant-debug-info/info.txt9
-rw-r--r--dx/tests/136-null-constant-debug-info/run19
-rw-r--r--dx/tests/137-dexmerger-dex38/expected.txt7147
-rwxr-xr-xdx/tests/137-dexmerger-dex38/generate-test38
-rw-r--r--dx/tests/137-dexmerger-dex38/info.txt1
-rw-r--r--dx/tests/137-dexmerger-dex38/invokecustom.jarbin0 -> 22055 bytes
-rwxr-xr-xdx/tests/137-dexmerger-dex38/run26
-rw-r--r--dx/tests/137-dexmerger-dex38/src/invokecustom/InvokeCustom.java185
-rw-r--r--dx/tests/137-dexmerger-dex38/src/invokecustom/TestGenerator.java464
-rw-r--r--dx/tests/138-invoke-polymorphic-again/Main.java60
-rw-r--r--dx/tests/138-invoke-polymorphic-again/expected.txt88
-rw-r--r--dx/tests/138-invoke-polymorphic-again/info.txt7
-rwxr-xr-xdx/tests/138-invoke-polymorphic-again/run22
-rw-r--r--dx/tests/139-lambda-metafactory/Main.java33
-rw-r--r--dx/tests/139-lambda-metafactory/expected.txt880
-rw-r--r--dx/tests/139-lambda-metafactory/info.txt1
-rwxr-xr-xdx/tests/139-lambda-metafactory/run22
-rwxr-xr-xdx/tests/run-test29
-rw-r--r--libdex/DexFile.h15
-rw-r--r--libdex/DexSwapVerify.cpp36
-rw-r--r--libdex/SysUtil.cpp2
94 files changed, 18629 insertions, 287 deletions
diff --git a/OWNERS b/OWNERS
new file mode 100644
index 000000000..8ac8ceda5
--- /dev/null
+++ b/OWNERS
@@ -0,0 +1,10 @@
+benoitlamarche@google.com
+jplesot@google.com
+yroussel@google.com
+# Studio
+gavra@google.com
+cmw@google.com
+# ART
+narayan@google.com
+ngeoffray@google.com
+oth@google.com
diff --git a/dexdump/DexDump.cpp b/dexdump/DexDump.cpp
index 5cc4e8a32..7a20c2995 100644
--- a/dexdump/DexDump.cpp
+++ b/dexdump/DexDump.cpp
@@ -1865,55 +1865,88 @@ static void dumpMethodHandles(DexFile* pDexFile)
(const DexMethodHandleItem*)(pDexFile->baseAddr + item->offset);
for (u4 i = 0; i < item->size; ++i) {
const DexMethodHandleItem& mh = method_handles[i];
- bool is_invoke = false;
const char* type;
- switch (mh.methodHandleType) {
- case 0:
+ bool is_invoke;
+ bool is_static;
+ switch ((MethodHandleType) mh.methodHandleType) {
+ case MethodHandleType::STATIC_PUT:
type = "put-static";
+ is_invoke = false;
+ is_static = true;
break;
- case 1:
+ case MethodHandleType::STATIC_GET:
type = "get-static";
+ is_invoke = false;
+ is_static = true;
break;
- case 2:
+ case MethodHandleType::INSTANCE_PUT:
type = "put-instance";
+ is_invoke = false;
+ is_static = false;
break;
- case 3:
+ case MethodHandleType::INSTANCE_GET:
type = "get-instance";
+ is_invoke = false;
+ is_static = false;
break;
- case 4:
+ case MethodHandleType::INVOKE_STATIC:
type = "invoke-static";
is_invoke = true;
+ is_static = true;
break;
- case 5:
+ case MethodHandleType::INVOKE_INSTANCE:
type = "invoke-instance";
is_invoke = true;
+ is_static = false;
break;
- case 6:
+ case MethodHandleType::INVOKE_CONSTRUCTOR:
type = "invoke-constructor";
is_invoke = true;
+ is_static = false;
break;
+ case MethodHandleType::INVOKE_DIRECT:
+ type = "invoke-direct";
+ is_invoke = true;
+ is_static = false;
+ break;
+ case MethodHandleType::INVOKE_INTERFACE:
+ type = "invoke-interface";
+ is_invoke = true;
+ is_static = false;
+ break;
+ default:
+ printf("Unknown method handle type 0x%02x, skipped.", mh.methodHandleType);
+ continue;
}
FieldMethodInfo info;
- memset(&info, 0, sizeof(info));
if (is_invoke) {
- getMethodInfo(pDexFile, mh.fieldOrMethodIdx, &info);
+ if (!getMethodInfo(pDexFile, mh.fieldOrMethodIdx, &info)) {
+ printf("Unknown method handle target method@%04x, skipped.", mh.fieldOrMethodIdx);
+ continue;
+ }
} else {
- getFieldInfo(pDexFile, mh.fieldOrMethodIdx, &info);
+ if (!getFieldInfo(pDexFile, mh.fieldOrMethodIdx, &info)) {
+ printf("Unknown method handle target field@%04x, skipped.", mh.fieldOrMethodIdx);
+ continue;
+ }
}
+ const char* instance = is_static ? "" : info.classDescriptor;
+
if (gOptions.outputFormat == OUTPUT_XML) {
printf("<method_handle index index=\"%u\"\n", i);
printf(" type=\"%s\"\n", type);
printf(" target_class=\"%s\"\n", info.classDescriptor);
printf(" target_member=\"%s\"\n", info.name);
- printf(" target_member_type=\"%s\"\n", info.signature);
+ printf(" target_member_type=\"%c%s%s\"\n",
+ info.signature[0], instance, info.signature + 1);
printf("</method_handle>\n");
} else {
printf("Method Handle #%u:\n", i);
printf(" type : %s\n", type);
printf(" target : %s %s\n", info.classDescriptor, info.name);
- printf(" target_type : %s\n", info.signature);
+ printf(" target_type : %c%s%s\n", info.signature[0], instance, info.signature + 1);
}
}
}
@@ -1961,7 +1994,8 @@ static void dumpCallSites(DexFile* pDexFile)
const DexCallSiteId* ids = (const DexCallSiteId*)(pDexFile->baseAddr + item->offset);
for (u4 index = 0; index < item->size; ++index) {
bool doXml = (gOptions.outputFormat == OUTPUT_XML);
- printf(doXml ? "<call_site index=\"%u\">\n" : "Call Site #%u\n", index);
+ printf(doXml ? "<call_site index=\"%u\" offset=\"%u\">\n" : "Call Site #%u // offset %u\n",
+ index, ids[index].callSiteOff);
const u1* data = pDexFile->baseAddr + ids[index].callSiteOff;
u4 count = readUnsignedLeb128(&data);
for (u4 i = 0; i < count; ++i) {
diff --git a/dx/etc/mainDexClasses b/dx/etc/mainDexClasses
index d1b0a2c32..4092a9195 100755
--- a/dx/etc/mainDexClasses
+++ b/dx/etc/mainDexClasses
@@ -58,7 +58,7 @@ prog="${progdir}"/`basename "${prog}"`
cd "${oldwd}"
baserules="${progdir}"/mainDexClasses.rules
-if [ ! -r ${baserules} ]; then
+if [ ! -r "${baserules}" ]; then
echo `basename "$prog"`": can't find mainDexClasses.rules" 1>&2
exit 1
fi
@@ -173,7 +173,7 @@ tmpOut=`makeTempJar`
trap cleanTmp 0
-${proguard} -injars ${@} -dontwarn -forceprocessing -outjars ${tmpOut} \
+"${proguard}" -injars ${@} -dontwarn -forceprocessing -outjars "${tmpOut}" \
-libraryjars "${shrinkedAndroidJar}" -dontoptimize -dontobfuscate -dontpreverify \
-include "${baserules}" -include "${extrarules}" 1>/dev/null || exit 10
diff --git a/dx/src/com/android/dex/CallSiteId.java b/dx/src/com/android/dex/CallSiteId.java
new file mode 100644
index 000000000..6c9a62327
--- /dev/null
+++ b/dx/src/com/android/dex/CallSiteId.java
@@ -0,0 +1,55 @@
+/*
+ * 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.dex;
+
+import com.android.dex.Dex.Section;
+import com.android.dex.util.Unsigned;
+
+/**
+ * A call_site_id_item: https://source.android.com/devices/tech/dalvik/dex-format#call-site-id-item
+ */
+public class CallSiteId implements Comparable<CallSiteId> {
+
+ private final Dex dex;
+ private final int offset;
+
+ public CallSiteId(Dex dex, int offset) {
+ this.dex = dex;
+ this.offset = offset;
+ }
+
+ @Override
+ public int compareTo(CallSiteId o) {
+ return Unsigned.compare(offset, o.offset);
+ }
+
+ public int getCallSiteOffset() {
+ return offset;
+ }
+
+ public void writeTo(Section out) {
+ out.writeInt(offset);
+ }
+
+ @Override
+ public String toString() {
+ if (dex == null) {
+ return String.valueOf(offset);
+ }
+ return dex.protoIds().get(offset).toString();
+ }
+}
diff --git a/dx/src/com/android/dex/Dex.java b/dx/src/com/android/dex/Dex.java
index 16293262c..5d5817150 100644
--- a/dx/src/com/android/dex/Dex.java
+++ b/dx/src/com/android/dex/Dex.java
@@ -18,6 +18,7 @@ package com.android.dex;
import com.android.dex.Code.CatchHandler;
import com.android.dex.Code.Try;
+import com.android.dex.MethodHandle.MethodHandleType;
import com.android.dex.util.ByteInput;
import com.android.dex.util.ByteOutput;
import com.android.dex.util.FileUtils;
@@ -352,6 +353,7 @@ public final class Dex {
return readShort() & 0xffff;
}
+ @Override
public byte readByte() {
return data.get();
}
@@ -439,6 +441,19 @@ public final class Dex {
return new ProtoId(Dex.this, shortyIndex, returnTypeIndex, parametersOffset);
}
+ public CallSiteId readCallSiteId() {
+ int offset = readInt();
+ return new CallSiteId(Dex.this, offset);
+ }
+
+ public MethodHandle readMethodHandle() {
+ MethodHandleType methodHandleType = MethodHandleType.fromValue(readUnsignedShort());
+ int unused1 = readUnsignedShort();
+ int fieldOrMethodId = readUnsignedShort();
+ int unused2 = readUnsignedShort();
+ return new MethodHandle(Dex.this, methodHandleType, unused1, fieldOrMethodId, unused2);
+ }
+
public ClassDef readClassDef() {
int offset = getPosition();
int type = readInt();
@@ -625,6 +640,7 @@ public final class Dex {
this.data.put(bytes);
}
+ @Override
public void writeByte(int b) {
data.put((byte) b);
}
@@ -782,6 +798,7 @@ public final class Dex {
}
private final class ClassDefIterable implements Iterable<ClassDef> {
+ @Override
public Iterator<ClassDef> iterator() {
return !tableOfContents.classDefs.exists()
? Collections.<ClassDef>emptySet().iterator()
diff --git a/dx/src/com/android/dex/EncodedValueReader.java b/dx/src/com/android/dex/EncodedValueReader.java
index 6f60538a2..24dc0e374 100644
--- a/dx/src/com/android/dex/EncodedValueReader.java
+++ b/dx/src/com/android/dex/EncodedValueReader.java
@@ -29,6 +29,8 @@ public final class EncodedValueReader {
public static final int ENCODED_LONG = 0x06;
public static final int ENCODED_FLOAT = 0x10;
public static final int ENCODED_DOUBLE = 0x11;
+ public static final int ENCODED_METHOD_TYPE = 0x15;
+ public static final int ENCODED_METHOD_HANDLE = 0x16;
public static final int ENCODED_STRING = 0x17;
public static final int ENCODED_TYPE = 0x18;
public static final int ENCODED_FIELD = 0x19;
@@ -173,6 +175,18 @@ public final class EncodedValueReader {
return Double.longBitsToDouble(EncodedValueCodec.readUnsignedLong(in, arg, true));
}
+ public int readMethodType() {
+ checkType(ENCODED_METHOD_TYPE);
+ type = MUST_READ;
+ return EncodedValueCodec.readUnsignedInt(in, arg, false);
+ }
+
+ public int readMethodHandle() {
+ checkType(ENCODED_METHOD_HANDLE);
+ type = MUST_READ;
+ return EncodedValueCodec.readUnsignedInt(in, arg, false);
+ }
+
public int readString() {
checkType(ENCODED_STRING);
type = MUST_READ;
@@ -241,6 +255,12 @@ public final class EncodedValueReader {
case ENCODED_DOUBLE:
readDouble();
break;
+ case ENCODED_METHOD_TYPE:
+ readMethodType();
+ break;
+ case ENCODED_METHOD_HANDLE:
+ readMethodHandle();
+ break;
case ENCODED_STRING:
readString();
break;
diff --git a/dx/src/com/android/dex/MethodHandle.java b/dx/src/com/android/dex/MethodHandle.java
new file mode 100644
index 000000000..9772f5402
--- /dev/null
+++ b/dx/src/com/android/dex/MethodHandle.java
@@ -0,0 +1,132 @@
+/*
+ * 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.dex;
+
+import com.android.dex.Dex.Section;
+import com.android.dex.util.Unsigned;
+
+/**
+ * A method_handle_item:
+ * https://source.android.com/devices/tech/dalvik/dex-format#method-handle-item
+ */
+public class MethodHandle implements Comparable<MethodHandle> {
+
+ /**
+ * A method handle type code:
+ * https://source.android.com/devices/tech/dalvik/dex-format#method-handle-type-codes
+ */
+ public enum MethodHandleType {
+ METHOD_HANDLE_TYPE_STATIC_PUT(0x00),
+ METHOD_HANDLE_TYPE_STATIC_GET(0x01),
+ METHOD_HANDLE_TYPE_INSTANCE_PUT(0x02),
+ METHOD_HANDLE_TYPE_INSTANCE_GET(0x03),
+ METHOD_HANDLE_TYPE_INVOKE_STATIC(0x04),
+ METHOD_HANDLE_TYPE_INVOKE_INSTANCE(0x05),
+ METHOD_HANDLE_TYPE_INVOKE_DIRECT(0x06),
+ METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR(0x07),
+ METHOD_HANDLE_TYPE_INVOKE_INTERFACE(0x08);
+
+ private final int value;
+
+ MethodHandleType(int value) {
+ this.value = value;
+ }
+
+ static MethodHandleType fromValue(int value) {
+ for (MethodHandleType methodHandleType : values()) {
+ if (methodHandleType.value == value) {
+ return methodHandleType;
+ }
+ }
+ throw new IllegalArgumentException(String.valueOf(value));
+ }
+
+ public boolean isField() {
+ switch (this) {
+ 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;
+ }
+ }
+ }
+
+ private final Dex dex;
+ private final MethodHandleType methodHandleType;
+ private final int unused1;
+ private final int fieldOrMethodId;
+ private final int unused2;
+
+ public MethodHandle(
+ Dex dex,
+ MethodHandleType methodHandleType,
+ int unused1,
+ int fieldOrMethodId,
+ int unused2) {
+ this.dex = dex;
+ this.methodHandleType = methodHandleType;
+ this.unused1 = unused1;
+ this.fieldOrMethodId = fieldOrMethodId;
+ this.unused2 = unused2;
+ }
+
+ @Override
+ public int compareTo(MethodHandle o) {
+ if (methodHandleType != o.methodHandleType) {
+ return methodHandleType.compareTo(o.methodHandleType);
+ }
+ return Unsigned.compare(fieldOrMethodId, o.fieldOrMethodId);
+ }
+
+ public MethodHandleType getMethodHandleType() {
+ return methodHandleType;
+ }
+
+ public int getUnused1() {
+ return unused1;
+ }
+
+ public int getFieldOrMethodId() {
+ return fieldOrMethodId;
+ }
+
+ public int getUnused2() {
+ return unused2;
+ }
+
+ public void writeTo(Section out) {
+ out.writeUnsignedShort(methodHandleType.value);
+ out.writeUnsignedShort(unused1);
+ out.writeUnsignedShort(fieldOrMethodId);
+ out.writeUnsignedShort(unused2);
+ }
+
+ @Override
+ public String toString() {
+ if (dex == null) {
+ return methodHandleType + " " + fieldOrMethodId;
+ }
+ return methodHandleType
+ + " "
+ + (methodHandleType.isField()
+ ? dex.fieldIds().get(fieldOrMethodId)
+ : dex.methodIds().get(fieldOrMethodId));
+ }
+}
diff --git a/dx/src/com/android/dex/SizeOf.java b/dx/src/com/android/dex/SizeOf.java
index 65fab565b..479525008 100644
--- a/dx/src/com/android/dex/SizeOf.java
+++ b/dx/src/com/android/dex/SizeOf.java
@@ -107,4 +107,17 @@ public final class SizeOf {
* handler_off ushort
*/
public static final int TRY_ITEM = UINT + USHORT + USHORT;
+
+ /**
+ * call_site_off uint
+ */
+ public static final int CALL_SITE_ID_ITEM = UINT;
+
+ /**
+ * method_handle_type ushort
+ * unused ushort
+ * field_or_method_id ushort
+ * unused ushort
+ */
+ public static final int METHOD_HANDLE_ITEM = USHORT + USHORT + USHORT + USHORT;
}
diff --git a/dx/src/com/android/dx/Version.java b/dx/src/com/android/dx/Version.java
index 88225e636..02d836494 100644
--- a/dx/src/com/android/dx/Version.java
+++ b/dx/src/com/android/dx/Version.java
@@ -21,5 +21,5 @@ package com.android.dx;
*/
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 000000000..acb2f54a2
--- /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 8fb9560f8..20f2e4b9a 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.CstInvokeDynamic;
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 @@ public final class BasicBlocker implements BytecodeArray.Visitor {
visitCommon(offset, length, true);
if ((cst instanceof CstMemberRef) || (cst instanceof CstType) ||
- (cst instanceof CstString)) {
+ (cst instanceof CstString) || (cst instanceof CstInvokeDynamic)) {
/*
* 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 000000000..7d5dea58b
--- /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.CstProtoRef;
+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 CstProtoRef) {
+ 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 000000000..c586949e4
--- /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 424b971a8..b1ea53ebc 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,11 @@ public final class BytecodeArray {
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);
+ visitor.visitConstant(opcode, offset, 5, cstInvokeDynamic, 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 67d7ab259..f0d5fddba 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.ThrowingCstInsn;
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 @@ import java.util.ArrayList;
*/
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 @@ import java.util.ArrayList;
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 5b7708278..bbb4b2db2 100644
--- a/dx/src/com/android/dx/cf/code/Simulator.java
+++ b/dx/src/com/android/dx/cf/code/Simulator.java
@@ -20,9 +20,11 @@ import com.android.dex.DexFormat;
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;
+import com.android.dx.rop.cst.CstInvokeDynamic;
import com.android.dx.rop.cst.CstMethodRef;
import com.android.dx.rop.cst.CstType;
import com.android.dx.rop.type.Prototype;
@@ -703,6 +705,21 @@ public class Simulator {
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 + ")");
+ }
+ CstInvokeDynamic invokeDynamicRef = (CstInvokeDynamic) cst;
+ Prototype prototype = invokeDynamicRef.getPrototype();
+ machine.popArgs(frame, prototype);
+ // Change the constant to be associated with instruction to
+ // a call site reference.
+ cst = invokeDynamicRef.addReference();
+ 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 de75db55b..c2c93f717 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 @@ public class ValueAwareMachine extends BaseMachine {
}
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 147edf3bb..b3c336f09 100644
--- a/dx/src/com/android/dx/cf/cst/ConstantPoolParser.java
+++ b/dx/src/com/android/dx/cf/cst/ConstantPoolParser.java
@@ -42,8 +42,8 @@ import com.android.dx.rop.cst.CstInvokeDynamic;
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.CstMethodType;
import com.android.dx.rop.cst.CstNat;
+import com.android.dx.rop.cst.CstProtoRef;
import com.android.dx.rop.cst.CstString;
import com.android.dx.rop.cst.CstType;
import com.android.dx.rop.cst.StdConstantPool;
@@ -336,24 +336,22 @@ public final class ConstantPoolParser {
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,21 +360,21 @@ public final class ConstantPoolParser {
+ 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: {
int descriptorIndex = bytes.getUnsignedShort(at + 1);
CstString descriptor = (CstString) parse0(descriptorIndex, wasUtf8);
- cst = CstMethodType.make(descriptor);
+ cst = CstProtoRef.make(descriptor);
break;
}
case CONSTANT_InvokeDynamic: {
@@ -425,4 +423,28 @@ public final class ConstantPoolParser {
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 000000000..e92dbf2fc
--- /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 043da75a3..623c303df 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 @@ public class DirectClassFile implements ClassFile {
}
/** {@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 710ba5763..2c58e0bb8 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.AttSourceDebugExtension;
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.annotation.AnnotationsList;
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 @@ public class StdAttributeFactory
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 @@ public class StdAttributeFactory
}
/**
+ * 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 @@ public class StdAttributeFactory
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 d6c9ed03e..f7e5d7ef6 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 interface ClassFile extends HasAttribute {
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 19dd84e0f..2e2755a04 100644
--- a/dx/src/com/android/dx/dex/DexOptions.java
+++ b/dx/src/com/android/dx/dex/DexOptions.java
@@ -74,4 +74,16 @@ public class DexOptions {
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 5b797d4e3..9a1e13a97 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.DexOptions;
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.ConstantPool;
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 @@ public class CfTranslator {
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 @@ public class CfTranslator {
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 ac8ba48f9..a83b545fe 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.dex.util.ExceptionWithContext;
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 @@ public final class DalvInsnList extends FixedSizeList {
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/Dops.java b/dx/src/com/android/dx/dex/code/Dops.java
index cc8769563..b70911e2c 100644
--- a/dx/src/com/android/dx/dex/code/Dops.java
+++ b/dx/src/com/android/dx/dex/code/Dops.java
@@ -939,19 +939,19 @@ public final class Dops {
public static final Dop INVOKE_POLYMORPHIC =
new Dop(Opcodes.INVOKE_POLYMORPHIC, Opcodes.INVOKE_POLYMORPHIC,
- Opcodes.INVOKE_POLYMORPHIC_RANGE, Form45cc.THE_ONE, true);
+ Opcodes.INVOKE_POLYMORPHIC_RANGE, Form45cc.THE_ONE, false);
public static final Dop INVOKE_POLYMORPHIC_RANGE =
new Dop(Opcodes.INVOKE_POLYMORPHIC_RANGE, Opcodes.INVOKE_POLYMORPHIC,
- Opcodes.NO_NEXT, Form4rcc.THE_ONE, true);
+ Opcodes.NO_NEXT, Form4rcc.THE_ONE, false);
public static final Dop INVOKE_CUSTOM =
new Dop(Opcodes.INVOKE_CUSTOM, Opcodes.INVOKE_CUSTOM,
- Opcodes.INVOKE_CUSTOM_RANGE, Form35c.THE_ONE, true);
+ Opcodes.INVOKE_CUSTOM_RANGE, Form35c.THE_ONE, false);
public static final Dop INVOKE_CUSTOM_RANGE =
new Dop(Opcodes.INVOKE_CUSTOM_RANGE, Opcodes.INVOKE_CUSTOM,
- Opcodes.NO_NEXT, Form3rc.THE_ONE, true);
+ Opcodes.NO_NEXT, Form3rc.THE_ONE, false);
// END(dops)
diff --git a/dx/src/com/android/dx/dex/code/OutputFinisher.java b/dx/src/com/android/dx/dex/code/OutputFinisher.java
index b506de230..06616b1f7 100644
--- a/dx/src/com/android/dx/dex/code/OutputFinisher.java
+++ b/dx/src/com/android/dx/dex/code/OutputFinisher.java
@@ -221,6 +221,10 @@ public final class OutputFinisher {
if (type != Type.KNOWN_NULL) {
result.add(CstType.intern(type));
+ } else {
+ /* If this a "known null", let's use "Object" because that's going to be the
+ * resulting type in {@link LocalList.MakeState#filterSpec} */
+ result.add(CstType.intern(Type.OBJECT));
}
if (name != null) {
diff --git a/dx/src/com/android/dx/dex/code/RopToDop.java b/dx/src/com/android/dx/dex/code/RopToDop.java
index 65c5fab0f..1f1d131e8 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 @@ public final class RopToDop {
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 208d4a74f..7d05395ca 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.dex.code.InsnFormat;
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 @@ public final class Form35c extends InsnFormat {
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 c1b21b675..732214ac9 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.DalvInsn;
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 @@ public final class Form3rc extends InsnFormat {
}
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 000000000..cf0bb24ef
--- /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 000000000..0a0e781e6
--- /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 000000000..048927201
--- /dev/null
+++ b/dx/src/com/android/dx/dex/file/CallSiteItem.java
@@ -0,0 +1,105 @@
+/*
+ * 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.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) {
+ ValueEncoder.addContents(file, value);
+ }
+}
diff --git a/dx/src/com/android/dx/dex/file/DexFile.java b/dx/src/com/android/dx/dex/file/DexFile.java
index 9b9d70f85..08e5d4bc4 100644
--- a/dx/src/com/android/dx/dex/file/DexFile.java
+++ b/dx/src/com/android/dx/dex/file/DexFile.java
@@ -21,8 +21,11 @@ import com.android.dx.dex.DexOptions;
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.CstCallSite;
+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.CstMethodHandle;
import com.android.dx.rop.cst.CstProtoRef;
import com.android.dx.rop.cst.CstString;
import com.android.dx.rop.cst.CstType;
@@ -43,7 +46,7 @@ import java.util.zip.Adler32;
*/
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 +89,12 @@ public final class DexFile {
/** {@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 +115,10 @@ public final class DexFile {
/**
* 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 +137,31 @@ public final class DexFile {
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 +423,32 @@ public final class DexFile {
}
/**
+ * 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
@@ -440,6 +495,10 @@ public final class DexFile {
* @param cst {@code non-null;} constant to possibly intern
*/
/*package*/ void internIfAppropriate(Constant cst) {
+ if (cst == null) {
+ throw new NullPointerException("cst == null");
+ }
+
if (cst instanceof CstString) {
stringIds.intern((CstString) cst);
} else if (cst instanceof CstType) {
@@ -450,8 +509,10 @@ public final class DexFile {
fieldIds.intern((CstFieldRef) cst);
} else if (cst instanceof CstEnumRef) {
fieldIds.intern(((CstEnumRef) cst).getFieldRef());
- } else if (cst == null) {
- throw new NullPointerException("cst == null");
+ } else if (cst instanceof CstProtoRef) {
+ protoIds.intern(((CstProtoRef) cst).getPrototype());
+ } else if (cst instanceof CstMethodHandle) {
+ methodHandles.intern((CstMethodHandle) cst);
}
}
@@ -467,8 +528,6 @@ public final class DexFile {
* item, or {@code null} if it's not that sort of constant
*/
/*package*/ IndexedItem findItemOrNull(Constant cst) {
- IndexedItem item;
-
if (cst instanceof CstString) {
return stringIds.get(cst);
} else if (cst instanceof CstType) {
@@ -477,8 +536,14 @@ public final class DexFile {
return methodIds.get(cst);
} else if (cst instanceof CstFieldRef) {
return fieldIds.get(cst);
+ } else if (cst instanceof CstEnumRef) {
+ return fieldIds.intern(((CstEnumRef) cst).getFieldRef());
} else if (cst instanceof CstProtoRef) {
return protoIds.get(cst);
+ } else if (cst instanceof CstMethodHandle) {
+ return methodHandles.get(cst);
+ } else if (cst instanceof CstCallSiteRef) {
+ return callSiteIds.get(cst);
} else {
return null;
}
@@ -503,7 +568,15 @@ public final class DexFile {
classDefs.prepare();
classData.prepare();
wordData.prepare();
+ if (dexOptions.canUseInvokePolymorphic()) {
+ // Prepare call site ids before byteData where the call site items are placed.
+ callSiteIds.prepare();
+ }
byteData.prepare();
+ if (dexOptions.canUseInvokePolymorphic()) {
+ // Prepare method handles after call site items placed in byteData.
+ methodHandles.prepare();
+ }
methodIds.prepare();
fieldIds.prepare();
protoIds.prepare();
@@ -520,6 +593,15 @@ public final class DexFile {
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 +645,16 @@ public final class DexFile {
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 2fe97ab25..31f8d03b7 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 @@ public enum ItemType implements ToHuman {
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 000000000..8e5f01e89
--- /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 000000000..f293d05e1
--- /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 fa807a7e4..c6634ff32 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.CstAnnotation;
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.CstInteger;
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 @@ public final class ValueEncoder {
/** 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 @@ public final class ValueEncoder {
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 @@ public final class ValueEncoder {
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/io/CodeReader.java b/dx/src/com/android/dx/io/CodeReader.java
index 5fd5cf696..52a3c68e8 100644
--- a/dx/src/com/android/dx/io/CodeReader.java
+++ b/dx/src/com/android/dx/io/CodeReader.java
@@ -28,6 +28,8 @@ public final class CodeReader {
private Visitor typeVisitor = null;
private Visitor fieldVisitor = null;
private Visitor methodVisitor = null;
+ private Visitor methodAndProtoVisitor = null;
+ private Visitor callSiteVisitor = null;
/**
* Sets {@code visitor} as the visitor for all instructions.
@@ -38,6 +40,8 @@ public final class CodeReader {
typeVisitor = visitor;
fieldVisitor = visitor;
methodVisitor = visitor;
+ methodAndProtoVisitor = visitor;
+ callSiteVisitor = visitor;
}
/**
@@ -76,6 +80,16 @@ public final class CodeReader {
methodVisitor = visitor;
}
+ /** Sets {@code visitor} as the visitor for all method and proto instructions. */
+ public void setMethodAndProtoVisitor(Visitor visitor) {
+ methodAndProtoVisitor = visitor;
+ }
+
+ /** Sets {@code visitor} as the visitor for all call site instructions. */
+ public void setCallSiteVisitor(Visitor visitor) {
+ callSiteVisitor = visitor;
+ }
+
public void visitAll(DecodedInstruction[] decodedInstructions)
throws DexException {
int size = decodedInstructions.length;
@@ -100,10 +114,12 @@ public final class CodeReader {
Visitor visitor = null;
switch (OpcodeInfo.getIndexType(one.getOpcode())) {
- case STRING_REF: visitor = stringVisitor; break;
- case TYPE_REF: visitor = typeVisitor; break;
- case FIELD_REF: visitor = fieldVisitor; break;
- case METHOD_REF: visitor = methodVisitor; break;
+ case STRING_REF: visitor = stringVisitor; break;
+ case TYPE_REF: visitor = typeVisitor; break;
+ case FIELD_REF: visitor = fieldVisitor; break;
+ case METHOD_REF: visitor = methodVisitor; break;
+ case METHOD_AND_PROTO_REF: visitor = methodAndProtoVisitor; break;
+ case CALL_SITE_REF: visitor = callSiteVisitor; break;
}
if (visitor == null) {
diff --git a/dx/src/com/android/dx/io/instructions/DecodedInstruction.java b/dx/src/com/android/dx/io/instructions/DecodedInstruction.java
index e5b70734e..921001a87 100644
--- a/dx/src/com/android/dx/io/instructions/DecodedInstruction.java
+++ b/dx/src/com/android/dx/io/instructions/DecodedInstruction.java
@@ -475,4 +475,14 @@ public abstract class DecodedInstruction {
* with the given one.
*/
public abstract DecodedInstruction withIndex(int newIndex);
+
+ /** Update the instruction with a new 45cc or 4rcc proto index. */
+ public DecodedInstruction withProtoIndex(int newIndex, int newProtoIndex) {
+ throw new IllegalStateException(getClass().toString());
+ }
+
+ /** Returns a 45cc or 4rcc proto index. */
+ public short getProtoIndex() {
+ throw new IllegalStateException(getClass().toString());
+ }
}
diff --git a/dx/src/com/android/dx/io/instructions/InstructionCodec.java b/dx/src/com/android/dx/io/instructions/InstructionCodec.java
index 9c305757b..a8fbf39ae 100644
--- a/dx/src/com/android/dx/io/instructions/InstructionCodec.java
+++ b/dx/src/com/android/dx/io/instructions/InstructionCodec.java
@@ -22,6 +22,10 @@ import com.android.dx.io.OpcodeInfo;
import com.android.dx.io.Opcodes;
import com.android.dx.util.Hex;
import java.io.EOFException;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Deque;
/**
* Representation of an instruction format, which knows how to decode into
@@ -477,6 +481,7 @@ public enum InstructionCodec {
in.setBaseAddress(target, baseAddress);
break;
}
+ default: // fall out
}
return new OneRegisterDecodedInstruction(
@@ -607,22 +612,71 @@ public enum InstructionCodec {
FORMAT_45CC() {
@Override public DecodedInstruction decode(int opcodeUnit,
CodeInput in) throws EOFException {
- return decodeRegisterList(this, opcodeUnit, in);
+ int opcode = byte0(opcodeUnit);
+ if (opcode != Opcodes.INVOKE_POLYMORPHIC) {
+ // 45cc isn't currently used for anything other than invoke-polymorphic.
+ // If that changes, add a more general DecodedInstruction for this format.
+ throw new UnsupportedOperationException(String.valueOf(opcode));
+ }
+ int g = nibble2(opcodeUnit);
+ int registerCount = nibble3(opcodeUnit);
+ int methodIndex = in.read();
+ int cdef = in.read();
+ int c = nibble0(cdef);
+ int d = nibble1(cdef);
+ int e = nibble2(cdef);
+ int f = nibble3(cdef);
+ int protoIndex = in.read();
+ IndexType indexType = OpcodeInfo.getIndexType(opcode);
+
+ if (registerCount < 1 || registerCount > 5) {
+ throw new DexException("bogus registerCount: " + Hex.uNibble(registerCount));
+ }
+ int[] registers = {c, d, e, f, g};
+ registers = Arrays.copyOfRange(registers, 0, registerCount);
+
+ return new InvokePolymorphicDecodedInstruction(
+ this, opcode, methodIndex, indexType, protoIndex, registers);
}
@Override public void encode(DecodedInstruction insn, CodeOutput out) {
- encodeRegisterList(insn, out);
+ InvokePolymorphicDecodedInstruction polyInsn =
+ (InvokePolymorphicDecodedInstruction) insn;
+ out.write(codeUnit(polyInsn.getOpcode(),
+ makeByte(polyInsn.getG(), polyInsn.getRegisterCount())),
+ polyInsn.getIndexUnit(),
+ codeUnit(polyInsn.getC(), polyInsn.getD(), polyInsn.getE(), polyInsn.getF()),
+ polyInsn.getProtoIndex());
+
}
},
FORMAT_4RCC() {
@Override public DecodedInstruction decode(int opcodeUnit,
CodeInput in) throws EOFException {
- return decodeRegisterList(this, opcodeUnit, in);
+ int opcode = byte0(opcodeUnit);
+ if (opcode != Opcodes.INVOKE_POLYMORPHIC_RANGE) {
+ // 4rcc isn't currently used for anything other than invoke-polymorphic.
+ // If that changes, add a more general DecodedInstruction for this format.
+ throw new UnsupportedOperationException(String.valueOf(opcode));
+ }
+ int registerCount = byte1(opcodeUnit);
+ int methodIndex = in.read();
+ int c = in.read();
+ int protoIndex = in.read();
+ IndexType indexType = OpcodeInfo.getIndexType(opcode);
+ return new InvokePolymorphicRangeDecodedInstruction(
+ this, opcode, methodIndex, indexType, c, registerCount, protoIndex);
+
}
@Override public void encode(DecodedInstruction insn, CodeOutput out) {
- encodeRegisterList(insn, out);
+ out.write(
+ codeUnit(insn.getOpcode(), insn.getRegisterCount()),
+ insn.getIndexUnit(),
+ insn.getCUnit(),
+ insn.getProtoIndex());
+
}
},
@@ -742,6 +796,7 @@ public enum InstructionCodec {
return new FillArrayDataPayloadDecodedInstruction(
this, opcodeUnit, array);
}
+ default: // fall out
}
throw new DexException("bogus element_width: "
@@ -831,6 +886,7 @@ public enum InstructionCodec {
format, opcode, index, indexType,
0, 0L,
a, b, c, d, e);
+ default: // fall out
}
throw new DexException("bogus registerCount: "
diff --git a/dx/src/com/android/dx/io/instructions/InvokePolymorphicDecodedInstruction.java b/dx/src/com/android/dx/io/instructions/InvokePolymorphicDecodedInstruction.java
new file mode 100644
index 000000000..72cd32f11
--- /dev/null
+++ b/dx/src/com/android/dx/io/instructions/InvokePolymorphicDecodedInstruction.java
@@ -0,0 +1,84 @@
+/*
+ * 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.io.instructions;
+
+import com.android.dx.io.IndexType;
+
+/** A decoded invoke-polymorphic instruction. */
+public class InvokePolymorphicDecodedInstruction extends DecodedInstruction {
+
+ private final int protoIndex;
+ private final int[] registers;
+
+ public InvokePolymorphicDecodedInstruction(
+ InstructionCodec format,
+ int opcode,
+ int methodIndex,
+ IndexType indexType,
+ int protoIndex,
+ int[] registers) {
+ super(format, opcode, methodIndex, indexType, 0, 0);
+ if (protoIndex != (short) protoIndex) {
+ throw new IllegalArgumentException("protoIndex doesn't fit in a short: " + protoIndex);
+ }
+ this.protoIndex = protoIndex;
+ this.registers = registers;
+ }
+
+ @Override
+ public int getRegisterCount() {
+ return registers.length;
+ }
+
+ @Override
+ public DecodedInstruction withIndex(int newIndex) {
+ throw new UnsupportedOperationException(
+ "use withProtoIndex to update both the method and proto indices for"
+ + " invoke-polymorphic");
+ }
+
+ @Override
+ public DecodedInstruction withProtoIndex(int newIndex, int newProtoIndex) {
+ return new InvokePolymorphicDecodedInstruction(
+ getFormat(), getOpcode(), newIndex, getIndexType(), newProtoIndex, registers);
+ }
+
+ public int getC() {
+ return registers.length > 0 ? registers[0] : 0;
+ }
+
+ public int getD() {
+ return registers.length > 1 ? registers[1] : 0;
+ }
+
+ public int getE() {
+ return registers.length > 2 ? registers[2] : 0;
+ }
+
+ public int getF() {
+ return registers.length > 3 ? registers[3] : 0;
+ }
+
+ public int getG() {
+ return registers.length > 4 ? registers[4] : 0;
+ }
+
+ @Override
+ public short getProtoIndex() {
+ return (short) protoIndex;
+ }
+}
diff --git a/dx/src/com/android/dx/io/instructions/InvokePolymorphicRangeDecodedInstruction.java b/dx/src/com/android/dx/io/instructions/InvokePolymorphicRangeDecodedInstruction.java
new file mode 100644
index 000000000..e4c99c904
--- /dev/null
+++ b/dx/src/com/android/dx/io/instructions/InvokePolymorphicRangeDecodedInstruction.java
@@ -0,0 +1,78 @@
+/*
+ * 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.io.instructions;
+
+import com.android.dx.io.IndexType;
+
+/** A decoded invoke-polymorphic/range instruction. */
+public class InvokePolymorphicRangeDecodedInstruction extends DecodedInstruction {
+
+ private final int c;
+ private final int registerCount;
+ private final int protoIndex;
+
+ public InvokePolymorphicRangeDecodedInstruction(
+ InstructionCodec format,
+ int opcode,
+ int methodIndex,
+ IndexType indexType,
+ int c,
+ int registerCount,
+ int protoIndex) {
+ super(format, opcode, methodIndex, indexType, 0, 0);
+ if (protoIndex != (short) protoIndex) {
+ throw new IllegalArgumentException("protoIndex doesn't fit in a short: " + protoIndex);
+ }
+ this.c = c;
+ this.registerCount = registerCount;
+ this.protoIndex = protoIndex;
+ }
+
+ @Override
+ public int getRegisterCount() {
+ return registerCount;
+ }
+
+ @Override
+ public int getC() {
+ return c;
+ }
+
+ @Override
+ public DecodedInstruction withProtoIndex(int newIndex, int newProtoIndex) {
+ return new InvokePolymorphicRangeDecodedInstruction(
+ getFormat(),
+ getOpcode(),
+ newIndex,
+ getIndexType(),
+ c,
+ registerCount,
+ newProtoIndex);
+ }
+
+ @Override
+ public DecodedInstruction withIndex(int newIndex) {
+ throw new UnsupportedOperationException(
+ "use withProtoIndex to update both the method and proto indices for "
+ + "invoke-polymorphic/range");
+ }
+
+ @Override
+ public short getProtoIndex() {
+ return (short) protoIndex;
+ }
+}
diff --git a/dx/src/com/android/dx/merge/DexMerger.java b/dx/src/com/android/dx/merge/DexMerger.java
index 81ad2ddb7..268e33df2 100644
--- a/dx/src/com/android/dx/merge/DexMerger.java
+++ b/dx/src/com/android/dx/merge/DexMerger.java
@@ -17,6 +17,7 @@
package com.android.dx.merge;
import com.android.dex.Annotation;
+import com.android.dex.CallSiteId;
import com.android.dex.ClassData;
import com.android.dex.ClassDef;
import com.android.dex.Code;
@@ -24,6 +25,7 @@ import com.android.dex.Dex;
import com.android.dex.DexException;
import com.android.dex.DexIndexOverflowException;
import com.android.dex.FieldId;
+import com.android.dex.MethodHandle;
import com.android.dex.MethodId;
import com.android.dex.ProtoId;
import com.android.dex.SizeOf;
@@ -162,8 +164,10 @@ public final class DexMerger {
mergeProtoIds();
mergeFieldIds();
mergeMethodIds();
+ mergeMethodHandles();
mergeAnnotations();
unionAnnotationSetsAndDirectories();
+ mergeCallSiteIds();
mergeClassDefs();
// computeSizesFromOffsets expects sections sorted by offset, so make it so
@@ -291,7 +295,7 @@ public final class DexMerger {
l = new ArrayList<Integer>();
values.put(v, l);
}
- l.add(new Integer(dex));
+ l.add(dex);
}
return offset;
}
@@ -468,12 +472,61 @@ public final class DexMerger {
indexMap.protoIds[oldIndex] = (short) newIndex;
}
- @Override void write(ProtoId value) {
+ @Override
+ void write(ProtoId value) {
+ value.writeTo(idsDefsOut);
+ }
+ }.mergeSorted();
+ }
+
+ private void mergeCallSiteIds() {
+ new IdMerger<CallSiteId>(idsDefsOut) {
+ @Override
+ TableOfContents.Section getSection(TableOfContents tableOfContents) {
+ return tableOfContents.callSiteIds;
+ }
+
+ @Override
+ CallSiteId read(Dex.Section in, IndexMap indexMap, int index) {
+ return indexMap.adjust(in.readCallSiteId());
+ }
+
+ @Override
+ void updateIndex(int offset, IndexMap indexMap, int oldIndex, int newIndex) {
+ indexMap.callSiteIds[oldIndex] = newIndex;
+ }
+
+ @Override
+ void write(CallSiteId value) {
value.writeTo(idsDefsOut);
}
}.mergeSorted();
}
+ private void mergeMethodHandles() {
+ new IdMerger<MethodHandle>(idsDefsOut) {
+ @Override
+ TableOfContents.Section getSection(TableOfContents tableOfContents) {
+ return tableOfContents.methodHandles;
+ }
+
+ @Override
+ MethodHandle read(Dex.Section in, IndexMap indexMap, int index) {
+ return indexMap.adjust(in.readMethodHandle());
+ }
+
+ @Override
+ void updateIndex(int offset, IndexMap indexMap, int oldIndex, int newIndex) {
+ indexMap.methodHandleIds.put(oldIndex, indexMap.methodHandleIds.size());
+ }
+
+ @Override
+ void write(MethodHandle value) {
+ value.writeTo(idsDefsOut);
+ }
+ }.mergeUnsorted();
+ }
+
private void mergeFieldIds() {
new IdMerger<FieldId>(idsDefsOut) {
@Override TableOfContents.Section getSection(TableOfContents tableOfContents) {
@@ -698,7 +751,7 @@ public final class DexMerger {
}
int staticValuesOff = classDef.getStaticValuesOffset();
- idsDefsOut.writeInt(indexMap.adjustStaticValues(staticValuesOff));
+ idsDefsOut.writeInt(indexMap.adjustEncodedArray(staticValuesOff));
}
/**
@@ -1000,7 +1053,7 @@ public final class DexMerger {
private void transformStaticValues(Dex.Section in, IndexMap indexMap) {
contentsOut.encodedArrays.size++;
- indexMap.putStaticValuesOffset(in.getPosition(), encodedArrayOut.getPosition());
+ indexMap.putEncodedArrayValueOffset(in.getPosition(), encodedArrayOut.getPosition());
indexMap.adjustEncodedArray(in.readEncodedArray()).writeTo(encodedArrayOut);
}
diff --git a/dx/src/com/android/dx/merge/IndexMap.java b/dx/src/com/android/dx/merge/IndexMap.java
index f47c03ccb..7033bfc3e 100644
--- a/dx/src/com/android/dx/merge/IndexMap.java
+++ b/dx/src/com/android/dx/merge/IndexMap.java
@@ -17,12 +17,14 @@
package com.android.dx.merge;
import com.android.dex.Annotation;
-import com.android.dex.util.ByteOutput;
+import com.android.dex.CallSiteId;
import com.android.dex.ClassDef;
import com.android.dex.Dex;
import com.android.dex.DexException;
import com.android.dex.EncodedValue;
import com.android.dex.EncodedValueReader;
+import com.android.dex.MethodHandle;
+import com.android.dex.util.ByteOutput;
import static com.android.dex.EncodedValueReader.ENCODED_ANNOTATION;
import static com.android.dex.EncodedValueReader.ENCODED_ARRAY;
import static com.android.dex.EncodedValueReader.ENCODED_BOOLEAN;
@@ -35,6 +37,8 @@ import static com.android.dex.EncodedValueReader.ENCODED_FLOAT;
import static com.android.dex.EncodedValueReader.ENCODED_INT;
import static com.android.dex.EncodedValueReader.ENCODED_LONG;
import static com.android.dex.EncodedValueReader.ENCODED_METHOD;
+import static com.android.dex.EncodedValueReader.ENCODED_METHOD_HANDLE;
+import static com.android.dex.EncodedValueReader.ENCODED_METHOD_TYPE;
import static com.android.dex.EncodedValueReader.ENCODED_NULL;
import static com.android.dex.EncodedValueReader.ENCODED_SHORT;
import static com.android.dex.EncodedValueReader.ENCODED_STRING;
@@ -61,12 +65,14 @@ public final class IndexMap {
public final short[] protoIds;
public final short[] fieldIds;
public final short[] methodIds;
+ public final int[] callSiteIds;
+ public final HashMap<Integer, Integer> methodHandleIds;
private final HashMap<Integer, Integer> typeListOffsets;
private final HashMap<Integer, Integer> annotationOffsets;
private final HashMap<Integer, Integer> annotationSetOffsets;
private final HashMap<Integer, Integer> annotationSetRefListOffsets;
private final HashMap<Integer, Integer> annotationDirectoryOffsets;
- private final HashMap<Integer, Integer> staticValuesOffsets;
+ private final HashMap<Integer, Integer> encodedArrayValueOffset;
public IndexMap(Dex target, TableOfContents tableOfContents) {
this.target = target;
@@ -75,12 +81,14 @@ public final class IndexMap {
this.protoIds = new short[tableOfContents.protoIds.size];
this.fieldIds = new short[tableOfContents.fieldIds.size];
this.methodIds = new short[tableOfContents.methodIds.size];
+ this.callSiteIds = new int[tableOfContents.callSiteIds.size];
+ this.methodHandleIds = new HashMap<Integer, Integer>();
this.typeListOffsets = new HashMap<Integer, Integer>();
this.annotationOffsets = new HashMap<Integer, Integer>();
this.annotationSetOffsets = new HashMap<Integer, Integer>();
this.annotationSetRefListOffsets = new HashMap<Integer, Integer>();
this.annotationDirectoryOffsets = new HashMap<Integer, Integer>();
- this.staticValuesOffsets = new HashMap<Integer, Integer>();
+ this.encodedArrayValueOffset = new HashMap<Integer, Integer>();
/*
* A type list, annotation set, annotation directory, or static value at
@@ -89,7 +97,7 @@ public final class IndexMap {
this.typeListOffsets.put(0, 0);
this.annotationSetOffsets.put(0, 0);
this.annotationDirectoryOffsets.put(0, 0);
- this.staticValuesOffsets.put(0, 0);
+ this.encodedArrayValueOffset.put(0, 0);
}
public void putTypeListOffset(int oldOffset, int newOffset) {
@@ -127,11 +135,11 @@ public final class IndexMap {
annotationDirectoryOffsets.put(oldOffset, newOffset);
}
- public void putStaticValuesOffset(int oldOffset, int newOffset) {
+ public void putEncodedArrayValueOffset(int oldOffset, int newOffset) {
if (oldOffset <= 0 || newOffset <= 0) {
throw new IllegalArgumentException();
}
- staticValuesOffsets.put(oldOffset, newOffset);
+ encodedArrayValueOffset.put(oldOffset, newOffset);
}
public int adjustString(int stringIndex) {
@@ -185,8 +193,16 @@ public final class IndexMap {
return annotationDirectoryOffsets.get(annotationDirectoryOffset);
}
- public int adjustStaticValues(int staticValuesOffset) {
- return staticValuesOffsets.get(staticValuesOffset);
+ public int adjustEncodedArray(int encodedArrayAttribute) {
+ return encodedArrayValueOffset.get(encodedArrayAttribute);
+ }
+
+ public int adjustCallSite(int callSiteIndex) {
+ return callSiteIds[callSiteIndex];
+ }
+
+ public int adjustMethodHandle(int methodHandleIndex) {
+ return methodHandleIds.get(methodHandleIndex);
}
public MethodId adjust(MethodId methodId) {
@@ -196,6 +212,21 @@ public final class IndexMap {
adjustString(methodId.getNameIndex()));
}
+ public CallSiteId adjust(CallSiteId callSiteId) {
+ return new CallSiteId(target, adjustEncodedArray(callSiteId.getCallSiteOffset()));
+ }
+
+ public MethodHandle adjust(MethodHandle methodHandle) {
+ return new MethodHandle(
+ target,
+ methodHandle.getMethodHandleType(),
+ methodHandle.getUnused1(),
+ methodHandle.getMethodHandleType().isField()
+ ? adjustField(methodHandle.getFieldOrMethodId())
+ : adjustMethod(methodHandle.getFieldOrMethodId()),
+ methodHandle.getUnused2());
+ }
+
public FieldId adjust(FieldId fieldId) {
return new FieldId(target,
adjustType(fieldId.getDeclaringClassIndex()),
@@ -282,6 +313,16 @@ public final class IndexMap {
EncodedValueCodec.writeRightZeroExtendedValue(
out, ENCODED_DOUBLE, Double.doubleToLongBits(reader.readDouble()));
break;
+ case ENCODED_METHOD_TYPE:
+ EncodedValueCodec.writeUnsignedIntegralValue(
+ out, ENCODED_METHOD_TYPE, adjustProto(reader.readMethodType()));
+ break;
+ case ENCODED_METHOD_HANDLE:
+ EncodedValueCodec.writeUnsignedIntegralValue(
+ out,
+ ENCODED_METHOD_HANDLE,
+ adjustMethodHandle(reader.readMethodHandle()));
+ break;
case ENCODED_STRING:
EncodedValueCodec.writeUnsignedIntegralValue(
out, ENCODED_STRING, adjustString(reader.readString()));
diff --git a/dx/src/com/android/dx/merge/InstructionTransformer.java b/dx/src/com/android/dx/merge/InstructionTransformer.java
index 461af0f35..6a785b035 100644
--- a/dx/src/com/android/dx/merge/InstructionTransformer.java
+++ b/dx/src/com/android/dx/merge/InstructionTransformer.java
@@ -37,6 +37,8 @@ final class InstructionTransformer {
this.reader.setTypeVisitor(new TypeVisitor());
this.reader.setFieldVisitor(new FieldVisitor());
this.reader.setMethodVisitor(new MethodVisitor());
+ this.reader.setMethodAndProtoVisitor(new MethodAndProtoVisitor());
+ this.reader.setCallSiteVisitor(new CallSiteVisitor());
}
public short[] transform(IndexMap indexMap, short[] encodedInstructions) throws DexException {
@@ -106,6 +108,25 @@ final class InstructionTransformer {
}
}
+ private class MethodAndProtoVisitor implements CodeReader.Visitor {
+ @Override
+ public void visit(DecodedInstruction[] all, DecodedInstruction one) {
+ int methodId = one.getIndex();
+ int protoId = one.getProtoIndex();
+ mappedInstructions[mappedAt++] =
+ one.withProtoIndex(indexMap.adjustMethod(methodId), indexMap.adjustProto(protoId));
+ }
+ }
+
+ private class CallSiteVisitor implements CodeReader.Visitor {
+ @Override
+ public void visit(DecodedInstruction[] all, DecodedInstruction one) {
+ int callSiteId = one.getIndex();
+ int mappedCallSiteId = indexMap.adjustCallSite(callSiteId);
+ mappedInstructions[mappedAt++] = one.withIndex(mappedCallSiteId);
+ }
+ }
+
private static void jumboCheck(boolean isJumbo, int newIndex) {
if (!isJumbo && (newIndex > 0xffff)) {
throw new DexIndexOverflowException("Cannot merge new index " + newIndex +
diff --git a/dx/src/com/android/dx/rop/code/RegOps.java b/dx/src/com/android/dx/rop/code/RegOps.java
index 6b51f0888..ff106911b 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 final class RegOps {
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 @@ public final class RegOps {
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 dfe4619c9..66d0ed9df 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 @@ package com.android.dx.rop.code;
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 @@ public final class Rops {
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 @@ public final class Rops {
}
/**
+ * 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 5644b2fe0..3aa7ab454 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 @@ import com.android.dx.util.FixedSizeList;
/**
* 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 000000000..df7de9a2b
--- /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 000000000..2d7c63fd1
--- /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 7d4f97ab9..2ef0b2c06 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 @@ public final class CstInvokeDynamic extends Constant {
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 @@ public final class CstInvokeDynamic extends Constant {
/** {@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 @@ public final class CstInvokeDynamic extends Constant {
* @return the bootstrap method index
*/
public int getBootstrapMethodIndex() {
- return bootstrapMethodIndex;
+ return bootstrapMethodIndex;
}
/**
@@ -82,21 +151,74 @@ public final class CstInvokeDynamic extends Constant {
* @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 d5e0f738a..d571b5efa 100644
--- a/dx/src/com/android/dx/rop/cst/CstMethodHandle.java
+++ b/dx/src/com/android/dx/rop/cst/CstMethodHandle.java
@@ -21,92 +21,178 @@ package com.android.dx.rop.cst;
*/
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;
-
- /** The kind of MethodHandle */
- private int kind;
+ 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;
+
+ 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();
+ /**
+ * Gets the actual constant.
+ *
+ * @return the value
+ */
+ public Constant getRef() {
+ return ref;
}
- /** {@inheritDoc} */
- @Override
- public String typeName() {
- return "method handle";
+ /**
+ * Gets the type of this method handle.
+ *
+ * @return the type
+ */
+ public int getType() {
+ return type;
}
- /** {@inheritDoc} */
- @Override
- public String toHuman() {
- return toString();
+ /**
+ * 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;
+ }
}
/**
- * Gets the actual constant.
+ * Reports whether the method handle is a field accessor.
*
- * @return the value
+ * @return true if the method handle is a field accessor, false otherwise
*/
- public Constant getRef() {
- return ref;
+ 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 the kind of this method handle.
+ * Gets a human readable name for a method handle type.
*
- * @return the kind
+ * @param type the method handle type
+ * @return the string representation of the type
*/
- public int getKind() {
- return kind;
+ 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/src/com/android/dx/rop/cst/CstMethodType.java b/dx/src/com/android/dx/rop/cst/CstMethodType.java
deleted file mode 100644
index 29a1964c5..000000000
--- a/dx/src/com/android/dx/rop/cst/CstMethodType.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * 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;
-
-/**
- * Constants of type {@code MethodType}.
- */
-public final class CstMethodType extends Constant {
- /** {@code non-null;} the raw prototype for this method */
- private final Prototype prototype;
-
- /**
- * Makes an instance for the given value. This may (but does not
- * necessarily) return an already-allocated instance.
- *
- * @param descriptor the method descriptor
- * @return {@code non-null;} the appropriate instance
- */
- public static CstMethodType make(CstString descriptor) {
- return new CstMethodType(descriptor);
- }
-
- /**
- * Constructs an instance. This constructor is private; use {@link #make}.
- *
- * @param descriptor the method descriptor
- */
- private CstMethodType(CstString descriptor) {
- prototype = Prototype.fromDescriptor(descriptor.getString());
- }
-
- @Override
- public String toString() {
- return prototype.getDescriptor();
- }
-
- /** {@inheritDoc} */
- @Override
- public String typeName() {
- return "method type";
- }
-
- /** {@inheritDoc} */
- @Override
- public String toHuman() {
- return toString();
- }
-
- /**
- * Gets the {@code Prototype} value.
- *
- * @return the value
- */
- public Prototype getValue() {
- return prototype;
- }
-
- @Override
- public boolean isCategory2() {
- return false;
- }
-
- @Override
- protected int compareTo0(Constant other) {
- return prototype.getDescriptor().compareTo(
- ((CstMethodType) other).getValue().getDescriptor());
- }
-}
diff --git a/dx/src/com/android/dx/rop/cst/CstProtoRef.java b/dx/src/com/android/dx/rop/cst/CstProtoRef.java
index a5613ce63..a91ec87c0 100644
--- a/dx/src/com/android/dx/rop/cst/CstProtoRef.java
+++ b/dx/src/com/android/dx/rop/cst/CstProtoRef.java
@@ -20,7 +20,7 @@ import com.android.dx.rop.type.Prototype;
/**
* Prototype reference.
*/
-public class CstProtoRef extends Constant {
+public final class CstProtoRef extends Constant {
/** {@code non-null;} the prototype */
private final Prototype prototype;
@@ -29,6 +29,18 @@ public class CstProtoRef extends Constant {
this.prototype = prototype;
}
+ /**
+ * Makes an instance for the given value. This may (but does not
+ * necessarily) return an already-allocated instance.
+ *
+ * @param descriptor the method descriptor
+ * @return {@code non-null;} the appropriate instance
+ */
+ public static CstProtoRef make(CstString descriptor) {
+ Prototype prototype = Prototype.fromDescriptor(descriptor.getString());
+ return new CstProtoRef(prototype);
+ }
+
/** {@inheritDoc} */
@Override
public boolean equals(Object other) {
diff --git a/dx/tests/029-unit-Bits/run b/dx/tests/029-unit-Bits/run
index 154689880..6bdcac147 100644
--- a/dx/tests/029-unit-Bits/run
+++ b/dx/tests/029-unit-Bits/run
@@ -22,7 +22,7 @@ junitjar=$progdir/../framework/junit-host.jar
for i in "$dxtestsjar" "$dxjar" "$junitjar"; do
if [ ! -r $i ]; then
- echo Missing dependency $i. Build dx/junit-tests.
+ echo Missing dependency $i. Build dx-tests.
exit 1
fi
done
diff --git a/dx/tests/033-unit-IntList/run b/dx/tests/033-unit-IntList/run
index 655724d95..b226ad417 100644
--- a/dx/tests/033-unit-IntList/run
+++ b/dx/tests/033-unit-IntList/run
@@ -22,7 +22,7 @@ junitjar=$progdir/../framework/junit-host.jar
for i in "$dxtestsjar" "$dxjar" "$junitjar"; do
if [ ! -r $i ]; then
- echo Missing dependency $i. Build dx/junit-tests.
+ echo Missing dependency $i. Build dx-tests.
exit 1
fi
done
diff --git a/dx/tests/115-merge/run b/dx/tests/115-merge/run
index 7d0e897f7..2378f1c1f 100644
--- a/dx/tests/115-merge/run
+++ b/dx/tests/115-merge/run
@@ -23,7 +23,7 @@ junitdex=$progdir/../framework/junit-hostdex.jar
for i in "$dxjar" "$junitjar" "$junitdex"; do
if [ ! -r $i ]; then
- echo Missing dependency $i. Build dx/junit-tests.
+ echo Missing dependency $i. Build dx-tests.
exit 1
fi
done
diff --git a/dx/tests/116-leb128/run b/dx/tests/116-leb128/run
index 6e09e08ae..ec5cca9a6 100644
--- a/dx/tests/116-leb128/run
+++ b/dx/tests/116-leb128/run
@@ -22,7 +22,7 @@ junitjar=$progdir/../framework/junit-host.jar
for i in "$dxjar" "$junitjar"; do
if [ ! -r $i ]; then
- echo Missing dependency $i. Build dx/junit-tests.
+ echo Missing dependency $i. Build dx-tests.
exit 1
fi
done
diff --git a/dx/tests/117-modified-utf8/run b/dx/tests/117-modified-utf8/run
index 3f54ae555..b9fadc13b 100644
--- a/dx/tests/117-modified-utf8/run
+++ b/dx/tests/117-modified-utf8/run
@@ -22,7 +22,7 @@ junitjar=$progdir/../framework/junit-host.jar
for i in "$dxjar" "$junitjar"; do
if [ ! -r $i ]; then
- echo Missing dependency $i. Build dx/junit-tests.
+ echo Missing dependency $i. Build dx-tests.
exit 1
fi
done
diff --git a/dx/tests/119-merge-conflict/run b/dx/tests/119-merge-conflict/run
index 51c72be29..3b11a35e9 100644
--- a/dx/tests/119-merge-conflict/run
+++ b/dx/tests/119-merge-conflict/run
@@ -23,7 +23,7 @@ junitdex=$progdir/../framework/junit-hostdex.jar
for i in "$dxjar" "$junitjar" "$junitdex"; do
if [ ! -r $i ]; then
- echo Missing dependency $i. Build dx/junit-tests.
+ echo Missing dependency $i. Build dx-tests.
exit 1
fi
done
diff --git a/dx/tests/127-merge-stress/com/android/dx/merge/MergeTest.java b/dx/tests/127-merge-stress/com/android/dx/merge/MergeTest.java
index cb0814c17..875cfadb3 100644
--- a/dx/tests/127-merge-stress/com/android/dx/merge/MergeTest.java
+++ b/dx/tests/127-merge-stress/com/android/dx/merge/MergeTest.java
@@ -21,8 +21,15 @@ import com.android.dex.DexIndexOverflowException;
import com.android.dx.command.dexer.DxContext;
import java.io.File;
+import java.io.IOException;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.TimeUnit;
import java.util.Arrays;
import java.util.Random;
+import java.util.HashSet;
/**
* This test tries to merge given dex files at random, a first pass at 2 by 2, followed by
@@ -32,31 +39,67 @@ public class MergeTest {
private static final int NUMBER_OF_TRIES = 1000;
+ private static final int WORKER_THREADS = 4;
+
+ private static final ExecutorService executor = Executors.newFixedThreadPool(WORKER_THREADS);
+
+ // Helper task to concurrently run merge tests.
+ static class MergeTask implements Runnable {
+ private final DexMerger dexMerger;
+ private final String[] dexFiles;
+
+ MergeTask(String[] dexFiles, Dex[] dexesToMerge) throws IOException {
+ this.dexMerger = new DexMerger(dexesToMerge, CollisionPolicy.KEEP_FIRST, new DxContext());
+ this.dexFiles = dexFiles;
+ }
+
+ public void run() {
+ try {
+ dexMerger.merge();
+ } catch (DexIndexOverflowException e) {
+ // ignore index overflow
+ } catch (Throwable t) {
+ System.err.println("Exception processing DEX files: " + t);
+ System.err.println("Problem merging those dexes: " + Arrays.toString(dexFiles));
+ System.exit(1);
+ }
+ }
+ }
+
public static void main(String[] args) throws Throwable {
Random random = new Random();
+ HashSet<Integer> seen = new HashSet<>();
for (int pass = 0; pass < 2; pass++) {
for (int i = 0; i < NUMBER_OF_TRIES; i++) {
// On the first pass only do 2-way merges, then do from 3 to 10 way merges
// but not more to avoid dex index overflow.
int numDex = pass == 0 ? 2 : random.nextInt(8) + 3;
- String[] fileNames = new String[numDex]; // only for the error message
- try {
- Dex[] dexesToMerge = new Dex[numDex];
- for (int j = 0; j < numDex; j++) {
- String fileName = args[random.nextInt(args.length)];
- fileNames[j] = fileName;
- dexesToMerge[j] = new Dex(new File(fileName));
+ String[] fileNames = new String[numDex];
+ for (int j = 0; j < numDex; ++j) {
+ int fileIndex = random.nextInt(args.length);
+ fileNames[j] = args[fileIndex];
+ }
+
+ if (!seen.add(fileNames.hashCode())) {
+ // Skip, already seen set of file names with the same hash.
+ continue;
+ }
+
+ Dex[] dexesToMerge = new Dex[numDex];
+ for (int j = 0; j < numDex; ++j) {
+ try {
+ dexesToMerge[j] = new Dex(new File(fileNames[j]));
+ } catch (IOException e) {
+ System.err.println("Error opening " + fileNames[j]);
+ System.err.println(e);
+ System.exit(1);
}
- new DexMerger(dexesToMerge, CollisionPolicy.KEEP_FIRST, new DxContext()).merge();
- } catch (DexIndexOverflowException e) {
- // ignore index overflow
- } catch (Throwable t) {
- System.err.println(
- "Problem merging those dexes: " + Arrays.toString(fileNames));
- throw t;
}
+ executor.execute(new MergeTask(fileNames, dexesToMerge));
}
}
+ executor.shutdown();
+ executor.awaitTermination(8, TimeUnit.HOURS);
}
}
diff --git a/dx/tests/127-merge-stress/run b/dx/tests/127-merge-stress/run
index 496b68eac..0bdbd96e1 100755
--- a/dx/tests/127-merge-stress/run
+++ b/dx/tests/127-merge-stress/run
@@ -24,35 +24,52 @@ dxjar=$progdir/../framework/dx.jar
for i in "$dxjar"; do
if [ ! -r $i ]; then
- echo Missing dependency $i. Build dx/junit-tests.
+ echo Missing dependency $i. Build dx-tests.
exit 1
fi
done
-# Find dex files in the tree
-dexes=`find $ANDROID_BUILD_TOP/out -name '*.dex' -printf '%p '`
-dexesinjars=`find $ANDROID_BUILD_TOP/libcore $ANDROID_BUILD_TOP/out -name '*.jar' -exec sh -c 'unzip -l "{}" 2>/dev/null | grep -q classes.dex ' \; -printf '%p '`
-dexesinapks=`find $ANDROID_BUILD_TOP/libcore $ANDROID_BUILD_TOP/out -name '*.apk' -exec sh -c 'unzip -l "{}" 2>/dev/null | grep -q classes.dex ' \; -printf '%p '`
+# Compile and run java merging test
+$JAVAC -Xlint:-options -source 1.7 -target 1.7 -cp $dxjar -d . com/android/dx/merge/MergeTest.java || exit 1
-# Select only the valid dex files
-validdexes=""
-for dex in $dexes $dexesinjars $dexesinapks; do
+# Find all files that could contain dex bytecode.
+candidates=`find "$ANDROID_BUILD_TOP/out" -name '*.dex' -o -name '*.jar' -o -name '*.apk'`
+validdexes=()
+checksums=()
+for dex in $candidates; do
if [[ "$dex" = *"core"* ]]; then
# Ignoring core files as hit limits of merging capability.
continue
fi
- dexdump2 -c $dex >/dev/null
+
+ # Filter out jar files and apks that do not unzip or contain a
+ # classes.dex file. DexMerger assumes file contents based on the
+ # file extension. Android build names some DEX files with a .jar
+ # extension and this raises an exception in DexMerger as it fails
+ # to unzip them.
+ if [[ "$dex" == *"jar" || "$dex" == *"apk" ]]; then
+ unzip -l "$dex" 2>&1 | grep -q -m 1 classes.dex
+ if [[ $? != 0 ]]; then
+ continue
+ fi
+ fi
+
+ # Skip duplicate files
+ checksum=`shasum "$dex" | sed -e 's/ .*//' -e 's/^/_/'`
+ if [[ "$checksums[$checksum]" == "$checksum" ]]; then
+ continue
+ fi
+ checksums[$checksum]=$checksum
+
+ dexdump2 -c $dex >/dev/null 2>&1
if [ $? -eq 0 ]; then
- validdexes="$validdexes $dex"
+ validdexes+=("$dex")
fi
done
-if [ "$validdexes" = "" ]; then
+if [ ${#validdexes[@]} -eq 0 ]; then
echo No valid DEX files found.
exit 1
fi
-# Compile and run java merging test
-$JAVAC -Xlint:-options -source 1.7 -target 1.7 -cp $dxjar -d . com/android/dx/merge/MergeTest.java
-java -cp .:$dxjar com.android.dx.merge.MergeTest $validdexes >/dev/null
-
+java -cp .:$dxjar -ea -esa com.android.dx.merge.MergeTest "${validdexes[@]}" > /dev/null
diff --git a/dx/tests/133-source-debug-extension/HelloKt.class b/dx/tests/133-source-debug-extension/HelloKt.class
new file mode 100644
index 000000000..c4e8a67dd
--- /dev/null
+++ b/dx/tests/133-source-debug-extension/HelloKt.class
Binary files differ
diff --git a/dx/tests/135-invoke-custom/expected.txt b/dx/tests/135-invoke-custom/expected.txt
new file mode 100644
index 000000000..ad14e8d25
--- /dev/null
+++ b/dx/tests/135-invoke-custom/expected.txt
@@ -0,0 +1,6383 @@
+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: dfc1 2240 |checksum
+00000c: 665a 629f 7c24 f7b7 45c0|signature
+000016: f275 8a42 7d1e 887c c413|
+000020: a423 0000 |file_size: 000023a4
+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: bc22 0000 |map_off: 000022bc
+000038: a700 0000 |string_ids_size: 000000a7
+00003c: 7000 0000 |string_ids_off: 00000070
+000040: 2600 0000 |type_ids_size: 00000026
+000044: 0c03 0000 |type_ids_off: 0000030c
+000048: 3300 0000 |proto_ids_size: 00000033
+00004c: a403 0000 |proto_ids_off: 000003a4
+000050: 0300 0000 |field_ids_size: 00000003
+000054: 0806 0000 |field_ids_off: 00000608
+000058: 4f00 0000 |method_ids_size: 0000004f
+00005c: 2006 0000 |method_ids_off: 00000620
+000060: 0200 0000 |class_defs_size: 00000002
+000064: 9808 0000 |class_defs_off: 00000898
+000068: 0c1a 0000 |data_size: 00001a0c
+00006c: 9809 0000 |data_off: 00000998
+ |
+ |string_ids:
+ |[0] ""
+000070: d216 0000 | string_data_off: 000016d2
+ |[1] " "
+000074: d416 0000 | string_data_off: 000016d4
+ |[2] " != "
+000078: d716 0000 | string_data_off: 000016d7
+ |[3] " * "
+00007c: dd16 0000 | string_data_off: 000016dd
+ |[4] " + "
+000080: e216 0000 | string_data_off: 000016e2
+ |[5] " = "
+000084: e716 0000 | string_data_off: 000016e7
+ |[6] " expected "
+000088: ec16 0000 | string_data_off: 000016ec
+ |[7] " new "
+00008c: f816 0000 | string_data_off: 000016f8
+ |[8] ")"
+000090: ff16 0000 | string_data_off: 000016ff
+ |[9] ", "
+000094: 0217 0000 | string_data_off: 00001702
+ |[a] "<clinit>"
+000098: 0617 0000 | string_data_off: 00001706
+ |[b] "<init>"
+00009c: 1017 0000 | string_data_off: 00001710
+ |[c] "B"
+0000a0: 1817 0000 | string_data_off: 00001718
+ |[d] "C"
+0000a4: 1b17 0000 | string_data_off: 0000171b
+ |[e] "D"
+0000a8: 1e17 0000 | string_data_off: 0000171e
+ |[f] "DFFD"
+0000ac: 2117 0000 | string_data_off: 00001721
+ |[10] "Dupe first invokedynamic invocation"
+0000b0: 2717 0000 | string_data_off: 00001727
+ |[11] "ERROR"
+0000b4: 4c17 0000 | string_data_off: 0000174c
+ |[12] "F"
+0000b8: 5317 0000 | string_data_off: 00001753
+ |[13] "FL"
+0000bc: 5617 0000 | string_data_off: 00001756
+ |[14] "Failed "
+0000c0: 5a17 0000 | string_data_off: 0000175a
+ |[15] "First invokedynamic invocation"
+0000c4: 6317 0000 | string_data_off: 00001763
+ |[16] "FortyTwo"
+0000c8: 8317 0000 | string_data_off: 00001783
+ |[17] "Hello World!"
+0000cc: 8d17 0000 | string_data_off: 0000178d
+ |[18] "I"
+0000d0: 9b17 0000 | string_data_off: 0000179b
+ |[19] "IIII"
+0000d4: 9e17 0000 | string_data_off: 0000179e
+ |[1a] "InvokeCustom.<init>("
+0000d8: a417 0000 | string_data_off: 000017a4
+ |[1b] "InvokeCustom.java"
+0000dc: ba17 0000 | string_data_off: 000017ba
+ |[1c] "InvokeCustom.privateMethodTest9()"
+0000e0: cd17 0000 | string_data_off: 000017cd
+ |[1d] "J"
+0000e4: f017 0000 | string_data_off: 000017f0
+ |[1e] "JJJJ"
+0000e8: f317 0000 | string_data_off: 000017f3
+ |[1f] "L"
+0000ec: f917 0000 | string_data_off: 000017f9
+ |[20] "LD"
+0000f0: fc17 0000 | string_data_off: 000017fc
+ |[21] "LF"
+0000f4: 0018 0000 | string_data_off: 00001800
+ |[22] "LI"
+0000f8: 0418 0000 | string_data_off: 00001804
+ |[23] "LJ"
+0000fc: 0818 0000 | string_data_off: 00001808
+ |[24] "LL"
+000100: 0c18 0000 | string_data_off: 0000180c
+ |[25] "LLLL"
+000104: 1018 0000 | string_data_off: 00001810
+ |[26] "LLLLIJFD"
+000108: 1618 0000 | string_data_off: 00001816
+ |[27] "LLLLL"
+00010c: 2018 0000 | string_data_off: 00001820
+ |[28] "LLLLLLL"
+000110: 2718 0000 | string_data_off: 00001827
+ |[29] "LLLLLLLLLLLL"
+000114: 3018 0000 | string_data_off: 00001830
+ |[2a] "Ldalvik/annotation/Throws;"
+000118: 3e18 0000 | string_data_off: 0000183e
+ |[2b] "Linvokecustom/InvokeCustom;"
+00011c: 5a18 0000 | string_data_off: 0000185a
+ |[2c] "Linvokecustom/Super;"
+000120: 7718 0000 | string_data_off: 00001877
+ |[2d] "Ljava/io/PrintStream;"
+000124: 8d18 0000 | string_data_off: 0000188d
+ |[2e] "Ljava/lang/Class;"
+000128: a418 0000 | string_data_off: 000018a4
+ |[2f] "Ljava/lang/IllegalAccessException;"
+00012c: b718 0000 | string_data_off: 000018b7
+ |[30] "Ljava/lang/NoSuchMethodException;"
+000130: db18 0000 | string_data_off: 000018db
+ |[31] "Ljava/lang/Object;"
+000134: fe18 0000 | string_data_off: 000018fe
+ |[32] "Ljava/lang/Runnable;"
+000138: 1219 0000 | string_data_off: 00001912
+ |[33] "Ljava/lang/String;"
+00013c: 2819 0000 | string_data_off: 00001928
+ |[34] "Ljava/lang/StringBuilder;"
+000140: 3c19 0000 | string_data_off: 0000193c
+ |[35] "Ljava/lang/System;"
+000144: 5719 0000 | string_data_off: 00001957
+ |[36] "Ljava/lang/Throwable;"
+000148: 6b19 0000 | string_data_off: 0000196b
+ |[37] "Ljava/lang/invoke/CallSite;"
+00014c: 8219 0000 | string_data_off: 00001982
+ |[38] "Ljava/lang/invoke/ConstantCallSite;"
+000150: 9f19 0000 | string_data_off: 0000199f
+ |[39] "Ljava/lang/invoke/LambdaMetafactory;"
+000154: c419 0000 | string_data_off: 000019c4
+ |[3a] "Ljava/lang/invoke/MethodHandle;"
+000158: ea19 0000 | string_data_off: 000019ea
+ |[3b] "Ljava/lang/invoke/MethodHandles$Lookup;"
+00015c: 0b1a 0000 | string_data_off: 00001a0b
+ |[3c] "Ljava/lang/invoke/MethodHandles;"
+000160: 341a 0000 | string_data_off: 00001a34
+ |[3d] "Ljava/lang/invoke/MethodType;"
+000164: 561a 0000 | string_data_off: 00001a56
+ |[3e] "Ljava/util/Arrays;"
+000168: 751a 0000 | string_data_off: 00001a75
+ |[3f] "Ljava/util/List;"
+00016c: 891a 0000 | string_data_off: 00001a89
+ |[40] "Ljava/util/Optional;"
+000170: 9b1a 0000 | string_data_off: 00001a9b
+ |[41] "Ljava/util/function/Consumer;"
+000174: b11a 0000 | string_data_off: 00001ab1
+ |[42] "Ljava/util/function/Function;"
+000178: d01a 0000 | string_data_off: 00001ad0
+ |[43] "Ljava/util/function/Predicate;"
+00017c: ef1a 0000 | string_data_off: 00001aef
+ |[44] "Ljava/util/stream/Stream;"
+000180: 0f1b 0000 | string_data_off: 00001b0f
+ |[45] "OK"
+000184: 2a1b 0000 | string_data_off: 00001b2a
+ |[46] "One"
+000188: 2e1b 0000 | string_data_off: 00001b2e
+ |[47] "S"
+00018c: 331b 0000 | string_data_off: 00001b33
+ |[48] "Second invokedynamic invocation"
+000190: 361b 0000 | string_data_off: 00001b36
+ |[49] "String"
+000194: 571b 0000 | string_data_off: 00001b57
+ |[4a] "Three"
+000198: 5f1b 0000 | string_data_off: 00001b5f
+ |[4b] "V"
+00019c: 661b 0000 | string_data_off: 00001b66
+ |[4c] "VC"
+0001a0: 691b 0000 | string_data_off: 00001b69
+ |[4d] "VD"
+0001a4: 6d1b 0000 | string_data_off: 00001b6d
+ |[4e] "VF"
+0001a8: 711b 0000 | string_data_off: 00001b71
+ |[4f] "VI"
+0001ac: 751b 0000 | string_data_off: 00001b75
+ |[50] "VJ"
+0001b0: 791b 0000 | string_data_off: 00001b79
+ |[51] "VL"
+0001b4: 7d1b 0000 | string_data_off: 00001b7d
+ |[52] "VLF"
+0001b8: 811b 0000 | string_data_off: 00001b81
+ |[53] "VLL"
+0001bc: 861b 0000 | string_data_off: 00001b86
+ |[54] "VZ"
+0001c0: 8b1b 0000 | string_data_off: 00001b8b
+ |[55] "VZBCSIFJDL"
+0001c4: 8f1b 0000 | string_data_off: 00001b8f
+ |[56] "Z"
+0001c8: 9b1b 0000 | string_data_off: 00001b9b
+ |[57] "ZL"
+0001cc: 9e1b 0000 | string_data_off: 00001b9e
+ |[58] "[Ljava/lang/Object;"
+0001d0: a21b 0000 | string_data_off: 00001ba2
+ |[59] "[Ljava/lang/String;"
+0001d4: b71b 0000 | string_data_off: 00001bb7
+ |[5a] "]"
+0001d8: cc1b 0000 | string_data_off: 00001bcc
+ |[5b] "accept"
+0001dc: cf1b 0000 | string_data_off: 00001bcf
+ |[5c] "append"
+0001e0: d71b 0000 | string_data_off: 00001bd7
+ |[5d] "apply"
+0001e4: df1b 0000 | string_data_off: 00001bdf
+ |[5e] "asList"
+0001e8: e61b 0000 | string_data_off: 00001be6
+ |[5f] "asType"
+0001ec: ee1b 0000 | string_data_off: 00001bee
+ |[60] "bsmCreateCallSite"
+0001f0: f61b 0000 | string_data_off: 00001bf6
+ |[61] "bsmCreateCallSite ["
+0001f4: 091c 0000 | string_data_off: 00001c09
+ |[62] "bsmLookupStatic"
+0001f8: 1e1c 0000 | string_data_off: 00001c1e
+ |[63] "bsmLookupStatic []"
+0001fc: 2f1c 0000 | string_data_off: 00001c2f
+ |[64] "bsmLookupStaticWithExtraArgs"
+000200: 431c 0000 | string_data_off: 00001c43
+ |[65] "bsmLookupStaticWithExtraArgs ["
+000204: 611c 0000 | string_data_off: 00001c61
+ |[66] "bsmLookupTest9"
+000208: 811c 0000 | string_data_off: 00001c81
+ |[67] "bsmLookupTest9 ["
+00020c: 911c 0000 | string_data_off: 00001c91
+ |[68] "checkFieldTest9"
+000210: a31c 0000 | string_data_off: 00001ca3
+ |[69] "checkFieldTest9: old "
+000214: b41c 0000 | string_data_off: 00001cb4
+ |[6a] "checkStaticFieldTest9"
+000218: cb1c 0000 | string_data_off: 00001ccb
+ |[6b] "checkStaticFieldTest9: old "
+00021c: e21c 0000 | string_data_off: 00001ce2
+ |[6c] "equals"
+000220: ff1c 0000 | string_data_off: 00001cff
+ |[6d] "fieldTest9"
+000224: 071d 0000 | string_data_off: 00001d07
+ |[6e] "filter"
+000228: 131d 0000 | string_data_off: 00001d13
+ |[6f] "findAny"
+00022c: 1b1d 0000 | string_data_off: 00001d1b
+ |[70] "findStatic"
+000230: 241d 0000 | string_data_off: 00001d24
+ |[71] "forEach"
+000234: 301d 0000 | string_data_off: 00001d30
+ |[72] "getClass"
+000238: 391d 0000 | string_data_off: 00001d39
+ |[73] "helperMethodTest9"
+00023c: 431d 0000 | string_data_off: 00001d43
+ |[74] "helperMethodTest9 in "
+000240: 561d 0000 | string_data_off: 00001d56
+ |[75] "invoke"
+000244: 6d1d 0000 | string_data_off: 00001d6d
+ |[76] "invokeExact"
+000248: 751d 0000 | string_data_off: 00001d75
+ |[77] "lambda$lambdaTest$0"
+00024c: 821d 0000 | string_data_off: 00001d82
+ |[78] "lambdaTest"
+000250: 971d 0000 | string_data_off: 00001d97
+ |[79] "lookup"
+000254: a31d 0000 | string_data_off: 00001da3
+ |[7a] "lookupClass"
+000258: ab1d 0000 | string_data_off: 00001dab
+ |[7b] "main"
+00025c: b81d 0000 | string_data_off: 00001db8
+ |[7c] "map"
+000260: be1d 0000 | string_data_off: 00001dbe
+ |[7d] "metafactory"
+000264: c31d 0000 | string_data_off: 00001dc3
+ |[7e] "orElse"
+000268: d01d 0000 | string_data_off: 00001dd0
+ |[7f] "out"
+00026c: d81d 0000 | string_data_off: 00001dd8
+ |[80] "print"
+000270: dd1d 0000 | string_data_off: 00001ddd
+ |[81] "println"
+000274: e41d 0000 | string_data_off: 00001de4
+ |[82] "privateMethodTest9"
+000278: ed1d 0000 | string_data_off: 00001ded
+ |[83] "run"
+00027c: 011e 0000 | string_data_off: 00001e01
+ |[84] "run() for Test9"
+000280: 061e 0000 | string_data_off: 00001e06
+ |[85] "staticFieldTest9"
+000284: 171e 0000 | string_data_off: 00001e17
+ |[86] "stream"
+000288: 291e 0000 | string_data_off: 00001e29
+ |[87] "targetMethodTest1"
+00028c: 311e 0000 | string_data_off: 00001e31
+ |[88] "targetMethodTest2"
+000290: 441e 0000 | string_data_off: 00001e44
+ |[89] "targetMethodTest3"
+000294: 571e 0000 | string_data_off: 00001e57
+ |[8a] "targetMethodTest3 from InvokeCustom"
+000298: 6a1e 0000 | string_data_off: 00001e6a
+ |[8b] "targetMethodTest4"
+00029c: 8f1e 0000 | string_data_off: 00001e8f
+ |[8c] "targetMethodTest4 from InvokeCustom (oops!)"
+0002a0: a21e 0000 | string_data_off: 00001ea2
+ |[8d] "targetMethodTest4 from Super"
+0002a4: cf1e 0000 | string_data_off: 00001ecf
+ |[8e] "targetMethodTest5"
+0002a8: ed1e 0000 | string_data_off: 00001eed
+ |[8f] "targetMethodTest5 "
+0002ac: 001f 0000 | string_data_off: 00001f00
+ |[90] "targetMethodTest5 returned: "
+0002b0: 141f 0000 | string_data_off: 00001f14
+ |[91] "targetMethodTest6"
+0002b4: 321f 0000 | string_data_off: 00001f32
+ |[92] "targetMethodTest6 "
+0002b8: 451f 0000 | string_data_off: 00001f45
+ |[93] "targetMethodTest6 returned: "
+0002bc: 591f 0000 | string_data_off: 00001f59
+ |[94] "targetMethodTest7"
+0002c0: 771f 0000 | string_data_off: 00001f77
+ |[95] "targetMethodTest7 "
+0002c4: 8a1f 0000 | string_data_off: 00001f8a
+ |[96] "targetMethodTest8"
+0002c8: 9e1f 0000 | string_data_off: 00001f9e
+ |[97] "targetMethodTest8 "
+0002cc: b11f 0000 | string_data_off: 00001fb1
+ |[98] "targetMethodTest9"
+0002d0: c51f 0000 | string_data_off: 00001fc5
+ |[99] "targetMethodTest9()"
+0002d4: d81f 0000 | string_data_off: 00001fd8
+ |[9a] "test"
+0002d8: ed1f 0000 | string_data_off: 00001fed
+ |[9b] "test1"
+0002dc: f31f 0000 | string_data_off: 00001ff3
+ |[9c] "test2"
+0002e0: fa1f 0000 | string_data_off: 00001ffa
+ |[9d] "test3"
+0002e4: 0120 0000 | string_data_off: 00002001
+ |[9e] "test4"
+0002e8: 0820 0000 | string_data_off: 00002008
+ |[9f] "test5"
+0002ec: 0f20 0000 | string_data_off: 0000200f
+ |[a0] "test6"
+0002f0: 1620 0000 | string_data_off: 00002016
+ |[a1] "test7"
+0002f4: 1d20 0000 | string_data_off: 0000201d
+ |[a2] "test8"
+0002f8: 2420 0000 | string_data_off: 00002024
+ |[a3] "test9"
+0002fc: 2b20 0000 | string_data_off: 0000202b
+ |[a4] "toString"
+000300: 3220 0000 | string_data_off: 00002032
+ |[a5] "trim"
+000304: 3c20 0000 | string_data_off: 0000203c
+ |[a6] "value"
+000308: 4220 0000 | string_data_off: 00002042
+ |
+ |type_ids:
+ |[0] B
+00030c: 0c00 0000 | descriptor_idx: 0000000c
+ |[1] C
+000310: 0d00 0000 | descriptor_idx: 0000000d
+ |[2] D
+000314: 0e00 0000 | descriptor_idx: 0000000e
+ |[3] F
+000318: 1200 0000 | descriptor_idx: 00000012
+ |[4] I
+00031c: 1800 0000 | descriptor_idx: 00000018
+ |[5] J
+000320: 1d00 0000 | descriptor_idx: 0000001d
+ |[6] Ldalvik/annotation/Throws;
+000324: 2a00 0000 | descriptor_idx: 0000002a
+ |[7] Linvokecustom/InvokeCustom;
+000328: 2b00 0000 | descriptor_idx: 0000002b
+ |[8] Linvokecustom/Super;
+00032c: 2c00 0000 | descriptor_idx: 0000002c
+ |[9] Ljava/io/PrintStream;
+000330: 2d00 0000 | descriptor_idx: 0000002d
+ |[a] Ljava/lang/Class;
+000334: 2e00 0000 | descriptor_idx: 0000002e
+ |[b] Ljava/lang/IllegalAccessException;
+000338: 2f00 0000 | descriptor_idx: 0000002f
+ |[c] Ljava/lang/NoSuchMethodException;
+00033c: 3000 0000 | descriptor_idx: 00000030
+ |[d] Ljava/lang/Object;
+000340: 3100 0000 | descriptor_idx: 00000031
+ |[e] Ljava/lang/Runnable;
+000344: 3200 0000 | descriptor_idx: 00000032
+ |[f] Ljava/lang/String;
+000348: 3300 0000 | descriptor_idx: 00000033
+ |[10] Ljava/lang/StringBuilder;
+00034c: 3400 0000 | descriptor_idx: 00000034
+ |[11] Ljava/lang/System;
+000350: 3500 0000 | descriptor_idx: 00000035
+ |[12] Ljava/lang/Throwable;
+000354: 3600 0000 | descriptor_idx: 00000036
+ |[13] Ljava/lang/invoke/CallSite;
+000358: 3700 0000 | descriptor_idx: 00000037
+ |[14] Ljava/lang/invoke/ConstantCallSite;
+00035c: 3800 0000 | descriptor_idx: 00000038
+ |[15] Ljava/lang/invoke/LambdaMetafactory;
+000360: 3900 0000 | descriptor_idx: 00000039
+ |[16] Ljava/lang/invoke/MethodHandle;
+000364: 3a00 0000 | descriptor_idx: 0000003a
+ |[17] Ljava/lang/invoke/MethodHandles$Lookup;
+000368: 3b00 0000 | descriptor_idx: 0000003b
+ |[18] Ljava/lang/invoke/MethodHandles;
+00036c: 3c00 0000 | descriptor_idx: 0000003c
+ |[19] Ljava/lang/invoke/MethodType;
+000370: 3d00 0000 | descriptor_idx: 0000003d
+ |[1a] Ljava/util/Arrays;
+000374: 3e00 0000 | descriptor_idx: 0000003e
+ |[1b] Ljava/util/List;
+000378: 3f00 0000 | descriptor_idx: 0000003f
+ |[1c] Ljava/util/Optional;
+00037c: 4000 0000 | descriptor_idx: 00000040
+ |[1d] Ljava/util/function/Consumer;
+000380: 4100 0000 | descriptor_idx: 00000041
+ |[1e] Ljava/util/function/Function;
+000384: 4200 0000 | descriptor_idx: 00000042
+ |[1f] Ljava/util/function/Predicate;
+000388: 4300 0000 | descriptor_idx: 00000043
+ |[20] Ljava/util/stream/Stream;
+00038c: 4400 0000 | descriptor_idx: 00000044
+ |[21] S
+000390: 4700 0000 | descriptor_idx: 00000047
+ |[22] V
+000394: 4b00 0000 | descriptor_idx: 0000004b
+ |[23] Z
+000398: 5600 0000 | descriptor_idx: 00000056
+ |[24] [Ljava/lang/Object;
+00039c: 5800 0000 | descriptor_idx: 00000058
+ |[25] [Ljava/lang/String;
+0003a0: 5900 0000 | descriptor_idx: 00000059
+ |
+ |proto_ids:
+ |[0] double proto(float, float, double)
+0003a4: 0f00 0000 | shorty_idx: 0000000f // "DFFD"
+0003a8: 0200 0000 | return_type_idx: 00000002 // double
+0003ac: 9c15 0000 | parameters_off: 0000159c
+ |[1] float proto(invokecustom.InvokeCustom)
+0003b0: 1300 0000 | shorty_idx: 00000013 // "FL"
+0003b4: 0300 0000 | return_type_idx: 00000003 // float
+0003b8: a815 0000 | parameters_off: 000015a8
+ |[2] int proto()
+0003bc: 1800 0000 | shorty_idx: 00000018 // "I"
+0003c0: 0400 0000 | return_type_idx: 00000004 // int
+0003c4: 0000 0000 | parameters_off: 00000000
+ |[3] int proto(int, int, int)
+0003c8: 1900 0000 | shorty_idx: 00000019 // "IIII"
+0003cc: 0400 0000 | return_type_idx: 00000004 // int
+0003d0: b015 0000 | parameters_off: 000015b0
+ |[4] long proto(long, long, long)
+0003d4: 1e00 0000 | shorty_idx: 0000001e // "JJJJ"
+0003d8: 0500 0000 | return_type_idx: 00000005 // long
+0003dc: bc15 0000 | parameters_off: 000015bc
+ |[5] invokecustom.InvokeCustom proto(int)
+0003e0: 2200 0000 | shorty_idx: 00000022 // "LI"
+0003e4: 0700 0000 | return_type_idx: 00000007 // invokecustom.InvokeCustom
+0003e8: c815 0000 | parameters_off: 000015c8
+ |[6] java.lang.Class proto()
+0003ec: 1f00 0000 | shorty_idx: 0000001f // "L"
+0003f0: 0a00 0000 | return_type_idx: 0000000a // java.lang.Class
+0003f4: 0000 0000 | parameters_off: 00000000
+ |[7] java.lang.Object proto(java.lang.Object)
+0003f8: 2400 0000 | shorty_idx: 00000024 // "LL"
+0003fc: 0d00 0000 | return_type_idx: 0000000d // java.lang.Object
+000400: d015 0000 | parameters_off: 000015d0
+ |[8] java.lang.Object proto(java.lang.Object[])
+000404: 2400 0000 | shorty_idx: 00000024 // "LL"
+000408: 0d00 0000 | return_type_idx: 0000000d // java.lang.Object
+00040c: d815 0000 | parameters_off: 000015d8
+ |[9] java.lang.String proto()
+000410: 1f00 0000 | shorty_idx: 0000001f // "L"
+000414: 0f00 0000 | return_type_idx: 0000000f // java.lang.String
+000418: 0000 0000 | parameters_off: 00000000
+ |[a] java.lang.String proto(java.lang.String)
+00041c: 2400 0000 | shorty_idx: 00000024 // "LL"
+000420: 0f00 0000 | return_type_idx: 0000000f // java.lang.String
+000424: e015 0000 | parameters_off: 000015e0
+ |[b] java.lang.StringBuilder proto(double)
+000428: 2000 0000 | shorty_idx: 00000020 // "LD"
+00042c: 1000 0000 | return_type_idx: 00000010 // java.lang.StringBuilder
+000430: e815 0000 | parameters_off: 000015e8
+ |[c] java.lang.StringBuilder proto(float)
+000434: 2100 0000 | shorty_idx: 00000021 // "LF"
+000438: 1000 0000 | return_type_idx: 00000010 // java.lang.StringBuilder
+00043c: f015 0000 | parameters_off: 000015f0
+ |[d] java.lang.StringBuilder proto(int)
+000440: 2200 0000 | shorty_idx: 00000022 // "LI"
+000444: 1000 0000 | return_type_idx: 00000010 // java.lang.StringBuilder
+000448: c815 0000 | parameters_off: 000015c8
+ |[e] java.lang.StringBuilder proto(long)
+00044c: 2300 0000 | shorty_idx: 00000023 // "LJ"
+000450: 1000 0000 | return_type_idx: 00000010 // java.lang.StringBuilder
+000454: f815 0000 | parameters_off: 000015f8
+ |[f] java.lang.StringBuilder proto(java.lang.Object)
+000458: 2400 0000 | shorty_idx: 00000024 // "LL"
+00045c: 1000 0000 | return_type_idx: 00000010 // java.lang.StringBuilder
+000460: d015 0000 | parameters_off: 000015d0
+ |[10] java.lang.StringBuilder proto(java.lang.String)
+000464: 2400 0000 | shorty_idx: 00000024 // "LL"
+000468: 1000 0000 | return_type_idx: 00000010 // java.lang.StringBuilder
+00046c: e015 0000 | parameters_off: 000015e0
+ |[11] java.lang.invoke.CallSite proto(java.lang.invoke.MethodHandles$Lookup, java.lang.String, java.lang.invoke.MethodType)
+000470: 2500 0000 | shorty_idx: 00000025 // "LLLL"
+000474: 1300 0000 | return_type_idx: 00000013 // java.lang.invoke.CallSite
+000478: 0016 0000 | parameters_off: 00001600
+ |[12] java.lang.invoke.CallSite proto(java.lang.invoke.MethodHandles$Lookup, java.lang.String, java.lang.invoke.MethodType, int, long, float, double)
+00047c: 2600 0000 | shorty_idx: 00000026 // "LLLLIJFD"
+000480: 1300 0000 | return_type_idx: 00000013 // java.lang.invoke.CallSite
+000484: 0c16 0000 | parameters_off: 0000160c
+ |[13] java.lang.invoke.CallSite proto(java.lang.invoke.MethodHandles$Lookup, java.lang.String, java.lang.invoke.MethodType, java.lang.invoke.MethodHandle)
+000488: 2700 0000 | shorty_idx: 00000027 // "LLLLL"
+00048c: 1300 0000 | return_type_idx: 00000013 // java.lang.invoke.CallSite
+000490: 2016 0000 | parameters_off: 00001620
+ |[14] 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, java.lang.invoke.MethodHandle)
+000494: 2900 0000 | shorty_idx: 00000029 // "LLLLLLLLLLLL"
+000498: 1300 0000 | return_type_idx: 00000013 // java.lang.invoke.CallSite
+00049c: 2c16 0000 | parameters_off: 0000162c
+ |[15] java.lang.invoke.CallSite proto(java.lang.invoke.MethodHandles$Lookup, java.lang.String, java.lang.invoke.MethodType, java.lang.invoke.MethodType, java.lang.invoke.MethodHandle, java.lang.invoke.MethodType)
+0004a0: 2800 0000 | shorty_idx: 00000028 // "LLLLLLL"
+0004a4: 1300 0000 | return_type_idx: 00000013 // java.lang.invoke.CallSite
+0004a8: 4816 0000 | parameters_off: 00001648
+ |[16] java.lang.invoke.MethodHandle proto(java.lang.Class, java.lang.String, java.lang.invoke.MethodType)
+0004ac: 2500 0000 | shorty_idx: 00000025 // "LLLL"
+0004b0: 1600 0000 | return_type_idx: 00000016 // java.lang.invoke.MethodHandle
+0004b4: 5816 0000 | parameters_off: 00001658
+ |[17] java.lang.invoke.MethodHandle proto(java.lang.invoke.MethodType)
+0004b8: 2400 0000 | shorty_idx: 00000024 // "LL"
+0004bc: 1600 0000 | return_type_idx: 00000016 // java.lang.invoke.MethodHandle
+0004c0: 6416 0000 | parameters_off: 00001664
+ |[18] java.lang.invoke.MethodHandles$Lookup proto()
+0004c4: 1f00 0000 | shorty_idx: 0000001f // "L"
+0004c8: 1700 0000 | return_type_idx: 00000017 // java.lang.invoke.MethodHandles$Lookup
+0004cc: 0000 0000 | parameters_off: 00000000
+ |[19] java.util.List proto(java.lang.Object[])
+0004d0: 2400 0000 | shorty_idx: 00000024 // "LL"
+0004d4: 1b00 0000 | return_type_idx: 0000001b // java.util.List
+0004d8: d815 0000 | parameters_off: 000015d8
+ |[1a] java.util.Optional proto()
+0004dc: 1f00 0000 | shorty_idx: 0000001f // "L"
+0004e0: 1c00 0000 | return_type_idx: 0000001c // java.util.Optional
+0004e4: 0000 0000 | parameters_off: 00000000
+ |[1b] java.util.function.Consumer proto(java.io.PrintStream)
+0004e8: 2400 0000 | shorty_idx: 00000024 // "LL"
+0004ec: 1d00 0000 | return_type_idx: 0000001d // java.util.function.Consumer
+0004f0: 6c16 0000 | parameters_off: 0000166c
+ |[1c] java.util.function.Function proto()
+0004f4: 1f00 0000 | shorty_idx: 0000001f // "L"
+0004f8: 1e00 0000 | return_type_idx: 0000001e // java.util.function.Function
+0004fc: 0000 0000 | parameters_off: 00000000
+ |[1d] java.util.function.Predicate proto()
+000500: 1f00 0000 | shorty_idx: 0000001f // "L"
+000504: 1f00 0000 | return_type_idx: 0000001f // java.util.function.Predicate
+000508: 0000 0000 | parameters_off: 00000000
+ |[1e] java.util.stream.Stream proto()
+00050c: 1f00 0000 | shorty_idx: 0000001f // "L"
+000510: 2000 0000 | return_type_idx: 00000020 // java.util.stream.Stream
+000514: 0000 0000 | parameters_off: 00000000
+ |[1f] java.util.stream.Stream proto(java.util.function.Function)
+000518: 2400 0000 | shorty_idx: 00000024 // "LL"
+00051c: 2000 0000 | return_type_idx: 00000020 // java.util.stream.Stream
+000520: 7416 0000 | parameters_off: 00001674
+ |[20] java.util.stream.Stream proto(java.util.function.Predicate)
+000524: 2400 0000 | shorty_idx: 00000024 // "LL"
+000528: 2000 0000 | return_type_idx: 00000020 // java.util.stream.Stream
+00052c: 7c16 0000 | parameters_off: 0000167c
+ |[21] void proto()
+000530: 4b00 0000 | shorty_idx: 0000004b // "V"
+000534: 2200 0000 | return_type_idx: 00000022 // void
+000538: 0000 0000 | parameters_off: 00000000
+ |[22] void proto(char)
+00053c: 4c00 0000 | shorty_idx: 0000004c // "VC"
+000540: 2200 0000 | return_type_idx: 00000022 // void
+000544: 8416 0000 | parameters_off: 00001684
+ |[23] void proto(double)
+000548: 4d00 0000 | shorty_idx: 0000004d // "VD"
+00054c: 2200 0000 | return_type_idx: 00000022 // void
+000550: e815 0000 | parameters_off: 000015e8
+ |[24] void proto(float)
+000554: 4e00 0000 | shorty_idx: 0000004e // "VF"
+000558: 2200 0000 | return_type_idx: 00000022 // void
+00055c: f015 0000 | parameters_off: 000015f0
+ |[25] void proto(int)
+000560: 4f00 0000 | shorty_idx: 0000004f // "VI"
+000564: 2200 0000 | return_type_idx: 00000022 // void
+000568: c815 0000 | parameters_off: 000015c8
+ |[26] void proto(long)
+00056c: 5000 0000 | shorty_idx: 00000050 // "VJ"
+000570: 2200 0000 | return_type_idx: 00000022 // void
+000574: f815 0000 | parameters_off: 000015f8
+ |[27] void proto(invokecustom.InvokeCustom)
+000578: 5100 0000 | shorty_idx: 00000051 // "VL"
+00057c: 2200 0000 | return_type_idx: 00000022 // void
+000580: a815 0000 | parameters_off: 000015a8
+ |[28] void proto(invokecustom.InvokeCustom, float)
+000584: 5200 0000 | shorty_idx: 00000052 // "VLF"
+000588: 2200 0000 | return_type_idx: 00000022 // void
+00058c: 8c16 0000 | parameters_off: 0000168c
+ |[29] void proto(java.lang.Object)
+000590: 5100 0000 | shorty_idx: 00000051 // "VL"
+000594: 2200 0000 | return_type_idx: 00000022 // void
+000598: d015 0000 | parameters_off: 000015d0
+ |[2a] void proto(java.lang.String)
+00059c: 5100 0000 | shorty_idx: 00000051 // "VL"
+0005a0: 2200 0000 | return_type_idx: 00000022 // void
+0005a4: e015 0000 | parameters_off: 000015e0
+ |[2b] void proto(java.lang.invoke.MethodHandle)
+0005a8: 5100 0000 | shorty_idx: 00000051 // "VL"
+0005ac: 2200 0000 | return_type_idx: 00000022 // void
+0005b0: 9416 0000 | parameters_off: 00001694
+ |[2c] void proto(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)
+0005b4: 5300 0000 | shorty_idx: 00000053 // "VLL"
+0005b8: 2200 0000 | return_type_idx: 00000022 // void
+0005bc: 9c16 0000 | parameters_off: 0000169c
+ |[2d] void proto(java.util.function.Consumer)
+0005c0: 5100 0000 | shorty_idx: 00000051 // "VL"
+0005c4: 2200 0000 | return_type_idx: 00000022 // void
+0005c8: a416 0000 | parameters_off: 000016a4
+ |[2e] void proto(boolean)
+0005cc: 5400 0000 | shorty_idx: 00000054 // "VZ"
+0005d0: 2200 0000 | return_type_idx: 00000022 // void
+0005d4: ac16 0000 | parameters_off: 000016ac
+ |[2f] void proto(boolean, byte, char, short, int, float, long, double, java.lang.String)
+0005d8: 5500 0000 | shorty_idx: 00000055 // "VZBCSIFJDL"
+0005dc: 2200 0000 | return_type_idx: 00000022 // void
+0005e0: b416 0000 | parameters_off: 000016b4
+ |[30] void proto(java.lang.String[])
+0005e4: 5100 0000 | shorty_idx: 00000051 // "VL"
+0005e8: 2200 0000 | return_type_idx: 00000022 // void
+0005ec: cc16 0000 | parameters_off: 000016cc
+ |[31] boolean proto(java.lang.Object)
+0005f0: 5700 0000 | shorty_idx: 00000057 // "ZL"
+0005f4: 2300 0000 | return_type_idx: 00000023 // boolean
+0005f8: d015 0000 | parameters_off: 000015d0
+ |[32] boolean proto(java.lang.String)
+0005fc: 5700 0000 | shorty_idx: 00000057 // "ZL"
+000600: 2300 0000 | return_type_idx: 00000023 // boolean
+000604: e015 0000 | parameters_off: 000015e0
+ |
+ |field_ids:
+ |[0] invokecustom.InvokeCustom.fieldTest9:F
+000608: 0700 | class_idx: 0007
+00060a: 0300 | type_idx: 0003
+00060c: 6d00 0000 | name_idx: 0000006d
+ |[1] invokecustom.InvokeCustom.staticFieldTest9:I
+000610: 0700 | class_idx: 0007
+000612: 0400 | type_idx: 0004
+000614: 8500 0000 | name_idx: 00000085
+ |[2] java.lang.System.out:Ljava/io/PrintStream;
+000618: 1100 | class_idx: 0011
+00061a: 0900 | type_idx: 0009
+00061c: 7f00 0000 | name_idx: 0000007f
+ |
+ |method_ids:
+ |[0] invokecustom.InvokeCustom.<clinit>:()V
+000620: 0700 | class_idx: 0007
+000622: 2100 | proto_idx: 0021
+000624: 0a00 0000 | name_idx: 0000000a
+ |[1] invokecustom.InvokeCustom.<init>:()V
+000628: 0700 | class_idx: 0007
+00062a: 2100 | proto_idx: 0021
+00062c: 0b00 0000 | name_idx: 0000000b
+ |[2] invokecustom.InvokeCustom.<init>:(I)V
+000630: 0700 | class_idx: 0007
+000632: 2500 | proto_idx: 0025
+000634: 0b00 0000 | name_idx: 0000000b
+ |[3] invokecustom.InvokeCustom.bsmCreateCallSite:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+000638: 0700 | class_idx: 0007
+00063a: 1300 | proto_idx: 0013
+00063c: 6000 0000 | name_idx: 00000060
+ |[4] invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
+000640: 0700 | class_idx: 0007
+000642: 1100 | proto_idx: 0011
+000644: 6200 0000 | name_idx: 00000062
+ |[5] invokecustom.InvokeCustom.bsmLookupStaticWithExtraArgs:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;
+000648: 0700 | class_idx: 0007
+00064a: 1200 | proto_idx: 0012
+00064c: 6400 0000 | name_idx: 00000064
+ |[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/MethodHandle;)Ljava/lang/invoke/CallSite;
+000650: 0700 | class_idx: 0007
+000652: 1400 | proto_idx: 0014
+000654: 6600 0000 | name_idx: 00000066
+ |[7] invokecustom.InvokeCustom.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+000658: 0700 | class_idx: 0007
+00065a: 2c00 | proto_idx: 002c
+00065c: 6800 0000 | name_idx: 00000068
+ |[8] invokecustom.InvokeCustom.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+000660: 0700 | class_idx: 0007
+000662: 2c00 | proto_idx: 002c
+000664: 6a00 0000 | name_idx: 0000006a
+ |[9] invokecustom.InvokeCustom.helperMethodTest9:()V
+000668: 0700 | class_idx: 0007
+00066a: 2100 | proto_idx: 0021
+00066c: 7300 0000 | name_idx: 00000073
+ |[a] invokecustom.InvokeCustom.lambda$lambdaTest$0:(Ljava/lang/String;)Z
+000670: 0700 | class_idx: 0007
+000672: 3200 | proto_idx: 0032
+000674: 7700 0000 | name_idx: 00000077
+ |[b] invokecustom.InvokeCustom.lambdaTest:()V
+000678: 0700 | class_idx: 0007
+00067a: 2100 | proto_idx: 0021
+00067c: 7800 0000 | name_idx: 00000078
+ |[c] invokecustom.InvokeCustom.main:([Ljava/lang/String;)V
+000680: 0700 | class_idx: 0007
+000682: 3000 | proto_idx: 0030
+000684: 7b00 0000 | name_idx: 0000007b
+ |[d] invokecustom.InvokeCustom.privateMethodTest9:()V
+000688: 0700 | class_idx: 0007
+00068a: 2100 | proto_idx: 0021
+00068c: 8200 0000 | name_idx: 00000082
+ |[e] invokecustom.InvokeCustom.run:()V
+000690: 0700 | class_idx: 0007
+000692: 2100 | proto_idx: 0021
+000694: 8300 0000 | name_idx: 00000083
+ |[f] invokecustom.InvokeCustom.targetMethodTest1:()V
+000698: 0700 | class_idx: 0007
+00069a: 2100 | proto_idx: 0021
+00069c: 8700 0000 | name_idx: 00000087
+ |[10] invokecustom.InvokeCustom.targetMethodTest2:(ZBCSIFJDLjava/lang/String;)V
+0006a0: 0700 | class_idx: 0007
+0006a2: 2f00 | proto_idx: 002f
+0006a4: 8800 0000 | name_idx: 00000088
+ |[11] invokecustom.InvokeCustom.targetMethodTest3:()V
+0006a8: 0700 | class_idx: 0007
+0006aa: 2100 | proto_idx: 0021
+0006ac: 8900 0000 | name_idx: 00000089
+ |[12] invokecustom.InvokeCustom.targetMethodTest4:()V
+0006b0: 0700 | class_idx: 0007
+0006b2: 2100 | proto_idx: 0021
+0006b4: 8b00 0000 | name_idx: 0000008b
+ |[13] invokecustom.InvokeCustom.targetMethodTest5:(III)I
+0006b8: 0700 | class_idx: 0007
+0006ba: 0300 | proto_idx: 0003
+0006bc: 8e00 0000 | name_idx: 0000008e
+ |[14] invokecustom.InvokeCustom.targetMethodTest6:(JJJ)J
+0006c0: 0700 | class_idx: 0007
+0006c2: 0400 | proto_idx: 0004
+0006c4: 9100 0000 | name_idx: 00000091
+ |[15] invokecustom.InvokeCustom.targetMethodTest7:(FFD)D
+0006c8: 0700 | class_idx: 0007
+0006ca: 0000 | proto_idx: 0000
+0006cc: 9400 0000 | name_idx: 00000094
+ |[16] invokecustom.InvokeCustom.targetMethodTest8:(Ljava/lang/String;)V
+0006d0: 0700 | class_idx: 0007
+0006d2: 2a00 | proto_idx: 002a
+0006d4: 9600 0000 | name_idx: 00000096
+ |[17] invokecustom.InvokeCustom.targetMethodTest9:()V
+0006d8: 0700 | class_idx: 0007
+0006da: 2100 | proto_idx: 0021
+0006dc: 9800 0000 | name_idx: 00000098
+ |[18] invokecustom.InvokeCustom.test1:()V
+0006e0: 0700 | class_idx: 0007
+0006e2: 2100 | proto_idx: 0021
+0006e4: 9b00 0000 | name_idx: 0000009b
+ |[19] invokecustom.InvokeCustom.test2:()V
+0006e8: 0700 | class_idx: 0007
+0006ea: 2100 | proto_idx: 0021
+0006ec: 9c00 0000 | name_idx: 0000009c
+ |[1a] invokecustom.InvokeCustom.test3:()V
+0006f0: 0700 | class_idx: 0007
+0006f2: 2100 | proto_idx: 0021
+0006f4: 9d00 0000 | name_idx: 0000009d
+ |[1b] invokecustom.InvokeCustom.test4:()V
+0006f8: 0700 | class_idx: 0007
+0006fa: 2100 | proto_idx: 0021
+0006fc: 9e00 0000 | name_idx: 0000009e
+ |[1c] invokecustom.InvokeCustom.test5:()V
+000700: 0700 | class_idx: 0007
+000702: 2100 | proto_idx: 0021
+000704: 9f00 0000 | name_idx: 0000009f
+ |[1d] invokecustom.InvokeCustom.test6:()V
+000708: 0700 | class_idx: 0007
+00070a: 2100 | proto_idx: 0021
+00070c: a000 0000 | name_idx: 000000a0
+ |[1e] invokecustom.InvokeCustom.test7:()V
+000710: 0700 | class_idx: 0007
+000712: 2100 | proto_idx: 0021
+000714: a100 0000 | name_idx: 000000a1
+ |[1f] invokecustom.InvokeCustom.test8:()V
+000718: 0700 | class_idx: 0007
+00071a: 2100 | proto_idx: 0021
+00071c: a200 0000 | name_idx: 000000a2
+ |[20] invokecustom.InvokeCustom.test9:()V
+000720: 0700 | class_idx: 0007
+000722: 2100 | proto_idx: 0021
+000724: a300 0000 | name_idx: 000000a3
+ |[21] invokecustom.Super.<init>:()V
+000728: 0800 | class_idx: 0008
+00072a: 2100 | proto_idx: 0021
+00072c: 0b00 0000 | name_idx: 0000000b
+ |[22] invokecustom.Super.helperMethodTest9:()V
+000730: 0800 | class_idx: 0008
+000732: 2100 | proto_idx: 0021
+000734: 7300 0000 | name_idx: 00000073
+ |[23] invokecustom.Super.targetMethodTest4:()V
+000738: 0800 | class_idx: 0008
+00073a: 2100 | proto_idx: 0021
+00073c: 8b00 0000 | name_idx: 0000008b
+ |[24] java.io.PrintStream.print:(Ljava/lang/String;)V
+000740: 0900 | class_idx: 0009
+000742: 2a00 | proto_idx: 002a
+000744: 8000 0000 | name_idx: 00000080
+ |[25] java.io.PrintStream.println:(C)V
+000748: 0900 | class_idx: 0009
+00074a: 2200 | proto_idx: 0022
+00074c: 8100 0000 | name_idx: 00000081
+ |[26] java.io.PrintStream.println:(D)V
+000750: 0900 | class_idx: 0009
+000752: 2300 | proto_idx: 0023
+000754: 8100 0000 | name_idx: 00000081
+ |[27] java.io.PrintStream.println:(F)V
+000758: 0900 | class_idx: 0009
+00075a: 2400 | proto_idx: 0024
+00075c: 8100 0000 | name_idx: 00000081
+ |[28] java.io.PrintStream.println:(I)V
+000760: 0900 | class_idx: 0009
+000762: 2500 | proto_idx: 0025
+000764: 8100 0000 | name_idx: 00000081
+ |[29] java.io.PrintStream.println:(J)V
+000768: 0900 | class_idx: 0009
+00076a: 2600 | proto_idx: 0026
+00076c: 8100 0000 | name_idx: 00000081
+ |[2a] java.io.PrintStream.println:(Ljava/lang/String;)V
+000770: 0900 | class_idx: 0009
+000772: 2a00 | proto_idx: 002a
+000774: 8100 0000 | name_idx: 00000081
+ |[2b] java.io.PrintStream.println:(Z)V
+000778: 0900 | class_idx: 0009
+00077a: 2e00 | proto_idx: 002e
+00077c: 8100 0000 | name_idx: 00000081
+ |[2c] java.lang.Object.<init>:()V
+000780: 0d00 | class_idx: 000d
+000782: 2100 | proto_idx: 0021
+000784: 0b00 0000 | name_idx: 0000000b
+ |[2d] java.lang.Object.getClass:()Ljava/lang/Class;
+000788: 0d00 | class_idx: 000d
+00078a: 0600 | proto_idx: 0006
+00078c: 7200 0000 | name_idx: 00000072
+ |[2e] java.lang.Runnable.run:()V
+000790: 0e00 | class_idx: 000e
+000792: 2100 | proto_idx: 0021
+000794: 8300 0000 | name_idx: 00000083
+ |[2f] java.lang.String.equals:(Ljava/lang/Object;)Z
+000798: 0f00 | class_idx: 000f
+00079a: 3100 | proto_idx: 0031
+00079c: 6c00 0000 | name_idx: 0000006c
+ |[30] java.lang.String.trim:()Ljava/lang/String;
+0007a0: 0f00 | class_idx: 000f
+0007a2: 0900 | proto_idx: 0009
+0007a4: a500 0000 | name_idx: 000000a5
+ |[31] java.lang.StringBuilder.<init>:()V
+0007a8: 1000 | class_idx: 0010
+0007aa: 2100 | proto_idx: 0021
+0007ac: 0b00 0000 | name_idx: 0000000b
+ |[32] java.lang.StringBuilder.append:(D)Ljava/lang/StringBuilder;
+0007b0: 1000 | class_idx: 0010
+0007b2: 0b00 | proto_idx: 000b
+0007b4: 5c00 0000 | name_idx: 0000005c
+ |[33] java.lang.StringBuilder.append:(F)Ljava/lang/StringBuilder;
+0007b8: 1000 | class_idx: 0010
+0007ba: 0c00 | proto_idx: 000c
+0007bc: 5c00 0000 | name_idx: 0000005c
+ |[34] java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder;
+0007c0: 1000 | class_idx: 0010
+0007c2: 0d00 | proto_idx: 000d
+0007c4: 5c00 0000 | name_idx: 0000005c
+ |[35] java.lang.StringBuilder.append:(J)Ljava/lang/StringBuilder;
+0007c8: 1000 | class_idx: 0010
+0007ca: 0e00 | proto_idx: 000e
+0007cc: 5c00 0000 | name_idx: 0000005c
+ |[36] java.lang.StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
+0007d0: 1000 | class_idx: 0010
+0007d2: 0f00 | proto_idx: 000f
+0007d4: 5c00 0000 | name_idx: 0000005c
+ |[37] java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
+0007d8: 1000 | class_idx: 0010
+0007da: 1000 | proto_idx: 0010
+0007dc: 5c00 0000 | name_idx: 0000005c
+ |[38] java.lang.StringBuilder.toString:()Ljava/lang/String;
+0007e0: 1000 | class_idx: 0010
+0007e2: 0900 | proto_idx: 0009
+0007e4: a400 0000 | name_idx: 000000a4
+ |[39] java.lang.invoke.ConstantCallSite.<init>:(Ljava/lang/invoke/MethodHandle;)V
+0007e8: 1400 | class_idx: 0014
+0007ea: 2b00 | proto_idx: 002b
+0007ec: 0b00 0000 | name_idx: 0000000b
+ |[3a] java.lang.invoke.LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
+0007f0: 1500 | class_idx: 0015
+0007f2: 1500 | proto_idx: 0015
+0007f4: 7d00 0000 | name_idx: 0000007d
+ |[3b] java.lang.invoke.MethodHandle.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;
+0007f8: 1600 | class_idx: 0016
+0007fa: 1700 | proto_idx: 0017
+0007fc: 5f00 0000 | name_idx: 0000005f
+ |[3c] java.lang.invoke.MethodHandle.invoke:([Ljava/lang/Object;)Ljava/lang/Object;
+000800: 1600 | class_idx: 0016
+000802: 0800 | proto_idx: 0008
+000804: 7500 0000 | name_idx: 00000075
+ |[3d] java.lang.invoke.MethodHandle.invoke:(Linvokecustom/InvokeCustom;)V
+000808: 1600 | class_idx: 0016
+00080a: 2700 | proto_idx: 0027
+00080c: 7500 0000 | name_idx: 00000075
+ |[3e] java.lang.invoke.MethodHandle.invokeExact:(Linvokecustom/InvokeCustom;)F
+000810: 1600 | class_idx: 0016
+000812: 0100 | proto_idx: 0001
+000814: 7600 0000 | name_idx: 00000076
+ |[3f] java.lang.invoke.MethodHandle.invokeExact:()I
+000818: 1600 | class_idx: 0016
+00081a: 0200 | proto_idx: 0002
+00081c: 7600 0000 | name_idx: 00000076
+ |[40] java.lang.invoke.MethodHandle.invokeExact:(I)Linvokecustom/InvokeCustom;
+000820: 1600 | class_idx: 0016
+000822: 0500 | proto_idx: 0005
+000824: 7600 0000 | name_idx: 00000076
+ |[41] java.lang.invoke.MethodHandle.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;
+000828: 1600 | class_idx: 0016
+00082a: 0800 | proto_idx: 0008
+00082c: 7600 0000 | name_idx: 00000076
+ |[42] java.lang.invoke.MethodHandle.invokeExact:(I)V
+000830: 1600 | class_idx: 0016
+000832: 2500 | proto_idx: 0025
+000834: 7600 0000 | name_idx: 00000076
+ |[43] java.lang.invoke.MethodHandle.invokeExact:(Linvokecustom/InvokeCustom;)V
+000838: 1600 | class_idx: 0016
+00083a: 2700 | proto_idx: 0027
+00083c: 7600 0000 | name_idx: 00000076
+ |[44] java.lang.invoke.MethodHandle.invokeExact:(Linvokecustom/InvokeCustom;F)V
+000840: 1600 | class_idx: 0016
+000842: 2800 | proto_idx: 0028
+000844: 7600 0000 | name_idx: 00000076
+ |[45] java.lang.invoke.MethodHandles$Lookup.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;
+000848: 1700 | class_idx: 0017
+00084a: 1600 | proto_idx: 0016
+00084c: 7000 0000 | name_idx: 00000070
+ |[46] java.lang.invoke.MethodHandles$Lookup.lookupClass:()Ljava/lang/Class;
+000850: 1700 | class_idx: 0017
+000852: 0600 | proto_idx: 0006
+000854: 7a00 0000 | name_idx: 0000007a
+ |[47] java.lang.invoke.MethodHandles.lookup:()Ljava/lang/invoke/MethodHandles$Lookup;
+000858: 1800 | class_idx: 0018
+00085a: 1800 | proto_idx: 0018
+00085c: 7900 0000 | name_idx: 00000079
+ |[48] java.util.Arrays.asList:([Ljava/lang/Object;)Ljava/util/List;
+000860: 1a00 | class_idx: 001a
+000862: 1900 | proto_idx: 0019
+000864: 5e00 0000 | name_idx: 0000005e
+ |[49] java.util.List.stream:()Ljava/util/stream/Stream;
+000868: 1b00 | class_idx: 001b
+00086a: 1e00 | proto_idx: 001e
+00086c: 8600 0000 | name_idx: 00000086
+ |[4a] java.util.Optional.orElse:(Ljava/lang/Object;)Ljava/lang/Object;
+000870: 1c00 | class_idx: 001c
+000872: 0700 | proto_idx: 0007
+000874: 7e00 0000 | name_idx: 0000007e
+ |[4b] java.util.stream.Stream.filter:(Ljava/util/function/Predicate;)Ljava/util/stream/Stream;
+000878: 2000 | class_idx: 0020
+00087a: 2000 | proto_idx: 0020
+00087c: 6e00 0000 | name_idx: 0000006e
+ |[4c] java.util.stream.Stream.findAny:()Ljava/util/Optional;
+000880: 2000 | class_idx: 0020
+000882: 1a00 | proto_idx: 001a
+000884: 6f00 0000 | name_idx: 0000006f
+ |[4d] java.util.stream.Stream.forEach:(Ljava/util/function/Consumer;)V
+000888: 2000 | class_idx: 0020
+00088a: 2d00 | proto_idx: 002d
+00088c: 7100 0000 | name_idx: 00000071
+ |[4e] java.util.stream.Stream.map:(Ljava/util/function/Function;)Ljava/util/stream/Stream;
+000890: 2000 | class_idx: 0020
+000892: 1f00 | proto_idx: 001f
+000894: 7c00 0000 | name_idx: 0000007c
+ |
+ |class_defs:
+ |[0] invokecustom.Super
+000898: 0800 0000 | class_idx: 00000008
+00089c: 0004 0000 | access_flags: abstract
+0008a0: 0d00 0000 | superclass_idx: 0000000d // java.lang.Object
+0008a4: 0000 0000 | interfaces_off: 00000000
+0008a8: 1b00 0000 | source_file_idx: 0000001b // InvokeCustom.java
+0008ac: 0000 0000 | annotations_off: 00000000
+0008b0: 1422 0000 | class_data_off: 00002214
+0008b4: 0000 0000 | static_values_off: 00000000
+ |[1] invokecustom.InvokeCustom
+0008b8: 0700 0000 | class_idx: 00000007
+0008bc: 0100 0000 | access_flags: public
+0008c0: 0800 0000 | superclass_idx: 00000008 // invokecustom.Super
+0008c4: 9415 0000 | interfaces_off: 00001594
+ | java.lang.Runnable
+0008c8: 1b00 0000 | source_file_idx: 0000001b // InvokeCustom.java
+0008cc: 5415 0000 | annotations_off: 00001554
+0008d0: 2622 0000 | class_data_off: 00002226
+0008d4: 0000 0000 | static_values_off: 00000000
+ |
+ |call_site_ids:
+ |[0] call site{method-handle{invoke-static,method{java.lang.invoke.LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}}, string{"test"}, proto{()Ljava/util/function/Predicate;}, proto{(Ljava/lang/Object;)Z}, method-handle{invoke-static,method{invokecustom.InvokeCustom.lambda$lambdaTest$0:(Ljava/lang/String;)Z}}, proto{(Ljava/lang/String;)Z}}
+0008d8: 8721 0000 |call_site_off: 00002187
+ |[1] call site{method-handle{invoke-static,method{java.lang.invoke.LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}}, string{"apply"}, proto{()Ljava/util/function/Function;}, proto{(Ljava/lang/Object;)Ljava/lang/Object;}, method-handle{invoke-instance,method{java.lang.String.trim:()Ljava/lang/String;}}, proto{(Ljava/lang/String;)Ljava/lang/String;}}
+0008dc: 9421 0000 |call_site_off: 00002194
+ |[2] call site{method-handle{invoke-static,method{java.lang.invoke.LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}}, string{"accept"}, proto{(Ljava/io/PrintStream;)Ljava/util/function/Consumer;}, proto{(Ljava/lang/Object;)V}, method-handle{invoke-instance,method{java.io.PrintStream.println:(Ljava/lang/String;)V}}, proto{(Ljava/lang/String;)V}}
+0008e0: a121 0000 |call_site_off: 000021a1
+ |[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{"targetMethodTest1"}, proto{()V}}
+0008e4: ae21 0000 |call_site_off: 000021ae
+ |[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{"targetMethodTest2"}, proto{(ZBCSIFJDLjava/lang/String;)V}}
+0008e8: b521 0000 |call_site_off: 000021b5
+ |[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}}
+0008ec: bc21 0000 |call_site_off: 000021bc
+ |[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}}
+0008f0: c321 0000 |call_site_off: 000021c3
+ |[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{"targetMethodTest7"}, proto{(FFD)D}}
+0008f4: ca21 0000 |call_site_off: 000021ca
+ |[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{"targetMethodTest8"}, proto{(Ljava/lang/String;)V}}
+0008f8: d121 0000 |call_site_off: 000021d1
+ |[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{"targetMethodTest8"}, proto{(Ljava/lang/String;)V}}
+0008fc: d121 0000 |call_site_off: 000021d1
+ |[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}}
+000900: d121 0000 |call_site_off: 000021d1
+ |[b] 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}}
+000904: d821 0000 |call_site_off: 000021d8
+ |[c] 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}}}
+000908: f421 0000 |call_site_off: 000021f4
+ |[d] 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/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-interface,ifaceMethod{java.lang.Runnable.run:()V}}, method-handle{invoke-direct,method{invokecustom.InvokeCustom.privateMethodTest9:()V}}}
+00090c: fd21 0000 |call_site_off: 000021fd
+ |
+ |method_handles:
+000910: 0000 |kind: 0000
+000912: 0000 |reserved:0000
+000914: 0100 |fieldId: 1
+000916: 0000 |reserved:0000
+000918: 0100 |kind: 0001
+00091a: 0000 |reserved:0000
+00091c: 0100 |fieldId: 1
+00091e: 0000 |reserved:0000
+000920: 0200 |kind: 0002
+000922: 0000 |reserved:0000
+000924: 0000 |fieldId: 0
+000926: 0000 |reserved:0000
+000928: 0300 |kind: 0003
+00092a: 0000 |reserved:0000
+00092c: 0000 |fieldId: 0
+00092e: 0000 |reserved:0000
+000930: 0400 |kind: 0004
+000932: 0000 |reserved:0000
+000934: 0300 |methodId: 3
+000936: 0000 |reserved:0000
+000938: 0400 |kind: 0004
+00093a: 0000 |reserved:0000
+00093c: 0400 |methodId: 4
+00093e: 0000 |reserved:0000
+000940: 0400 |kind: 0004
+000942: 0000 |reserved:0000
+000944: 0500 |methodId: 5
+000946: 0000 |reserved:0000
+000948: 0400 |kind: 0004
+00094a: 0000 |reserved:0000
+00094c: 0600 |methodId: 6
+00094e: 0000 |reserved:0000
+000950: 0400 |kind: 0004
+000952: 0000 |reserved:0000
+000954: 0a00 |methodId: 10
+000956: 0000 |reserved:0000
+000958: 0400 |kind: 0004
+00095a: 0000 |reserved:0000
+00095c: 3a00 |methodId: 58
+00095e: 0000 |reserved:0000
+000960: 0500 |kind: 0005
+000962: 0000 |reserved:0000
+000964: 0900 |methodId: 9
+000966: 0000 |reserved:0000
+000968: 0500 |kind: 0005
+00096a: 0000 |reserved:0000
+00096c: 2a00 |methodId: 42
+00096e: 0000 |reserved:0000
+000970: 0500 |kind: 0005
+000972: 0000 |reserved:0000
+000974: 3000 |methodId: 48
+000976: 0000 |reserved:0000
+000978: 0600 |kind: 0006
+00097a: 0000 |reserved:0000
+00097c: 0200 |methodId: 2
+00097e: 0000 |reserved:0000
+000980: 0700 |kind: 0007
+000982: 0000 |reserved:0000
+000984: 0d00 |methodId: 13
+000986: 0000 |reserved:0000
+000988: 0700 |kind: 0007
+00098a: 0000 |reserved:0000
+00098c: 2300 |methodId: 35
+00098e: 0000 |reserved:0000
+000990: 0800 |kind: 0008
+000992: 0000 |reserved:0000
+000994: 2e00 |methodId: 46
+000996: 0000 |reserved:0000
+ |
+ |word_data:
+ |[998] annotation set
+000998: 0100 0000 | size: 00000001
+00099c: 7321 0000 | entries[0]: 00002173
+ | visibility: system
+ | type: dalvik.annotation.Throws
+ | value: array {java.lang.Throwable}
+ |
+ |[9a0] annotation set
+0009a0: 0100 0000 | size: 00000001
+0009a4: 7c21 0000 | entries[0]: 0000217c
+ | visibility: system
+ | type: dalvik.annotation.Throws
+ | value: array {java.lang.NoSuchMethodException, java.lang.IllegalAccessException}
+ |
+ |[9a8] invokecustom.Super.<init>:()V
+0009a8: 0100 | registers_size: 0001
+0009aa: 0100 | ins_size: 0001
+0009ac: 0100 | outs_size: 0001
+0009ae: 0000 | tries_size: 0000
+0009b0: 4920 0000 | debug_off: 00002049
+0009b4: 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
+0009b8: 7010 2c00 0000 | 0000: invoke-direct {v0}, java.lang.Object.<init>:()V // method@002c
+ | 0003: code-address
+ | 0003: code-address
+ | 0003: local-snapshot
+0009be: 0e00 | 0003: return-void
+ | 0004: code-address
+ | debug info
+ | line_start: 29
+ | parameters_size: 0000
+ | 0000: prologue end
+ | 0000: line 29
+ | end sequence
+ |
+ |[9c0] invokecustom.Super.targetMethodTest4:()V
+0009c0: 0300 | registers_size: 0003
+0009c2: 0100 | ins_size: 0001
+0009c4: 0200 | outs_size: 0002
+0009c6: 0000 | tries_size: 0000
+0009c8: 4e20 0000 | debug_off: 0000204e
+0009cc: 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
+0009d0: 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
+0009d4: 1a01 8d00 | 0002: const-string v1, "targetMethodTest4 from Super" // utf8@008d
+ | 0004: code-address
+ | 0004: code-address
+ | 0004: local-snapshot
+ | 0004: code-address
+ | 0004: code-address
+ | 0004: local-snapshot
+ | 0004: code-address
+0009d8: 6e20 2a00 1000 | 0004: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 0007: code-address
+ | 0007: code-address
+ | 0007: local-snapshot
+0009de: 0e00 | 0007: return-void
+ | 0008: code-address
+ | debug info
+ | line_start: 31
+ | parameters_size: 0000
+ | 0000: prologue end
+ | 0000: line 31
+ | 0007: line 32
+ | end sequence
+ |
+ |[9e0] invokecustom.InvokeCustom.<clinit>:()V
+0009e0: 0100 | registers_size: 0001
+0009e2: 0000 | ins_size: 0000
+0009e4: 0000 | outs_size: 0000
+0009e6: 0000 | tries_size: 0000
+0009e8: 5420 0000 | debug_off: 00002054
+0009ec: 0400 0000 | insns_size: 00000004
+ | 0000: code-address
+ | 0000: local-snapshot
+ | 0000: code-address
+ | 0000: code-address
+ | 0000: local-snapshot
+0009f0: 1200 | 0000: const/4 v0, #int 0 // #0
+ | 0001: code-address
+0009f2: 6700 0100 | 0001: sput v0, invokecustom.InvokeCustom.staticFieldTest9:I // field@0001
+ | 0003: code-address
+ | 0003: code-address
+ | 0003: local-snapshot
+0009f6: 0e00 | 0003: return-void
+ | 0004: code-address
+ | debug info
+ | line_start: 102
+ | parameters_size: 0000
+ | 0000: prologue end
+ | 0000: line 102
+ | end sequence
+ |
+ |[9f8] invokecustom.InvokeCustom.<init>:()V
+0009f8: 0200 | registers_size: 0002
+0009fa: 0100 | ins_size: 0001
+0009fc: 0100 | outs_size: 0001
+0009fe: 0000 | tries_size: 0000
+000a00: 5920 0000 | debug_off: 00002059
+000a04: 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
+000a08: 7010 2100 0100 | 0000: invoke-direct {v1}, invokecustom.Super.<init>:()V // method@0021
+ | 0003: code-address
+ | 0003: code-address
+ | 0003: local-snapshot
+000a0e: 1200 | 0003: const/4 v0, #float 0.0 // #0
+ | 0004: code-address
+000a10: 5910 0000 | 0004: iput v0, v1, invokecustom.InvokeCustom.fieldTest9:F // field@0000
+ | 0006: code-address
+ | 0006: code-address
+ | 0006: local-snapshot
+000a14: 0e00 | 0006: return-void
+ | 0007: code-address
+ | debug info
+ | line_start: 39
+ | parameters_size: 0000
+ | 0000: prologue end
+ | 0000: line 39
+ | line = 115
+ | 0003: line 115
+ | line = 39
+ | 0006: line 39
+ | end sequence
+ |
+000a16: 0000 |
+ |[a18] invokecustom.InvokeCustom.<init>:(I)V
+000a18: 0500 | registers_size: 0005
+000a1a: 0200 | ins_size: 0002
+000a1c: 0200 | outs_size: 0002
+000a1e: 0000 | tries_size: 0000
+000a20: 6620 0000 | debug_off: 00002066
+000a24: 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
+000a28: 7010 2100 0300 | 0000: invoke-direct {v3}, invokecustom.Super.<init>:()V // method@0021
+ | 0003: code-address
+ | 0003: code-address
+ | 0003: local-snapshot
+000a2e: 1200 | 0003: const/4 v0, #float 0.0 // #0
+ | 0004: code-address
+000a30: 5930 0000 | 0004: iput v0, v3, invokecustom.InvokeCustom.fieldTest9:F // field@0000
+ | 0006: code-address
+ | 0006: code-address
+ | 0006: local-snapshot
+ | 0006: code-address
+000a34: 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
+000a38: 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
+000a3c: 7010 3100 0100 | 000a: invoke-direct {v1}, java.lang.StringBuilder.<init>:()V // method@0031
+ | 000d: code-address
+ | 000d: code-address
+ | 000d: local-snapshot
+ | 000d: code-address
+000a42: 1a02 1a00 | 000d: const-string v2, "InvokeCustom.<init>(" // utf8@001a
+ | 000f: code-address
+ | 000f: code-address
+ | 000f: local-snapshot
+ | 000f: code-address
+ | 000f: code-address
+ | 000f: local-snapshot
+ | 000f: code-address
+000a46: 6e20 3700 2100 | 000f: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0012: code-address
+ | 0012: code-address
+ | 0012: local-snapshot
+000a4c: 0c01 | 0012: move-result-object v1
+ | 0013: code-address
+ | 0013: code-address
+ | 0013: local-snapshot
+ | 0013: code-address
+000a4e: 6e20 3400 4100 | 0013: invoke-virtual {v1, v4}, java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder; // method@0034
+ | 0016: code-address
+ | 0016: code-address
+ | 0016: local-snapshot
+000a54: 0c01 | 0016: move-result-object v1
+ | 0017: code-address
+ | 0017: code-address
+ | 0017: local-snapshot
+ | 0017: code-address
+000a56: 1a02 0800 | 0017: const-string v2, ")" // utf8@0008
+ | 0019: code-address
+ | 0019: code-address
+ | 0019: local-snapshot
+ | 0019: code-address
+ | 0019: code-address
+ | 0019: local-snapshot
+ | 0019: code-address
+000a5a: 6e20 3700 2100 | 0019: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 001c: code-address
+ | 001c: code-address
+ | 001c: local-snapshot
+000a60: 0c01 | 001c: move-result-object v1
+ | 001d: code-address
+ | 001d: code-address
+ | 001d: local-snapshot
+ | 001d: code-address
+000a62: 6e10 3800 0100 | 001d: invoke-virtual {v1}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0038
+ | 0020: code-address
+ | 0020: code-address
+ | 0020: local-snapshot
+000a68: 0c01 | 0020: move-result-object v1
+ | 0021: code-address
+ | 0021: code-address
+ | 0021: local-snapshot
+ | 0021: code-address
+000a6a: 6e20 2a00 1000 | 0021: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 0024: code-address
+ | 0024: code-address
+ | 0024: local-snapshot
+000a70: 0e00 | 0024: return-void
+ | 0025: code-address
+ | debug info
+ | line_start: 40
+ | parameters_size: 0001
+ | parameter <unnamed> v4
+ | 0000: prologue end
+ | 0000: line 40
+ | line = 115
+ | 0003: line 115
+ | line = 41
+ | 0006: line 41
+ | 0024: advance pc
+ | 0024: line 42
+ | end sequence
+ |
+000a72: 0000 |
+ |[a74] invokecustom.InvokeCustom.bsmCreateCallSite:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+000a74: 0700 | registers_size: 0007
+000a76: 0400 | ins_size: 0004
+000a78: 0200 | outs_size: 0002
+000a7a: 0000 | tries_size: 0000
+000a7c: 7720 0000 | debug_off: 00002077
+000a80: 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
+000a84: 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
+000a88: 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
+000a8c: 7010 3100 0100 | 0004: invoke-direct {v1}, java.lang.StringBuilder.<init>:()V // method@0031
+ | 0007: code-address
+ | 0007: code-address
+ | 0007: local-snapshot
+ | 0007: code-address
+000a92: 1a02 6100 | 0007: const-string v2, "bsmCreateCallSite [" // utf8@0061
+ | 0009: code-address
+ | 0009: code-address
+ | 0009: local-snapshot
+ | 0009: code-address
+ | 0009: code-address
+ | 0009: local-snapshot
+ | 0009: code-address
+000a96: 6e20 3700 2100 | 0009: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 000c: code-address
+ | 000c: code-address
+ | 000c: local-snapshot
+000a9c: 0c01 | 000c: move-result-object v1
+ | 000d: code-address
+ | 000d: code-address
+ | 000d: local-snapshot
+ | 000d: code-address
+000a9e: 6e20 3600 6100 | 000d: invoke-virtual {v1, v6}, java.lang.StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@0036
+ | 0010: code-address
+ | 0010: code-address
+ | 0010: local-snapshot
+000aa4: 0c01 | 0010: move-result-object v1
+ | 0011: code-address
+ | 0011: code-address
+ | 0011: local-snapshot
+ | 0011: code-address
+000aa6: 1a02 5a00 | 0011: const-string v2, "]" // utf8@005a
+ | 0013: code-address
+ | 0013: code-address
+ | 0013: local-snapshot
+ | 0013: code-address
+ | 0013: code-address
+ | 0013: local-snapshot
+ | 0013: code-address
+000aaa: 6e20 3700 2100 | 0013: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0016: code-address
+ | 0016: code-address
+ | 0016: local-snapshot
+000ab0: 0c01 | 0016: move-result-object v1
+ | 0017: code-address
+ | 0017: code-address
+ | 0017: local-snapshot
+ | 0017: code-address
+000ab2: 6e10 3800 0100 | 0017: invoke-virtual {v1}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0038
+ | 001a: code-address
+ | 001a: code-address
+ | 001a: local-snapshot
+000ab8: 0c01 | 001a: move-result-object v1
+ | 001b: code-address
+ | 001b: code-address
+ | 001b: local-snapshot
+ | 001b: code-address
+000aba: 6e20 2a00 1000 | 001b: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 001e: code-address
+ | 001e: code-address
+ | 001e: local-snapshot
+ | 001e: code-address
+000ac0: 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
+000ac4: 7020 3900 6000 | 0020: invoke-direct {v0, v6}, java.lang.invoke.ConstantCallSite.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@0039
+ | 0023: code-address
+ | 0023: code-address
+ | 0023: local-snapshot
+000aca: 1100 | 0023: return-object v0
+ | 0024: code-address
+ | debug info
+ | line_start: 160
+ | parameters_size: 0004
+ | parameter <unnamed> v3
+ | parameter <unnamed> v4
+ | parameter <unnamed> v5
+ | parameter <unnamed> v6
+ | 0000: prologue end
+ | 0000: line 160
+ | 001e: advance pc
+ | 001e: line 161
+ | end sequence
+ |
+ |[acc] invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
+000acc: 0500 | registers_size: 0005
+000ace: 0300 | ins_size: 0003
+000ad0: 0400 | outs_size: 0004
+000ad2: 0000 | tries_size: 0000
+000ad4: 8420 0000 | debug_off: 00002084
+000ad8: 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
+000adc: 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
+000ae0: 1a01 6300 | 0002: const-string v1, "bsmLookupStatic []" // utf8@0063
+ | 0004: code-address
+ | 0004: code-address
+ | 0004: local-snapshot
+ | 0004: code-address
+ | 0004: code-address
+ | 0004: local-snapshot
+ | 0004: code-address
+000ae4: 6e20 2a00 1000 | 0004: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 0007: code-address
+ | 0007: code-address
+ | 0007: local-snapshot
+ | 0007: code-address
+000aea: 7100 4700 0000 | 0007: invoke-static {}, java.lang.invoke.MethodHandles.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@0047
+ | 000a: code-address
+ | 000a: code-address
+ | 000a: local-snapshot
+000af0: 0c00 | 000a: move-result-object v0
+ | 000b: code-address
+ | 000b: code-address
+ | 000b: local-snapshot
+ | 000b: code-address
+000af2: 6e10 4600 0000 | 000b: invoke-virtual {v0}, java.lang.invoke.MethodHandles$Lookup.lookupClass:()Ljava/lang/Class; // method@0046
+ | 000e: code-address
+ | 000e: code-address
+ | 000e: local-snapshot
+000af8: 0c01 | 000e: move-result-object v1
+ | 000f: code-address
+ | 000f: code-address
+ | 000f: local-snapshot
+ | 000f: code-address
+000afa: 6e40 4500 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@0045
+ | 0012: code-address
+ | 0012: code-address
+ | 0012: local-snapshot
+000b00: 0c00 | 0012: move-result-object v0
+ | 0013: code-address
+ | 0013: code-address
+ | 0013: local-snapshot
+ | 0013: code-address
+000b02: 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
+000b06: 6e20 3b00 4000 | 0015: invoke-virtual {v0, v4}, java.lang.invoke.MethodHandle.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@003b
+ | 0018: code-address
+ | 0018: code-address
+ | 0018: local-snapshot
+000b0c: 0c00 | 0018: move-result-object v0
+ | 0019: code-address
+ | 0019: code-address
+ | 0019: local-snapshot
+ | 0019: code-address
+000b0e: 7020 3900 0100 | 0019: invoke-direct {v1, v0}, java.lang.invoke.ConstantCallSite.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@0039
+ | 001c: code-address
+ | 001c: code-address
+ | 001c: local-snapshot
+000b14: 1101 | 001c: return-object v1
+ | 001d: code-address
+ | debug info
+ | line_start: 142
+ | parameters_size: 0003
+ | parameter <unnamed> v2
+ | parameter <unnamed> v3
+ | parameter <unnamed> v4
+ | 0000: prologue end
+ | 0000: line 142
+ | 0007: line 143
+ | 000b: line 144
+ | 0013: line 145
+ | end sequence
+ |
+000b16: 0000 |
+ |[b18] invokecustom.InvokeCustom.bsmLookupStaticWithExtraArgs:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;
+000b18: 0c00 | registers_size: 000c
+000b1a: 0900 | ins_size: 0009
+000b1c: 0400 | outs_size: 0004
+000b1e: 0000 | tries_size: 0000
+000b20: 9020 0000 | debug_off: 00002090
+000b24: 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
+000b28: 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
+000b2c: 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
+000b30: 7010 3100 0100 | 0004: invoke-direct {v1}, java.lang.StringBuilder.<init>:()V // method@0031
+ | 0007: code-address
+ | 0007: code-address
+ | 0007: local-snapshot
+ | 0007: code-address
+000b36: 1a02 6500 | 0007: const-string v2, "bsmLookupStaticWithExtraArgs [" // utf8@0065
+ | 0009: code-address
+ | 0009: code-address
+ | 0009: local-snapshot
+ | 0009: code-address
+ | 0009: code-address
+ | 0009: local-snapshot
+ | 0009: code-address
+000b3a: 6e20 3700 2100 | 0009: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 000c: code-address
+ | 000c: code-address
+ | 000c: local-snapshot
+000b40: 0c01 | 000c: move-result-object v1
+ | 000d: code-address
+ | 000d: code-address
+ | 000d: local-snapshot
+ | 000d: code-address
+000b42: 6e20 3400 6100 | 000d: invoke-virtual {v1, v6}, java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder; // method@0034
+ | 0010: code-address
+ | 0010: code-address
+ | 0010: local-snapshot
+000b48: 0c01 | 0010: move-result-object v1
+ | 0011: code-address
+ | 0011: code-address
+ | 0011: local-snapshot
+ | 0011: code-address
+000b4a: 1a02 0900 | 0011: const-string v2, ", " // utf8@0009
+ | 0013: code-address
+ | 0013: code-address
+ | 0013: local-snapshot
+ | 0013: code-address
+ | 0013: code-address
+ | 0013: local-snapshot
+ | 0013: code-address
+000b4e: 6e20 3700 2100 | 0013: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0016: code-address
+ | 0016: code-address
+ | 0016: local-snapshot
+000b54: 0c01 | 0016: move-result-object v1
+ | 0017: code-address
+ | 0017: code-address
+ | 0017: local-snapshot
+ | 0017: code-address
+000b56: 6e30 3500 7108 | 0017: invoke-virtual {v1, v7, v8}, java.lang.StringBuilder.append:(J)Ljava/lang/StringBuilder; // method@0035
+ | 001a: code-address
+ | 001a: code-address
+ | 001a: local-snapshot
+000b5c: 0c01 | 001a: move-result-object v1
+ | 001b: code-address
+ | 001b: code-address
+ | 001b: local-snapshot
+ | 001b: code-address
+000b5e: 1a02 0900 | 001b: const-string v2, ", " // utf8@0009
+ | 001d: code-address
+ | 001d: code-address
+ | 001d: local-snapshot
+ | 001d: code-address
+ | 001d: code-address
+ | 001d: local-snapshot
+ | 001d: code-address
+000b62: 6e20 3700 2100 | 001d: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0020: code-address
+ | 0020: code-address
+ | 0020: local-snapshot
+000b68: 0c01 | 0020: move-result-object v1
+ | 0021: code-address
+ | 0021: code-address
+ | 0021: local-snapshot
+ | 0021: code-address
+000b6a: 6e20 3300 9100 | 0021: invoke-virtual {v1, v9}, java.lang.StringBuilder.append:(F)Ljava/lang/StringBuilder; // method@0033
+ | 0024: code-address
+ | 0024: code-address
+ | 0024: local-snapshot
+000b70: 0c01 | 0024: move-result-object v1
+ | 0025: code-address
+ | 0025: code-address
+ | 0025: local-snapshot
+ | 0025: code-address
+000b72: 1a02 0900 | 0025: const-string v2, ", " // utf8@0009
+ | 0027: code-address
+ | 0027: code-address
+ | 0027: local-snapshot
+ | 0027: code-address
+ | 0027: code-address
+ | 0027: local-snapshot
+ | 0027: code-address
+000b76: 6e20 3700 2100 | 0027: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 002a: code-address
+ | 002a: code-address
+ | 002a: local-snapshot
+000b7c: 0c01 | 002a: move-result-object v1
+ | 002b: code-address
+ | 002b: code-address
+ | 002b: local-snapshot
+ | 002b: code-address
+000b7e: 6e30 3200 a10b | 002b: invoke-virtual {v1, v10, v11}, java.lang.StringBuilder.append:(D)Ljava/lang/StringBuilder; // method@0032
+ | 002e: code-address
+ | 002e: code-address
+ | 002e: local-snapshot
+000b84: 0c01 | 002e: move-result-object v1
+ | 002f: code-address
+ | 002f: code-address
+ | 002f: local-snapshot
+ | 002f: code-address
+000b86: 1a02 5a00 | 002f: const-string v2, "]" // utf8@005a
+ | 0031: code-address
+ | 0031: code-address
+ | 0031: local-snapshot
+ | 0031: code-address
+ | 0031: code-address
+ | 0031: local-snapshot
+ | 0031: code-address
+000b8a: 6e20 3700 2100 | 0031: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0034: code-address
+ | 0034: code-address
+ | 0034: local-snapshot
+000b90: 0c01 | 0034: move-result-object v1
+ | 0035: code-address
+ | 0035: code-address
+ | 0035: local-snapshot
+ | 0035: code-address
+000b92: 6e10 3800 0100 | 0035: invoke-virtual {v1}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0038
+ | 0038: code-address
+ | 0038: code-address
+ | 0038: local-snapshot
+000b98: 0c01 | 0038: move-result-object v1
+ | 0039: code-address
+ | 0039: code-address
+ | 0039: local-snapshot
+ | 0039: code-address
+000b9a: 6e20 2a00 1000 | 0039: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 003c: code-address
+ | 003c: code-address
+ | 003c: local-snapshot
+ | 003c: code-address
+000ba0: 7100 4700 0000 | 003c: invoke-static {}, java.lang.invoke.MethodHandles.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@0047
+ | 003f: code-address
+ | 003f: code-address
+ | 003f: local-snapshot
+000ba6: 0c00 | 003f: move-result-object v0
+ | 0040: code-address
+ | 0040: code-address
+ | 0040: local-snapshot
+ | 0040: code-address
+000ba8: 6e10 4600 0000 | 0040: invoke-virtual {v0}, java.lang.invoke.MethodHandles$Lookup.lookupClass:()Ljava/lang/Class; // method@0046
+ | 0043: code-address
+ | 0043: code-address
+ | 0043: local-snapshot
+000bae: 0c01 | 0043: move-result-object v1
+ | 0044: code-address
+ | 0044: code-address
+ | 0044: local-snapshot
+ | 0044: code-address
+000bb0: 6e40 4500 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@0045
+ | 0047: code-address
+ | 0047: code-address
+ | 0047: local-snapshot
+000bb6: 0c00 | 0047: move-result-object v0
+ | 0048: code-address
+ | 0048: code-address
+ | 0048: local-snapshot
+ | 0048: code-address
+000bb8: 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
+000bbc: 6e20 3b00 5000 | 004a: invoke-virtual {v0, v5}, java.lang.invoke.MethodHandle.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@003b
+ | 004d: code-address
+ | 004d: code-address
+ | 004d: local-snapshot
+000bc2: 0c00 | 004d: move-result-object v0
+ | 004e: code-address
+ | 004e: code-address
+ | 004e: local-snapshot
+ | 004e: code-address
+000bc4: 7020 3900 0100 | 004e: invoke-direct {v1, v0}, java.lang.invoke.ConstantCallSite.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@0039
+ | 0051: code-address
+ | 0051: code-address
+ | 0051: local-snapshot
+000bca: 1101 | 0051: return-object v1
+ | 0052: code-address
+ | debug info
+ | line_start: 151
+ | 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 151
+ | 003c: advance pc
+ | 003c: line 152
+ | 0040: line 153
+ | 0048: line 154
+ | end sequence
+ |
+ |[bcc] 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/MethodHandle;)Ljava/lang/invoke/CallSite;
+000bcc: 0e00 | registers_size: 000e
+000bce: 0b00 | ins_size: 000b
+000bd0: 0400 | outs_size: 0004
+000bd2: 0000 | tries_size: 0000
+000bd4: a220 0000 | debug_off: 000020a2
+000bd8: 8b00 0000 | insns_size: 0000008b
+ | 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
+000bdc: 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
+000be0: 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
+000be4: 7010 3100 0100 | 0004: invoke-direct {v1}, java.lang.StringBuilder.<init>:()V // method@0031
+ | 0007: code-address
+ | 0007: code-address
+ | 0007: local-snapshot
+ | 0007: code-address
+000bea: 1a02 6700 | 0007: const-string v2, "bsmLookupTest9 [" // utf8@0067
+ | 0009: code-address
+ | 0009: code-address
+ | 0009: local-snapshot
+ | 0009: code-address
+ | 0009: code-address
+ | 0009: local-snapshot
+ | 0009: code-address
+000bee: 6e20 3700 2100 | 0009: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 000c: code-address
+ | 000c: code-address
+ | 000c: local-snapshot
+000bf4: 0c01 | 000c: move-result-object v1
+ | 000d: code-address
+ | 000d: code-address
+ | 000d: local-snapshot
+ | 000d: code-address
+000bf6: 6e20 3600 6100 | 000d: invoke-virtual {v1, v6}, java.lang.StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@0036
+ | 0010: code-address
+ | 0010: code-address
+ | 0010: local-snapshot
+000bfc: 0c01 | 0010: move-result-object v1
+ | 0011: code-address
+ | 0011: code-address
+ | 0011: local-snapshot
+ | 0011: code-address
+000bfe: 1a02 0900 | 0011: const-string v2, ", " // utf8@0009
+ | 0013: code-address
+ | 0013: code-address
+ | 0013: local-snapshot
+ | 0013: code-address
+ | 0013: code-address
+ | 0013: local-snapshot
+ | 0013: code-address
+000c02: 6e20 3700 2100 | 0013: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0016: code-address
+ | 0016: code-address
+ | 0016: local-snapshot
+000c08: 0c01 | 0016: move-result-object v1
+ | 0017: code-address
+ | 0017: code-address
+ | 0017: local-snapshot
+ | 0017: code-address
+000c0a: 6e20 3600 7100 | 0017: invoke-virtual {v1, v7}, java.lang.StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@0036
+ | 001a: code-address
+ | 001a: code-address
+ | 001a: local-snapshot
+000c10: 0c01 | 001a: move-result-object v1
+ | 001b: code-address
+ | 001b: code-address
+ | 001b: local-snapshot
+ | 001b: code-address
+000c12: 1a02 0900 | 001b: const-string v2, ", " // utf8@0009
+ | 001d: code-address
+ | 001d: code-address
+ | 001d: local-snapshot
+ | 001d: code-address
+ | 001d: code-address
+ | 001d: local-snapshot
+ | 001d: code-address
+000c16: 6e20 3700 2100 | 001d: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0020: code-address
+ | 0020: code-address
+ | 0020: local-snapshot
+000c1c: 0c01 | 0020: move-result-object v1
+ | 0021: code-address
+ | 0021: code-address
+ | 0021: local-snapshot
+ | 0021: code-address
+000c1e: 6e20 3600 8100 | 0021: invoke-virtual {v1, v8}, java.lang.StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@0036
+ | 0024: code-address
+ | 0024: code-address
+ | 0024: local-snapshot
+000c24: 0c01 | 0024: move-result-object v1
+ | 0025: code-address
+ | 0025: code-address
+ | 0025: local-snapshot
+ | 0025: code-address
+000c26: 1a02 0900 | 0025: const-string v2, ", " // utf8@0009
+ | 0027: code-address
+ | 0027: code-address
+ | 0027: local-snapshot
+ | 0027: code-address
+ | 0027: code-address
+ | 0027: local-snapshot
+ | 0027: code-address
+000c2a: 6e20 3700 2100 | 0027: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 002a: code-address
+ | 002a: code-address
+ | 002a: local-snapshot
+000c30: 0c01 | 002a: move-result-object v1
+ | 002b: code-address
+ | 002b: code-address
+ | 002b: local-snapshot
+ | 002b: code-address
+000c32: 6e20 3600 9100 | 002b: invoke-virtual {v1, v9}, java.lang.StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@0036
+ | 002e: code-address
+ | 002e: code-address
+ | 002e: local-snapshot
+000c38: 0c01 | 002e: move-result-object v1
+ | 002f: code-address
+ | 002f: code-address
+ | 002f: local-snapshot
+ | 002f: code-address
+000c3a: 1a02 5a00 | 002f: const-string v2, "]" // utf8@005a
+ | 0031: code-address
+ | 0031: code-address
+ | 0031: local-snapshot
+ | 0031: code-address
+ | 0031: code-address
+ | 0031: local-snapshot
+ | 0031: code-address
+000c3e: 6e20 3700 2100 | 0031: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0034: code-address
+ | 0034: code-address
+ | 0034: local-snapshot
+000c44: 0c01 | 0034: move-result-object v1
+ | 0035: code-address
+ | 0035: code-address
+ | 0035: local-snapshot
+ | 0035: code-address
+000c46: 6e10 3800 0100 | 0035: invoke-virtual {v1}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0038
+ | 0038: code-address
+ | 0038: code-address
+ | 0038: local-snapshot
+000c4c: 0c01 | 0038: move-result-object v1
+ | 0039: code-address
+ | 0039: code-address
+ | 0039: local-snapshot
+ | 0039: code-address
+000c4e: 6e20 2a00 1000 | 0039: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 003c: code-address
+ | 003c: code-address
+ | 003c: local-snapshot
+ | 003c: code-address
+000c54: 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
+000c58: 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
+000c5c: 7010 3100 0100 | 0040: invoke-direct {v1}, java.lang.StringBuilder.<init>:()V // method@0031
+ | 0043: code-address
+ | 0043: code-address
+ | 0043: local-snapshot
+ | 0043: code-address
+000c62: 6e20 3700 4100 | 0043: invoke-virtual {v1, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0046: code-address
+ | 0046: code-address
+ | 0046: local-snapshot
+000c68: 0c01 | 0046: move-result-object v1
+ | 0047: code-address
+ | 0047: code-address
+ | 0047: local-snapshot
+ | 0047: code-address
+000c6a: 1a02 0100 | 0047: const-string v2, " " // utf8@0001
+ | 0049: code-address
+ | 0049: code-address
+ | 0049: local-snapshot
+ | 0049: code-address
+ | 0049: code-address
+ | 0049: local-snapshot
+ | 0049: code-address
+000c6e: 6e20 3700 2100 | 0049: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 004c: code-address
+ | 004c: code-address
+ | 004c: local-snapshot
+000c74: 0c01 | 004c: move-result-object v1
+ | 004d: code-address
+ | 004d: code-address
+ | 004d: local-snapshot
+ | 004d: code-address
+000c76: 6e20 3600 5100 | 004d: invoke-virtual {v1, v5}, java.lang.StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@0036
+ | 0050: code-address
+ | 0050: code-address
+ | 0050: local-snapshot
+000c7c: 0c01 | 0050: move-result-object v1
+ | 0051: code-address
+ | 0051: code-address
+ | 0051: local-snapshot
+ | 0051: code-address
+000c7e: 6e10 3800 0100 | 0051: invoke-virtual {v1}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0038
+ | 0054: code-address
+ | 0054: code-address
+ | 0054: local-snapshot
+000c84: 0c01 | 0054: move-result-object v1
+ | 0055: code-address
+ | 0055: code-address
+ | 0055: local-snapshot
+ | 0055: code-address
+000c86: 6e20 2a00 1000 | 0055: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 0058: code-address
+ | 0058: code-address
+ | 0058: local-snapshot
+ | 0058: code-address
+000c8c: 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
+000c92: 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
+000c96: 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
+000c9c: 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
+000ca2: fa20 4100 0a00 2700 | 0063: invoke-polymorphic {v10, v0}, java.lang.invoke.MethodHandle.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)V // method@0041, proto@0027
+ | 0067: code-address
+ | 0067: code-address
+ | 0067: local-snapshot
+000caa: 1230 | 0067: const/4 v0, #int 3 // #3
+ | 0068: code-address
+000cac: fa20 4100 0b00 0500 | 0068: invoke-polymorphic {v11, v0}, java.lang.invoke.MethodHandle.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (I)Linvokecustom/InvokeCustom; // method@0041, proto@0005
+ | 006c: code-address
+ | 006c: code-address
+ | 006c: local-snapshot
+000cb4: 0c00 | 006c: move-result-object v0
+ | 006d: code-address
+ | 006d: code-address
+ | 006d: local-snapshot
+ | 006d: code-address
+000cb6: fa20 3c00 0c00 2700 | 006d: invoke-polymorphic {v12, v0}, java.lang.invoke.MethodHandle.invoke:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)V // method@003c, proto@0027
+ | 0071: code-address
+ | 0071: code-address
+ | 0071: local-snapshot
+ | 0071: code-address
+000cbe: fa20 3c00 0d00 2700 | 0071: invoke-polymorphic {v13, v0}, java.lang.invoke.MethodHandle.invoke:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)V // method@003c, proto@0027
+ | 0075: code-address
+ | 0075: code-address
+ | 0075: local-snapshot
+ | 0075: code-address
+000cc6: 7100 4700 0000 | 0075: invoke-static {}, java.lang.invoke.MethodHandles.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@0047
+ | 0078: code-address
+ | 0078: code-address
+ | 0078: local-snapshot
+000ccc: 0c00 | 0078: move-result-object v0
+ | 0079: code-address
+ | 0079: code-address
+ | 0079: local-snapshot
+ | 0079: code-address
+000cce: 6e10 4600 0000 | 0079: invoke-virtual {v0}, java.lang.invoke.MethodHandles$Lookup.lookupClass:()Ljava/lang/Class; // method@0046
+ | 007c: code-address
+ | 007c: code-address
+ | 007c: local-snapshot
+000cd4: 0c01 | 007c: move-result-object v1
+ | 007d: code-address
+ | 007d: code-address
+ | 007d: local-snapshot
+ | 007d: code-address
+000cd6: 6e40 4500 1054 | 007d: 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@0045
+ | 0080: code-address
+ | 0080: code-address
+ | 0080: local-snapshot
+000cdc: 0c00 | 0080: move-result-object v0
+ | 0081: code-address
+ | 0081: code-address
+ | 0081: local-snapshot
+ | 0081: code-address
+000cde: 2201 1400 | 0081: new-instance v1, java.lang.invoke.ConstantCallSite // type@0014
+ | 0083: code-address
+ | 0083: code-address
+ | 0083: local-snapshot
+ | 0083: code-address
+ | 0083: code-address
+ | 0083: local-snapshot
+ | 0083: code-address
+000ce2: 6e20 3b00 5000 | 0083: invoke-virtual {v0, v5}, java.lang.invoke.MethodHandle.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@003b
+ | 0086: code-address
+ | 0086: code-address
+ | 0086: local-snapshot
+000ce8: 0c00 | 0086: move-result-object v0
+ | 0087: code-address
+ | 0087: code-address
+ | 0087: local-snapshot
+ | 0087: code-address
+000cea: 7020 3900 0100 | 0087: invoke-direct {v1, v0}, java.lang.invoke.ConstantCallSite.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@0039
+ | 008a: code-address
+ | 008a: code-address
+ | 008a: local-snapshot
+000cf0: 1101 | 008a: return-object v1
+ | 008b: code-address
+ | debug info
+ | line_start: 174
+ | parameters_size: 000b
+ | 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
+ | parameter <unnamed> v13
+ | 0000: prologue end
+ | 0000: line 174
+ | 003c: advance pc
+ | 003c: line 176
+ | 0058: advance pc
+ | 0058: line 179
+ | 005b: line 180
+ | 0060: line 181
+ | 0063: line 184
+ | 0067: line 186
+ | 006d: line 187
+ | 0071: line 188
+ | 0075: line 190
+ | 0079: line 191
+ | 0081: line 192
+ | end sequence
+ |
+000cf2: 0000 |
+ |[cf4] invokecustom.InvokeCustom.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+000cf4: 0900 | registers_size: 0009
+000cf6: 0300 | ins_size: 0003
+000cf8: 0300 | outs_size: 0003
+000cfa: 0000 | tries_size: 0000
+000cfc: c220 0000 | debug_off: 000020c2
+000d00: 5200 0000 | insns_size: 00000052
+ | throws java.lang.Throwable
+ | 0000: code-address
+ | 0000: local-snapshot
+000d04: 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
+000d0a: fa20 4100 6700 0100 | 0003: invoke-polymorphic {v7, v6}, java.lang.invoke.MethodHandle.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)F // method@0041, proto@0001
+ | 0007: code-address
+ | 0007: code-address
+ | 0007: local-snapshot
+000d12: 0a00 | 0007: move-result v0
+ | 0008: code-address
+ | 0008: code-address
+ | 0008: local-snapshot
+ | 0008: code-address
+000d14: fa30 4100 6805 2800 | 0008: invoke-polymorphic {v8, v6, v5}, java.lang.invoke.MethodHandle.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;F)V // method@0041, proto@0028
+ | 000c: code-address
+ | 000c: code-address
+ | 000c: local-snapshot
+ | 000c: code-address
+000d1c: fa20 4100 6700 0100 | 000c: invoke-polymorphic {v7, v6}, java.lang.invoke.MethodHandle.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)F // method@0041, proto@0001
+ | 0010: code-address
+ | 0010: code-address
+ | 0010: local-snapshot
+000d24: 0a01 | 0010: move-result v1
+ | 0011: code-address
+ | 0011: code-address
+ | 0011: local-snapshot
+ | 0011: code-address
+000d26: 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
+000d2a: 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
+000d2e: 7010 3100 0300 | 0015: invoke-direct {v3}, java.lang.StringBuilder.<init>:()V // method@0031
+ | 0018: code-address
+ | 0018: code-address
+ | 0018: local-snapshot
+ | 0018: code-address
+000d34: 1a04 6900 | 0018: const-string v4, "checkFieldTest9: old " // utf8@0069
+ | 001a: code-address
+ | 001a: code-address
+ | 001a: local-snapshot
+ | 001a: code-address
+ | 001a: code-address
+ | 001a: local-snapshot
+ | 001a: code-address
+000d38: 6e20 3700 4300 | 001a: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 001d: code-address
+ | 001d: code-address
+ | 001d: local-snapshot
+000d3e: 0c03 | 001d: move-result-object v3
+ | 001e: code-address
+ | 001e: code-address
+ | 001e: local-snapshot
+ | 001e: code-address
+000d40: 6e20 3300 0300 | 001e: invoke-virtual {v3, v0}, java.lang.StringBuilder.append:(F)Ljava/lang/StringBuilder; // method@0033
+ | 0021: code-address
+ | 0021: code-address
+ | 0021: local-snapshot
+000d46: 0c00 | 0021: move-result-object v0
+ | 0022: code-address
+ | 0022: code-address
+ | 0022: local-snapshot
+ | 0022: code-address
+000d48: 1a03 0700 | 0022: const-string v3, " new " // utf8@0007
+ | 0024: code-address
+ | 0024: code-address
+ | 0024: local-snapshot
+ | 0024: code-address
+ | 0024: code-address
+ | 0024: local-snapshot
+ | 0024: code-address
+000d4c: 6e20 3700 3000 | 0024: invoke-virtual {v0, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0027: code-address
+ | 0027: code-address
+ | 0027: local-snapshot
+000d52: 0c00 | 0027: move-result-object v0
+ | 0028: code-address
+ | 0028: code-address
+ | 0028: local-snapshot
+ | 0028: code-address
+000d54: 6e20 3300 1000 | 0028: invoke-virtual {v0, v1}, java.lang.StringBuilder.append:(F)Ljava/lang/StringBuilder; // method@0033
+ | 002b: code-address
+ | 002b: code-address
+ | 002b: local-snapshot
+000d5a: 0c00 | 002b: move-result-object v0
+ | 002c: code-address
+ | 002c: code-address
+ | 002c: local-snapshot
+ | 002c: code-address
+000d5c: 1a03 0600 | 002c: const-string v3, " expected " // utf8@0006
+ | 002e: code-address
+ | 002e: code-address
+ | 002e: local-snapshot
+ | 002e: code-address
+ | 002e: code-address
+ | 002e: local-snapshot
+ | 002e: code-address
+000d60: 6e20 3700 3000 | 002e: invoke-virtual {v0, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0031: code-address
+ | 0031: code-address
+ | 0031: local-snapshot
+000d66: 0c00 | 0031: move-result-object v0
+ | 0032: code-address
+ | 0032: code-address
+ | 0032: local-snapshot
+ | 0032: code-address
+000d68: 6e20 3300 5000 | 0032: invoke-virtual {v0, v5}, java.lang.StringBuilder.append:(F)Ljava/lang/StringBuilder; // method@0033
+ | 0035: code-address
+ | 0035: code-address
+ | 0035: local-snapshot
+000d6e: 0c00 | 0035: move-result-object v0
+ | 0036: code-address
+ | 0036: code-address
+ | 0036: local-snapshot
+ | 0036: code-address
+000d70: 1a03 0100 | 0036: const-string v3, " " // utf8@0001
+ | 0038: code-address
+ | 0038: code-address
+ | 0038: local-snapshot
+ | 0038: code-address
+ | 0038: code-address
+ | 0038: local-snapshot
+ | 0038: code-address
+000d74: 6e20 3700 3000 | 0038: invoke-virtual {v0, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 003b: code-address
+ | 003b: code-address
+ | 003b: local-snapshot
+000d7a: 0c00 | 003b: move-result-object v0
+ | 003c: code-address
+ | 003c: code-address
+ | 003c: local-snapshot
+ | 003c: code-address
+000d7c: 6e10 3800 0000 | 003c: invoke-virtual {v0}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0038
+ | 003f: code-address
+ | 003f: code-address
+ | 003f: local-snapshot
+000d82: 0c00 | 003f: move-result-object v0
+ | 0040: code-address
+ | 0040: code-address
+ | 0040: local-snapshot
+ | 0040: code-address
+000d84: 6e20 2400 0200 | 0040: invoke-virtual {v2, v0}, java.io.PrintStream.print:(Ljava/lang/String;)V // method@0024
+ | 0043: code-address
+ | 0043: code-address
+ | 0043: local-snapshot
+ | 0043: code-address
+000d8a: 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
+000d8e: 2d00 0105 | 0045: cmpl-float v0, v1, v5
+000d92: 3900 0800 | 0047: if-nez v0, 004f // +0008
+ | 0049: code-address
+ | 0049: code-address
+ | 0049: local-snapshot
+ | 0049: code-address
+000d96: 1a00 4500 | 0049: const-string v0, "OK" // utf8@0045
+ | 004b: code-address
+ | 004b: code-address
+ | 004b: local-snapshot
+ | 004b: code-address
+ | 004b: code-address
+ | 004b: local-snapshot
+ | 004b: code-address
+000d9a: 6e20 2a00 0200 | 004b: invoke-virtual {v2, v0}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 004e: code-address
+ | 004e: code-address
+ | 004e: local-snapshot
+000da0: 0e00 | 004e: return-void
+ | 004f: code-address
+ | 004f: code-address
+ | 004f: local-snapshot
+ | 004f: code-address
+000da2: 1a00 1100 | 004f: const-string v0, "ERROR" // utf8@0011
+ | 0051: code-address
+ | 0051: code-address
+ | 0051: local-snapshot
+ | 0051: code-address
+000da6: 28fa | 0051: goto 004b // -0006
+ | debug info
+ | line_start: 120
+ | parameters_size: 0002
+ | parameter <unnamed> v7
+ | parameter <unnamed> v8
+ | 0000: prologue end
+ | 0003: line 120
+ | 0008: line 121
+ | 000c: line 122
+ | 0011: line 123
+ | 0043: advance pc
+ | 0043: line 125
+ | 004e: line 126
+ | 004f: line 125
+ | end sequence
+ |
+ |[da8] invokecustom.InvokeCustom.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+000da8: 0800 | registers_size: 0008
+000daa: 0200 | ins_size: 0002
+000dac: 0200 | outs_size: 0002
+000dae: 0000 | tries_size: 0000
+000db0: d120 0000 | debug_off: 000020d1
+000db4: 5000 0000 | insns_size: 00000050
+ | throws java.lang.Throwable
+ | 0000: code-address
+ | 0000: local-snapshot
+000db8: 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
+000dbe: fa10 4100 0600 0200 | 0003: invoke-polymorphic {v6}, java.lang.invoke.MethodHandle.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, ()I // method@0041, proto@0002
+ | 0007: code-address
+ | 0007: code-address
+ | 0007: local-snapshot
+000dc6: 0a00 | 0007: move-result v0
+ | 0008: code-address
+ | 0008: code-address
+ | 0008: local-snapshot
+ | 0008: code-address
+000dc8: fa20 4100 5700 2500 | 0008: invoke-polymorphic {v7, v5}, java.lang.invoke.MethodHandle.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (I)V // method@0041, proto@0025
+ | 000c: code-address
+ | 000c: code-address
+ | 000c: local-snapshot
+ | 000c: code-address
+000dd0: fa10 4100 0600 0200 | 000c: invoke-polymorphic {v6}, java.lang.invoke.MethodHandle.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, ()I // method@0041, proto@0002
+ | 0010: code-address
+ | 0010: code-address
+ | 0010: local-snapshot
+000dd8: 0a01 | 0010: move-result v1
+ | 0011: code-address
+ | 0011: code-address
+ | 0011: local-snapshot
+ | 0011: code-address
+000dda: 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
+000dde: 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
+000de2: 7010 3100 0300 | 0015: invoke-direct {v3}, java.lang.StringBuilder.<init>:()V // method@0031
+ | 0018: code-address
+ | 0018: code-address
+ | 0018: local-snapshot
+ | 0018: code-address
+000de8: 1a04 6b00 | 0018: const-string v4, "checkStaticFieldTest9: old " // utf8@006b
+ | 001a: code-address
+ | 001a: code-address
+ | 001a: local-snapshot
+ | 001a: code-address
+ | 001a: code-address
+ | 001a: local-snapshot
+ | 001a: code-address
+000dec: 6e20 3700 4300 | 001a: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 001d: code-address
+ | 001d: code-address
+ | 001d: local-snapshot
+000df2: 0c03 | 001d: move-result-object v3
+ | 001e: code-address
+ | 001e: code-address
+ | 001e: local-snapshot
+ | 001e: code-address
+000df4: 6e20 3400 0300 | 001e: invoke-virtual {v3, v0}, java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder; // method@0034
+ | 0021: code-address
+ | 0021: code-address
+ | 0021: local-snapshot
+000dfa: 0c00 | 0021: move-result-object v0
+ | 0022: code-address
+ | 0022: code-address
+ | 0022: local-snapshot
+ | 0022: code-address
+000dfc: 1a03 0700 | 0022: const-string v3, " new " // utf8@0007
+ | 0024: code-address
+ | 0024: code-address
+ | 0024: local-snapshot
+ | 0024: code-address
+ | 0024: code-address
+ | 0024: local-snapshot
+ | 0024: code-address
+000e00: 6e20 3700 3000 | 0024: invoke-virtual {v0, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0027: code-address
+ | 0027: code-address
+ | 0027: local-snapshot
+000e06: 0c00 | 0027: move-result-object v0
+ | 0028: code-address
+ | 0028: code-address
+ | 0028: local-snapshot
+ | 0028: code-address
+000e08: 6e20 3400 1000 | 0028: invoke-virtual {v0, v1}, java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder; // method@0034
+ | 002b: code-address
+ | 002b: code-address
+ | 002b: local-snapshot
+000e0e: 0c00 | 002b: move-result-object v0
+ | 002c: code-address
+ | 002c: code-address
+ | 002c: local-snapshot
+ | 002c: code-address
+000e10: 1a03 0600 | 002c: const-string v3, " expected " // utf8@0006
+ | 002e: code-address
+ | 002e: code-address
+ | 002e: local-snapshot
+ | 002e: code-address
+ | 002e: code-address
+ | 002e: local-snapshot
+ | 002e: code-address
+000e14: 6e20 3700 3000 | 002e: invoke-virtual {v0, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0031: code-address
+ | 0031: code-address
+ | 0031: local-snapshot
+000e1a: 0c00 | 0031: move-result-object v0
+ | 0032: code-address
+ | 0032: code-address
+ | 0032: local-snapshot
+ | 0032: code-address
+000e1c: 6e20 3400 5000 | 0032: invoke-virtual {v0, v5}, java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder; // method@0034
+ | 0035: code-address
+ | 0035: code-address
+ | 0035: local-snapshot
+000e22: 0c00 | 0035: move-result-object v0
+ | 0036: code-address
+ | 0036: code-address
+ | 0036: local-snapshot
+ | 0036: code-address
+000e24: 1a03 0100 | 0036: const-string v3, " " // utf8@0001
+ | 0038: code-address
+ | 0038: code-address
+ | 0038: local-snapshot
+ | 0038: code-address
+ | 0038: code-address
+ | 0038: local-snapshot
+ | 0038: code-address
+000e28: 6e20 3700 3000 | 0038: invoke-virtual {v0, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 003b: code-address
+ | 003b: code-address
+ | 003b: local-snapshot
+000e2e: 0c00 | 003b: move-result-object v0
+ | 003c: code-address
+ | 003c: code-address
+ | 003c: local-snapshot
+ | 003c: code-address
+000e30: 6e10 3800 0000 | 003c: invoke-virtual {v0}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0038
+ | 003f: code-address
+ | 003f: code-address
+ | 003f: local-snapshot
+000e36: 0c00 | 003f: move-result-object v0
+ | 0040: code-address
+ | 0040: code-address
+ | 0040: local-snapshot
+ | 0040: code-address
+000e38: 6e20 2400 0200 | 0040: invoke-virtual {v2, v0}, java.io.PrintStream.print:(Ljava/lang/String;)V // method@0024
+ | 0043: code-address
+ | 0043: code-address
+ | 0043: local-snapshot
+ | 0043: code-address
+000e3e: 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
+000e42: 3351 0800 | 0045: if-ne v1, v5, 004d // +0008
+ | 0047: code-address
+ | 0047: code-address
+ | 0047: local-snapshot
+ | 0047: code-address
+000e46: 1a00 4500 | 0047: const-string v0, "OK" // utf8@0045
+ | 0049: code-address
+ | 0049: code-address
+ | 0049: local-snapshot
+ | 0049: code-address
+ | 0049: code-address
+ | 0049: local-snapshot
+ | 0049: code-address
+000e4a: 6e20 2a00 0200 | 0049: invoke-virtual {v2, v0}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 004c: code-address
+ | 004c: code-address
+ | 004c: local-snapshot
+000e50: 0e00 | 004c: return-void
+ | 004d: code-address
+ | 004d: code-address
+ | 004d: local-snapshot
+ | 004d: code-address
+000e52: 1a00 1100 | 004d: const-string v0, "ERROR" // utf8@0011
+ | 004f: code-address
+ | 004f: code-address
+ | 004f: local-snapshot
+ | 004f: code-address
+000e56: 28fa | 004f: goto 0049 // -0006
+ | debug info
+ | line_start: 107
+ | parameters_size: 0002
+ | parameter <unnamed> v6
+ | parameter <unnamed> v7
+ | 0000: prologue end
+ | 0003: line 107
+ | 0008: line 108
+ | 000c: line 109
+ | 0011: line 110
+ | 0043: advance pc
+ | 0043: line 112
+ | 004c: line 113
+ | 004d: line 112
+ | end sequence
+ |
+ |[e58] invokecustom.InvokeCustom.lambda$lambdaTest$0:(Ljava/lang/String;)Z
+000e58: 0300 | registers_size: 0003
+000e5a: 0100 | ins_size: 0001
+000e5c: 0200 | outs_size: 0002
+000e5e: 0000 | tries_size: 0000
+000e60: e020 0000 | debug_off: 000020e0
+000e64: 0b00 0000 | insns_size: 0000000b
+ | 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
+000e68: 1a00 4600 | 0000: const-string v0, "One" // utf8@0046
+ | 0002: code-address
+ | 0002: code-address
+ | 0002: local-snapshot
+ | 0002: code-address
+ | 0002: code-address
+ | 0002: local-snapshot
+ | 0002: code-address
+000e6c: 6e10 3000 0200 | 0002: invoke-virtual {v2}, java.lang.String.trim:()Ljava/lang/String; // method@0030
+ | 0005: code-address
+ | 0005: code-address
+ | 0005: local-snapshot
+000e72: 0c01 | 0005: move-result-object v1
+ | 0006: code-address
+ | 0006: code-address
+ | 0006: local-snapshot
+ | 0006: code-address
+000e74: 6e20 2f00 1000 | 0006: invoke-virtual {v0, v1}, java.lang.String.equals:(Ljava/lang/Object;)Z // method@002f
+ | 0009: code-address
+ | 0009: code-address
+ | 0009: local-snapshot
+000e7a: 0a00 | 0009: move-result v0
+ | 000a: code-address
+ | 000a: code-address
+ | 000a: local-snapshot
+000e7c: 0f00 | 000a: return v0
+ | 000b: code-address
+ | debug info
+ | line_start: 197
+ | parameters_size: 0001
+ | parameter <unnamed> v2
+ | 0000: prologue end
+ | 0000: line 197
+ | end sequence
+ |
+000e7e: 0000 |
+ |[e80] invokecustom.InvokeCustom.lambdaTest:()V
+000e80: 0300 | registers_size: 0003
+000e82: 0000 | ins_size: 0000
+000e84: 0200 | outs_size: 0002
+000e86: 0000 | tries_size: 0000
+000e88: e720 0000 | debug_off: 000020e7
+000e8c: 4700 0000 | insns_size: 00000047
+ | 0000: code-address
+ | 0000: local-snapshot
+ | 0000: code-address
+ | 0000: code-address
+ | 0000: local-snapshot
+000e90: 1230 | 0000: const/4 v0, #int 3 // #3
+ | 0001: code-address
+000e92: 2300 2500 | 0001: new-array v0, v0, java.lang.String[] // type@0025
+ | 0003: code-address
+ | 0003: code-address
+ | 0003: local-snapshot
+ | 0003: code-address
+ | 0003: code-address
+ | 0003: local-snapshot
+000e96: 1201 | 0003: const/4 v1, #int 0 // #0
+ | 0004: code-address
+000e98: 1a02 4a00 | 0004: const-string v2, "Three" // utf8@004a
+ | 0006: code-address
+ | 0006: code-address
+ | 0006: local-snapshot
+ | 0006: code-address
+ | 0006: code-address
+ | 0006: local-snapshot
+ | 0006: code-address
+000e9c: 4d02 0001 | 0006: aput-object v2, v0, v1
+ | 0008: code-address
+ | 0008: code-address
+ | 0008: local-snapshot
+000ea0: 1211 | 0008: const/4 v1, #int 1 // #1
+ | 0009: code-address
+000ea2: 1a02 4600 | 0009: const-string v2, "One" // utf8@0046
+ | 000b: code-address
+ | 000b: code-address
+ | 000b: local-snapshot
+ | 000b: code-address
+ | 000b: code-address
+ | 000b: local-snapshot
+ | 000b: code-address
+000ea6: 4d02 0001 | 000b: aput-object v2, v0, v1
+ | 000d: code-address
+ | 000d: code-address
+ | 000d: local-snapshot
+000eaa: 1221 | 000d: const/4 v1, #int 2 // #2
+ | 000e: code-address
+000eac: 1a02 1600 | 000e: const-string v2, "FortyTwo" // utf8@0016
+ | 0010: code-address
+ | 0010: code-address
+ | 0010: local-snapshot
+ | 0010: code-address
+ | 0010: code-address
+ | 0010: local-snapshot
+ | 0010: code-address
+000eb0: 4d02 0001 | 0010: aput-object v2, v0, v1
+ | 0012: code-address
+ | 0012: code-address
+ | 0012: local-snapshot
+ | 0012: code-address
+000eb4: 7110 4800 0000 | 0012: invoke-static {v0}, java.util.Arrays.asList:([Ljava/lang/Object;)Ljava/util/List; // method@0048
+ | 0015: code-address
+ | 0015: code-address
+ | 0015: local-snapshot
+000eba: 0c01 | 0015: move-result-object v1
+ | 0016: code-address
+ | 0016: code-address
+ | 0016: local-snapshot
+ | 0016: code-address
+000ebc: 7210 4900 0100 | 0016: invoke-interface {v1}, java.util.List.stream:()Ljava/util/stream/Stream; // method@0049
+ | 0019: code-address
+ | 0019: code-address
+ | 0019: local-snapshot
+000ec2: 0c00 | 0019: move-result-object v0
+ | 001a: code-address
+ | 001a: code-address
+ | 001a: local-snapshot
+ | 001a: code-address
+000ec4: fc00 0000 0000 | 001a: invoke-custom {}, {invoke-static,method{java.lang.invoke.LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}, test, ()Ljava/util/function/Predicate;, (Ljava/lang/Object;)Z, invoke-static,method{invokecustom.InvokeCustom.lambda$lambdaTest$0:(Ljava/lang/String;)Z}, (Ljava/lang/String;)Z} // CallSiteRef@0000
+ | 001d: code-address
+ | 001d: code-address
+ | 001d: local-snapshot
+000eca: 0c02 | 001d: move-result-object v2
+ | 001e: code-address
+ | 001e: code-address
+ | 001e: local-snapshot
+ | 001e: code-address
+000ecc: 7220 4b00 2000 | 001e: invoke-interface {v0, v2}, java.util.stream.Stream.filter:(Ljava/util/function/Predicate;)Ljava/util/stream/Stream; // method@004b
+ | 0021: code-address
+ | 0021: code-address
+ | 0021: local-snapshot
+000ed2: 0c00 | 0021: move-result-object v0
+ | 0022: code-address
+ | 0022: code-address
+ | 0022: local-snapshot
+ | 0022: code-address
+000ed4: fc00 0100 0000 | 0022: invoke-custom {}, {invoke-static,method{java.lang.invoke.LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}, apply, ()Ljava/util/function/Function;, (Ljava/lang/Object;)Ljava/lang/Object;, invoke-instance,method{java.lang.String.trim:()Ljava/lang/String;}, (Ljava/lang/String;)Ljava/lang/String;} // CallSiteRef@0001
+ | 0025: code-address
+ | 0025: code-address
+ | 0025: local-snapshot
+000eda: 0c02 | 0025: move-result-object v2
+ | 0026: code-address
+ | 0026: code-address
+ | 0026: local-snapshot
+ | 0026: code-address
+000edc: 7220 4e00 2000 | 0026: invoke-interface {v0, v2}, java.util.stream.Stream.map:(Ljava/util/function/Function;)Ljava/util/stream/Stream; // method@004e
+ | 0029: code-address
+ | 0029: code-address
+ | 0029: local-snapshot
+000ee2: 0c00 | 0029: move-result-object v0
+ | 002a: code-address
+ | 002a: code-address
+ | 002a: local-snapshot
+ | 002a: code-address
+000ee4: 7210 4c00 0000 | 002a: invoke-interface {v0}, java.util.stream.Stream.findAny:()Ljava/util/Optional; // method@004c
+ | 002d: code-address
+ | 002d: code-address
+ | 002d: local-snapshot
+000eea: 0c00 | 002d: move-result-object v0
+ | 002e: code-address
+ | 002e: code-address
+ | 002e: local-snapshot
+ | 002e: code-address
+000eec: 1a02 0000 | 002e: const-string v2, "" // utf8@0000
+ | 0030: code-address
+ | 0030: code-address
+ | 0030: local-snapshot
+ | 0030: code-address
+ | 0030: code-address
+ | 0030: local-snapshot
+ | 0030: code-address
+000ef0: 6e20 4a00 2000 | 0030: invoke-virtual {v0, v2}, java.util.Optional.orElse:(Ljava/lang/Object;)Ljava/lang/Object; // method@004a
+ | 0033: code-address
+ | 0033: code-address
+ | 0033: local-snapshot
+000ef6: 0c00 | 0033: move-result-object v0
+ | 0034: code-address
+ | 0034: code-address
+ | 0034: local-snapshot
+ | 0034: code-address
+000ef8: 1f00 0f00 | 0034: check-cast v0, java.lang.String // type@000f
+ | 0036: code-address
+ | 0036: code-address
+ | 0036: local-snapshot
+ | 0036: code-address
+ | 0036: code-address
+ | 0036: local-snapshot
+ | 0036: code-address
+000efc: 7210 4900 0100 | 0036: invoke-interface {v1}, java.util.List.stream:()Ljava/util/stream/Stream; // method@0049
+ | 0039: code-address
+ | 0039: code-address
+ | 0039: local-snapshot
+000f02: 0c00 | 0039: move-result-object v0
+ | 003a: code-address
+ | 003a: code-address
+ | 003a: local-snapshot
+ | 003a: code-address
+000f04: 6201 0200 | 003a: sget-object v1, java.lang.System.out:Ljava/io/PrintStream; // field@0002
+ | 003c: code-address
+ | 003c: code-address
+ | 003c: local-snapshot
+ | 003c: code-address
+ | 003c: code-address
+ | 003c: local-snapshot
+ | 003c: code-address
+000f08: 6e10 2d00 0100 | 003c: invoke-virtual {v1}, java.lang.Object.getClass:()Ljava/lang/Class; // method@002d
+ | 003f: code-address
+ | 003f: code-address
+ | 003f: local-snapshot
+ | 003f: code-address
+000f0e: fc10 0200 0100 | 003f: invoke-custom {v1}, {invoke-static,method{java.lang.invoke.LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}, accept, (Ljava/io/PrintStream;)Ljava/util/function/Consumer;, (Ljava/lang/Object;)V, invoke-instance,method{java.io.PrintStream.println:(Ljava/lang/String;)V}, (Ljava/lang/String;)V} // CallSiteRef@0002
+ | 0042: code-address
+ | 0042: code-address
+ | 0042: local-snapshot
+000f14: 0c01 | 0042: move-result-object v1
+ | 0043: code-address
+ | 0043: code-address
+ | 0043: local-snapshot
+ | 0043: code-address
+000f16: 7220 4d00 1000 | 0043: invoke-interface {v0, v1}, java.util.stream.Stream.forEach:(Ljava/util/function/Consumer;)V // method@004d
+ | 0046: code-address
+ | 0046: code-address
+ | 0046: local-snapshot
+000f1c: 0e00 | 0046: return-void
+ | 0047: code-address
+ | debug info
+ | line_start: 196
+ | parameters_size: 0000
+ | 0000: prologue end
+ | 0000: line 196
+ | 0016: advance pc
+ | 0016: line 197
+ | 0026: line 198
+ | 0036: line 199
+ | 0046: line 200
+ | end sequence
+ |
+000f1e: 0000 |
+ |[f20] invokecustom.InvokeCustom.main:([Ljava/lang/String;)V
+000f20: 0100 | registers_size: 0001
+000f22: 0100 | ins_size: 0001
+000f24: 0000 | outs_size: 0000
+000f26: 0000 | tries_size: 0000
+000f28: 0000 0000 | debug_off: 00000000
+000f2c: 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
+000f30: 7100 1800 0000 | 0000: invoke-static {}, invokecustom.InvokeCustom.test1:()V // method@0018
+ | 0003: code-address
+ | 0003: code-address
+ | 0003: local-snapshot
+ | 0003: code-address
+000f36: 7100 1900 0000 | 0003: invoke-static {}, invokecustom.InvokeCustom.test2:()V // method@0019
+ | 0006: code-address
+ | 0006: code-address
+ | 0006: local-snapshot
+ | 0006: code-address
+000f3c: 7100 1a00 0000 | 0006: invoke-static {}, invokecustom.InvokeCustom.test3:()V // method@001a
+ | 0009: code-address
+ | 0009: code-address
+ | 0009: local-snapshot
+ | 0009: code-address
+000f42: 7100 1b00 0000 | 0009: invoke-static {}, invokecustom.InvokeCustom.test4:()V // method@001b
+ | 000c: code-address
+ | 000c: code-address
+ | 000c: local-snapshot
+ | 000c: code-address
+000f48: 7100 1c00 0000 | 000c: invoke-static {}, invokecustom.InvokeCustom.test5:()V // method@001c
+ | 000f: code-address
+ | 000f: code-address
+ | 000f: local-snapshot
+ | 000f: code-address
+000f4e: 7100 1d00 0000 | 000f: invoke-static {}, invokecustom.InvokeCustom.test6:()V // method@001d
+ | 0012: code-address
+ | 0012: code-address
+ | 0012: local-snapshot
+ | 0012: code-address
+000f54: 7100 1e00 0000 | 0012: invoke-static {}, invokecustom.InvokeCustom.test7:()V // method@001e
+ | 0015: code-address
+ | 0015: code-address
+ | 0015: local-snapshot
+ | 0015: code-address
+000f5a: 7100 1f00 0000 | 0015: invoke-static {}, invokecustom.InvokeCustom.test8:()V // method@001f
+ | 0018: code-address
+ | 0018: code-address
+ | 0018: local-snapshot
+ | 0018: code-address
+000f60: 7100 2000 0000 | 0018: invoke-static {}, invokecustom.InvokeCustom.test9:()V // method@0020
+ | 001b: code-address
+ | 001b: code-address
+ | 001b: local-snapshot
+000f66: 0e00 | 001b: return-void
+ | 001c: code-address
+ |
+ |[f68] invokecustom.InvokeCustom.privateMethodTest9:()V
+000f68: 0300 | registers_size: 0003
+000f6a: 0100 | ins_size: 0001
+000f6c: 0200 | outs_size: 0002
+000f6e: 0000 | tries_size: 0000
+000f70: f320 0000 | debug_off: 000020f3
+000f74: 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
+000f78: 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
+000f7c: 1a01 1c00 | 0002: const-string v1, "InvokeCustom.privateMethodTest9()" // utf8@001c
+ | 0004: code-address
+ | 0004: code-address
+ | 0004: local-snapshot
+ | 0004: code-address
+ | 0004: code-address
+ | 0004: local-snapshot
+ | 0004: code-address
+000f80: 6e20 2a00 1000 | 0004: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 0007: code-address
+ | 0007: code-address
+ | 0007: local-snapshot
+000f86: 0e00 | 0007: return-void
+ | 0008: code-address
+ | debug info
+ | line_start: 165
+ | parameters_size: 0000
+ | 0000: prologue end
+ | 0000: line 165
+ | 0007: line 166
+ | end sequence
+ |
+ |[f88] invokecustom.InvokeCustom.targetMethodTest1:()V
+000f88: 0200 | registers_size: 0002
+000f8a: 0000 | ins_size: 0000
+000f8c: 0200 | outs_size: 0002
+000f8e: 0000 | tries_size: 0000
+000f90: fa20 0000 | debug_off: 000020fa
+000f94: 0800 0000 | insns_size: 00000008
+ | 0000: code-address
+ | 0000: local-snapshot
+ | 0000: code-address
+ | 0000: code-address
+ | 0000: local-snapshot
+ | 0000: code-address
+000f98: 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
+000f9c: 1a01 1700 | 0002: const-string v1, "Hello World!" // utf8@0017
+ | 0004: code-address
+ | 0004: code-address
+ | 0004: local-snapshot
+ | 0004: code-address
+ | 0004: code-address
+ | 0004: local-snapshot
+ | 0004: code-address
+000fa0: 6e20 2a00 1000 | 0004: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 0007: code-address
+ | 0007: code-address
+ | 0007: local-snapshot
+000fa6: 0e00 | 0007: return-void
+ | 0008: code-address
+ | debug info
+ | line_start: 45
+ | parameters_size: 0000
+ | 0000: prologue end
+ | 0000: line 45
+ | 0007: line 46
+ | end sequence
+ |
+ |[fa8] invokecustom.InvokeCustom.targetMethodTest2:(ZBCSIFJDLjava/lang/String;)V
+000fa8: 0d00 | registers_size: 000d
+000faa: 0b00 | ins_size: 000b
+000fac: 0300 | outs_size: 0003
+000fae: 0000 | tries_size: 0000
+000fb0: 0021 0000 | debug_off: 00002100
+000fb4: 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
+000fb8: 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
+000fbc: 6e20 2b00 2000 | 0002: invoke-virtual {v0, v2}, java.io.PrintStream.println:(Z)V // method@002b
+ | 0005: code-address
+ | 0005: code-address
+ | 0005: local-snapshot
+ | 0005: code-address
+000fc2: 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
+000fc6: 6e20 2800 3000 | 0007: invoke-virtual {v0, v3}, java.io.PrintStream.println:(I)V // method@0028
+ | 000a: code-address
+ | 000a: code-address
+ | 000a: local-snapshot
+ | 000a: code-address
+000fcc: 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
+000fd0: 6e20 2500 4000 | 000c: invoke-virtual {v0, v4}, java.io.PrintStream.println:(C)V // method@0025
+ | 000f: code-address
+ | 000f: code-address
+ | 000f: local-snapshot
+ | 000f: code-address
+000fd6: 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
+000fda: 6e20 2800 5000 | 0011: invoke-virtual {v0, v5}, java.io.PrintStream.println:(I)V // method@0028
+ | 0014: code-address
+ | 0014: code-address
+ | 0014: local-snapshot
+ | 0014: code-address
+000fe0: 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
+000fe4: 6e20 2800 6000 | 0016: invoke-virtual {v0, v6}, java.io.PrintStream.println:(I)V // method@0028
+ | 0019: code-address
+ | 0019: code-address
+ | 0019: local-snapshot
+ | 0019: code-address
+000fea: 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
+000fee: 6e20 2700 7000 | 001b: invoke-virtual {v0, v7}, java.io.PrintStream.println:(F)V // method@0027
+ | 001e: code-address
+ | 001e: code-address
+ | 001e: local-snapshot
+ | 001e: code-address
+000ff4: 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
+000ff8: 6e30 2900 8009 | 0020: invoke-virtual {v0, v8, v9}, java.io.PrintStream.println:(J)V // method@0029
+ | 0023: code-address
+ | 0023: code-address
+ | 0023: local-snapshot
+ | 0023: code-address
+000ffe: 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
+001002: 6e30 2600 a00b | 0025: invoke-virtual {v0, v10, v11}, java.io.PrintStream.println:(D)V // method@0026
+ | 0028: code-address
+ | 0028: code-address
+ | 0028: local-snapshot
+ | 0028: code-address
+001008: 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
+00100c: 6e20 2a00 c000 | 002a: invoke-virtual {v0, v12}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 002d: code-address
+ | 002d: code-address
+ | 002d: local-snapshot
+001012: 0e00 | 002d: return-void
+ | 002e: code-address
+ | debug info
+ | line_start: 50
+ | 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 50
+ | 0005: line 51
+ | 000a: line 52
+ | 000f: line 53
+ | 0014: line 54
+ | 0019: line 55
+ | 001e: line 56
+ | 0023: line 57
+ | 0028: line 58
+ | 002d: line 59
+ | end sequence
+ |
+ |[1014] invokecustom.InvokeCustom.targetMethodTest3:()V
+001014: 0200 | registers_size: 0002
+001016: 0000 | ins_size: 0000
+001018: 0200 | outs_size: 0002
+00101a: 0000 | tries_size: 0000
+00101c: 1721 0000 | debug_off: 00002117
+001020: 0800 0000 | insns_size: 00000008
+ | 0000: code-address
+ | 0000: local-snapshot
+ | 0000: code-address
+ | 0000: code-address
+ | 0000: local-snapshot
+ | 0000: code-address
+001024: 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
+001028: 1a01 8a00 | 0002: const-string v1, "targetMethodTest3 from InvokeCustom" // utf8@008a
+ | 0004: code-address
+ | 0004: code-address
+ | 0004: local-snapshot
+ | 0004: code-address
+ | 0004: code-address
+ | 0004: local-snapshot
+ | 0004: code-address
+00102c: 6e20 2a00 1000 | 0004: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 0007: code-address
+ | 0007: code-address
+ | 0007: local-snapshot
+001032: 0e00 | 0007: return-void
+ | 0008: code-address
+ | debug info
+ | line_start: 62
+ | parameters_size: 0000
+ | 0000: prologue end
+ | 0000: line 62
+ | 0007: line 63
+ | end sequence
+ |
+ |[1034] invokecustom.InvokeCustom.targetMethodTest5:(III)I
+001034: 0700 | registers_size: 0007
+001036: 0300 | ins_size: 0003
+001038: 0200 | outs_size: 0002
+00103a: 0000 | tries_size: 0000
+00103c: 1d21 0000 | debug_off: 0000211d
+001040: 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
+001044: 9000 0405 | 0000: add-int v0, v4, v5
+ | 0002: code-address
+001048: 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
+00104c: 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
+001050: 7010 3100 0200 | 0006: invoke-direct {v2}, java.lang.StringBuilder.<init>:()V // method@0031
+ | 0009: code-address
+ | 0009: code-address
+ | 0009: local-snapshot
+ | 0009: code-address
+001056: 1a03 8f00 | 0009: const-string v3, "targetMethodTest5 " // utf8@008f
+ | 000b: code-address
+ | 000b: code-address
+ | 000b: local-snapshot
+ | 000b: code-address
+ | 000b: code-address
+ | 000b: local-snapshot
+ | 000b: code-address
+00105a: 6e20 3700 3200 | 000b: invoke-virtual {v2, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 000e: code-address
+ | 000e: code-address
+ | 000e: local-snapshot
+001060: 0c02 | 000e: move-result-object v2
+ | 000f: code-address
+ | 000f: code-address
+ | 000f: local-snapshot
+ | 000f: code-address
+001062: 6e20 3400 4200 | 000f: invoke-virtual {v2, v4}, java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder; // method@0034
+ | 0012: code-address
+ | 0012: code-address
+ | 0012: local-snapshot
+001068: 0c02 | 0012: move-result-object v2
+ | 0013: code-address
+ | 0013: code-address
+ | 0013: local-snapshot
+ | 0013: code-address
+00106a: 1a03 0400 | 0013: const-string v3, " + " // utf8@0004
+ | 0015: code-address
+ | 0015: code-address
+ | 0015: local-snapshot
+ | 0015: code-address
+ | 0015: code-address
+ | 0015: local-snapshot
+ | 0015: code-address
+00106e: 6e20 3700 3200 | 0015: invoke-virtual {v2, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0018: code-address
+ | 0018: code-address
+ | 0018: local-snapshot
+001074: 0c02 | 0018: move-result-object v2
+ | 0019: code-address
+ | 0019: code-address
+ | 0019: local-snapshot
+ | 0019: code-address
+001076: 6e20 3400 5200 | 0019: invoke-virtual {v2, v5}, java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder; // method@0034
+ | 001c: code-address
+ | 001c: code-address
+ | 001c: local-snapshot
+00107c: 0c02 | 001c: move-result-object v2
+ | 001d: code-address
+ | 001d: code-address
+ | 001d: local-snapshot
+ | 001d: code-address
+00107e: 1a03 0500 | 001d: const-string v3, " = " // utf8@0005
+ | 001f: code-address
+ | 001f: code-address
+ | 001f: local-snapshot
+ | 001f: code-address
+ | 001f: code-address
+ | 001f: local-snapshot
+ | 001f: code-address
+001082: 6e20 3700 3200 | 001f: invoke-virtual {v2, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0022: code-address
+ | 0022: code-address
+ | 0022: local-snapshot
+001088: 0c02 | 0022: move-result-object v2
+ | 0023: code-address
+ | 0023: code-address
+ | 0023: local-snapshot
+ | 0023: code-address
+00108a: 6e20 3400 0200 | 0023: invoke-virtual {v2, v0}, java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder; // method@0034
+ | 0026: code-address
+ | 0026: code-address
+ | 0026: local-snapshot
+001090: 0c02 | 0026: move-result-object v2
+ | 0027: code-address
+ | 0027: code-address
+ | 0027: local-snapshot
+ | 0027: code-address
+001092: 6e10 3800 0200 | 0027: invoke-virtual {v2}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0038
+ | 002a: code-address
+ | 002a: code-address
+ | 002a: local-snapshot
+001098: 0c02 | 002a: move-result-object v2
+ | 002b: code-address
+ | 002b: code-address
+ | 002b: local-snapshot
+ | 002b: code-address
+00109a: 6e20 2a00 2100 | 002b: invoke-virtual {v1, v2}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 002e: code-address
+ | 002e: code-address
+ | 002e: local-snapshot
+0010a0: 3260 2400 | 002e: if-eq v0, v6, 0052 // +0024
+ | 0030: code-address
+ | 0030: code-address
+ | 0030: local-snapshot
+ | 0030: code-address
+0010a4: 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
+0010a8: 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
+0010ac: 7010 3100 0200 | 0034: invoke-direct {v2}, java.lang.StringBuilder.<init>:()V // method@0031
+ | 0037: code-address
+ | 0037: code-address
+ | 0037: local-snapshot
+ | 0037: code-address
+0010b2: 1a03 1400 | 0037: const-string v3, "Failed " // utf8@0014
+ | 0039: code-address
+ | 0039: code-address
+ | 0039: local-snapshot
+ | 0039: code-address
+ | 0039: code-address
+ | 0039: local-snapshot
+ | 0039: code-address
+0010b6: 6e20 3700 3200 | 0039: invoke-virtual {v2, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 003c: code-address
+ | 003c: code-address
+ | 003c: local-snapshot
+0010bc: 0c02 | 003c: move-result-object v2
+ | 003d: code-address
+ | 003d: code-address
+ | 003d: local-snapshot
+ | 003d: code-address
+0010be: 6e20 3400 0200 | 003d: invoke-virtual {v2, v0}, java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder; // method@0034
+ | 0040: code-address
+ | 0040: code-address
+ | 0040: local-snapshot
+0010c4: 0c02 | 0040: move-result-object v2
+ | 0041: code-address
+ | 0041: code-address
+ | 0041: local-snapshot
+ | 0041: code-address
+0010c6: 1a03 0200 | 0041: const-string v3, " != " // utf8@0002
+ | 0043: code-address
+ | 0043: code-address
+ | 0043: local-snapshot
+ | 0043: code-address
+ | 0043: code-address
+ | 0043: local-snapshot
+ | 0043: code-address
+0010ca: 6e20 3700 3200 | 0043: invoke-virtual {v2, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0046: code-address
+ | 0046: code-address
+ | 0046: local-snapshot
+0010d0: 0c02 | 0046: move-result-object v2
+ | 0047: code-address
+ | 0047: code-address
+ | 0047: local-snapshot
+ | 0047: code-address
+0010d2: 6e20 3400 6200 | 0047: invoke-virtual {v2, v6}, java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder; // method@0034
+ | 004a: code-address
+ | 004a: code-address
+ | 004a: local-snapshot
+0010d8: 0c02 | 004a: move-result-object v2
+ | 004b: code-address
+ | 004b: code-address
+ | 004b: local-snapshot
+ | 004b: code-address
+0010da: 6e10 3800 0200 | 004b: invoke-virtual {v2}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0038
+ | 004e: code-address
+ | 004e: code-address
+ | 004e: local-snapshot
+0010e0: 0c02 | 004e: move-result-object v2
+ | 004f: code-address
+ | 004f: code-address
+ | 004f: local-snapshot
+ | 004f: code-address
+0010e2: 6e20 2a00 2100 | 004f: invoke-virtual {v1, v2}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 0052: code-address
+ | 0052: code-address
+ | 0052: local-snapshot
+0010e8: 0f00 | 0052: return v0
+ | 0053: code-address
+ | debug info
+ | line_start: 72
+ | parameters_size: 0003
+ | parameter <unnamed> v4
+ | parameter <unnamed> v5
+ | parameter <unnamed> v6
+ | 0000: prologue end
+ | 0000: line 72
+ | 0002: line 73
+ | 002e: advance pc
+ | 002e: line 74
+ | 0030: line 75
+ | 0052: advance pc
+ | 0052: line 77
+ | end sequence
+ |
+0010ea: 0000 |
+ |[10ec] invokecustom.InvokeCustom.targetMethodTest6:(JJJ)J
+0010ec: 0c00 | registers_size: 000c
+0010ee: 0600 | ins_size: 0006
+0010f0: 0300 | outs_size: 0003
+0010f2: 0000 | tries_size: 0000
+0010f4: 2d21 0000 | debug_off: 0000212d
+0010f8: 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
+0010fc: 9b00 0608 | 0000: add-long v0, v6, v8
+ | 0002: code-address
+001100: 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
+001104: 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
+001108: 7010 3100 0300 | 0006: invoke-direct {v3}, java.lang.StringBuilder.<init>:()V // method@0031
+ | 0009: code-address
+ | 0009: code-address
+ | 0009: local-snapshot
+ | 0009: code-address
+00110e: 1a04 9200 | 0009: const-string v4, "targetMethodTest6 " // utf8@0092
+ | 000b: code-address
+ | 000b: code-address
+ | 000b: local-snapshot
+ | 000b: code-address
+ | 000b: code-address
+ | 000b: local-snapshot
+ | 000b: code-address
+001112: 6e20 3700 4300 | 000b: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 000e: code-address
+ | 000e: code-address
+ | 000e: local-snapshot
+001118: 0c03 | 000e: move-result-object v3
+ | 000f: code-address
+ | 000f: code-address
+ | 000f: local-snapshot
+ | 000f: code-address
+00111a: 6e30 3500 6307 | 000f: invoke-virtual {v3, v6, v7}, java.lang.StringBuilder.append:(J)Ljava/lang/StringBuilder; // method@0035
+ | 0012: code-address
+ | 0012: code-address
+ | 0012: local-snapshot
+001120: 0c03 | 0012: move-result-object v3
+ | 0013: code-address
+ | 0013: code-address
+ | 0013: local-snapshot
+ | 0013: code-address
+001122: 1a04 0400 | 0013: const-string v4, " + " // utf8@0004
+ | 0015: code-address
+ | 0015: code-address
+ | 0015: local-snapshot
+ | 0015: code-address
+ | 0015: code-address
+ | 0015: local-snapshot
+ | 0015: code-address
+001126: 6e20 3700 4300 | 0015: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0018: code-address
+ | 0018: code-address
+ | 0018: local-snapshot
+00112c: 0c03 | 0018: move-result-object v3
+ | 0019: code-address
+ | 0019: code-address
+ | 0019: local-snapshot
+ | 0019: code-address
+00112e: 6e30 3500 8309 | 0019: invoke-virtual {v3, v8, v9}, java.lang.StringBuilder.append:(J)Ljava/lang/StringBuilder; // method@0035
+ | 001c: code-address
+ | 001c: code-address
+ | 001c: local-snapshot
+001134: 0c03 | 001c: move-result-object v3
+ | 001d: code-address
+ | 001d: code-address
+ | 001d: local-snapshot
+ | 001d: code-address
+001136: 1a04 0500 | 001d: const-string v4, " = " // utf8@0005
+ | 001f: code-address
+ | 001f: code-address
+ | 001f: local-snapshot
+ | 001f: code-address
+ | 001f: code-address
+ | 001f: local-snapshot
+ | 001f: code-address
+00113a: 6e20 3700 4300 | 001f: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0022: code-address
+ | 0022: code-address
+ | 0022: local-snapshot
+001140: 0c03 | 0022: move-result-object v3
+ | 0023: code-address
+ | 0023: code-address
+ | 0023: local-snapshot
+ | 0023: code-address
+001142: 6e30 3500 0301 | 0023: invoke-virtual {v3, v0, v1}, java.lang.StringBuilder.append:(J)Ljava/lang/StringBuilder; // method@0035
+ | 0026: code-address
+ | 0026: code-address
+ | 0026: local-snapshot
+001148: 0c03 | 0026: move-result-object v3
+ | 0027: code-address
+ | 0027: code-address
+ | 0027: local-snapshot
+ | 0027: code-address
+00114a: 6e10 3800 0300 | 0027: invoke-virtual {v3}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0038
+ | 002a: code-address
+ | 002a: code-address
+ | 002a: local-snapshot
+001150: 0c03 | 002a: move-result-object v3
+ | 002b: code-address
+ | 002b: code-address
+ | 002b: local-snapshot
+ | 002b: code-address
+001152: 6e20 2a00 3200 | 002b: invoke-virtual {v2, v3}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 002e: code-address
+ | 002e: code-address
+ | 002e: local-snapshot
+001158: 3102 000a | 002e: cmp-long v2, v0, v10
+00115c: 3802 2400 | 0030: if-eqz v2, 0054 // +0024
+ | 0032: code-address
+ | 0032: code-address
+ | 0032: local-snapshot
+ | 0032: code-address
+001160: 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
+001164: 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
+001168: 7010 3100 0300 | 0036: invoke-direct {v3}, java.lang.StringBuilder.<init>:()V // method@0031
+ | 0039: code-address
+ | 0039: code-address
+ | 0039: local-snapshot
+ | 0039: code-address
+00116e: 1a04 1400 | 0039: const-string v4, "Failed " // utf8@0014
+ | 003b: code-address
+ | 003b: code-address
+ | 003b: local-snapshot
+ | 003b: code-address
+ | 003b: code-address
+ | 003b: local-snapshot
+ | 003b: code-address
+001172: 6e20 3700 4300 | 003b: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 003e: code-address
+ | 003e: code-address
+ | 003e: local-snapshot
+001178: 0c03 | 003e: move-result-object v3
+ | 003f: code-address
+ | 003f: code-address
+ | 003f: local-snapshot
+ | 003f: code-address
+00117a: 6e30 3500 0301 | 003f: invoke-virtual {v3, v0, v1}, java.lang.StringBuilder.append:(J)Ljava/lang/StringBuilder; // method@0035
+ | 0042: code-address
+ | 0042: code-address
+ | 0042: local-snapshot
+001180: 0c03 | 0042: move-result-object v3
+ | 0043: code-address
+ | 0043: code-address
+ | 0043: local-snapshot
+ | 0043: code-address
+001182: 1a04 0200 | 0043: const-string v4, " != " // utf8@0002
+ | 0045: code-address
+ | 0045: code-address
+ | 0045: local-snapshot
+ | 0045: code-address
+ | 0045: code-address
+ | 0045: local-snapshot
+ | 0045: code-address
+001186: 6e20 3700 4300 | 0045: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0048: code-address
+ | 0048: code-address
+ | 0048: local-snapshot
+00118c: 0c03 | 0048: move-result-object v3
+ | 0049: code-address
+ | 0049: code-address
+ | 0049: local-snapshot
+ | 0049: code-address
+00118e: 6e30 3500 a30b | 0049: invoke-virtual {v3, v10, v11}, java.lang.StringBuilder.append:(J)Ljava/lang/StringBuilder; // method@0035
+ | 004c: code-address
+ | 004c: code-address
+ | 004c: local-snapshot
+001194: 0c03 | 004c: move-result-object v3
+ | 004d: code-address
+ | 004d: code-address
+ | 004d: local-snapshot
+ | 004d: code-address
+001196: 6e10 3800 0300 | 004d: invoke-virtual {v3}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0038
+ | 0050: code-address
+ | 0050: code-address
+ | 0050: local-snapshot
+00119c: 0c03 | 0050: move-result-object v3
+ | 0051: code-address
+ | 0051: code-address
+ | 0051: local-snapshot
+ | 0051: code-address
+00119e: 6e20 2a00 3200 | 0051: invoke-virtual {v2, v3}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 0054: code-address
+ | 0054: code-address
+ | 0054: local-snapshot
+0011a4: 1000 | 0054: return-wide v0
+ | 0055: code-address
+ | debug info
+ | line_start: 81
+ | parameters_size: 0003
+ | parameter <unnamed> v6
+ | parameter <unnamed> v8
+ | parameter <unnamed> v10
+ | 0000: prologue end
+ | 0000: line 81
+ | 0002: line 82
+ | 002e: advance pc
+ | 002e: line 83
+ | 0032: line 84
+ | 0054: advance pc
+ | 0054: line 86
+ | end sequence
+ |
+0011a6: 0000 |
+ |[11a8] invokecustom.InvokeCustom.targetMethodTest7:(FFD)D
+0011a8: 0a00 | registers_size: 000a
+0011aa: 0400 | ins_size: 0004
+0011ac: 0300 | outs_size: 0003
+0011ae: 0000 | tries_size: 0000
+0011b0: 3d21 0000 | debug_off: 0000213d
+0011b4: 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
+0011b8: a800 0607 | 0000: mul-float v0, v6, v7
+0011bc: 8900 | 0002: float-to-double v0, v0
+ | 0003: code-address
+0011be: 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
+0011c2: 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
+0011c6: 7010 3100 0300 | 0007: invoke-direct {v3}, java.lang.StringBuilder.<init>:()V // method@0031
+ | 000a: code-address
+ | 000a: code-address
+ | 000a: local-snapshot
+ | 000a: code-address
+0011cc: 1a04 9500 | 000a: const-string v4, "targetMethodTest7 " // utf8@0095
+ | 000c: code-address
+ | 000c: code-address
+ | 000c: local-snapshot
+ | 000c: code-address
+ | 000c: code-address
+ | 000c: local-snapshot
+ | 000c: code-address
+0011d0: 6e20 3700 4300 | 000c: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 000f: code-address
+ | 000f: code-address
+ | 000f: local-snapshot
+0011d6: 0c03 | 000f: move-result-object v3
+ | 0010: code-address
+ | 0010: code-address
+ | 0010: local-snapshot
+ | 0010: code-address
+0011d8: 6e20 3300 6300 | 0010: invoke-virtual {v3, v6}, java.lang.StringBuilder.append:(F)Ljava/lang/StringBuilder; // method@0033
+ | 0013: code-address
+ | 0013: code-address
+ | 0013: local-snapshot
+0011de: 0c03 | 0013: move-result-object v3
+ | 0014: code-address
+ | 0014: code-address
+ | 0014: local-snapshot
+ | 0014: code-address
+0011e0: 1a04 0300 | 0014: const-string v4, " * " // utf8@0003
+ | 0016: code-address
+ | 0016: code-address
+ | 0016: local-snapshot
+ | 0016: code-address
+ | 0016: code-address
+ | 0016: local-snapshot
+ | 0016: code-address
+0011e4: 6e20 3700 4300 | 0016: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0019: code-address
+ | 0019: code-address
+ | 0019: local-snapshot
+0011ea: 0c03 | 0019: move-result-object v3
+ | 001a: code-address
+ | 001a: code-address
+ | 001a: local-snapshot
+ | 001a: code-address
+0011ec: 6e20 3300 7300 | 001a: invoke-virtual {v3, v7}, java.lang.StringBuilder.append:(F)Ljava/lang/StringBuilder; // method@0033
+ | 001d: code-address
+ | 001d: code-address
+ | 001d: local-snapshot
+0011f2: 0c03 | 001d: move-result-object v3
+ | 001e: code-address
+ | 001e: code-address
+ | 001e: local-snapshot
+ | 001e: code-address
+0011f4: 1a04 0500 | 001e: const-string v4, " = " // utf8@0005
+ | 0020: code-address
+ | 0020: code-address
+ | 0020: local-snapshot
+ | 0020: code-address
+ | 0020: code-address
+ | 0020: local-snapshot
+ | 0020: code-address
+0011f8: 6e20 3700 4300 | 0020: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0023: code-address
+ | 0023: code-address
+ | 0023: local-snapshot
+0011fe: 0c03 | 0023: move-result-object v3
+ | 0024: code-address
+ | 0024: code-address
+ | 0024: local-snapshot
+ | 0024: code-address
+001200: 6e30 3200 0301 | 0024: invoke-virtual {v3, v0, v1}, java.lang.StringBuilder.append:(D)Ljava/lang/StringBuilder; // method@0032
+ | 0027: code-address
+ | 0027: code-address
+ | 0027: local-snapshot
+001206: 0c03 | 0027: move-result-object v3
+ | 0028: code-address
+ | 0028: code-address
+ | 0028: local-snapshot
+ | 0028: code-address
+001208: 6e10 3800 0300 | 0028: invoke-virtual {v3}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0038
+ | 002b: code-address
+ | 002b: code-address
+ | 002b: local-snapshot
+00120e: 0c03 | 002b: move-result-object v3
+ | 002c: code-address
+ | 002c: code-address
+ | 002c: local-snapshot
+ | 002c: code-address
+001210: 6e20 2a00 3200 | 002c: invoke-virtual {v2, v3}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 002f: code-address
+ | 002f: code-address
+ | 002f: local-snapshot
+001216: 2f02 0008 | 002f: cmpl-double v2, v0, v8
+00121a: 3802 2400 | 0031: if-eqz v2, 0055 // +0024
+ | 0033: code-address
+ | 0033: code-address
+ | 0033: local-snapshot
+ | 0033: code-address
+00121e: 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
+001222: 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
+001226: 7010 3100 0300 | 0037: invoke-direct {v3}, java.lang.StringBuilder.<init>:()V // method@0031
+ | 003a: code-address
+ | 003a: code-address
+ | 003a: local-snapshot
+ | 003a: code-address
+00122c: 1a04 1400 | 003a: const-string v4, "Failed " // utf8@0014
+ | 003c: code-address
+ | 003c: code-address
+ | 003c: local-snapshot
+ | 003c: code-address
+ | 003c: code-address
+ | 003c: local-snapshot
+ | 003c: code-address
+001230: 6e20 3700 4300 | 003c: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 003f: code-address
+ | 003f: code-address
+ | 003f: local-snapshot
+001236: 0c03 | 003f: move-result-object v3
+ | 0040: code-address
+ | 0040: code-address
+ | 0040: local-snapshot
+ | 0040: code-address
+001238: 6e30 3200 0301 | 0040: invoke-virtual {v3, v0, v1}, java.lang.StringBuilder.append:(D)Ljava/lang/StringBuilder; // method@0032
+ | 0043: code-address
+ | 0043: code-address
+ | 0043: local-snapshot
+00123e: 0c03 | 0043: move-result-object v3
+ | 0044: code-address
+ | 0044: code-address
+ | 0044: local-snapshot
+ | 0044: code-address
+001240: 1a04 0200 | 0044: const-string v4, " != " // utf8@0002
+ | 0046: code-address
+ | 0046: code-address
+ | 0046: local-snapshot
+ | 0046: code-address
+ | 0046: code-address
+ | 0046: local-snapshot
+ | 0046: code-address
+001244: 6e20 3700 4300 | 0046: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0049: code-address
+ | 0049: code-address
+ | 0049: local-snapshot
+00124a: 0c03 | 0049: move-result-object v3
+ | 004a: code-address
+ | 004a: code-address
+ | 004a: local-snapshot
+ | 004a: code-address
+00124c: 6e30 3200 8309 | 004a: invoke-virtual {v3, v8, v9}, java.lang.StringBuilder.append:(D)Ljava/lang/StringBuilder; // method@0032
+ | 004d: code-address
+ | 004d: code-address
+ | 004d: local-snapshot
+001252: 0c03 | 004d: move-result-object v3
+ | 004e: code-address
+ | 004e: code-address
+ | 004e: local-snapshot
+ | 004e: code-address
+001254: 6e10 3800 0300 | 004e: invoke-virtual {v3}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0038
+ | 0051: code-address
+ | 0051: code-address
+ | 0051: local-snapshot
+00125a: 0c03 | 0051: move-result-object v3
+ | 0052: code-address
+ | 0052: code-address
+ | 0052: local-snapshot
+ | 0052: code-address
+00125c: 6e20 2a00 3200 | 0052: invoke-virtual {v2, v3}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 0055: code-address
+ | 0055: code-address
+ | 0055: local-snapshot
+001262: 1000 | 0055: return-wide v0
+ | 0056: code-address
+ | debug info
+ | line_start: 90
+ | parameters_size: 0003
+ | parameter <unnamed> v6
+ | parameter <unnamed> v7
+ | parameter <unnamed> v8
+ | 0000: prologue end
+ | 0000: line 90
+ | 0003: line 91
+ | 002f: advance pc
+ | 002f: line 92
+ | 0033: line 93
+ | 0055: advance pc
+ | 0055: line 95
+ | end sequence
+ |
+ |[1264] invokecustom.InvokeCustom.targetMethodTest8:(Ljava/lang/String;)V
+001264: 0400 | registers_size: 0004
+001266: 0100 | ins_size: 0001
+001268: 0200 | outs_size: 0002
+00126a: 0000 | tries_size: 0000
+00126c: 4d21 0000 | debug_off: 0000214d
+001270: 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
+001274: 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
+001278: 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
+00127c: 7010 3100 0100 | 0004: invoke-direct {v1}, java.lang.StringBuilder.<init>:()V // method@0031
+ | 0007: code-address
+ | 0007: code-address
+ | 0007: local-snapshot
+ | 0007: code-address
+001282: 1a02 9700 | 0007: const-string v2, "targetMethodTest8 " // utf8@0097
+ | 0009: code-address
+ | 0009: code-address
+ | 0009: local-snapshot
+ | 0009: code-address
+ | 0009: code-address
+ | 0009: local-snapshot
+ | 0009: code-address
+001286: 6e20 3700 2100 | 0009: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 000c: code-address
+ | 000c: code-address
+ | 000c: local-snapshot
+00128c: 0c01 | 000c: move-result-object v1
+ | 000d: code-address
+ | 000d: code-address
+ | 000d: local-snapshot
+ | 000d: code-address
+00128e: 6e20 3700 3100 | 000d: invoke-virtual {v1, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0010: code-address
+ | 0010: code-address
+ | 0010: local-snapshot
+001294: 0c01 | 0010: move-result-object v1
+ | 0011: code-address
+ | 0011: code-address
+ | 0011: local-snapshot
+ | 0011: code-address
+001296: 6e10 3800 0100 | 0011: invoke-virtual {v1}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0038
+ | 0014: code-address
+ | 0014: code-address
+ | 0014: local-snapshot
+00129c: 0c01 | 0014: move-result-object v1
+ | 0015: code-address
+ | 0015: code-address
+ | 0015: local-snapshot
+ | 0015: code-address
+00129e: 6e20 2a00 1000 | 0015: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 0018: code-address
+ | 0018: code-address
+ | 0018: local-snapshot
+0012a4: 0e00 | 0018: return-void
+ | 0019: code-address
+ | debug info
+ | line_start: 99
+ | parameters_size: 0001
+ | parameter <unnamed> v3
+ | 0000: prologue end
+ | 0000: line 99
+ | 0018: advance pc
+ | 0018: line 100
+ | end sequence
+ |
+0012a6: 0000 |
+ |[12a8] invokecustom.InvokeCustom.targetMethodTest9:()V
+0012a8: 0200 | registers_size: 0002
+0012aa: 0000 | ins_size: 0000
+0012ac: 0200 | outs_size: 0002
+0012ae: 0000 | tries_size: 0000
+0012b0: 5621 0000 | debug_off: 00002156
+0012b4: 0800 0000 | insns_size: 00000008
+ | 0000: code-address
+ | 0000: local-snapshot
+ | 0000: code-address
+ | 0000: code-address
+ | 0000: local-snapshot
+ | 0000: code-address
+0012b8: 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
+0012bc: 1a01 9900 | 0002: const-string v1, "targetMethodTest9()" // utf8@0099
+ | 0004: code-address
+ | 0004: code-address
+ | 0004: local-snapshot
+ | 0004: code-address
+ | 0004: code-address
+ | 0004: local-snapshot
+ | 0004: code-address
+0012c0: 6e20 2a00 1000 | 0004: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 0007: code-address
+ | 0007: code-address
+ | 0007: local-snapshot
+0012c6: 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
+ |
+ |[12c8] invokecustom.InvokeCustom.test1:()V
+0012c8: 0000 | registers_size: 0000
+0012ca: 0000 | ins_size: 0000
+0012cc: 0000 | outs_size: 0000
+0012ce: 0000 | tries_size: 0000
+0012d0: 0000 0000 | debug_off: 00000000
+0012d4: 0400 0000 | insns_size: 00000004
+ | 0000: code-address
+ | 0000: local-snapshot
+ | 0000: code-address
+ | 0000: code-address
+ | 0000: local-snapshot
+ | 0000: code-address
+0012d8: fc00 0300 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@0003
+ | 0003: code-address
+ | 0003: code-address
+ | 0003: local-snapshot
+0012de: 0e00 | 0003: return-void
+ | 0004: code-address
+ |
+ |[12e0] invokecustom.InvokeCustom.test2:()V
+0012e0: 0b00 | registers_size: 000b
+0012e2: 0000 | ins_size: 0000
+0012e4: 0b00 | outs_size: 000b
+0012e6: 0000 | tries_size: 0000
+0012e8: 0000 0000 | debug_off: 00000000
+0012ec: 1b00 0000 | insns_size: 0000001b
+ | 0000: code-address
+ | 0000: local-snapshot
+ | 0000: code-address
+ | 0000: code-address
+ | 0000: local-snapshot
+0012f0: 1210 | 0000: const/4 v0, #int 1 // #1
+0012f2: 1301 7f00 | 0001: const/16 v1, #int 127 // #007f
+0012f6: 1302 6300 | 0003: const/16 v2, #int 99 // #0063
+0012fa: 1303 0004 | 0005: const/16 v3, #int 1024 // #0400
+0012fe: 1404 40e2 0100 | 0007: const v4, #int 123456 // #0001e240
+001304: 1405 9a99 993f | 000a: const v5, #float 1.2 // #3f99999a
+00130a: 1706 15cd 5b07 | 000d: const-wide/32 v6, #long 123456789 // #075bcd15
+001310: 1808 b6fa f8b0 4819 0c40| 0010: const-wide v8, #double 3.5123456789 // #400c1948b0f8fab6
+ | 0015: code-address
+00131a: 1a0a 4900 | 0015: const-string v10, "String" // utf8@0049
+ | 0017: code-address
+ | 0017: code-address
+ | 0017: local-snapshot
+ | 0017: code-address
+ | 0017: code-address
+ | 0017: local-snapshot
+ | 0017: code-address
+00131e: fd0b 0400 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@0004
+ | 001a: code-address
+ | 001a: code-address
+ | 001a: local-snapshot
+001324: 0e00 | 001a: return-void
+ | 001b: code-address
+ |
+001326: 0000 |
+ |[1328] invokecustom.InvokeCustom.test3:()V
+001328: 0000 | registers_size: 0000
+00132a: 0000 | ins_size: 0000
+00132c: 0000 | outs_size: 0000
+00132e: 0000 | tries_size: 0000
+001330: 0000 0000 | debug_off: 00000000
+001334: 0400 0000 | insns_size: 00000004
+ | 0000: code-address
+ | 0000: local-snapshot
+ | 0000: code-address
+ | 0000: code-address
+ | 0000: local-snapshot
+ | 0000: code-address
+001338: fc00 0b00 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@000b
+ | 0003: code-address
+ | 0003: code-address
+ | 0003: local-snapshot
+00133e: 0e00 | 0003: return-void
+ | 0004: code-address
+ |
+ |[1340] invokecustom.InvokeCustom.test4:()V
+001340: 0100 | registers_size: 0001
+001342: 0000 | ins_size: 0000
+001344: 0100 | outs_size: 0001
+001346: 0000 | tries_size: 0000
+001348: 0000 0000 | debug_off: 00000000
+00134c: 0900 0000 | insns_size: 00000009
+ | 0000: code-address
+ | 0000: local-snapshot
+ | 0000: code-address
+ | 0000: code-address
+ | 0000: local-snapshot
+ | 0000: code-address
+001350: 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
+001354: 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
+00135a: fc10 0c00 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@000c
+ | 0008: code-address
+ | 0008: code-address
+ | 0008: local-snapshot
+001360: 0e00 | 0008: return-void
+ | 0009: code-address
+ |
+001362: 0000 |
+ |[1364] invokecustom.InvokeCustom.test5:()V
+001364: 0400 | registers_size: 0004
+001366: 0000 | ins_size: 0000
+001368: 0300 | outs_size: 0003
+00136a: 0000 | tries_size: 0000
+00136c: 0000 0000 | debug_off: 00000000
+001370: 2300 0000 | insns_size: 00000023
+ | 0000: code-address
+ | 0000: local-snapshot
+ | 0000: code-address
+ | 0000: code-address
+ | 0000: local-snapshot
+001374: 1300 e803 | 0000: const/16 v0, #int 1000 // #03e8
+001378: 1301 65fc | 0002: const/16 v1, #int -923 // #fc65
+00137c: 1302 4d00 | 0004: const/16 v2, #int 77 // #004d
+ | 0006: code-address
+001380: 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
+001386: 0a00 | 0009: move-result v0
+ | 000a: code-address
+ | 000a: code-address
+ | 000a: local-snapshot
+ | 000a: code-address
+001388: 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
+00138c: 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
+001390: 7010 3100 0200 | 000e: invoke-direct {v2}, java.lang.StringBuilder.<init>:()V // method@0031
+ | 0011: code-address
+ | 0011: code-address
+ | 0011: local-snapshot
+ | 0011: code-address
+001396: 1a03 9000 | 0011: const-string v3, "targetMethodTest5 returned: " // utf8@0090
+ | 0013: code-address
+ | 0013: code-address
+ | 0013: local-snapshot
+ | 0013: code-address
+ | 0013: code-address
+ | 0013: local-snapshot
+ | 0013: code-address
+00139a: 6e20 3700 3200 | 0013: invoke-virtual {v2, v3}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 0016: code-address
+ | 0016: code-address
+ | 0016: local-snapshot
+0013a0: 0c02 | 0016: move-result-object v2
+ | 0017: code-address
+ | 0017: code-address
+ | 0017: local-snapshot
+ | 0017: code-address
+0013a2: 6e20 3400 0200 | 0017: invoke-virtual {v2, v0}, java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder; // method@0034
+ | 001a: code-address
+ | 001a: code-address
+ | 001a: local-snapshot
+0013a8: 0c00 | 001a: move-result-object v0
+ | 001b: code-address
+ | 001b: code-address
+ | 001b: local-snapshot
+ | 001b: code-address
+0013aa: 6e10 3800 0000 | 001b: invoke-virtual {v0}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0038
+ | 001e: code-address
+ | 001e: code-address
+ | 001e: local-snapshot
+0013b0: 0c00 | 001e: move-result-object v0
+ | 001f: code-address
+ | 001f: code-address
+ | 001f: local-snapshot
+ | 001f: code-address
+0013b2: 6e20 2a00 0100 | 001f: invoke-virtual {v1, v0}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 0022: code-address
+ | 0022: code-address
+ | 0022: local-snapshot
+0013b8: 0e00 | 0022: return-void
+ | 0023: code-address
+ |
+0013ba: 0000 |
+ |[13bc] invokecustom.InvokeCustom.test6:()V
+0013bc: 0600 | registers_size: 0006
+0013be: 0000 | ins_size: 0000
+0013c0: 0600 | outs_size: 0006
+0013c2: 0000 | tries_size: 0000
+0013c4: 0000 0000 | debug_off: 00000000
+0013c8: 2c00 0000 | insns_size: 0000002c
+ | 0000: code-address
+ | 0000: local-snapshot
+ | 0000: code-address
+ | 0000: code-address
+ | 0000: local-snapshot
+0013cc: 1800 7777 7777 7707 0000| 0000: const-wide v0, #long 8209686820727 // #0000077777777777
+0013d6: 1802 efee eeee eefe ffff| 0005: const-wide v2, #long -1172812402961 // #fffffeeeeeeeeeef
+0013e0: 1804 6666 6666 6606 0000| 000a: const-wide v4, #long 7036874417766 // #0000066666666666
+ | 000f: code-address
+0013ea: fd06 0600 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@0006
+ | 0012: code-address
+ | 0012: code-address
+ | 0012: local-snapshot
+0013f0: 0b00 | 0012: move-result-wide v0
+ | 0013: code-address
+ | 0013: code-address
+ | 0013: local-snapshot
+ | 0013: code-address
+0013f2: 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
+0013f6: 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
+0013fa: 7010 3100 0300 | 0017: invoke-direct {v3}, java.lang.StringBuilder.<init>:()V // method@0031
+ | 001a: code-address
+ | 001a: code-address
+ | 001a: local-snapshot
+ | 001a: code-address
+001400: 1a04 9300 | 001a: const-string v4, "targetMethodTest6 returned: " // utf8@0093
+ | 001c: code-address
+ | 001c: code-address
+ | 001c: local-snapshot
+ | 001c: code-address
+ | 001c: code-address
+ | 001c: local-snapshot
+ | 001c: code-address
+001404: 6e20 3700 4300 | 001c: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 001f: code-address
+ | 001f: code-address
+ | 001f: local-snapshot
+00140a: 0c03 | 001f: move-result-object v3
+ | 0020: code-address
+ | 0020: code-address
+ | 0020: local-snapshot
+ | 0020: code-address
+00140c: 6e30 3500 0301 | 0020: invoke-virtual {v3, v0, v1}, java.lang.StringBuilder.append:(J)Ljava/lang/StringBuilder; // method@0035
+ | 0023: code-address
+ | 0023: code-address
+ | 0023: local-snapshot
+001412: 0c00 | 0023: move-result-object v0
+ | 0024: code-address
+ | 0024: code-address
+ | 0024: local-snapshot
+ | 0024: code-address
+001414: 6e10 3800 0000 | 0024: invoke-virtual {v0}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0038
+ | 0027: code-address
+ | 0027: code-address
+ | 0027: local-snapshot
+00141a: 0c00 | 0027: move-result-object v0
+ | 0028: code-address
+ | 0028: code-address
+ | 0028: local-snapshot
+ | 0028: code-address
+00141c: 6e20 2a00 0200 | 0028: invoke-virtual {v2, v0}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 002b: code-address
+ | 002b: code-address
+ | 002b: local-snapshot
+001422: 0e00 | 002b: return-void
+ | 002c: code-address
+ |
+ |[1424] invokecustom.InvokeCustom.test7:()V
+001424: 0500 | registers_size: 0005
+001426: 0000 | ins_size: 0000
+001428: 0400 | outs_size: 0004
+00142a: 0000 | tries_size: 0000
+00142c: 0000 0000 | debug_off: 00000000
+001430: 2800 0000 | insns_size: 00000028
+ | 0000: code-address
+ | 0000: local-snapshot
+ | 0000: code-address
+ | 0000: code-address
+ | 0000: local-snapshot
+001434: 1400 0040 003f | 0000: const v0, #float 0.50097656 // #3f004000
+00143a: 1401 0040 00bf | 0003: const v1, #float -0.50097656 // #bf004000
+001440: 1802 0000 0000 0410 d0bf| 0006: const-wide v2, #double -0.2509775161743164 // #bfd0100400000000
+ | 000b: code-address
+00144a: fc40 0700 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@0007
+ | 000e: code-address
+ | 000e: code-address
+ | 000e: local-snapshot
+001450: 0b00 | 000e: move-result-wide v0
+ | 000f: code-address
+ | 000f: code-address
+ | 000f: local-snapshot
+ | 000f: code-address
+001452: 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
+001456: 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
+00145a: 7010 3100 0300 | 0013: invoke-direct {v3}, java.lang.StringBuilder.<init>:()V // method@0031
+ | 0016: code-address
+ | 0016: code-address
+ | 0016: local-snapshot
+ | 0016: code-address
+001460: 1a04 9300 | 0016: const-string v4, "targetMethodTest6 returned: " // utf8@0093
+ | 0018: code-address
+ | 0018: code-address
+ | 0018: local-snapshot
+ | 0018: code-address
+ | 0018: code-address
+ | 0018: local-snapshot
+ | 0018: code-address
+001464: 6e20 3700 4300 | 0018: invoke-virtual {v3, v4}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 001b: code-address
+ | 001b: code-address
+ | 001b: local-snapshot
+00146a: 0c03 | 001b: move-result-object v3
+ | 001c: code-address
+ | 001c: code-address
+ | 001c: local-snapshot
+ | 001c: code-address
+00146c: 6e30 3200 0301 | 001c: invoke-virtual {v3, v0, v1}, java.lang.StringBuilder.append:(D)Ljava/lang/StringBuilder; // method@0032
+ | 001f: code-address
+ | 001f: code-address
+ | 001f: local-snapshot
+001472: 0c00 | 001f: move-result-object v0
+ | 0020: code-address
+ | 0020: code-address
+ | 0020: local-snapshot
+ | 0020: code-address
+001474: 6e10 3800 0000 | 0020: invoke-virtual {v0}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0038
+ | 0023: code-address
+ | 0023: code-address
+ | 0023: local-snapshot
+00147a: 0c00 | 0023: move-result-object v0
+ | 0024: code-address
+ | 0024: code-address
+ | 0024: local-snapshot
+ | 0024: code-address
+00147c: 6e20 2a00 0200 | 0024: invoke-virtual {v2, v0}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 0027: code-address
+ | 0027: code-address
+ | 0027: local-snapshot
+001482: 0e00 | 0027: return-void
+ | 0028: code-address
+ |
+ |[1484] invokecustom.InvokeCustom.test8:()V
+001484: 0100 | registers_size: 0001
+001486: 0000 | ins_size: 0000
+001488: 0100 | outs_size: 0001
+00148a: 0000 | tries_size: 0000
+00148c: 0000 0000 | debug_off: 00000000
+001490: 1000 0000 | insns_size: 00000010
+ | 0000: code-address
+ | 0000: local-snapshot
+ | 0000: code-address
+ | 0000: code-address
+ | 0000: local-snapshot
+ | 0000: code-address
+001494: 1a00 1500 | 0000: const-string v0, "First invokedynamic invocation" // utf8@0015
+ | 0002: code-address
+ | 0002: code-address
+ | 0002: local-snapshot
+ | 0002: code-address
+ | 0002: code-address
+ | 0002: local-snapshot
+ | 0002: code-address
+001498: fc10 0800 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@0008
+ | 0005: code-address
+ | 0005: code-address
+ | 0005: local-snapshot
+ | 0005: code-address
+00149e: 1a00 4800 | 0005: const-string v0, "Second invokedynamic invocation" // utf8@0048
+ | 0007: code-address
+ | 0007: code-address
+ | 0007: local-snapshot
+ | 0007: code-address
+ | 0007: code-address
+ | 0007: local-snapshot
+ | 0007: code-address
+0014a2: fc10 0900 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@0009
+ | 000a: code-address
+ | 000a: code-address
+ | 000a: local-snapshot
+ | 000a: code-address
+0014a8: 1a00 1000 | 000a: const-string v0, "Dupe first invokedynamic invocation" // utf8@0010
+ | 000c: code-address
+ | 000c: code-address
+ | 000c: local-snapshot
+ | 000c: code-address
+ | 000c: code-address
+ | 000c: local-snapshot
+ | 000c: code-address
+0014ac: fc10 0a00 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@000a
+ | 000f: code-address
+ | 000f: code-address
+ | 000f: local-snapshot
+0014b2: 0e00 | 000f: return-void
+ | 0010: code-address
+ |
+ |[14b4] invokecustom.InvokeCustom.test9:()V
+0014b4: 0000 | registers_size: 0000
+0014b6: 0000 | ins_size: 0000
+0014b8: 0000 | outs_size: 0000
+0014ba: 0000 | tries_size: 0000
+0014bc: 0000 0000 | debug_off: 00000000
+0014c0: 0400 0000 | insns_size: 00000004
+ | 0000: code-address
+ | 0000: local-snapshot
+ | 0000: code-address
+ | 0000: code-address
+ | 0000: local-snapshot
+ | 0000: code-address
+0014c4: fc00 0d00 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/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}, invoke-direct,method{invokecustom.InvokeCus
+ | tom.privateMethodTest9:()V}} // CallSiteRef@000d
+ | 0003: code-address
+ | 0003: code-address
+ | 0003: local-snapshot
+0014ca: 0e00 | 0003: return-void
+ | 0004: code-address
+ |
+ |[14cc] invokecustom.InvokeCustom.helperMethodTest9:()V
+0014cc: 0400 | registers_size: 0004
+0014ce: 0100 | ins_size: 0001
+0014d0: 0200 | outs_size: 0002
+0014d2: 0000 | tries_size: 0000
+0014d4: 5d21 0000 | debug_off: 0000215d
+0014d8: 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
+0014dc: 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
+0014e0: 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
+0014e4: 7010 3100 0100 | 0004: invoke-direct {v1}, java.lang.StringBuilder.<init>:()V // method@0031
+ | 0007: code-address
+ | 0007: code-address
+ | 0007: local-snapshot
+ | 0007: code-address
+0014ea: 1a02 7400 | 0007: const-string v2, "helperMethodTest9 in " // utf8@0074
+ | 0009: code-address
+ | 0009: code-address
+ | 0009: local-snapshot
+ | 0009: code-address
+ | 0009: code-address
+ | 0009: local-snapshot
+ | 0009: code-address
+0014ee: 6e20 3700 2100 | 0009: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@0037
+ | 000c: code-address
+ | 000c: code-address
+ | 000c: local-snapshot
+0014f4: 0c01 | 000c: move-result-object v1
+ | 000d: code-address
+ | 000d: code-address
+ | 000d: local-snapshot
+ | 000d: code-address
+0014f6: 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
+0014fa: 6e20 3600 2100 | 000f: invoke-virtual {v1, v2}, java.lang.StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@0036
+ | 0012: code-address
+ | 0012: code-address
+ | 0012: local-snapshot
+001500: 0c01 | 0012: move-result-object v1
+ | 0013: code-address
+ | 0013: code-address
+ | 0013: local-snapshot
+ | 0013: code-address
+001502: 6e10 3800 0100 | 0013: invoke-virtual {v1}, java.lang.StringBuilder.toString:()Ljava/lang/String; // method@0038
+ | 0016: code-address
+ | 0016: code-address
+ | 0016: local-snapshot
+001508: 0c01 | 0016: move-result-object v1
+ | 0017: code-address
+ | 0017: code-address
+ | 0017: local-snapshot
+ | 0017: code-address
+00150a: 6e20 2a00 1000 | 0017: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 001a: code-address
+ | 001a: code-address
+ | 001a: local-snapshot
+001510: 0e00 | 001a: return-void
+ | 001b: code-address
+ | debug info
+ | line_start: 129
+ | parameters_size: 0000
+ | 0000: prologue end
+ | 0000: line 129
+ | 001a: advance pc
+ | 001a: line 130
+ | end sequence
+ |
+001512: 0000 |
+ |[1514] invokecustom.InvokeCustom.run:()V
+001514: 0300 | registers_size: 0003
+001516: 0100 | ins_size: 0001
+001518: 0200 | outs_size: 0002
+00151a: 0000 | tries_size: 0000
+00151c: 6621 0000 | debug_off: 00002166
+001520: 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
+001524: 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
+001528: 1a01 8400 | 0002: const-string v1, "run() for Test9" // utf8@0084
+ | 0004: code-address
+ | 0004: code-address
+ | 0004: local-snapshot
+ | 0004: code-address
+ | 0004: code-address
+ | 0004: local-snapshot
+ | 0004: code-address
+00152c: 6e20 2a00 1000 | 0004: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 0007: code-address
+ | 0007: code-address
+ | 0007: local-snapshot
+001532: 0e00 | 0007: return-void
+ | 0008: code-address
+ | debug info
+ | line_start: 137
+ | parameters_size: 0000
+ | 0000: prologue end
+ | 0000: line 137
+ | 0007: line 138
+ | end sequence
+ |
+ |[1534] invokecustom.InvokeCustom.targetMethodTest4:()V
+001534: 0300 | registers_size: 0003
+001536: 0100 | ins_size: 0001
+001538: 0200 | outs_size: 0002
+00153a: 0000 | tries_size: 0000
+00153c: 6d21 0000 | debug_off: 0000216d
+001540: 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
+001544: 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
+001548: 1a01 8c00 | 0002: const-string v1, "targetMethodTest4 from InvokeCustom (oops!)" // utf8@008c
+ | 0004: code-address
+ | 0004: code-address
+ | 0004: local-snapshot
+ | 0004: code-address
+ | 0004: code-address
+ | 0004: local-snapshot
+ | 0004: code-address
+00154c: 6e20 2a00 1000 | 0004: invoke-virtual {v0, v1}, java.io.PrintStream.println:(Ljava/lang/String;)V // method@002a
+ | 0007: code-address
+ | 0007: code-address
+ | 0007: local-snapshot
+001552: 0e00 | 0007: return-void
+ | 0008: code-address
+ | debug info
+ | line_start: 68
+ | parameters_size: 0000
+ | 0000: prologue end
+ | 0000: line 68
+ | 0007: line 69
+ | end sequence
+ |
+ |[1554] annotations directory
+001554: 0000 0000 | class_annotations_off: 00000000
+001558: 0000 0000 | fields_size: 00000000
+00155c: 0600 0000 | methods_size: 00000006
+001560: 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;
+001564: 0300 0000 | method_idx: 00000003
+001568: 9809 0000 | annotations_off: 00000998
+ | invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
+00156c: 0400 0000 | method_idx: 00000004
+001570: a009 0000 | annotations_off: 000009a0
+ | invokecustom.InvokeCustom.bsmLookupStaticWithExtraArgs:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;
+001574: 0500 0000 | method_idx: 00000005
+001578: a009 0000 | annotations_off: 000009a0
+ | 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/MethodHandle;)Ljava/lang/invoke/CallSite;
+00157c: 0600 0000 | method_idx: 00000006
+001580: 9809 0000 | annotations_off: 00000998
+ | invokecustom.InvokeCustom.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+001584: 0700 0000 | method_idx: 00000007
+001588: 9809 0000 | annotations_off: 00000998
+ | invokecustom.InvokeCustom.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+00158c: 0800 0000 | method_idx: 00000008
+001590: 9809 0000 | annotations_off: 00000998
+ |
+ |[1594] type_list
+001594: 0100 0000 | size: 00000001
+001598: 0e00 | 000e // java.lang.Runnable
+ |
+00159a: 0000 |
+ |[159c] type_list
+00159c: 0300 0000 | size: 00000003
+0015a0: 0300 | 0003 // float
+0015a2: 0300 | 0003 // float
+0015a4: 0200 | 0002 // double
+ |
+0015a6: 0000 |
+ |[15a8] type_list
+0015a8: 0100 0000 | size: 00000001
+0015ac: 0700 | 0007 // invokecustom.InvokeCustom
+ |
+0015ae: 0000 |
+ |[15b0] type_list
+0015b0: 0300 0000 | size: 00000003
+0015b4: 0400 | 0004 // int
+0015b6: 0400 | 0004 // int
+0015b8: 0400 | 0004 // int
+ |
+0015ba: 0000 |
+ |[15bc] type_list
+0015bc: 0300 0000 | size: 00000003
+0015c0: 0500 | 0005 // long
+0015c2: 0500 | 0005 // long
+0015c4: 0500 | 0005 // long
+ |
+0015c6: 0000 |
+ |[15c8] type_list
+0015c8: 0100 0000 | size: 00000001
+0015cc: 0400 | 0004 // int
+ |
+0015ce: 0000 |
+ |[15d0] type_list
+0015d0: 0100 0000 | size: 00000001
+0015d4: 0d00 | 000d // java.lang.Object
+ |
+0015d6: 0000 |
+ |[15d8] type_list
+0015d8: 0100 0000 | size: 00000001
+0015dc: 2400 | 0024 // java.lang.Object[]
+ |
+0015de: 0000 |
+ |[15e0] type_list
+0015e0: 0100 0000 | size: 00000001
+0015e4: 0f00 | 000f // java.lang.String
+ |
+0015e6: 0000 |
+ |[15e8] type_list
+0015e8: 0100 0000 | size: 00000001
+0015ec: 0200 | 0002 // double
+ |
+0015ee: 0000 |
+ |[15f0] type_list
+0015f0: 0100 0000 | size: 00000001
+0015f4: 0300 | 0003 // float
+ |
+0015f6: 0000 |
+ |[15f8] type_list
+0015f8: 0100 0000 | size: 00000001
+0015fc: 0500 | 0005 // long
+ |
+0015fe: 0000 |
+ |[1600] type_list
+001600: 0300 0000 | size: 00000003
+001604: 1700 | 0017 // java.lang.invoke.MethodHandles$Lookup
+001606: 0f00 | 000f // java.lang.String
+001608: 1900 | 0019 // java.lang.invoke.MethodType
+ |
+00160a: 0000 |
+ |[160c] type_list
+00160c: 0700 0000 | size: 00000007
+001610: 1700 | 0017 // java.lang.invoke.MethodHandles$Lookup
+001612: 0f00 | 000f // java.lang.String
+001614: 1900 | 0019 // java.lang.invoke.MethodType
+001616: 0400 | 0004 // int
+001618: 0500 | 0005 // long
+00161a: 0300 | 0003 // float
+00161c: 0200 | 0002 // double
+ |
+00161e: 0000 |
+ |[1620] type_list
+001620: 0400 0000 | size: 00000004
+001624: 1700 | 0017 // java.lang.invoke.MethodHandles$Lookup
+001626: 0f00 | 000f // java.lang.String
+001628: 1900 | 0019 // java.lang.invoke.MethodType
+00162a: 1600 | 0016 // java.lang.invoke.MethodHandle
+ |
+ |[162c] type_list
+00162c: 0b00 0000 | size: 0000000b
+001630: 1700 | 0017 // java.lang.invoke.MethodHandles$Lookup
+001632: 0f00 | 000f // java.lang.String
+001634: 1900 | 0019 // java.lang.invoke.MethodType
+001636: 1600 | 0016 // java.lang.invoke.MethodHandle
+001638: 1600 | 0016 // java.lang.invoke.MethodHandle
+00163a: 1600 | 0016 // java.lang.invoke.MethodHandle
+00163c: 1600 | 0016 // java.lang.invoke.MethodHandle
+00163e: 1600 | 0016 // java.lang.invoke.MethodHandle
+001640: 1600 | 0016 // java.lang.invoke.MethodHandle
+001642: 1600 | 0016 // java.lang.invoke.MethodHandle
+001644: 1600 | 0016 // java.lang.invoke.MethodHandle
+ |
+001646: 0000 |
+ |[1648] type_list
+001648: 0600 0000 | size: 00000006
+00164c: 1700 | 0017 // java.lang.invoke.MethodHandles$Lookup
+00164e: 0f00 | 000f // java.lang.String
+001650: 1900 | 0019 // java.lang.invoke.MethodType
+001652: 1900 | 0019 // java.lang.invoke.MethodType
+001654: 1600 | 0016 // java.lang.invoke.MethodHandle
+001656: 1900 | 0019 // java.lang.invoke.MethodType
+ |
+ |[1658] type_list
+001658: 0300 0000 | size: 00000003
+00165c: 0a00 | 000a // java.lang.Class
+00165e: 0f00 | 000f // java.lang.String
+001660: 1900 | 0019 // java.lang.invoke.MethodType
+ |
+001662: 0000 |
+ |[1664] type_list
+001664: 0100 0000 | size: 00000001
+001668: 1900 | 0019 // java.lang.invoke.MethodType
+ |
+00166a: 0000 |
+ |[166c] type_list
+00166c: 0100 0000 | size: 00000001
+001670: 0900 | 0009 // java.io.PrintStream
+ |
+001672: 0000 |
+ |[1674] type_list
+001674: 0100 0000 | size: 00000001
+001678: 1e00 | 001e // java.util.function.Function
+ |
+00167a: 0000 |
+ |[167c] type_list
+00167c: 0100 0000 | size: 00000001
+001680: 1f00 | 001f // java.util.function.Predicate
+ |
+001682: 0000 |
+ |[1684] type_list
+001684: 0100 0000 | size: 00000001
+001688: 0100 | 0001 // char
+ |
+00168a: 0000 |
+ |[168c] type_list
+00168c: 0200 0000 | size: 00000002
+001690: 0700 | 0007 // invokecustom.InvokeCustom
+001692: 0300 | 0003 // float
+ |
+ |[1694] type_list
+001694: 0100 0000 | size: 00000001
+001698: 1600 | 0016 // java.lang.invoke.MethodHandle
+ |
+00169a: 0000 |
+ |[169c] type_list
+00169c: 0200 0000 | size: 00000002
+0016a0: 1600 | 0016 // java.lang.invoke.MethodHandle
+0016a2: 1600 | 0016 // java.lang.invoke.MethodHandle
+ |
+ |[16a4] type_list
+0016a4: 0100 0000 | size: 00000001
+0016a8: 1d00 | 001d // java.util.function.Consumer
+ |
+0016aa: 0000 |
+ |[16ac] type_list
+0016ac: 0100 0000 | size: 00000001
+0016b0: 2300 | 0023 // boolean
+ |
+0016b2: 0000 |
+ |[16b4] type_list
+0016b4: 0900 0000 | size: 00000009
+0016b8: 2300 | 0023 // boolean
+0016ba: 0000 | 0000 // byte
+0016bc: 0100 | 0001 // char
+0016be: 2100 | 0021 // short
+0016c0: 0400 | 0004 // int
+0016c2: 0300 | 0003 // float
+0016c4: 0500 | 0005 // long
+0016c6: 0200 | 0002 // double
+0016c8: 0f00 | 000f // java.lang.String
+ |
+0016ca: 0000 |
+ |[16cc] type_list
+0016cc: 0100 0000 | size: 00000001
+0016d0: 2500 | 0025 // java.lang.String[]
+ |
+ |string_data:
+0016d2: 00 |utf16_size: 00000000
+0016d3: 00 |""
+ |
+0016d4: 01 |utf16_size: 00000001
+0016d5: 2000 |" "
+ |
+0016d7: 04 |utf16_size: 00000004
+0016d8: 2021 3d20 00 |" != "
+ |
+0016dd: 03 |utf16_size: 00000003
+0016de: 202a 2000 |" * "
+ |
+0016e2: 03 |utf16_size: 00000003
+0016e3: 202b 2000 |" + "
+ |
+0016e7: 03 |utf16_size: 00000003
+0016e8: 203d 2000 |" = "
+ |
+0016ec: 0a |utf16_size: 0000000a
+0016ed: 2065 7870 6563 7465 6420|" expected "
+0016f7: 00 |
+ |
+0016f8: 05 |utf16_size: 00000005
+0016f9: 206e 6577 2000 |" new "
+ |
+0016ff: 01 |utf16_size: 00000001
+001700: 2900 |")"
+ |
+001702: 02 |utf16_size: 00000002
+001703: 2c20 00 |", "
+ |
+001706: 08 |utf16_size: 00000008
+001707: 3c63 6c69 6e69 743e 00 |"<clinit>"
+ |
+001710: 06 |utf16_size: 00000006
+001711: 3c69 6e69 743e 00 |"<init>"
+ |
+001718: 01 |utf16_size: 00000001
+001719: 4200 |"B"
+ |
+00171b: 01 |utf16_size: 00000001
+00171c: 4300 |"C"
+ |
+00171e: 01 |utf16_size: 00000001
+00171f: 4400 |"D"
+ |
+001721: 04 |utf16_size: 00000004
+001722: 4446 4644 00 |"DFFD"
+ |
+001727: 23 |utf16_size: 00000023
+001728: 4475 7065 2066 6972 7374|"Dupe first invokedynamic invocation"
+001732: 2069 6e76 6f6b 6564 796e|
+00173c: 616d 6963 2069 6e76 6f63|
+001746: 6174 696f 6e00 |
+ |
+00174c: 05 |utf16_size: 00000005
+00174d: 4552 524f 5200 |"ERROR"
+ |
+001753: 01 |utf16_size: 00000001
+001754: 4600 |"F"
+ |
+001756: 02 |utf16_size: 00000002
+001757: 464c 00 |"FL"
+ |
+00175a: 07 |utf16_size: 00000007
+00175b: 4661 696c 6564 2000 |"Failed "
+ |
+001763: 1e |utf16_size: 0000001e
+001764: 4669 7273 7420 696e 766f|"First invokedynamic invocation"
+00176e: 6b65 6479 6e61 6d69 6320|
+001778: 696e 766f 6361 7469 6f6e|
+001782: 00 |
+ |
+001783: 08 |utf16_size: 00000008
+001784: 466f 7274 7954 776f 00 |"FortyTwo"
+ |
+00178d: 0c |utf16_size: 0000000c
+00178e: 4865 6c6c 6f20 576f 726c|"Hello World!"
+001798: 6421 00 |
+ |
+00179b: 01 |utf16_size: 00000001
+00179c: 4900 |"I"
+ |
+00179e: 04 |utf16_size: 00000004
+00179f: 4949 4949 00 |"IIII"
+ |
+0017a4: 14 |utf16_size: 00000014
+0017a5: 496e 766f 6b65 4375 7374|"InvokeCustom.<init>("
+0017af: 6f6d 2e3c 696e 6974 3e28|
+0017b9: 00 |
+ |
+0017ba: 11 |utf16_size: 00000011
+0017bb: 496e 766f 6b65 4375 7374|"InvokeCustom.java"
+0017c5: 6f6d 2e6a 6176 6100 |
+ |
+0017cd: 21 |utf16_size: 00000021
+0017ce: 496e 766f 6b65 4375 7374|"InvokeCustom.privateMethodTest9()"
+0017d8: 6f6d 2e70 7269 7661 7465|
+0017e2: 4d65 7468 6f64 5465 7374|
+0017ec: 3928 2900 |
+ |
+0017f0: 01 |utf16_size: 00000001
+0017f1: 4a00 |"J"
+ |
+0017f3: 04 |utf16_size: 00000004
+0017f4: 4a4a 4a4a 00 |"JJJJ"
+ |
+0017f9: 01 |utf16_size: 00000001
+0017fa: 4c00 |"L"
+ |
+0017fc: 02 |utf16_size: 00000002
+0017fd: 4c44 00 |"LD"
+ |
+001800: 02 |utf16_size: 00000002
+001801: 4c46 00 |"LF"
+ |
+001804: 02 |utf16_size: 00000002
+001805: 4c49 00 |"LI"
+ |
+001808: 02 |utf16_size: 00000002
+001809: 4c4a 00 |"LJ"
+ |
+00180c: 02 |utf16_size: 00000002
+00180d: 4c4c 00 |"LL"
+ |
+001810: 04 |utf16_size: 00000004
+001811: 4c4c 4c4c 00 |"LLLL"
+ |
+001816: 08 |utf16_size: 00000008
+001817: 4c4c 4c4c 494a 4644 00 |"LLLLIJFD"
+ |
+001820: 05 |utf16_size: 00000005
+001821: 4c4c 4c4c 4c00 |"LLLLL"
+ |
+001827: 07 |utf16_size: 00000007
+001828: 4c4c 4c4c 4c4c 4c00 |"LLLLLLL"
+ |
+001830: 0c |utf16_size: 0000000c
+001831: 4c4c 4c4c 4c4c 4c4c 4c4c|"LLLLLLLLLLLL"
+00183b: 4c4c 00 |
+ |
+00183e: 1a |utf16_size: 0000001a
+00183f: 4c64 616c 7669 6b2f 616e|"Ldalvik/annotation/Throws;"
+001849: 6e6f 7461 7469 6f6e 2f54|
+001853: 6872 6f77 733b 00 |
+ |
+00185a: 1b |utf16_size: 0000001b
+00185b: 4c69 6e76 6f6b 6563 7573|"Linvokecustom/InvokeCustom;"
+001865: 746f 6d2f 496e 766f 6b65|
+00186f: 4375 7374 6f6d 3b00 |
+ |
+001877: 14 |utf16_size: 00000014
+001878: 4c69 6e76 6f6b 6563 7573|"Linvokecustom/Super;"
+001882: 746f 6d2f 5375 7065 723b|
+00188c: 00 |
+ |
+00188d: 15 |utf16_size: 00000015
+00188e: 4c6a 6176 612f 696f 2f50|"Ljava/io/PrintStream;"
+001898: 7269 6e74 5374 7265 616d|
+0018a2: 3b00 |
+ |
+0018a4: 11 |utf16_size: 00000011
+0018a5: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/Class;"
+0018af: 2f43 6c61 7373 3b00 |
+ |
+0018b7: 22 |utf16_size: 00000022
+0018b8: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/IllegalAccessException;"
+0018c2: 2f49 6c6c 6567 616c 4163|
+0018cc: 6365 7373 4578 6365 7074|
+0018d6: 696f 6e3b 00 |
+ |
+0018db: 21 |utf16_size: 00000021
+0018dc: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/NoSuchMethodException;"
+0018e6: 2f4e 6f53 7563 684d 6574|
+0018f0: 686f 6445 7863 6570 7469|
+0018fa: 6f6e 3b00 |
+ |
+0018fe: 12 |utf16_size: 00000012
+0018ff: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/Object;"
+001909: 2f4f 626a 6563 743b 00 |
+ |
+001912: 14 |utf16_size: 00000014
+001913: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/Runnable;"
+00191d: 2f52 756e 6e61 626c 653b|
+001927: 00 |
+ |
+001928: 12 |utf16_size: 00000012
+001929: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/String;"
+001933: 2f53 7472 696e 673b 00 |
+ |
+00193c: 19 |utf16_size: 00000019
+00193d: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/StringBuilder;"
+001947: 2f53 7472 696e 6742 7569|
+001951: 6c64 6572 3b00 |
+ |
+001957: 12 |utf16_size: 00000012
+001958: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/System;"
+001962: 2f53 7973 7465 6d3b 00 |
+ |
+00196b: 15 |utf16_size: 00000015
+00196c: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/Throwable;"
+001976: 2f54 6872 6f77 6162 6c65|
+001980: 3b00 |
+ |
+001982: 1b |utf16_size: 0000001b
+001983: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/invoke/CallSite;"
+00198d: 2f69 6e76 6f6b 652f 4361|
+001997: 6c6c 5369 7465 3b00 |
+ |
+00199f: 23 |utf16_size: 00000023
+0019a0: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/invoke/ConstantCallSite;"
+0019aa: 2f69 6e76 6f6b 652f 436f|
+0019b4: 6e73 7461 6e74 4361 6c6c|
+0019be: 5369 7465 3b00 |
+ |
+0019c4: 24 |utf16_size: 00000024
+0019c5: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/invoke/LambdaMetafactory;"
+0019cf: 2f69 6e76 6f6b 652f 4c61|
+0019d9: 6d62 6461 4d65 7461 6661|
+0019e3: 6374 6f72 793b 00 |
+ |
+0019ea: 1f |utf16_size: 0000001f
+0019eb: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/invoke/MethodHandle;"
+0019f5: 2f69 6e76 6f6b 652f 4d65|
+0019ff: 7468 6f64 4861 6e64 6c65|
+001a09: 3b00 |
+ |
+001a0b: 27 |utf16_size: 00000027
+001a0c: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/invoke/MethodHandles$Lookup;"
+001a16: 2f69 6e76 6f6b 652f 4d65|
+001a20: 7468 6f64 4861 6e64 6c65|
+001a2a: 7324 4c6f 6f6b 7570 3b00|
+ |
+001a34: 20 |utf16_size: 00000020
+001a35: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/invoke/MethodHandles;"
+001a3f: 2f69 6e76 6f6b 652f 4d65|
+001a49: 7468 6f64 4861 6e64 6c65|
+001a53: 733b 00 |
+ |
+001a56: 1d |utf16_size: 0000001d
+001a57: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/invoke/MethodType;"
+001a61: 2f69 6e76 6f6b 652f 4d65|
+001a6b: 7468 6f64 5479 7065 3b00|
+ |
+001a75: 12 |utf16_size: 00000012
+001a76: 4c6a 6176 612f 7574 696c|"Ljava/util/Arrays;"
+001a80: 2f41 7272 6179 733b 00 |
+ |
+001a89: 10 |utf16_size: 00000010
+001a8a: 4c6a 6176 612f 7574 696c|"Ljava/util/List;"
+001a94: 2f4c 6973 743b 00 |
+ |
+001a9b: 14 |utf16_size: 00000014
+001a9c: 4c6a 6176 612f 7574 696c|"Ljava/util/Optional;"
+001aa6: 2f4f 7074 696f 6e61 6c3b|
+001ab0: 00 |
+ |
+001ab1: 1d |utf16_size: 0000001d
+001ab2: 4c6a 6176 612f 7574 696c|"Ljava/util/function/Consumer;"
+001abc: 2f66 756e 6374 696f 6e2f|
+001ac6: 436f 6e73 756d 6572 3b00|
+ |
+001ad0: 1d |utf16_size: 0000001d
+001ad1: 4c6a 6176 612f 7574 696c|"Ljava/util/function/Function;"
+001adb: 2f66 756e 6374 696f 6e2f|
+001ae5: 4675 6e63 7469 6f6e 3b00|
+ |
+001aef: 1e |utf16_size: 0000001e
+001af0: 4c6a 6176 612f 7574 696c|"Ljava/util/function/Predicate;"
+001afa: 2f66 756e 6374 696f 6e2f|
+001b04: 5072 6564 6963 6174 653b|
+001b0e: 00 |
+ |
+001b0f: 19 |utf16_size: 00000019
+001b10: 4c6a 6176 612f 7574 696c|"Ljava/util/stream/Stream;"
+001b1a: 2f73 7472 6561 6d2f 5374|
+001b24: 7265 616d 3b00 |
+ |
+001b2a: 02 |utf16_size: 00000002
+001b2b: 4f4b 00 |"OK"
+ |
+001b2e: 03 |utf16_size: 00000003
+001b2f: 4f6e 6500 |"One"
+ |
+001b33: 01 |utf16_size: 00000001
+001b34: 5300 |"S"
+ |
+001b36: 1f |utf16_size: 0000001f
+001b37: 5365 636f 6e64 2069 6e76|"Second invokedynamic invocation"
+001b41: 6f6b 6564 796e 616d 6963|
+001b4b: 2069 6e76 6f63 6174 696f|
+001b55: 6e00 |
+ |
+001b57: 06 |utf16_size: 00000006
+001b58: 5374 7269 6e67 00 |"String"
+ |
+001b5f: 05 |utf16_size: 00000005
+001b60: 5468 7265 6500 |"Three"
+ |
+001b66: 01 |utf16_size: 00000001
+001b67: 5600 |"V"
+ |
+001b69: 02 |utf16_size: 00000002
+001b6a: 5643 00 |"VC"
+ |
+001b6d: 02 |utf16_size: 00000002
+001b6e: 5644 00 |"VD"
+ |
+001b71: 02 |utf16_size: 00000002
+001b72: 5646 00 |"VF"
+ |
+001b75: 02 |utf16_size: 00000002
+001b76: 5649 00 |"VI"
+ |
+001b79: 02 |utf16_size: 00000002
+001b7a: 564a 00 |"VJ"
+ |
+001b7d: 02 |utf16_size: 00000002
+001b7e: 564c 00 |"VL"
+ |
+001b81: 03 |utf16_size: 00000003
+001b82: 564c 4600 |"VLF"
+ |
+001b86: 03 |utf16_size: 00000003
+001b87: 564c 4c00 |"VLL"
+ |
+001b8b: 02 |utf16_size: 00000002
+001b8c: 565a 00 |"VZ"
+ |
+001b8f: 0a |utf16_size: 0000000a
+001b90: 565a 4243 5349 464a 444c|"VZBCSIFJDL"
+001b9a: 00 |
+ |
+001b9b: 01 |utf16_size: 00000001
+001b9c: 5a00 |"Z"
+ |
+001b9e: 02 |utf16_size: 00000002
+001b9f: 5a4c 00 |"ZL"
+ |
+001ba2: 13 |utf16_size: 00000013
+001ba3: 5b4c 6a61 7661 2f6c 616e|"[Ljava/lang/Object;"
+001bad: 672f 4f62 6a65 6374 3b00|
+ |
+001bb7: 13 |utf16_size: 00000013
+001bb8: 5b4c 6a61 7661 2f6c 616e|"[Ljava/lang/String;"
+001bc2: 672f 5374 7269 6e67 3b00|
+ |
+001bcc: 01 |utf16_size: 00000001
+001bcd: 5d00 |"]"
+ |
+001bcf: 06 |utf16_size: 00000006
+001bd0: 6163 6365 7074 00 |"accept"
+ |
+001bd7: 06 |utf16_size: 00000006
+001bd8: 6170 7065 6e64 00 |"append"
+ |
+001bdf: 05 |utf16_size: 00000005
+001be0: 6170 706c 7900 |"apply"
+ |
+001be6: 06 |utf16_size: 00000006
+001be7: 6173 4c69 7374 00 |"asList"
+ |
+001bee: 06 |utf16_size: 00000006
+001bef: 6173 5479 7065 00 |"asType"
+ |
+001bf6: 11 |utf16_size: 00000011
+001bf7: 6273 6d43 7265 6174 6543|"bsmCreateCallSite"
+001c01: 616c 6c53 6974 6500 |
+ |
+001c09: 13 |utf16_size: 00000013
+001c0a: 6273 6d43 7265 6174 6543|"bsmCreateCallSite ["
+001c14: 616c 6c53 6974 6520 5b00|
+ |
+001c1e: 0f |utf16_size: 0000000f
+001c1f: 6273 6d4c 6f6f 6b75 7053|"bsmLookupStatic"
+001c29: 7461 7469 6300 |
+ |
+001c2f: 12 |utf16_size: 00000012
+001c30: 6273 6d4c 6f6f 6b75 7053|"bsmLookupStatic []"
+001c3a: 7461 7469 6320 5b5d 00 |
+ |
+001c43: 1c |utf16_size: 0000001c
+001c44: 6273 6d4c 6f6f 6b75 7053|"bsmLookupStaticWithExtraArgs"
+001c4e: 7461 7469 6357 6974 6845|
+001c58: 7874 7261 4172 6773 00 |
+ |
+001c61: 1e |utf16_size: 0000001e
+001c62: 6273 6d4c 6f6f 6b75 7053|"bsmLookupStaticWithExtraArgs ["
+001c6c: 7461 7469 6357 6974 6845|
+001c76: 7874 7261 4172 6773 205b|
+001c80: 00 |
+ |
+001c81: 0e |utf16_size: 0000000e
+001c82: 6273 6d4c 6f6f 6b75 7054|"bsmLookupTest9"
+001c8c: 6573 7439 00 |
+ |
+001c91: 10 |utf16_size: 00000010
+001c92: 6273 6d4c 6f6f 6b75 7054|"bsmLookupTest9 ["
+001c9c: 6573 7439 205b 00 |
+ |
+001ca3: 0f |utf16_size: 0000000f
+001ca4: 6368 6563 6b46 6965 6c64|"checkFieldTest9"
+001cae: 5465 7374 3900 |
+ |
+001cb4: 15 |utf16_size: 00000015
+001cb5: 6368 6563 6b46 6965 6c64|"checkFieldTest9: old "
+001cbf: 5465 7374 393a 206f 6c64|
+001cc9: 2000 |
+ |
+001ccb: 15 |utf16_size: 00000015
+001ccc: 6368 6563 6b53 7461 7469|"checkStaticFieldTest9"
+001cd6: 6346 6965 6c64 5465 7374|
+001ce0: 3900 |
+ |
+001ce2: 1b |utf16_size: 0000001b
+001ce3: 6368 6563 6b53 7461 7469|"checkStaticFieldTest9: old "
+001ced: 6346 6965 6c64 5465 7374|
+001cf7: 393a 206f 6c64 2000 |
+ |
+001cff: 06 |utf16_size: 00000006
+001d00: 6571 7561 6c73 00 |"equals"
+ |
+001d07: 0a |utf16_size: 0000000a
+001d08: 6669 656c 6454 6573 7439|"fieldTest9"
+001d12: 00 |
+ |
+001d13: 06 |utf16_size: 00000006
+001d14: 6669 6c74 6572 00 |"filter"
+ |
+001d1b: 07 |utf16_size: 00000007
+001d1c: 6669 6e64 416e 7900 |"findAny"
+ |
+001d24: 0a |utf16_size: 0000000a
+001d25: 6669 6e64 5374 6174 6963|"findStatic"
+001d2f: 00 |
+ |
+001d30: 07 |utf16_size: 00000007
+001d31: 666f 7245 6163 6800 |"forEach"
+ |
+001d39: 08 |utf16_size: 00000008
+001d3a: 6765 7443 6c61 7373 00 |"getClass"
+ |
+001d43: 11 |utf16_size: 00000011
+001d44: 6865 6c70 6572 4d65 7468|"helperMethodTest9"
+001d4e: 6f64 5465 7374 3900 |
+ |
+001d56: 15 |utf16_size: 00000015
+001d57: 6865 6c70 6572 4d65 7468|"helperMethodTest9 in "
+001d61: 6f64 5465 7374 3920 696e|
+001d6b: 2000 |
+ |
+001d6d: 06 |utf16_size: 00000006
+001d6e: 696e 766f 6b65 00 |"invoke"
+ |
+001d75: 0b |utf16_size: 0000000b
+001d76: 696e 766f 6b65 4578 6163|"invokeExact"
+001d80: 7400 |
+ |
+001d82: 13 |utf16_size: 00000013
+001d83: 6c61 6d62 6461 246c 616d|"lambda$lambdaTest$0"
+001d8d: 6264 6154 6573 7424 3000|
+ |
+001d97: 0a |utf16_size: 0000000a
+001d98: 6c61 6d62 6461 5465 7374|"lambdaTest"
+001da2: 00 |
+ |
+001da3: 06 |utf16_size: 00000006
+001da4: 6c6f 6f6b 7570 00 |"lookup"
+ |
+001dab: 0b |utf16_size: 0000000b
+001dac: 6c6f 6f6b 7570 436c 6173|"lookupClass"
+001db6: 7300 |
+ |
+001db8: 04 |utf16_size: 00000004
+001db9: 6d61 696e 00 |"main"
+ |
+001dbe: 03 |utf16_size: 00000003
+001dbf: 6d61 7000 |"map"
+ |
+001dc3: 0b |utf16_size: 0000000b
+001dc4: 6d65 7461 6661 6374 6f72|"metafactory"
+001dce: 7900 |
+ |
+001dd0: 06 |utf16_size: 00000006
+001dd1: 6f72 456c 7365 00 |"orElse"
+ |
+001dd8: 03 |utf16_size: 00000003
+001dd9: 6f75 7400 |"out"
+ |
+001ddd: 05 |utf16_size: 00000005
+001dde: 7072 696e 7400 |"print"
+ |
+001de4: 07 |utf16_size: 00000007
+001de5: 7072 696e 746c 6e00 |"println"
+ |
+001ded: 12 |utf16_size: 00000012
+001dee: 7072 6976 6174 654d 6574|"privateMethodTest9"
+001df8: 686f 6454 6573 7439 00 |
+ |
+001e01: 03 |utf16_size: 00000003
+001e02: 7275 6e00 |"run"
+ |
+001e06: 0f |utf16_size: 0000000f
+001e07: 7275 6e28 2920 666f 7220|"run() for Test9"
+001e11: 5465 7374 3900 |
+ |
+001e17: 10 |utf16_size: 00000010
+001e18: 7374 6174 6963 4669 656c|"staticFieldTest9"
+001e22: 6454 6573 7439 00 |
+ |
+001e29: 06 |utf16_size: 00000006
+001e2a: 7374 7265 616d 00 |"stream"
+ |
+001e31: 11 |utf16_size: 00000011
+001e32: 7461 7267 6574 4d65 7468|"targetMethodTest1"
+001e3c: 6f64 5465 7374 3100 |
+ |
+001e44: 11 |utf16_size: 00000011
+001e45: 7461 7267 6574 4d65 7468|"targetMethodTest2"
+001e4f: 6f64 5465 7374 3200 |
+ |
+001e57: 11 |utf16_size: 00000011
+001e58: 7461 7267 6574 4d65 7468|"targetMethodTest3"
+001e62: 6f64 5465 7374 3300 |
+ |
+001e6a: 23 |utf16_size: 00000023
+001e6b: 7461 7267 6574 4d65 7468|"targetMethodTest3 from InvokeCustom"
+001e75: 6f64 5465 7374 3320 6672|
+001e7f: 6f6d 2049 6e76 6f6b 6543|
+001e89: 7573 746f 6d00 |
+ |
+001e8f: 11 |utf16_size: 00000011
+001e90: 7461 7267 6574 4d65 7468|"targetMethodTest4"
+001e9a: 6f64 5465 7374 3400 |
+ |
+001ea2: 2b |utf16_size: 0000002b
+001ea3: 7461 7267 6574 4d65 7468|"targetMethodTest4 from InvokeCustom (oops!)"
+001ead: 6f64 5465 7374 3420 6672|
+001eb7: 6f6d 2049 6e76 6f6b 6543|
+001ec1: 7573 746f 6d20 286f 6f70|
+001ecb: 7321 2900 |
+ |
+001ecf: 1c |utf16_size: 0000001c
+001ed0: 7461 7267 6574 4d65 7468|"targetMethodTest4 from Super"
+001eda: 6f64 5465 7374 3420 6672|
+001ee4: 6f6d 2053 7570 6572 00 |
+ |
+001eed: 11 |utf16_size: 00000011
+001eee: 7461 7267 6574 4d65 7468|"targetMethodTest5"
+001ef8: 6f64 5465 7374 3500 |
+ |
+001f00: 12 |utf16_size: 00000012
+001f01: 7461 7267 6574 4d65 7468|"targetMethodTest5 "
+001f0b: 6f64 5465 7374 3520 00 |
+ |
+001f14: 1c |utf16_size: 0000001c
+001f15: 7461 7267 6574 4d65 7468|"targetMethodTest5 returned: "
+001f1f: 6f64 5465 7374 3520 7265|
+001f29: 7475 726e 6564 3a20 00 |
+ |
+001f32: 11 |utf16_size: 00000011
+001f33: 7461 7267 6574 4d65 7468|"targetMethodTest6"
+001f3d: 6f64 5465 7374 3600 |
+ |
+001f45: 12 |utf16_size: 00000012
+001f46: 7461 7267 6574 4d65 7468|"targetMethodTest6 "
+001f50: 6f64 5465 7374 3620 00 |
+ |
+001f59: 1c |utf16_size: 0000001c
+001f5a: 7461 7267 6574 4d65 7468|"targetMethodTest6 returned: "
+001f64: 6f64 5465 7374 3620 7265|
+001f6e: 7475 726e 6564 3a20 00 |
+ |
+001f77: 11 |utf16_size: 00000011
+001f78: 7461 7267 6574 4d65 7468|"targetMethodTest7"
+001f82: 6f64 5465 7374 3700 |
+ |
+001f8a: 12 |utf16_size: 00000012
+001f8b: 7461 7267 6574 4d65 7468|"targetMethodTest7 "
+001f95: 6f64 5465 7374 3720 00 |
+ |
+001f9e: 11 |utf16_size: 00000011
+001f9f: 7461 7267 6574 4d65 7468|"targetMethodTest8"
+001fa9: 6f64 5465 7374 3800 |
+ |
+001fb1: 12 |utf16_size: 00000012
+001fb2: 7461 7267 6574 4d65 7468|"targetMethodTest8 "
+001fbc: 6f64 5465 7374 3820 00 |
+ |
+001fc5: 11 |utf16_size: 00000011
+001fc6: 7461 7267 6574 4d65 7468|"targetMethodTest9"
+001fd0: 6f64 5465 7374 3900 |
+ |
+001fd8: 13 |utf16_size: 00000013
+001fd9: 7461 7267 6574 4d65 7468|"targetMethodTest9()"
+001fe3: 6f64 5465 7374 3928 2900|
+ |
+001fed: 04 |utf16_size: 00000004
+001fee: 7465 7374 00 |"test"
+ |
+001ff3: 05 |utf16_size: 00000005
+001ff4: 7465 7374 3100 |"test1"
+ |
+001ffa: 05 |utf16_size: 00000005
+001ffb: 7465 7374 3200 |"test2"
+ |
+002001: 05 |utf16_size: 00000005
+002002: 7465 7374 3300 |"test3"
+ |
+002008: 05 |utf16_size: 00000005
+002009: 7465 7374 3400 |"test4"
+ |
+00200f: 05 |utf16_size: 00000005
+002010: 7465 7374 3500 |"test5"
+ |
+002016: 05 |utf16_size: 00000005
+002017: 7465 7374 3600 |"test6"
+ |
+00201d: 05 |utf16_size: 00000005
+00201e: 7465 7374 3700 |"test7"
+ |
+002024: 05 |utf16_size: 00000005
+002025: 7465 7374 3800 |"test8"
+ |
+00202b: 05 |utf16_size: 00000005
+00202c: 7465 7374 3900 |"test9"
+ |
+002032: 08 |utf16_size: 00000008
+002033: 746f 5374 7269 6e67 00 |"toString"
+ |
+00203c: 04 |utf16_size: 00000004
+00203d: 7472 696d 00 |"trim"
+ |
+002042: 05 |utf16_size: 00000005
+002043: 7661 6c75 6500 |"value"
+ |
+ |byte_data:
+ |[2049] debug info
+002049: 1d |line_start: 29
+00204a: 00 |parameters_size: 0000
+00204b: 07 |0000: prologue end
+00204c: 0e |0000: line 29
+00204d: 00 |end sequence
+ |
+ |[204e] debug info
+00204e: 1f |line_start: 31
+00204f: 00 |parameters_size: 0000
+002050: 07 |0000: prologue end
+002051: 0e |0000: line 31
+002052: 78 |0007: line 32
+002053: 00 |end sequence
+ |
+ |[2054] debug info
+002054: 66 |line_start: 102
+002055: 00 |parameters_size: 0000
+002056: 07 |0000: prologue end
+002057: 0e |0000: line 102
+002058: 00 |end sequence
+ |
+ |[2059] debug info
+002059: 27 |line_start: 39
+00205a: 00 |parameters_size: 0000
+00205b: 07 |0000: prologue end
+00205c: 0e |0000: line 39
+00205d: 02cc 00 |line = 115
+002060: 3b |0003: line 115
+002061: 02b4 7f |line = 39
+002064: 3b |0006: line 39
+002065: 00 |end sequence
+ |
+ |[2066] debug info
+002066: 28 |line_start: 40
+002067: 01 |parameters_size: 0001
+002068: 00 |parameter <unnamed> v4
+002069: 07 |0000: prologue end
+00206a: 0e |0000: line 40
+00206b: 02cb 00 |line = 115
+00206e: 3b |0003: line 115
+00206f: 02b6 7f |line = 41
+002072: 3b |0006: line 41
+002073: 011e |0024: advance pc
+002075: 0f |0024: line 42
+002076: 00 |end sequence
+ |
+ |[2077] debug info
+002077: a001 |line_start: 160
+002079: 04 |parameters_size: 0004
+00207a: 00 |parameter <unnamed> v3
+00207b: 00 |parameter <unnamed> v4
+00207c: 00 |parameter <unnamed> v5
+00207d: 00 |parameter <unnamed> v6
+00207e: 07 |0000: prologue end
+00207f: 0e |0000: line 160
+002080: 011e |001e: advance pc
+002082: 0f |001e: line 161
+002083: 00 |end sequence
+ |
+ |[2084] debug info
+002084: 8e01 |line_start: 142
+002086: 03 |parameters_size: 0003
+002087: 00 |parameter <unnamed> v2
+002088: 00 |parameter <unnamed> v3
+002089: 00 |parameter <unnamed> v4
+00208a: 07 |0000: prologue end
+00208b: 0e |0000: line 142
+00208c: 78 |0007: line 143
+00208d: 4b |000b: line 144
+00208e: 87 |0013: line 145
+00208f: 00 |end sequence
+ |
+ |[2090] debug info
+002090: 9701 |line_start: 151
+002092: 07 |parameters_size: 0007
+002093: 00 |parameter <unnamed> v3
+002094: 00 |parameter <unnamed> v4
+002095: 00 |parameter <unnamed> v5
+002096: 00 |parameter <unnamed> v6
+002097: 00 |parameter <unnamed> v7
+002098: 00 |parameter <unnamed> v9
+002099: 00 |parameter <unnamed> v10
+00209a: 07 |0000: prologue end
+00209b: 0e |0000: line 151
+00209c: 013c |003c: advance pc
+00209e: 0f |003c: line 152
+00209f: 4b |0040: line 153
+0020a0: 87 |0048: line 154
+0020a1: 00 |end sequence
+ |
+ |[20a2] debug info
+0020a2: ae01 |line_start: 174
+0020a4: 0b |parameters_size: 000b
+0020a5: 00 |parameter <unnamed> v3
+0020a6: 00 |parameter <unnamed> v4
+0020a7: 00 |parameter <unnamed> v5
+0020a8: 00 |parameter <unnamed> v6
+0020a9: 00 |parameter <unnamed> v7
+0020aa: 00 |parameter <unnamed> v8
+0020ab: 00 |parameter <unnamed> v9
+0020ac: 00 |parameter <unnamed> v10
+0020ad: 00 |parameter <unnamed> v11
+0020ae: 00 |parameter <unnamed> v12
+0020af: 00 |parameter <unnamed> v13
+0020b0: 07 |0000: prologue end
+0020b1: 0e |0000: line 174
+0020b2: 013c |003c: advance pc
+0020b4: 10 |003c: line 176
+0020b5: 011c |0058: advance pc
+0020b7: 11 |0058: line 179
+0020b8: 3c |005b: line 180
+0020b9: 5a |0060: line 181
+0020ba: 3e |0063: line 184
+0020bb: 4c |0067: line 186
+0020bc: 69 |006d: line 187
+0020bd: 4b |0071: line 188
+0020be: 4c |0075: line 190
+0020bf: 4b |0079: line 191
+0020c0: 87 |0081: line 192
+0020c1: 00 |end sequence
+ |
+ |[20c2] debug info
+0020c2: 78 |line_start: 120
+0020c3: 02 |parameters_size: 0002
+0020c4: 00 |parameter <unnamed> v7
+0020c5: 00 |parameter <unnamed> v8
+0020c6: 07 |0000: prologue end
+0020c7: 3b |0003: line 120
+0020c8: 5a |0008: line 121
+0020c9: 4b |000c: line 122
+0020ca: 5a |0011: line 123
+0020cb: 0132 |0043: advance pc
+0020cd: 10 |0043: line 125
+0020ce: b4 |004e: line 126
+0020cf: 1c |004f: line 125
+0020d0: 00 |end sequence
+ |
+ |[20d1] debug info
+0020d1: 6b |line_start: 107
+0020d2: 02 |parameters_size: 0002
+0020d3: 00 |parameter <unnamed> v6
+0020d4: 00 |parameter <unnamed> v7
+0020d5: 07 |0000: prologue end
+0020d6: 3b |0003: line 107
+0020d7: 5a |0008: line 108
+0020d8: 4b |000c: line 109
+0020d9: 5a |0011: line 110
+0020da: 0132 |0043: advance pc
+0020dc: 10 |0043: line 112
+0020dd: 96 |004c: line 113
+0020de: 1c |004d: line 112
+0020df: 00 |end sequence
+ |
+ |[20e0] debug info
+0020e0: c501 |line_start: 197
+0020e2: 01 |parameters_size: 0001
+0020e3: 00 |parameter <unnamed> v2
+0020e4: 07 |0000: prologue end
+0020e5: 0e |0000: line 197
+0020e6: 00 |end sequence
+ |
+ |[20e7] debug info
+0020e7: c401 |line_start: 196
+0020e9: 00 |parameters_size: 0000
+0020ea: 07 |0000: prologue end
+0020eb: 0e |0000: line 196
+0020ec: 0116 |0016: advance pc
+0020ee: 0f |0016: line 197
+0020ef: ff |0026: line 198
+0020f0: ff |0036: line 199
+0020f1: ff |0046: line 200
+0020f2: 00 |end sequence
+ |
+ |[20f3] debug info
+0020f3: a501 |line_start: 165
+0020f5: 00 |parameters_size: 0000
+0020f6: 07 |0000: prologue end
+0020f7: 0e |0000: line 165
+0020f8: 78 |0007: line 166
+0020f9: 00 |end sequence
+ |
+ |[20fa] debug info
+0020fa: 2d |line_start: 45
+0020fb: 00 |parameters_size: 0000
+0020fc: 07 |0000: prologue end
+0020fd: 0e |0000: line 45
+0020fe: 78 |0007: line 46
+0020ff: 00 |end sequence
+ |
+ |[2100] debug info
+002100: 32 |line_start: 50
+002101: 09 |parameters_size: 0009
+002102: 00 |parameter <unnamed> v2
+002103: 00 |parameter <unnamed> v3
+002104: 00 |parameter <unnamed> v4
+002105: 00 |parameter <unnamed> v5
+002106: 00 |parameter <unnamed> v6
+002107: 00 |parameter <unnamed> v7
+002108: 00 |parameter <unnamed> v8
+002109: 00 |parameter <unnamed> v10
+00210a: 00 |parameter <unnamed> v12
+00210b: 07 |0000: prologue end
+00210c: 0e |0000: line 50
+00210d: 5a |0005: line 51
+00210e: 5a |000a: line 52
+00210f: 5a |000f: line 53
+002110: 5a |0014: line 54
+002111: 5a |0019: line 55
+002112: 5a |001e: line 56
+002113: 5a |0023: line 57
+002114: 5a |0028: line 58
+002115: 5a |002d: line 59
+002116: 00 |end sequence
+ |
+ |[2117] debug info
+002117: 3e |line_start: 62
+002118: 00 |parameters_size: 0000
+002119: 07 |0000: prologue end
+00211a: 0e |0000: line 62
+00211b: 78 |0007: line 63
+00211c: 00 |end sequence
+ |
+ |[211d] debug info
+00211d: 48 |line_start: 72
+00211e: 03 |parameters_size: 0003
+00211f: 00 |parameter <unnamed> v4
+002120: 00 |parameter <unnamed> v5
+002121: 00 |parameter <unnamed> v6
+002122: 07 |0000: prologue end
+002123: 0e |0000: line 72
+002124: 2d |0002: line 73
+002125: 012c |002e: advance pc
+002127: 0f |002e: line 74
+002128: 2d |0030: line 75
+002129: 0122 |0052: advance pc
+00212b: 10 |0052: line 77
+00212c: 00 |end sequence
+ |
+ |[212d] debug info
+00212d: 51 |line_start: 81
+00212e: 03 |parameters_size: 0003
+00212f: 00 |parameter <unnamed> v6
+002130: 00 |parameter <unnamed> v8
+002131: 00 |parameter <unnamed> v10
+002132: 07 |0000: prologue end
+002133: 0e |0000: line 81
+002134: 2d |0002: line 82
+002135: 012c |002e: advance pc
+002137: 0f |002e: line 83
+002138: 4b |0032: line 84
+002139: 0122 |0054: advance pc
+00213b: 10 |0054: line 86
+00213c: 00 |end sequence
+ |
+ |[213d] debug info
+00213d: 5a |line_start: 90
+00213e: 03 |parameters_size: 0003
+00213f: 00 |parameter <unnamed> v6
+002140: 00 |parameter <unnamed> v7
+002141: 00 |parameter <unnamed> v8
+002142: 07 |0000: prologue end
+002143: 0e |0000: line 90
+002144: 3c |0003: line 91
+002145: 012c |002f: advance pc
+002147: 0f |002f: line 92
+002148: 4b |0033: line 93
+002149: 0122 |0055: advance pc
+00214b: 10 |0055: line 95
+00214c: 00 |end sequence
+ |
+ |[214d] debug info
+00214d: 63 |line_start: 99
+00214e: 01 |parameters_size: 0001
+00214f: 00 |parameter <unnamed> v3
+002150: 07 |0000: prologue end
+002151: 0e |0000: line 99
+002152: 0118 |0018: advance pc
+002154: 0f |0018: line 100
+002155: 00 |end sequence
+ |
+ |[2156] debug info
+002156: 8501 |line_start: 133
+002158: 00 |parameters_size: 0000
+002159: 07 |0000: prologue end
+00215a: 0e |0000: line 133
+00215b: 78 |0007: line 134
+00215c: 00 |end sequence
+ |
+ |[215d] debug info
+00215d: 8101 |line_start: 129
+00215f: 00 |parameters_size: 0000
+002160: 07 |0000: prologue end
+002161: 0e |0000: line 129
+002162: 011a |001a: advance pc
+002164: 0f |001a: line 130
+002165: 00 |end sequence
+ |
+ |[2166] debug info
+002166: 8901 |line_start: 137
+002168: 00 |parameters_size: 0000
+002169: 07 |0000: prologue end
+00216a: 0e |0000: line 137
+00216b: 78 |0007: line 138
+00216c: 00 |end sequence
+ |
+ |[216d] debug info
+00216d: 44 |line_start: 68
+00216e: 00 |parameters_size: 0000
+00216f: 07 |0000: prologue end
+002170: 0e |0000: line 68
+002171: 78 |0007: line 69
+002172: 00 |end sequence
+ |
+ |[2173] annotation
+002173: 02 | visibility: VISBILITY_SYSTEM
+002174: 06 | type_idx: 00000006 // dalvik.annotation.Throws
+002175: 01 | size: 00000001
+ | elements[0]:
+002176: a601 | name_idx: 000000a6 // value
+002178: 1c01 1812 | value: array {java.lang.Throwable}
+ |
+ |[217c] annotation
+00217c: 02 | visibility: VISBILITY_SYSTEM
+00217d: 06 | type_idx: 00000006 // dalvik.annotation.Throws
+00217e: 01 | size: 00000001
+ | elements[0]:
+00217f: a601 | name_idx: 000000a6 // value
+002181: 1c02 180c 180b | value: array {java.lang.NoSuchMethodException, java.lang.IllegalAccessException}
+ |
+ |[2187] call site
+002187: 06 | size: 00000006
+002188: 1609 | [0] method handle invoke-static,method{java.lang.invoke.LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}
+00218a: 179a | [1] utf8 test
+00218c: 151d | [2] proto ()Ljava/util/function/Predicate;
+00218e: 1531 | [3] proto (Ljava/lang/Object;)Z
+002190: 1608 | [4] method handle invoke-static,method{invokecustom.InvokeCustom.lambda$lambdaTest$0:(Ljava/lang/String;)Z}
+002192: 1532 | [5] proto (Ljava/lang/String;)Z
+ |
+ |[2194] call site
+002194: 06 | size: 00000006
+002195: 1609 | [0] method handle invoke-static,method{java.lang.invoke.LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}
+002197: 175d | [1] utf8 apply
+002199: 151c | [2] proto ()Ljava/util/function/Function;
+00219b: 1507 | [3] proto (Ljava/lang/Object;)Ljava/lang/Object;
+00219d: 160c | [4] method handle invoke-instance,method{java.lang.String.trim:()Ljava/lang/String;}
+00219f: 150a | [5] proto (Ljava/lang/String;)Ljava/lang/String;
+ |
+ |[21a1] call site
+0021a1: 06 | size: 00000006
+0021a2: 1609 | [0] method handle invoke-static,method{java.lang.invoke.LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}
+0021a4: 175b | [1] utf8 accept
+0021a6: 151b | [2] proto (Ljava/io/PrintStream;)Ljava/util/function/Consumer;
+0021a8: 1529 | [3] proto (Ljava/lang/Object;)V
+0021aa: 160b | [4] method handle invoke-instance,method{java.io.PrintStream.println:(Ljava/lang/String;)V}
+0021ac: 152a | [5] proto (Ljava/lang/String;)V
+ |
+ |[21ae] call site
+0021ae: 03 | size: 00000003
+0021af: 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;}
+0021b1: 1787 | [1] utf8 targetMethodTest1
+0021b3: 1521 | [2] proto ()V
+ |
+ |[21b5] call site
+0021b5: 03 | size: 00000003
+0021b6: 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;}
+0021b8: 1788 | [1] utf8 targetMethodTest2
+0021ba: 152f | [2] proto (ZBCSIFJDLjava/lang/String;)V
+ |
+ |[21bc] call site
+0021bc: 03 | size: 00000003
+0021bd: 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;}
+0021bf: 178e | [1] utf8 targetMethodTest5
+0021c1: 1503 | [2] proto (III)I
+ |
+ |[21c3] call site
+0021c3: 03 | size: 00000003
+0021c4: 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;}
+0021c6: 1791 | [1] utf8 targetMethodTest6
+0021c8: 1504 | [2] proto (JJJ)J
+ |
+ |[21ca] call site
+0021ca: 03 | size: 00000003
+0021cb: 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;}
+0021cd: 1794 | [1] utf8 targetMethodTest7
+0021cf: 1500 | [2] proto (FFD)D
+ |
+ |[21d1] call site
+0021d1: 03 | size: 00000003
+0021d2: 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;}
+0021d4: 1796 | [1] utf8 targetMethodTest8
+0021d6: 152a | [2] proto (Ljava/lang/String;)V
+ |
+ |[21d8] call site
+0021d8: 07 | size: 00000007
+0021d9: 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;}
+0021db: 1789 | [1] utf8 targetMethodTest3
+0021dd: 1521 | [2] proto ()V
+0021df: 0401 | [3] int 1
+0021e1: 6615 cd5b 07 | [4] long 123456789
+0021e6: 7079 e9f6 42 | [5] float 123.456
+0021eb: f158 703f a00c 24fe 40 | [6] double 123456.789123
+ |
+ |[21f4] call site
+0021f4: 04 | size: 00000004
+0021f5: 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;}
+0021f7: 178b | [1] utf8 targetMethodTest4
+0021f9: 1527 | [2] proto (Linvokecustom/InvokeCustom;)V
+0021fb: 160f | [3] method handle invoke-direct,method{invokecustom.Super.targetMethodTest4:()V}
+ |
+ |[21fd] call site
+0021fd: 0b | size: 0000000b
+0021fe: 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/MethodHandle;)Ljava/lang/invoke/CallSite;}
+002200: 1798 | [1] utf8 targetMethodTest9
+002202: 1521 | [2] proto ()V
+002204: 1601 | [3] method handle static-get,field{invokecustom.InvokeCustom.staticFieldTest9:I}
+002206: 1600 | [4] method handle static-put,field{invokecustom.InvokeCustom.staticFieldTest9:I}
+002208: 1603 | [5] method handle instance-get,field{invokecustom.InvokeCustom.fieldTest9:F}
+00220a: 1602 | [6] method handle instance-put,field{invokecustom.InvokeCustom.fieldTest9:F}
+00220c: 160a | [7] method handle invoke-instance,method{invokecustom.InvokeCustom.helperMethodTest9:()V}
+00220e: 160d | [8] method handle invoke-constructor,method{invokecustom.InvokeCustom.<init>:(I)V}
+002210: 1610 | [9] method handle invoke-interface,ifaceMethod{java.lang.Runnable.run:()V}
+002212: 160e | [a] method handle invoke-direct,method{invokecustom.InvokeCustom.privateMethodTest9:()V}
+ |
+ |[2214] class data for invokecustom.Super
+002214: 00 | static_fields_size: 00000000
+002215: 00 | instance_fields_size: 00000000
+002216: 01 | direct_methods_size: 00000001
+002217: 02 | virtual_methods_size: 00000002
+ | direct_methods:
+ | [0] invokecustom.Super.<init>:()V
+002218: 21 | method_idx: 00000021
+002219: 8080 04 | access_flags: constructor
+00221c: a813 | code_off: 000009a8
+ | virtual_methods:
+ | [0] invokecustom.Super.helperMethodTest9:()V
+00221e: 22 | method_idx: 00000022
+00221f: 8108 | access_flags: public|abstract
+002221: 00 | code_off: 00000000
+ | [1] invokecustom.Super.targetMethodTest4:()V
+002222: 01 | method_idx: 00000023
+002223: 01 | access_flags: public
+002224: c013 | code_off: 000009c0
+ |
+ |[2226] class data for invokecustom.InvokeCustom
+002226: 01 | static_fields_size: 00000001
+002227: 01 | instance_fields_size: 00000001
+002228: 1e | direct_methods_size: 0000001e
+002229: 03 | virtual_methods_size: 00000003
+ | static_fields:
+ | [0] invokecustom.InvokeCustom.staticFieldTest9:I
+00222a: 01 | field_idx: 00000001
+00222b: 0a | access_flags: private|static
+ | instance_fields:
+ | [0] invokecustom.InvokeCustom.fieldTest9:F
+00222c: 00 | field_idx: 00000000
+00222d: 02 | access_flags: private
+ | direct_methods:
+ | [0] invokecustom.InvokeCustom.<clinit>:()V
+00222e: 00 | method_idx: 00000000
+00222f: 8880 04 | access_flags: static|constructor
+002232: e013 | code_off: 000009e0
+ | [1] invokecustom.InvokeCustom.<init>:()V
+002234: 01 | method_idx: 00000001
+002235: 8180 04 | access_flags: public|constructor
+002238: f813 | code_off: 000009f8
+ | [2] invokecustom.InvokeCustom.<init>:(I)V
+00223a: 01 | method_idx: 00000002
+00223b: 8180 04 | access_flags: public|constructor
+00223e: 9814 | code_off: 00000a18
+ | [3] invokecustom.InvokeCustom.bsmCreateCallSite:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+002240: 01 | method_idx: 00000003
+002241: 09 | access_flags: public|static
+002242: f414 | code_off: 00000a74
+ | [4] invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
+002244: 01 | method_idx: 00000004
+002245: 09 | access_flags: public|static
+002246: cc15 | code_off: 00000acc
+ | [5] invokecustom.InvokeCustom.bsmLookupStaticWithExtraArgs:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;
+002248: 01 | method_idx: 00000005
+002249: 09 | access_flags: public|static
+00224a: 9816 | code_off: 00000b18
+ | [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/MethodHandle;)Ljava/lang/invoke/CallSite;
+00224c: 01 | method_idx: 00000006
+00224d: 09 | access_flags: public|static
+00224e: cc17 | code_off: 00000bcc
+ | [7] invokecustom.InvokeCustom.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+002250: 01 | method_idx: 00000007
+002251: 02 | access_flags: private
+002252: f419 | code_off: 00000cf4
+ | [8] invokecustom.InvokeCustom.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+002254: 01 | method_idx: 00000008
+002255: 0a | access_flags: private|static
+002256: a81b | code_off: 00000da8
+ | [9] invokecustom.InvokeCustom.lambda$lambdaTest$0:(Ljava/lang/String;)Z
+002258: 02 | method_idx: 0000000a
+002259: 8a20 | access_flags: private|static|synthetic
+00225b: d81c | code_off: 00000e58
+ | [a] invokecustom.InvokeCustom.lambdaTest:()V
+00225d: 01 | method_idx: 0000000b
+00225e: 09 | access_flags: public|static
+00225f: 801d | code_off: 00000e80
+ | [b] invokecustom.InvokeCustom.main:([Ljava/lang/String;)V
+002261: 01 | method_idx: 0000000c
+002262: 09 | access_flags: public|static
+002263: a01e | code_off: 00000f20
+ | [c] invokecustom.InvokeCustom.privateMethodTest9:()V
+002265: 01 | method_idx: 0000000d
+002266: 02 | access_flags: private
+002267: e81e | code_off: 00000f68
+ | [d] invokecustom.InvokeCustom.targetMethodTest1:()V
+002269: 02 | method_idx: 0000000f
+00226a: 0a | access_flags: private|static
+00226b: 881f | code_off: 00000f88
+ | [e] invokecustom.InvokeCustom.targetMethodTest2:(ZBCSIFJDLjava/lang/String;)V
+00226d: 01 | method_idx: 00000010
+00226e: 0a | access_flags: private|static
+00226f: a81f | code_off: 00000fa8
+ | [f] invokecustom.InvokeCustom.targetMethodTest3:()V
+002271: 01 | method_idx: 00000011
+002272: 0a | access_flags: private|static
+002273: 9420 | code_off: 00001014
+ | [10] invokecustom.InvokeCustom.targetMethodTest5:(III)I
+002275: 02 | method_idx: 00000013
+002276: 09 | access_flags: public|static
+002277: b420 | code_off: 00001034
+ | [11] invokecustom.InvokeCustom.targetMethodTest6:(JJJ)J
+002279: 01 | method_idx: 00000014
+00227a: 09 | access_flags: public|static
+00227b: ec21 | code_off: 000010ec
+ | [12] invokecustom.InvokeCustom.targetMethodTest7:(FFD)D
+00227d: 01 | method_idx: 00000015
+00227e: 09 | access_flags: public|static
+00227f: a823 | code_off: 000011a8
+ | [13] invokecustom.InvokeCustom.targetMethodTest8:(Ljava/lang/String;)V
+002281: 01 | method_idx: 00000016
+002282: 09 | access_flags: public|static
+002283: e424 | code_off: 00001264
+ | [14] invokecustom.InvokeCustom.targetMethodTest9:()V
+002285: 01 | method_idx: 00000017
+002286: 0a | access_flags: private|static
+002287: a825 | code_off: 000012a8
+ | [15] invokecustom.InvokeCustom.test1:()V
+002289: 01 | method_idx: 00000018
+00228a: 09 | access_flags: public|static
+00228b: c825 | code_off: 000012c8
+ | [16] invokecustom.InvokeCustom.test2:()V
+00228d: 01 | method_idx: 00000019
+00228e: 09 | access_flags: public|static
+00228f: e025 | code_off: 000012e0
+ | [17] invokecustom.InvokeCustom.test3:()V
+002291: 01 | method_idx: 0000001a
+002292: 09 | access_flags: public|static
+002293: a826 | code_off: 00001328
+ | [18] invokecustom.InvokeCustom.test4:()V
+002295: 01 | method_idx: 0000001b
+002296: 09 | access_flags: public|static
+002297: c026 | code_off: 00001340
+ | [19] invokecustom.InvokeCustom.test5:()V
+002299: 01 | method_idx: 0000001c
+00229a: 09 | access_flags: public|static
+00229b: e426 | code_off: 00001364
+ | [1a] invokecustom.InvokeCustom.test6:()V
+00229d: 01 | method_idx: 0000001d
+00229e: 09 | access_flags: public|static
+00229f: bc27 | code_off: 000013bc
+ | [1b] invokecustom.InvokeCustom.test7:()V
+0022a1: 01 | method_idx: 0000001e
+0022a2: 09 | access_flags: public|static
+0022a3: a428 | code_off: 00001424
+ | [1c] invokecustom.InvokeCustom.test8:()V
+0022a5: 01 | method_idx: 0000001f
+0022a6: 09 | access_flags: public|static
+0022a7: 8429 | code_off: 00001484
+ | [1d] invokecustom.InvokeCustom.test9:()V
+0022a9: 01 | method_idx: 00000020
+0022aa: 09 | access_flags: public|static
+0022ab: b429 | code_off: 000014b4
+ | virtual_methods:
+ | [0] invokecustom.InvokeCustom.helperMethodTest9:()V
+0022ad: 09 | method_idx: 00000009
+0022ae: 01 | access_flags: public
+0022af: cc29 | code_off: 000014cc
+ | [1] invokecustom.InvokeCustom.run:()V
+0022b1: 05 | method_idx: 0000000e
+0022b2: 01 | access_flags: public
+0022b3: 942a | code_off: 00001514
+ | [2] invokecustom.InvokeCustom.targetMethodTest4:()V
+0022b5: 04 | method_idx: 00000012
+0022b6: 01 | access_flags: public
+0022b7: b42a | code_off: 00001534
+0022b9: 0000 00 |
+ |
+ |map:
+ |[22bc] map list
+0022bc: 1300 0000 | size: 00000013
+ |[22c0] header_item map
+0022c0: 0000 | type: 0000 // TYPE_HEADER_ITEM
+0022c2: 0000 | unused: 0
+0022c4: 0100 0000 | size: 00000001
+0022c8: 0000 0000 | offset: 00000000
+ |[22cc] string_id_item map
+0022cc: 0100 | type: 0001 // TYPE_STRING_ID_ITEM
+0022ce: 0000 | unused: 0
+0022d0: a700 0000 | size: 000000a7
+0022d4: 7000 0000 | offset: 00000070
+ |[22d8] type_id_item map
+0022d8: 0200 | type: 0002 // TYPE_TYPE_ID_ITEM
+0022da: 0000 | unused: 0
+0022dc: 2600 0000 | size: 00000026
+0022e0: 0c03 0000 | offset: 0000030c
+ |[22e4] proto_id_item map
+0022e4: 0300 | type: 0003 // TYPE_PROTO_ID_ITEM
+0022e6: 0000 | unused: 0
+0022e8: 3300 0000 | size: 00000033
+0022ec: a403 0000 | offset: 000003a4
+ |[22f0] field_id_item map
+0022f0: 0400 | type: 0004 // TYPE_FIELD_ID_ITEM
+0022f2: 0000 | unused: 0
+0022f4: 0300 0000 | size: 00000003
+0022f8: 0806 0000 | offset: 00000608
+ |[22fc] method_id_item map
+0022fc: 0500 | type: 0005 // TYPE_METHOD_ID_ITEM
+0022fe: 0000 | unused: 0
+002300: 4f00 0000 | size: 0000004f
+002304: 2006 0000 | offset: 00000620
+ |[2308] class_def_item map
+002308: 0600 | type: 0006 // TYPE_CLASS_DEF_ITEM
+00230a: 0000 | unused: 0
+00230c: 0200 0000 | size: 00000002
+002310: 9808 0000 | offset: 00000898
+ |[2314] call_site_id_item map
+002314: 0700 | type: 0007 // TYPE_CALL_SITE_ID_ITEM
+002316: 0000 | unused: 0
+002318: 0e00 0000 | size: 0000000e
+00231c: d808 0000 | offset: 000008d8
+ |[2320] method_handle_item map
+002320: 0800 | type: 0008 // TYPE_METHOD_HANDLE_ITEM
+002322: 0000 | unused: 0
+002324: 1100 0000 | size: 00000011
+002328: 1009 0000 | offset: 00000910
+ |[232c] annotation_set_item map
+00232c: 0310 | type: 1003 // TYPE_ANNOTATION_SET_ITEM
+00232e: 0000 | unused: 0
+002330: 0200 0000 | size: 00000002
+002334: 9809 0000 | offset: 00000998
+ |[2338] code_item map
+002338: 0120 | type: 2001 // TYPE_CODE_ITEM
+00233a: 0000 | unused: 0
+00233c: 2300 0000 | size: 00000023
+002340: a809 0000 | offset: 000009a8
+ |[2344] annotations_directory_item map
+002344: 0620 | type: 2006 // TYPE_ANNOTATIONS_DIRECTORY_ITEM
+002346: 0000 | unused: 0
+002348: 0100 0000 | size: 00000001
+00234c: 5415 0000 | offset: 00001554
+ |[2350] type_list map
+002350: 0110 | type: 1001 // TYPE_TYPE_LIST
+002352: 0000 | unused: 0
+002354: 1e00 0000 | size: 0000001e
+002358: 9415 0000 | offset: 00001594
+ |[235c] string_data_item map
+00235c: 0220 | type: 2002 // TYPE_STRING_DATA_ITEM
+00235e: 0000 | unused: 0
+002360: a700 0000 | size: 000000a7
+002364: d216 0000 | offset: 000016d2
+ |[2368] debug_info_item map
+002368: 0320 | type: 2003 // TYPE_DEBUG_INFO_ITEM
+00236a: 0000 | unused: 0
+00236c: 1900 0000 | size: 00000019
+002370: 4920 0000 | offset: 00002049
+ |[2374] annotation_item map
+002374: 0420 | type: 2004 // TYPE_ANNOTATION_ITEM
+002376: 0000 | unused: 0
+002378: 0200 0000 | size: 00000002
+00237c: 7321 0000 | offset: 00002173
+ |[2380] encoded_array_item map
+002380: 0520 | type: 2005 // TYPE_ENCODED_ARRAY_ITEM
+002382: 0000 | unused: 0
+002384: 0c00 0000 | size: 0000000c
+002388: 8721 0000 | offset: 00002187
+ |[238c] class_data_item map
+00238c: 0020 | type: 2000 // TYPE_CLASS_DATA_ITEM
+00238e: 0000 | unused: 0
+002390: 0200 0000 | size: 00000002
+002394: 1422 0000 | offset: 00002214
+ |[2398] map_list map
+002398: 0010 | type: 1000 // TYPE_MAP_LIST
+00239a: 0000 | unused: 0
+00239c: 0100 0000 | size: 00000001
+0023a0: bc22 0000 | offset: 000022bc
+ |
+ |method code index:
+ |
+ |[9e0] invokecustom.InvokeCustom.<clinit>:()V
+ |[9f8] invokecustom.InvokeCustom.<init>:()V
+ |[a18] invokecustom.InvokeCustom.<init>:(I)V
+ |[a74] invokecustom.InvokeCustom.bsmCreateCallSite:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+ |[acc] invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
+ |[b18] invokecustom.InvokeCustom.bsmLookupStaticWithExtraArgs:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;
+ |[bcc] 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/MethodHandle;)Ljava/lang/invoke/CallSite;
+ |[cf4] invokecustom.InvokeCustom.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+ |[da8] invokecustom.InvokeCustom.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+ |[14cc] invokecustom.InvokeCustom.helperMethodTest9:()V
+ |[e58] invokecustom.InvokeCustom.lambda$lambdaTest$0:(Ljava/lang/String;)Z
+ |[e80] invokecustom.InvokeCustom.lambdaTest:()V
+ |[f20] invokecustom.InvokeCustom.main:([Ljava/lang/String;)V
+ |[f68] invokecustom.InvokeCustom.privateMethodTest9:()V
+ |[1514] invokecustom.InvokeCustom.run:()V
+ |[f88] invokecustom.InvokeCustom.targetMethodTest1:()V
+ |[fa8] invokecustom.InvokeCustom.targetMethodTest2:(ZBCSIFJDLjava/lang/String;)V
+ |[1014] invokecustom.InvokeCustom.targetMethodTest3:()V
+ |[1534] invokecustom.InvokeCustom.targetMethodTest4:()V
+ |[1034] invokecustom.InvokeCustom.targetMethodTest5:(III)I
+ |[10ec] invokecustom.InvokeCustom.targetMethodTest6:(JJJ)J
+ |[11a8] invokecustom.InvokeCustom.targetMethodTest7:(FFD)D
+ |[1264] invokecustom.InvokeCustom.targetMethodTest8:(Ljava/lang/String;)V
+ |[12a8] invokecustom.InvokeCustom.targetMethodTest9:()V
+ |[12c8] invokecustom.InvokeCustom.test1:()V
+ |[12e0] invokecustom.InvokeCustom.test2:()V
+ |[1328] invokecustom.InvokeCustom.test3:()V
+ |[1340] invokecustom.InvokeCustom.test4:()V
+ |[1364] invokecustom.InvokeCustom.test5:()V
+ |[13bc] invokecustom.InvokeCustom.test6:()V
+ |[1424] invokecustom.InvokeCustom.test7:()V
+ |[1484] invokecustom.InvokeCustom.test8:()V
+ |[14b4] invokecustom.InvokeCustom.test9:()V
+ |[9a8] invokecustom.Super.<init>:()V
+ |[9c0] 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: 14 items; 56 bytes total
+ | 4 bytes/item
+ | class data: 2 items; 165 bytes total
+ | 18..147 bytes/item; average 82
+ | class def: 2 items; 64 bytes total
+ | 32 bytes/item
+ | code: 35 items; 2988 bytes total
+ | 24..296 bytes/item; average 85
+ | debug info: 25 items; 298 bytes total
+ | 5..32 bytes/item; average 11
+ | encoded array: 12 items; 141 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: 17 items; 136 bytes total
+ | 8 bytes/item
+ | method id: 79 items; 632 bytes total
+ | 8 bytes/item
+ | proto id: 51 items; 612 bytes total
+ | 12 bytes/item
+ | string data: 167 items; 2423 bytes total
+ | 2..45 bytes/item; average 14
+ | string id: 167 items; 668 bytes total
+ | 4 bytes/item
+ | type id: 38 items; 152 bytes total
+ | 4 bytes/item
+ | type list: 30 items; 268 bytes total
+ | 6..26 bytes/item; average 8
diff --git a/dx/tests/135-invoke-custom/generate-test b/dx/tests/135-invoke-custom/generate-test
new file mode 100755
index 000000000..4d7c4000c
--- /dev/null
+++ b/dx/tests/135-invoke-custom/generate-test
@@ -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/info.txt b/dx/tests/135-invoke-custom/info.txt
new file mode 100644
index 000000000..ad54d01ce
--- /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 000000000..85e1c41b2
--- /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 000000000..c4d00e209
--- /dev/null
+++ b/dx/tests/135-invoke-custom/run
@@ -0,0 +1,69 @@
+#!/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
+
+DX_OUTPUT=dx.log
+rm -f ${DX_OUTPUT} 2>/dev/null
+
+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 | tee -a ${DX_OUTPUT}
+
+JAVAP_OUTPUT=invokecustom.InvokeCustom.txt
+javap -c -v -cp invokecustom.jar invokecustom.InvokeCustom > ${JAVAP_OUTPUT}
+
+# Check each invokedynamic instruction produced one invoke-custom
+INVOKEDYNAMIC_COUNT=$( grep "invokedynamic #" ${JAVAP_OUTPUT} | wc -l )
+INVOKE_CUSTOM_COUNT=$( grep ": invoke-custom" ${DX_OUTPUT} | wc -l )
+if [ "${INVOKEDYNAMIC_COUNT}" -ne "${INVOKE_CUSTOM_COUNT}" ]; then
+ echo Found ${INVOKEDYNAMIC_COUNT} uses of invokedynamic but ${INVOKE_CUSTOM_COUNT} uses of invoke-custom.
+ exit 1
+fi
+
+# Check there is a 1:1 correspondance between the number of call site ids and invoke-custom bytecodes.
+CALL_SITE_ID_COUNT=$( sed -n -e '/call_site_off:/ p' ${DX_OUTPUT} | wc -l )
+if [ ${CALL_SITE_ID_COUNT} -gt ${INVOKE_CUSTOM_COUNT} ]; then
+ echo Found ${CALL_SITE_ID_COUNT} call sites but ${INVOKE_CUSTOM_COUNT} uses of invoke-custom.
+ exit 1
+fi
+
+# Check number of invokedynamic constants matches the number of unique call sites
+CST_INDY_COUNT=$( sed -n -e 's@.*: invokedynamic #\([0-9]*\),.*@\1@p' ${JAVAP_OUTPUT} | \
+ sort | \
+ uniq -c | \
+ wc -l )
+CALL_SITE_COUNT=$( sed -n -e 's@.*call_site_off: \([0-9a-f]\+\)@\1@p' ${DX_OUTPUT} | \
+ uniq -c | \
+ wc -l )
+if [ ${CST_INDY_COUNT} -ne ${CALL_SITE_COUNT} ]; then
+ echo Found ${CST_INDY_COUNT} invokedynamic constants but ${CALL_SITE_COUNT} call sites.
+ exit 1
+fi
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 000000000..efd937a10
--- /dev/null
+++ b/dx/tests/135-invoke-custom/src/invokecustom/InvokeCustom.java
@@ -0,0 +1,201 @@
+/*
+ * 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;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+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);
+ }
+
+ private void privateMethodTest9() {
+ System.out.println("InvokeCustom.privateMethodTest9()");
+ }
+
+ 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, MethodHandle privateInvoke)
+ 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);
+ privateInvoke.invoke(instance2);
+
+ final MethodHandles.Lookup lookup = MethodHandles.lookup();
+ final MethodHandle targetMH = lookup.findStatic(lookup.lookupClass(), name, type);
+ return new ConstantCallSite(targetMH.asType(type));
+ }
+
+ public static void lambdaTest() {
+ List<String> strings = Arrays.asList(new String[] { "Three", "One", "FortyTwo" });
+ String sample = strings.stream().filter(x -> "One".equals(x.trim()))
+ .map(String::trim).findAny().orElse("");
+ strings.stream().forEach(System.out::println);
+ }
+}
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 000000000..897ba843a
--- /dev/null
+++ b/dx/tests/135-invoke-custom/src/invokecustom/TestGenerator.java
@@ -0,0 +1,356 @@
+/*
+ * 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, 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);
+ 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);
+ // test4 covers invokespecial for a super method. This covers invokespecial of a private method.
+ Handle privateInvoke =
+ new Handle(Opcodes.H_INVOKESPECIAL, internalName, "privateMethodTest9", "()V", false);
+
+ mv.visitInvokeDynamicInsn("targetMethodTest9", "()V", bootstrap,
+ staticSetter, staticGetter,
+ setter, getter,
+ instanceInvoke, constructor,
+ interfaceInvoke, privateInvoke);
+ mv.visitInsn(Opcodes.RETURN);
+ mv.visitMaxs(-1, -1);
+ }
+}
diff --git a/dx/tests/136-null-constant-debug-info/NullConstant.java b/dx/tests/136-null-constant-debug-info/NullConstant.java
new file mode 100644
index 000000000..5e7065443
--- /dev/null
+++ b/dx/tests/136-null-constant-debug-info/NullConstant.java
@@ -0,0 +1,25 @@
+/*
+ * 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.
+ */
+
+public class NullConstant extends Throwable {
+
+ public final void m() {
+ NullConstant t = this;
+ NullConstant f;
+ f = t = null;
+ long lout = 0L;
+ }
+}
diff --git a/dx/tests/136-null-constant-debug-info/expected.txt b/dx/tests/136-null-constant-debug-info/expected.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/dx/tests/136-null-constant-debug-info/expected.txt
diff --git a/dx/tests/136-null-constant-debug-info/info.txt b/dx/tests/136-null-constant-debug-info/info.txt
new file mode 100644
index 000000000..45e4a2634
--- /dev/null
+++ b/dx/tests/136-null-constant-debug-info/info.txt
@@ -0,0 +1,9 @@
+This is a non-regression test that reproduces a case where a local variable
+would have the java.lang.Object type because of a null constant.
+The type of the local variable would be transformed from "KNOWN_NULL" to
+"java.lang.Object", but "java.lang.Object" wouldn't be added to the types of
+the dex.
+So in the rare case where java.lang.Object wouldn't be referenced anywhere else
+in the compilation unit it would fail with "java.lang.IllegalArgumentException:
+not found: Ljava/lang/Object;"
+
diff --git a/dx/tests/136-null-constant-debug-info/run b/dx/tests/136-null-constant-debug-info/run
new file mode 100644
index 000000000..286d40098
--- /dev/null
+++ b/dx/tests/136-null-constant-debug-info/run
@@ -0,0 +1,19 @@
+#!/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.
+
+${JAVAC} -g -d . NullConstant.java &> /dev/null
+
+dx --debug --dex *.class 2>&1
diff --git a/dx/tests/137-dexmerger-dex38/expected.txt b/dx/tests/137-dexmerger-dex38/expected.txt
new file mode 100644
index 000000000..e50a5b472
--- /dev/null
+++ b/dx/tests/137-dexmerger-dex38/expected.txt
@@ -0,0 +1,7147 @@
+Processing 'out.dex'...
+Opened 'out.dex', DEX version '038'
+Class #0 -
+ Class descriptor : 'Linvokecustom/Super;'
+ Access flags : 0x0400 (ABSTRACT)
+ Superclass : 'Ljava/lang/Object;'
+ Interfaces -
+ Static fields -
+ Instance fields -
+ Direct methods -
+ #0 : (in Linvokecustom/Super;)
+ name : '<init>'
+ type : '()V'
+ access : 0x10000 (CONSTRUCTOR)
+ code -
+ registers : 1
+ ins : 1
+ outs : 1
+ insns size : 4 16-bit code units
+0040ac: |[0040ac] invokecustom.Super.<init>:()V
+0040bc: 7010 b300 0000 |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@00b3
+0040c2: 0e00 |0003: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=25
+ locals :
+ 0x0000 - 0x0004 reg=0 this Linvokecustom/Super;
+
+ Virtual methods -
+ #0 : (in Linvokecustom/Super;)
+ name : 'helperMethodTest9'
+ type : '()V'
+ access : 0x0401 (PUBLIC ABSTRACT)
+ code : (none)
+
+ #1 : (in Linvokecustom/Super;)
+ name : 'targetMethodTest4'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 3
+ ins : 1
+ outs : 2
+ insns size : 8 16-bit code units
+0040c4: |[0040c4] invokecustom.Super.targetMethodTest4:()V
+0040d4: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0040d8: 1a01 7600 |0002: const-string v1, "targetMethodTest4 from Super" // string@0076
+0040dc: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0040e2: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=27
+ 0x0007 line=28
+ locals :
+ 0x0000 - 0x0008 reg=2 this Linvokecustom/Super;
+
+ source_file_idx : 25 (InvokeCustom.java)
+
+Class #1 -
+ Class descriptor : 'Linvokecustom/InvokeCustom1;'
+ Access flags : 0x0001 (PUBLIC)
+ Superclass : 'Linvokecustom/Super;'
+ Interfaces -
+ #0 : 'Ljava/lang/Runnable;'
+ Static fields -
+ #0 : (in Linvokecustom/InvokeCustom1;)
+ name : 'staticFieldTest9'
+ type : 'I'
+ access : 0x000a (PRIVATE STATIC)
+ Instance fields -
+ #0 : (in Linvokecustom/InvokeCustom1;)
+ name : 'fieldTest9'
+ type : 'F'
+ access : 0x0002 (PRIVATE)
+ Direct methods -
+ #0 : (in Linvokecustom/InvokeCustom1;)
+ name : '<clinit>'
+ type : '()V'
+ access : 0x10008 (STATIC CONSTRUCTOR)
+ code -
+ registers : 1
+ ins : 0
+ outs : 0
+ insns size : 4 16-bit code units
+0040e4: |[0040e4] invokecustom.InvokeCustom1.<clinit>:()V
+0040f4: 1200 |0000: const/4 v0, #int 0 // #0
+0040f6: 6700 0f00 |0001: sput v0, Linvokecustom/InvokeCustom;.staticFieldTest9:I // field@000f
+0040fa: 0e00 |0003: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=98
+ locals :
+
+ #1 : (in Linvokecustom/InvokeCustom1;)
+ name : '<init>'
+ type : '()V'
+ access : 0x10001 (PUBLIC CONSTRUCTOR)
+ code -
+ registers : 2
+ ins : 1
+ outs : 1
+ insns size : 7 16-bit code units
+0040fc: |[0040fc] invokecustom.InvokeCustom1.<init>:()V
+00410c: 7010 a800 0100 |0000: invoke-direct {v1}, Linvokecustom/Super;.<init>:()V // method@00a8
+004112: 1200 |0003: const/4 v0, #int 0 // #0
+004114: 5910 0e00 |0004: iput v0, v1, Linvokecustom/InvokeCustom;.fieldTest9:F // field@000e
+004118: 0e00 |0006: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=35
+ 0x0003 line=111
+ 0x0006 line=35
+ locals :
+ 0x0000 - 0x0007 reg=1 this Linvokecustom/InvokeCustom1;
+
+ #2 : (in Linvokecustom/InvokeCustom1;)
+ name : '<init>'
+ type : '(I)V'
+ access : 0x10001 (PUBLIC CONSTRUCTOR)
+ code -
+ registers : 5
+ ins : 2
+ outs : 2
+ insns size : 37 16-bit code units
+00411c: |[00411c] invokecustom.InvokeCustom1.<init>:(I)V
+00412c: 7010 a800 0300 |0000: invoke-direct {v3}, Linvokecustom/Super;.<init>:()V // method@00a8
+004132: 1200 |0003: const/4 v0, #int 0 // #0
+004134: 5930 0e00 |0004: iput v0, v3, Linvokecustom/InvokeCustom;.fieldTest9:F // field@000e
+004138: 6200 1000 |0006: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00413c: 2201 1700 |0008: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+004140: 7010 b400 0100 |000a: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+004146: 1a02 1800 |000d: const-string v2, "InvokeCustom.<init>(" // string@0018
+00414a: 6e20 ba00 2100 |000f: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004150: 0c01 |0012: move-result-object v1
+004152: 6e20 b700 4100 |0013: invoke-virtual {v1, v4}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+004158: 0c01 |0016: move-result-object v1
+00415a: 1a02 0700 |0017: const-string v2, ")" // string@0007
+00415e: 6e20 ba00 2100 |0019: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004164: 0c01 |001c: move-result-object v1
+004166: 6e10 bb00 0100 |001d: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00416c: 0c01 |0020: move-result-object v1
+00416e: 6e20 b100 1000 |0021: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004174: 0e00 |0024: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=36
+ 0x0003 line=111
+ 0x0006 line=37
+ 0x0024 line=38
+ locals :
+ 0x0000 - 0x0025 reg=3 this Linvokecustom/InvokeCustom1;
+ 0x0000 - 0x0025 reg=4 (null) I
+
+ #3 : (in Linvokecustom/InvokeCustom1;)
+ name : 'bsmCreateCallSite'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 7
+ ins : 4
+ outs : 2
+ insns size : 36 16-bit code units
+004178: |[004178] invokecustom.InvokeCustom1.bsmCreateCallSite:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+004188: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00418c: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+004190: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+004196: 1a02 5600 |0007: const-string v2, "bsmCreateCallSite [" // string@0056
+00419a: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0041a0: 0c01 |000c: move-result-object v1
+0041a2: 6e20 b900 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+0041a8: 0c01 |0010: move-result-object v1
+0041aa: 1a02 5200 |0011: const-string v2, "]" // string@0052
+0041ae: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0041b4: 0c01 |0016: move-result-object v1
+0041b6: 6e10 bb00 0100 |0017: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0041bc: 0c01 |001a: move-result-object v1
+0041be: 6e20 b100 1000 |001b: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0041c4: 2200 1b00 |001e: new-instance v0, Ljava/lang/invoke/ConstantCallSite; // type@001b
+0041c8: 7020 bc00 6000 |0020: invoke-direct {v0, v6}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+0041ce: 1100 |0023: return-object v0
+ catches : (none)
+ positions :
+ 0x0000 line=156
+ 0x001e line=157
+ locals :
+ 0x0000 - 0x0024 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0024 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0024 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0024 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+
+ #4 : (in Linvokecustom/InvokeCustom1;)
+ name : 'bsmLookupStatic'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 5
+ ins : 3
+ outs : 4
+ insns size : 29 16-bit code units
+0041d0: |[0041d0] invokecustom.InvokeCustom1.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
+0041e0: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0041e4: 1a01 5800 |0002: const-string v1, "bsmLookupStatic []" // string@0058
+0041e8: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0041ee: 7100 c900 0000 |0007: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+0041f4: 0c00 |000a: move-result-object v0
+0041f6: 6e10 c800 0000 |000b: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+0041fc: 0c01 |000e: move-result-object v1
+0041fe: 6e40 c700 1043 |000f: invoke-virtual {v0, v1, v3, v4}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+004204: 0c00 |0012: move-result-object v0
+004206: 2201 1b00 |0013: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+00420a: 6e20 bd00 4000 |0015: invoke-virtual {v0, v4}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+004210: 0c00 |0018: move-result-object v0
+004212: 7020 bc00 0100 |0019: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+004218: 1101 |001c: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=138
+ 0x0007 line=139
+ 0x000b line=140
+ 0x0013 line=141
+ locals :
+ 0x0000 - 0x001d reg=2 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x001d reg=3 (null) Ljava/lang/String;
+ 0x0000 - 0x001d reg=4 (null) Ljava/lang/invoke/MethodType;
+
+ #5 : (in Linvokecustom/InvokeCustom1;)
+ name : 'bsmLookupStaticWithExtraArgs'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 12
+ ins : 9
+ outs : 4
+ insns size : 82 16-bit code units
+00421c: |[00421c] invokecustom.InvokeCustom1.bsmLookupStaticWithExtraArgs:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;
+00422c: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004230: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+004234: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00423a: 1a02 5a00 |0007: const-string v2, "bsmLookupStaticWithExtraArgs [" // string@005a
+00423e: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004244: 0c01 |000c: move-result-object v1
+004246: 6e20 b700 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+00424c: 0c01 |0010: move-result-object v1
+00424e: 1a02 0800 |0011: const-string v2, ", " // string@0008
+004252: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004258: 0c01 |0016: move-result-object v1
+00425a: 6e30 b800 7108 |0017: invoke-virtual {v1, v7, v8}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+004260: 0c01 |001a: move-result-object v1
+004262: 1a02 0800 |001b: const-string v2, ", " // string@0008
+004266: 6e20 ba00 2100 |001d: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00426c: 0c01 |0020: move-result-object v1
+00426e: 6e20 b600 9100 |0021: invoke-virtual {v1, v9}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+004274: 0c01 |0024: move-result-object v1
+004276: 1a02 0800 |0025: const-string v2, ", " // string@0008
+00427a: 6e20 ba00 2100 |0027: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004280: 0c01 |002a: move-result-object v1
+004282: 6e30 b500 a10b |002b: invoke-virtual {v1, v10, v11}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+004288: 0c01 |002e: move-result-object v1
+00428a: 1a02 5200 |002f: const-string v2, "]" // string@0052
+00428e: 6e20 ba00 2100 |0031: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004294: 0c01 |0034: move-result-object v1
+004296: 6e10 bb00 0100 |0035: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00429c: 0c01 |0038: move-result-object v1
+00429e: 6e20 b100 1000 |0039: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0042a4: 7100 c900 0000 |003c: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+0042aa: 0c00 |003f: move-result-object v0
+0042ac: 6e10 c800 0000 |0040: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+0042b2: 0c01 |0043: move-result-object v1
+0042b4: 6e40 c700 1054 |0044: invoke-virtual {v0, v1, v4, v5}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+0042ba: 0c00 |0047: move-result-object v0
+0042bc: 2201 1b00 |0048: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+0042c0: 6e20 bd00 5000 |004a: invoke-virtual {v0, v5}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+0042c6: 0c00 |004d: move-result-object v0
+0042c8: 7020 bc00 0100 |004e: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+0042ce: 1101 |0051: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=147
+ 0x003c line=148
+ 0x0040 line=149
+ 0x0048 line=150
+ locals :
+ 0x0000 - 0x0052 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0052 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0052 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0052 reg=6 (null) I
+ 0x0000 - 0x0052 reg=7 (null) J
+ 0x0000 - 0x0052 reg=9 (null) F
+ 0x0000 - 0x0052 reg=10 (null) D
+
+ #6 : (in Linvokecustom/InvokeCustom1;)
+ name : 'bsmLookupTest9'
+ type : '(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;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 13
+ ins : 10
+ outs : 4
+ insns size : 135 16-bit code units
+0042d0: |[0042d0] invokecustom.InvokeCustom1.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;
+0042e0: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0042e4: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+0042e8: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0042ee: 1a02 5c00 |0007: const-string v2, "bsmLookupTest9 [" // string@005c
+0042f2: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0042f8: 0c01 |000c: move-result-object v1
+0042fa: 6e20 b900 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+004300: 0c01 |0010: move-result-object v1
+004302: 1a02 0800 |0011: const-string v2, ", " // string@0008
+004306: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00430c: 0c01 |0016: move-result-object v1
+00430e: 6e20 b900 7100 |0017: invoke-virtual {v1, v7}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+004314: 0c01 |001a: move-result-object v1
+004316: 1a02 0800 |001b: const-string v2, ", " // string@0008
+00431a: 6e20 ba00 2100 |001d: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004320: 0c01 |0020: move-result-object v1
+004322: 6e20 b900 8100 |0021: invoke-virtual {v1, v8}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+004328: 0c01 |0024: move-result-object v1
+00432a: 1a02 0800 |0025: const-string v2, ", " // string@0008
+00432e: 6e20 ba00 2100 |0027: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004334: 0c01 |002a: move-result-object v1
+004336: 6e20 b900 9100 |002b: invoke-virtual {v1, v9}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+00433c: 0c01 |002e: move-result-object v1
+00433e: 1a02 5200 |002f: const-string v2, "]" // string@0052
+004342: 6e20 ba00 2100 |0031: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004348: 0c01 |0034: move-result-object v1
+00434a: 6e10 bb00 0100 |0035: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+004350: 0c01 |0038: move-result-object v1
+004352: 6e20 b100 1000 |0039: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004358: 6200 1000 |003c: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00435c: 2201 1700 |003e: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+004360: 7010 b400 0100 |0040: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+004366: 6e20 ba00 4100 |0043: invoke-virtual {v1, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00436c: 0c01 |0046: move-result-object v1
+00436e: 1a02 0000 |0047: const-string v2, " " // string@0000
+004372: 6e20 ba00 2100 |0049: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004378: 0c01 |004c: move-result-object v1
+00437a: 6e20 b900 5100 |004d: invoke-virtual {v1, v5}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+004380: 0c01 |0050: move-result-object v1
+004382: 6e10 bb00 0100 |0051: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+004388: 0c01 |0054: move-result-object v1
+00438a: 6e20 b100 1000 |0055: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004390: 7120 9b00 7600 |0058: invoke-static {v6, v7}, Linvokecustom/InvokeCustom;.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V // method@009b
+004396: 2200 0e00 |005b: new-instance v0, Linvokecustom/InvokeCustom; // type@000e
+00439a: 7010 9400 0000 |005d: invoke-direct {v0}, Linvokecustom/InvokeCustom;.<init>:()V // method@0094
+0043a0: 6f30 9a00 8009 |0060: invoke-super {v0, v8, v9}, Linvokecustom/InvokeCustom;.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V // method@009a
+0043a6: fa20 c300 0a00 1c00 |0063: invoke-polymorphic {v10, v0}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)V // method@00c3, proto@001c
+0043ae: 1230 |0067: const/4 v0, #int 3 // #3
+0043b0: fa20 c300 0b00 0500 |0068: invoke-polymorphic {v11, v0}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (I)Linvokecustom/InvokeCustom; // method@00c3, proto@0005
+0043b8: 0c00 |006c: move-result-object v0
+0043ba: fa20 be00 0c00 1c00 |006d: invoke-polymorphic {v12, v0}, Ljava/lang/invoke/MethodHandle;.invoke:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)V // method@00be, proto@001c
+0043c2: 7100 c900 0000 |0071: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+0043c8: 0c00 |0074: move-result-object v0
+0043ca: 6e10 c800 0000 |0075: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+0043d0: 0c01 |0078: move-result-object v1
+0043d2: 6e40 c700 1054 |0079: invoke-virtual {v0, v1, v4, v5}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+0043d8: 0c00 |007c: move-result-object v0
+0043da: 2201 1b00 |007d: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+0043de: 6e20 bd00 5000 |007f: invoke-virtual {v0, v5}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+0043e4: 0c00 |0082: move-result-object v0
+0043e6: 7020 bc00 0100 |0083: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+0043ec: 1101 |0086: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=166
+ 0x003c line=168
+ 0x0058 line=171
+ 0x005b line=172
+ 0x0060 line=173
+ 0x0063 line=176
+ 0x0067 line=178
+ 0x006d line=179
+ 0x0071 line=181
+ 0x0075 line=182
+ 0x007d line=183
+ locals :
+ 0x0000 - 0x0087 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0087 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0087 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0087 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=8 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=9 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=10 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=11 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=12 (null) Ljava/lang/invoke/MethodHandle;
+
+ #7 : (in Linvokecustom/InvokeCustom1;)
+ name : 'checkFieldTest9'
+ type : '(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V'
+ access : 0x0002 (PRIVATE)
+ code -
+ registers : 9
+ ins : 3
+ outs : 3
+ insns size : 82 16-bit code units
+0043f0: |[0043f0] invokecustom.InvokeCustom1.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+004400: 1405 0ff0 6a20 |0000: const v5, #float 1.99e-19 // #206af00f
+004406: fa20 c300 6700 0100 |0003: invoke-polymorphic {v7, v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)F // method@00c3, proto@0001
+00440e: 0a00 |0007: move-result v0
+004410: fa30 c300 6805 1d00 |0008: invoke-polymorphic {v8, v6, v5}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;F)V // method@00c3, proto@001d
+004418: fa20 c300 6700 0100 |000c: invoke-polymorphic {v7, v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)F // method@00c3, proto@0001
+004420: 0a01 |0010: move-result v1
+004422: 6202 1000 |0011: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004426: 2203 1700 |0013: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+00442a: 7010 b400 0300 |0015: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+004430: 1a04 5e00 |0018: const-string v4, "checkFieldTest9: old " // string@005e
+004434: 6e20 ba00 4300 |001a: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00443a: 0c03 |001d: move-result-object v3
+00443c: 6e20 b600 0300 |001e: invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+004442: 0c00 |0021: move-result-object v0
+004444: 1a03 0600 |0022: const-string v3, " new " // string@0006
+004448: 6e20 ba00 3000 |0024: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00444e: 0c00 |0027: move-result-object v0
+004450: 6e20 b600 1000 |0028: invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+004456: 0c00 |002b: move-result-object v0
+004458: 1a03 0500 |002c: const-string v3, " expected " // string@0005
+00445c: 6e20 ba00 3000 |002e: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004462: 0c00 |0031: move-result-object v0
+004464: 6e20 b600 5000 |0032: invoke-virtual {v0, v5}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+00446a: 0c00 |0035: move-result-object v0
+00446c: 1a03 0000 |0036: const-string v3, " " // string@0000
+004470: 6e20 ba00 3000 |0038: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004476: 0c00 |003b: move-result-object v0
+004478: 6e10 bb00 0000 |003c: invoke-virtual {v0}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00447e: 0c00 |003f: move-result-object v0
+004480: 6e20 ab00 0200 |0040: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.print:(Ljava/lang/String;)V // method@00ab
+004486: 6202 1000 |0043: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00448a: 2d00 0105 |0045: cmpl-float v0, v1, v5
+00448e: 3900 0800 |0047: if-nez v0, 004f // +0008
+004492: 1a00 4000 |0049: const-string v0, "OK" // string@0040
+004496: 6e20 b100 0200 |004b: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00449c: 0e00 |004e: return-void
+00449e: 1a00 1000 |004f: const-string v0, "ERROR" // string@0010
+0044a2: 28fa |0051: goto 004b // -0006
+ catches : (none)
+ positions :
+ 0x0003 line=116
+ 0x0008 line=117
+ 0x000c line=118
+ 0x0011 line=119
+ 0x0043 line=121
+ 0x004e line=122
+ 0x004f line=121
+ locals :
+ 0x0000 - 0x0052 reg=6 this Linvokecustom/InvokeCustom1;
+ 0x0000 - 0x0052 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0052 reg=8 (null) Ljava/lang/invoke/MethodHandle;
+
+ #8 : (in Linvokecustom/InvokeCustom1;)
+ name : 'checkStaticFieldTest9'
+ type : '(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 8
+ ins : 2
+ outs : 2
+ insns size : 80 16-bit code units
+0044a4: |[0044a4] invokecustom.InvokeCustom1.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+0044b4: 1405 1032 5476 |0000: const v5, #float 1.07596e+33 // #76543210
+0044ba: fa10 c300 0600 0200 |0003: invoke-polymorphic {v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, ()I // method@00c3, proto@0002
+0044c2: 0a00 |0007: move-result v0
+0044c4: fa20 c300 5700 1a00 |0008: invoke-polymorphic {v7, v5}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (I)V // method@00c3, proto@001a
+0044cc: fa10 c300 0600 0200 |000c: invoke-polymorphic {v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, ()I // method@00c3, proto@0002
+0044d4: 0a01 |0010: move-result v1
+0044d6: 6202 1000 |0011: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0044da: 2203 1700 |0013: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+0044de: 7010 b400 0300 |0015: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0044e4: 1a04 6000 |0018: const-string v4, "checkStaticFieldTest9: old " // string@0060
+0044e8: 6e20 ba00 4300 |001a: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0044ee: 0c03 |001d: move-result-object v3
+0044f0: 6e20 b700 0300 |001e: invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+0044f6: 0c00 |0021: move-result-object v0
+0044f8: 1a03 0600 |0022: const-string v3, " new " // string@0006
+0044fc: 6e20 ba00 3000 |0024: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004502: 0c00 |0027: move-result-object v0
+004504: 6e20 b700 1000 |0028: invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+00450a: 0c00 |002b: move-result-object v0
+00450c: 1a03 0500 |002c: const-string v3, " expected " // string@0005
+004510: 6e20 ba00 3000 |002e: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004516: 0c00 |0031: move-result-object v0
+004518: 6e20 b700 5000 |0032: invoke-virtual {v0, v5}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+00451e: 0c00 |0035: move-result-object v0
+004520: 1a03 0000 |0036: const-string v3, " " // string@0000
+004524: 6e20 ba00 3000 |0038: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00452a: 0c00 |003b: move-result-object v0
+00452c: 6e10 bb00 0000 |003c: invoke-virtual {v0}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+004532: 0c00 |003f: move-result-object v0
+004534: 6e20 ab00 0200 |0040: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.print:(Ljava/lang/String;)V // method@00ab
+00453a: 6202 1000 |0043: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00453e: 3351 0800 |0045: if-ne v1, v5, 004d // +0008
+004542: 1a00 4000 |0047: const-string v0, "OK" // string@0040
+004546: 6e20 b100 0200 |0049: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00454c: 0e00 |004c: return-void
+00454e: 1a00 1000 |004d: const-string v0, "ERROR" // string@0010
+004552: 28fa |004f: goto 0049 // -0006
+ catches : (none)
+ positions :
+ 0x0003 line=103
+ 0x0008 line=104
+ 0x000c line=105
+ 0x0011 line=106
+ 0x0043 line=108
+ 0x004c line=109
+ 0x004d line=108
+ locals :
+ 0x0000 - 0x0050 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0050 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+
+ #9 : (in Linvokecustom/InvokeCustom1;)
+ name : 'targetMethodTest1'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+004554: |[004554] invokecustom.InvokeCustom1.targetMethodTest1:()V
+004564: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004568: 1a01 1500 |0002: const-string v1, "Hello World!" // string@0015
+00456c: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004572: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=41
+ 0x0007 line=42
+ locals :
+
+ #10 : (in Linvokecustom/InvokeCustom1;)
+ name : 'targetMethodTest2'
+ type : '(ZBCSIFJDLjava/lang/String;)V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 13
+ ins : 11
+ outs : 3
+ insns size : 46 16-bit code units
+004574: |[004574] invokecustom.InvokeCustom1.targetMethodTest2:(ZBCSIFJDLjava/lang/String;)V
+004584: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004588: 6e20 b200 2000 |0002: invoke-virtual {v0, v2}, Ljava/io/PrintStream;.println:(Z)V // method@00b2
+00458e: 6200 1000 |0005: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004592: 6e20 af00 3000 |0007: invoke-virtual {v0, v3}, Ljava/io/PrintStream;.println:(I)V // method@00af
+004598: 6200 1000 |000a: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00459c: 6e20 ac00 4000 |000c: invoke-virtual {v0, v4}, Ljava/io/PrintStream;.println:(C)V // method@00ac
+0045a2: 6200 1000 |000f: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0045a6: 6e20 af00 5000 |0011: invoke-virtual {v0, v5}, Ljava/io/PrintStream;.println:(I)V // method@00af
+0045ac: 6200 1000 |0014: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0045b0: 6e20 af00 6000 |0016: invoke-virtual {v0, v6}, Ljava/io/PrintStream;.println:(I)V // method@00af
+0045b6: 6200 1000 |0019: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0045ba: 6e20 ae00 7000 |001b: invoke-virtual {v0, v7}, Ljava/io/PrintStream;.println:(F)V // method@00ae
+0045c0: 6200 1000 |001e: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0045c4: 6e30 b000 8009 |0020: invoke-virtual {v0, v8, v9}, Ljava/io/PrintStream;.println:(J)V // method@00b0
+0045ca: 6200 1000 |0023: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0045ce: 6e30 ad00 a00b |0025: invoke-virtual {v0, v10, v11}, Ljava/io/PrintStream;.println:(D)V // method@00ad
+0045d4: 6200 1000 |0028: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0045d8: 6e20 b100 c000 |002a: invoke-virtual {v0, v12}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0045de: 0e00 |002d: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=46
+ 0x0005 line=47
+ 0x000a line=48
+ 0x000f line=49
+ 0x0014 line=50
+ 0x0019 line=51
+ 0x001e line=52
+ 0x0023 line=53
+ 0x0028 line=54
+ 0x002d line=55
+ locals :
+ 0x0000 - 0x002e reg=2 (null) Z
+ 0x0000 - 0x002e reg=3 (null) B
+ 0x0000 - 0x002e reg=4 (null) C
+ 0x0000 - 0x002e reg=5 (null) S
+ 0x0000 - 0x002e reg=6 (null) I
+ 0x0000 - 0x002e reg=7 (null) F
+ 0x0000 - 0x002e reg=8 (null) J
+ 0x0000 - 0x002e reg=10 (null) D
+ 0x0000 - 0x002e reg=12 (null) Ljava/lang/String;
+
+ #11 : (in Linvokecustom/InvokeCustom1;)
+ name : 'targetMethodTest3'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+0045e0: |[0045e0] invokecustom.InvokeCustom1.targetMethodTest3:()V
+0045f0: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0045f4: 1a01 7300 |0002: const-string v1, "targetMethodTest3 from InvokeCustom" // string@0073
+0045f8: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0045fe: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=58
+ 0x0007 line=59
+ locals :
+
+ #12 : (in Linvokecustom/InvokeCustom1;)
+ name : 'targetMethodTest5'
+ type : '(III)I'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 7
+ ins : 3
+ outs : 2
+ insns size : 83 16-bit code units
+004600: |[004600] invokecustom.InvokeCustom1.targetMethodTest5:(III)I
+004610: 9000 0405 |0000: add-int v0, v4, v5
+004614: 6201 1000 |0002: sget-object v1, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004618: 2202 1700 |0004: new-instance v2, Ljava/lang/StringBuilder; // type@0017
+00461c: 7010 b400 0200 |0006: invoke-direct {v2}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+004622: 1a03 7800 |0009: const-string v3, "targetMethodTest5 " // string@0078
+004626: 6e20 ba00 3200 |000b: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00462c: 0c02 |000e: move-result-object v2
+00462e: 6e20 b700 4200 |000f: invoke-virtual {v2, v4}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+004634: 0c02 |0012: move-result-object v2
+004636: 1a03 0300 |0013: const-string v3, " + " // string@0003
+00463a: 6e20 ba00 3200 |0015: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004640: 0c02 |0018: move-result-object v2
+004642: 6e20 b700 5200 |0019: invoke-virtual {v2, v5}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+004648: 0c02 |001c: move-result-object v2
+00464a: 1a03 0400 |001d: const-string v3, " = " // string@0004
+00464e: 6e20 ba00 3200 |001f: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004654: 0c02 |0022: move-result-object v2
+004656: 6e20 b700 0200 |0023: invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+00465c: 0c02 |0026: move-result-object v2
+00465e: 6e10 bb00 0200 |0027: invoke-virtual {v2}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+004664: 0c02 |002a: move-result-object v2
+004666: 6e20 b100 2100 |002b: invoke-virtual {v1, v2}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00466c: 3260 2400 |002e: if-eq v0, v6, 0052 // +0024
+004670: 6201 1000 |0030: sget-object v1, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004674: 2202 1700 |0032: new-instance v2, Ljava/lang/StringBuilder; // type@0017
+004678: 7010 b400 0200 |0034: invoke-direct {v2}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00467e: 1a03 1300 |0037: const-string v3, "Failed " // string@0013
+004682: 6e20 ba00 3200 |0039: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004688: 0c02 |003c: move-result-object v2
+00468a: 6e20 b700 0200 |003d: invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+004690: 0c02 |0040: move-result-object v2
+004692: 1a03 0100 |0041: const-string v3, " != " // string@0001
+004696: 6e20 ba00 3200 |0043: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00469c: 0c02 |0046: move-result-object v2
+00469e: 6e20 b700 6200 |0047: invoke-virtual {v2, v6}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+0046a4: 0c02 |004a: move-result-object v2
+0046a6: 6e10 bb00 0200 |004b: invoke-virtual {v2}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0046ac: 0c02 |004e: move-result-object v2
+0046ae: 6e20 b100 2100 |004f: invoke-virtual {v1, v2}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0046b4: 0f00 |0052: return v0
+ catches : (none)
+ positions :
+ 0x0000 line=68
+ 0x0002 line=69
+ 0x002e line=70
+ 0x0030 line=71
+ 0x0052 line=73
+ locals :
+ 0x0000 - 0x0053 reg=4 (null) I
+ 0x0000 - 0x0053 reg=5 (null) I
+ 0x0000 - 0x0053 reg=6 (null) I
+
+ #13 : (in Linvokecustom/InvokeCustom1;)
+ name : 'targetMethodTest6'
+ type : '(JJJ)J'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 12
+ ins : 6
+ outs : 3
+ insns size : 85 16-bit code units
+0046b8: |[0046b8] invokecustom.InvokeCustom1.targetMethodTest6:(JJJ)J
+0046c8: 9b00 0608 |0000: add-long v0, v6, v8
+0046cc: 6202 1000 |0002: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0046d0: 2203 1700 |0004: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+0046d4: 7010 b400 0300 |0006: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0046da: 1a04 7b00 |0009: const-string v4, "targetMethodTest6 " // string@007b
+0046de: 6e20 ba00 4300 |000b: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0046e4: 0c03 |000e: move-result-object v3
+0046e6: 6e30 b800 6307 |000f: invoke-virtual {v3, v6, v7}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+0046ec: 0c03 |0012: move-result-object v3
+0046ee: 1a04 0300 |0013: const-string v4, " + " // string@0003
+0046f2: 6e20 ba00 4300 |0015: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0046f8: 0c03 |0018: move-result-object v3
+0046fa: 6e30 b800 8309 |0019: invoke-virtual {v3, v8, v9}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+004700: 0c03 |001c: move-result-object v3
+004702: 1a04 0400 |001d: const-string v4, " = " // string@0004
+004706: 6e20 ba00 4300 |001f: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00470c: 0c03 |0022: move-result-object v3
+00470e: 6e30 b800 0301 |0023: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+004714: 0c03 |0026: move-result-object v3
+004716: 6e10 bb00 0300 |0027: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00471c: 0c03 |002a: move-result-object v3
+00471e: 6e20 b100 3200 |002b: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004724: 3102 000a |002e: cmp-long v2, v0, v10
+004728: 3802 2400 |0030: if-eqz v2, 0054 // +0024
+00472c: 6202 1000 |0032: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004730: 2203 1700 |0034: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+004734: 7010 b400 0300 |0036: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00473a: 1a04 1300 |0039: const-string v4, "Failed " // string@0013
+00473e: 6e20 ba00 4300 |003b: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004744: 0c03 |003e: move-result-object v3
+004746: 6e30 b800 0301 |003f: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+00474c: 0c03 |0042: move-result-object v3
+00474e: 1a04 0100 |0043: const-string v4, " != " // string@0001
+004752: 6e20 ba00 4300 |0045: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004758: 0c03 |0048: move-result-object v3
+00475a: 6e30 b800 a30b |0049: invoke-virtual {v3, v10, v11}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+004760: 0c03 |004c: move-result-object v3
+004762: 6e10 bb00 0300 |004d: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+004768: 0c03 |0050: move-result-object v3
+00476a: 6e20 b100 3200 |0051: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004770: 1000 |0054: return-wide v0
+ catches : (none)
+ positions :
+ 0x0000 line=77
+ 0x0002 line=78
+ 0x002e line=79
+ 0x0032 line=80
+ 0x0054 line=82
+ locals :
+ 0x0000 - 0x0055 reg=6 (null) J
+ 0x0000 - 0x0055 reg=8 (null) J
+ 0x0000 - 0x0055 reg=10 (null) J
+
+ #14 : (in Linvokecustom/InvokeCustom1;)
+ name : 'targetMethodTest7'
+ type : '(FFD)D'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 10
+ ins : 4
+ outs : 3
+ insns size : 86 16-bit code units
+004774: |[004774] invokecustom.InvokeCustom1.targetMethodTest7:(FFD)D
+004784: a800 0607 |0000: mul-float v0, v6, v7
+004788: 8900 |0002: float-to-double v0, v0
+00478a: 6202 1000 |0003: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00478e: 2203 1700 |0005: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+004792: 7010 b400 0300 |0007: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+004798: 1a04 7e00 |000a: const-string v4, "targetMethodTest7 " // string@007e
+00479c: 6e20 ba00 4300 |000c: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0047a2: 0c03 |000f: move-result-object v3
+0047a4: 6e20 b600 6300 |0010: invoke-virtual {v3, v6}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+0047aa: 0c03 |0013: move-result-object v3
+0047ac: 1a04 0200 |0014: const-string v4, " * " // string@0002
+0047b0: 6e20 ba00 4300 |0016: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0047b6: 0c03 |0019: move-result-object v3
+0047b8: 6e20 b600 7300 |001a: invoke-virtual {v3, v7}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+0047be: 0c03 |001d: move-result-object v3
+0047c0: 1a04 0400 |001e: const-string v4, " = " // string@0004
+0047c4: 6e20 ba00 4300 |0020: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0047ca: 0c03 |0023: move-result-object v3
+0047cc: 6e30 b500 0301 |0024: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+0047d2: 0c03 |0027: move-result-object v3
+0047d4: 6e10 bb00 0300 |0028: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0047da: 0c03 |002b: move-result-object v3
+0047dc: 6e20 b100 3200 |002c: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0047e2: 2f02 0008 |002f: cmpl-double v2, v0, v8
+0047e6: 3802 2400 |0031: if-eqz v2, 0055 // +0024
+0047ea: 6202 1000 |0033: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0047ee: 2203 1700 |0035: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+0047f2: 7010 b400 0300 |0037: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0047f8: 1a04 1300 |003a: const-string v4, "Failed " // string@0013
+0047fc: 6e20 ba00 4300 |003c: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004802: 0c03 |003f: move-result-object v3
+004804: 6e30 b500 0301 |0040: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+00480a: 0c03 |0043: move-result-object v3
+00480c: 1a04 0100 |0044: const-string v4, " != " // string@0001
+004810: 6e20 ba00 4300 |0046: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004816: 0c03 |0049: move-result-object v3
+004818: 6e30 b500 8309 |004a: invoke-virtual {v3, v8, v9}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+00481e: 0c03 |004d: move-result-object v3
+004820: 6e10 bb00 0300 |004e: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+004826: 0c03 |0051: move-result-object v3
+004828: 6e20 b100 3200 |0052: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00482e: 1000 |0055: return-wide v0
+ catches : (none)
+ positions :
+ 0x0000 line=86
+ 0x0003 line=87
+ 0x002f line=88
+ 0x0033 line=89
+ 0x0055 line=91
+ locals :
+ 0x0000 - 0x0056 reg=6 (null) F
+ 0x0000 - 0x0056 reg=7 (null) F
+ 0x0000 - 0x0056 reg=8 (null) D
+
+ #15 : (in Linvokecustom/InvokeCustom1;)
+ name : 'targetMethodTest8'
+ type : '(Ljava/lang/String;)V'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 4
+ ins : 1
+ outs : 2
+ insns size : 25 16-bit code units
+004830: |[004830] invokecustom.InvokeCustom1.targetMethodTest8:(Ljava/lang/String;)V
+004840: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004844: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+004848: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00484e: 1a02 8000 |0007: const-string v2, "targetMethodTest8 " // string@0080
+004852: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004858: 0c01 |000c: move-result-object v1
+00485a: 6e20 ba00 3100 |000d: invoke-virtual {v1, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004860: 0c01 |0010: move-result-object v1
+004862: 6e10 bb00 0100 |0011: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+004868: 0c01 |0014: move-result-object v1
+00486a: 6e20 b100 1000 |0015: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004870: 0e00 |0018: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=95
+ 0x0018 line=96
+ locals :
+ 0x0000 - 0x0019 reg=3 (null) Ljava/lang/String;
+
+ #16 : (in Linvokecustom/InvokeCustom1;)
+ name : 'targetMethodTest9'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+004874: |[004874] invokecustom.InvokeCustom1.targetMethodTest9:()V
+004884: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004888: 1a01 8200 |0002: const-string v1, "targetMethodTest9()" // string@0082
+00488c: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004892: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=129
+ 0x0007 line=130
+ locals :
+
+ #17 : (in Linvokecustom/InvokeCustom1;)
+ name : 'test1'
+ type : '()V'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 0
+ ins : 0
+ outs : 0
+ insns size : 4 16-bit code units
+004894: |[004894] invokecustom.InvokeCustom1.test1:()V
+0048a4: fc00 0000 0000 |0000: invoke-custom {}, call_site@0000
+0048aa: 0e00 |0003: return-void
+ catches : (none)
+ positions :
+ locals :
+
+ Virtual methods -
+ #0 : (in Linvokecustom/InvokeCustom1;)
+ name : 'helperMethodTest9'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 4
+ ins : 1
+ outs : 2
+ insns size : 27 16-bit code units
+0048ac: |[0048ac] invokecustom.InvokeCustom1.helperMethodTest9:()V
+0048bc: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0048c0: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+0048c4: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0048ca: 1a02 6400 |0007: const-string v2, "helperMethodTest9 in " // string@0064
+0048ce: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0048d4: 0c01 |000c: move-result-object v1
+0048d6: 1c02 0e00 |000d: const-class v2, Linvokecustom/InvokeCustom; // type@000e
+0048da: 6e20 b900 2100 |000f: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+0048e0: 0c01 |0012: move-result-object v1
+0048e2: 6e10 bb00 0100 |0013: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0048e8: 0c01 |0016: move-result-object v1
+0048ea: 6e20 b100 1000 |0017: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0048f0: 0e00 |001a: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=125
+ 0x001a line=126
+ locals :
+ 0x0000 - 0x001b reg=3 this Linvokecustom/InvokeCustom1;
+
+ #1 : (in Linvokecustom/InvokeCustom1;)
+ name : 'run'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 3
+ ins : 1
+ outs : 2
+ insns size : 8 16-bit code units
+0048f4: |[0048f4] invokecustom.InvokeCustom1.run:()V
+004904: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004908: 1a01 6e00 |0002: const-string v1, "run() for Test9" // string@006e
+00490c: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004912: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=133
+ 0x0007 line=134
+ locals :
+ 0x0000 - 0x0008 reg=2 this Linvokecustom/InvokeCustom1;
+
+ #2 : (in Linvokecustom/InvokeCustom1;)
+ name : 'targetMethodTest4'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 3
+ ins : 1
+ outs : 2
+ insns size : 8 16-bit code units
+004914: |[004914] invokecustom.InvokeCustom1.targetMethodTest4:()V
+004924: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004928: 1a01 7500 |0002: const-string v1, "targetMethodTest4 from InvokeCustom (oops!)" // string@0075
+00492c: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004932: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=64
+ 0x0007 line=65
+ locals :
+ 0x0000 - 0x0008 reg=2 this Linvokecustom/InvokeCustom1;
+
+ source_file_idx : 25 (InvokeCustom.java)
+
+Class #2 -
+ Class descriptor : 'Linvokecustom/InvokeCustom2;'
+ Access flags : 0x0001 (PUBLIC)
+ Superclass : 'Linvokecustom/Super;'
+ Interfaces -
+ #0 : 'Ljava/lang/Runnable;'
+ Static fields -
+ #0 : (in Linvokecustom/InvokeCustom2;)
+ name : 'staticFieldTest9'
+ type : 'I'
+ access : 0x000a (PRIVATE STATIC)
+ Instance fields -
+ #0 : (in Linvokecustom/InvokeCustom2;)
+ name : 'fieldTest9'
+ type : 'F'
+ access : 0x0002 (PRIVATE)
+ Direct methods -
+ #0 : (in Linvokecustom/InvokeCustom2;)
+ name : '<clinit>'
+ type : '()V'
+ access : 0x10008 (STATIC CONSTRUCTOR)
+ code -
+ registers : 1
+ ins : 0
+ outs : 0
+ insns size : 4 16-bit code units
+004934: |[004934] invokecustom.InvokeCustom2.<clinit>:()V
+004944: 1200 |0000: const/4 v0, #int 0 // #0
+004946: 6700 0f00 |0001: sput v0, Linvokecustom/InvokeCustom;.staticFieldTest9:I // field@000f
+00494a: 0e00 |0003: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=98
+ locals :
+
+ #1 : (in Linvokecustom/InvokeCustom2;)
+ name : '<init>'
+ type : '()V'
+ access : 0x10001 (PUBLIC CONSTRUCTOR)
+ code -
+ registers : 2
+ ins : 1
+ outs : 1
+ insns size : 7 16-bit code units
+00494c: |[00494c] invokecustom.InvokeCustom2.<init>:()V
+00495c: 7010 a800 0100 |0000: invoke-direct {v1}, Linvokecustom/Super;.<init>:()V // method@00a8
+004962: 1200 |0003: const/4 v0, #int 0 // #0
+004964: 5910 0e00 |0004: iput v0, v1, Linvokecustom/InvokeCustom;.fieldTest9:F // field@000e
+004968: 0e00 |0006: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=35
+ 0x0003 line=111
+ 0x0006 line=35
+ locals :
+ 0x0000 - 0x0007 reg=1 this Linvokecustom/InvokeCustom2;
+
+ #2 : (in Linvokecustom/InvokeCustom2;)
+ name : '<init>'
+ type : '(I)V'
+ access : 0x10001 (PUBLIC CONSTRUCTOR)
+ code -
+ registers : 5
+ ins : 2
+ outs : 2
+ insns size : 37 16-bit code units
+00496c: |[00496c] invokecustom.InvokeCustom2.<init>:(I)V
+00497c: 7010 a800 0300 |0000: invoke-direct {v3}, Linvokecustom/Super;.<init>:()V // method@00a8
+004982: 1200 |0003: const/4 v0, #int 0 // #0
+004984: 5930 0e00 |0004: iput v0, v3, Linvokecustom/InvokeCustom;.fieldTest9:F // field@000e
+004988: 6200 1000 |0006: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00498c: 2201 1700 |0008: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+004990: 7010 b400 0100 |000a: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+004996: 1a02 1800 |000d: const-string v2, "InvokeCustom.<init>(" // string@0018
+00499a: 6e20 ba00 2100 |000f: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0049a0: 0c01 |0012: move-result-object v1
+0049a2: 6e20 b700 4100 |0013: invoke-virtual {v1, v4}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+0049a8: 0c01 |0016: move-result-object v1
+0049aa: 1a02 0700 |0017: const-string v2, ")" // string@0007
+0049ae: 6e20 ba00 2100 |0019: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0049b4: 0c01 |001c: move-result-object v1
+0049b6: 6e10 bb00 0100 |001d: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0049bc: 0c01 |0020: move-result-object v1
+0049be: 6e20 b100 1000 |0021: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0049c4: 0e00 |0024: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=36
+ 0x0003 line=111
+ 0x0006 line=37
+ 0x0024 line=38
+ locals :
+ 0x0000 - 0x0025 reg=3 this Linvokecustom/InvokeCustom2;
+ 0x0000 - 0x0025 reg=4 (null) I
+
+ #3 : (in Linvokecustom/InvokeCustom2;)
+ name : 'bsmCreateCallSite'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 7
+ ins : 4
+ outs : 2
+ insns size : 36 16-bit code units
+0049c8: |[0049c8] invokecustom.InvokeCustom2.bsmCreateCallSite:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+0049d8: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0049dc: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+0049e0: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0049e6: 1a02 5600 |0007: const-string v2, "bsmCreateCallSite [" // string@0056
+0049ea: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0049f0: 0c01 |000c: move-result-object v1
+0049f2: 6e20 b900 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+0049f8: 0c01 |0010: move-result-object v1
+0049fa: 1a02 5200 |0011: const-string v2, "]" // string@0052
+0049fe: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004a04: 0c01 |0016: move-result-object v1
+004a06: 6e10 bb00 0100 |0017: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+004a0c: 0c01 |001a: move-result-object v1
+004a0e: 6e20 b100 1000 |001b: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004a14: 2200 1b00 |001e: new-instance v0, Ljava/lang/invoke/ConstantCallSite; // type@001b
+004a18: 7020 bc00 6000 |0020: invoke-direct {v0, v6}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+004a1e: 1100 |0023: return-object v0
+ catches : (none)
+ positions :
+ 0x0000 line=156
+ 0x001e line=157
+ locals :
+ 0x0000 - 0x0024 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0024 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0024 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0024 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+
+ #4 : (in Linvokecustom/InvokeCustom2;)
+ name : 'bsmLookupStatic'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 5
+ ins : 3
+ outs : 4
+ insns size : 29 16-bit code units
+004a20: |[004a20] invokecustom.InvokeCustom2.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
+004a30: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004a34: 1a01 5800 |0002: const-string v1, "bsmLookupStatic []" // string@0058
+004a38: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004a3e: 7100 c900 0000 |0007: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+004a44: 0c00 |000a: move-result-object v0
+004a46: 6e10 c800 0000 |000b: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+004a4c: 0c01 |000e: move-result-object v1
+004a4e: 6e40 c700 1043 |000f: invoke-virtual {v0, v1, v3, v4}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+004a54: 0c00 |0012: move-result-object v0
+004a56: 2201 1b00 |0013: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+004a5a: 6e20 bd00 4000 |0015: invoke-virtual {v0, v4}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+004a60: 0c00 |0018: move-result-object v0
+004a62: 7020 bc00 0100 |0019: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+004a68: 1101 |001c: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=138
+ 0x0007 line=139
+ 0x000b line=140
+ 0x0013 line=141
+ locals :
+ 0x0000 - 0x001d reg=2 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x001d reg=3 (null) Ljava/lang/String;
+ 0x0000 - 0x001d reg=4 (null) Ljava/lang/invoke/MethodType;
+
+ #5 : (in Linvokecustom/InvokeCustom2;)
+ name : 'bsmLookupStaticWithExtraArgs'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 12
+ ins : 9
+ outs : 4
+ insns size : 82 16-bit code units
+004a6c: |[004a6c] invokecustom.InvokeCustom2.bsmLookupStaticWithExtraArgs:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;
+004a7c: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004a80: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+004a84: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+004a8a: 1a02 5a00 |0007: const-string v2, "bsmLookupStaticWithExtraArgs [" // string@005a
+004a8e: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004a94: 0c01 |000c: move-result-object v1
+004a96: 6e20 b700 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+004a9c: 0c01 |0010: move-result-object v1
+004a9e: 1a02 0800 |0011: const-string v2, ", " // string@0008
+004aa2: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004aa8: 0c01 |0016: move-result-object v1
+004aaa: 6e30 b800 7108 |0017: invoke-virtual {v1, v7, v8}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+004ab0: 0c01 |001a: move-result-object v1
+004ab2: 1a02 0800 |001b: const-string v2, ", " // string@0008
+004ab6: 6e20 ba00 2100 |001d: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004abc: 0c01 |0020: move-result-object v1
+004abe: 6e20 b600 9100 |0021: invoke-virtual {v1, v9}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+004ac4: 0c01 |0024: move-result-object v1
+004ac6: 1a02 0800 |0025: const-string v2, ", " // string@0008
+004aca: 6e20 ba00 2100 |0027: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004ad0: 0c01 |002a: move-result-object v1
+004ad2: 6e30 b500 a10b |002b: invoke-virtual {v1, v10, v11}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+004ad8: 0c01 |002e: move-result-object v1
+004ada: 1a02 5200 |002f: const-string v2, "]" // string@0052
+004ade: 6e20 ba00 2100 |0031: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004ae4: 0c01 |0034: move-result-object v1
+004ae6: 6e10 bb00 0100 |0035: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+004aec: 0c01 |0038: move-result-object v1
+004aee: 6e20 b100 1000 |0039: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004af4: 7100 c900 0000 |003c: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+004afa: 0c00 |003f: move-result-object v0
+004afc: 6e10 c800 0000 |0040: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+004b02: 0c01 |0043: move-result-object v1
+004b04: 6e40 c700 1054 |0044: invoke-virtual {v0, v1, v4, v5}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+004b0a: 0c00 |0047: move-result-object v0
+004b0c: 2201 1b00 |0048: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+004b10: 6e20 bd00 5000 |004a: invoke-virtual {v0, v5}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+004b16: 0c00 |004d: move-result-object v0
+004b18: 7020 bc00 0100 |004e: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+004b1e: 1101 |0051: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=147
+ 0x003c line=148
+ 0x0040 line=149
+ 0x0048 line=150
+ locals :
+ 0x0000 - 0x0052 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0052 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0052 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0052 reg=6 (null) I
+ 0x0000 - 0x0052 reg=7 (null) J
+ 0x0000 - 0x0052 reg=9 (null) F
+ 0x0000 - 0x0052 reg=10 (null) D
+
+ #6 : (in Linvokecustom/InvokeCustom2;)
+ name : 'bsmLookupTest9'
+ type : '(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;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 13
+ ins : 10
+ outs : 4
+ insns size : 135 16-bit code units
+004b20: |[004b20] invokecustom.InvokeCustom2.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;
+004b30: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004b34: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+004b38: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+004b3e: 1a02 5c00 |0007: const-string v2, "bsmLookupTest9 [" // string@005c
+004b42: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004b48: 0c01 |000c: move-result-object v1
+004b4a: 6e20 b900 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+004b50: 0c01 |0010: move-result-object v1
+004b52: 1a02 0800 |0011: const-string v2, ", " // string@0008
+004b56: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004b5c: 0c01 |0016: move-result-object v1
+004b5e: 6e20 b900 7100 |0017: invoke-virtual {v1, v7}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+004b64: 0c01 |001a: move-result-object v1
+004b66: 1a02 0800 |001b: const-string v2, ", " // string@0008
+004b6a: 6e20 ba00 2100 |001d: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004b70: 0c01 |0020: move-result-object v1
+004b72: 6e20 b900 8100 |0021: invoke-virtual {v1, v8}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+004b78: 0c01 |0024: move-result-object v1
+004b7a: 1a02 0800 |0025: const-string v2, ", " // string@0008
+004b7e: 6e20 ba00 2100 |0027: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004b84: 0c01 |002a: move-result-object v1
+004b86: 6e20 b900 9100 |002b: invoke-virtual {v1, v9}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+004b8c: 0c01 |002e: move-result-object v1
+004b8e: 1a02 5200 |002f: const-string v2, "]" // string@0052
+004b92: 6e20 ba00 2100 |0031: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004b98: 0c01 |0034: move-result-object v1
+004b9a: 6e10 bb00 0100 |0035: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+004ba0: 0c01 |0038: move-result-object v1
+004ba2: 6e20 b100 1000 |0039: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004ba8: 6200 1000 |003c: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004bac: 2201 1700 |003e: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+004bb0: 7010 b400 0100 |0040: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+004bb6: 6e20 ba00 4100 |0043: invoke-virtual {v1, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004bbc: 0c01 |0046: move-result-object v1
+004bbe: 1a02 0000 |0047: const-string v2, " " // string@0000
+004bc2: 6e20 ba00 2100 |0049: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004bc8: 0c01 |004c: move-result-object v1
+004bca: 6e20 b900 5100 |004d: invoke-virtual {v1, v5}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+004bd0: 0c01 |0050: move-result-object v1
+004bd2: 6e10 bb00 0100 |0051: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+004bd8: 0c01 |0054: move-result-object v1
+004bda: 6e20 b100 1000 |0055: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004be0: 7120 9b00 7600 |0058: invoke-static {v6, v7}, Linvokecustom/InvokeCustom;.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V // method@009b
+004be6: 2200 0e00 |005b: new-instance v0, Linvokecustom/InvokeCustom; // type@000e
+004bea: 7010 9400 0000 |005d: invoke-direct {v0}, Linvokecustom/InvokeCustom;.<init>:()V // method@0094
+004bf0: 6f30 9a00 8009 |0060: invoke-super {v0, v8, v9}, Linvokecustom/InvokeCustom;.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V // method@009a
+004bf6: fa20 c300 0a00 1c00 |0063: invoke-polymorphic {v10, v0}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)V // method@00c3, proto@001c
+004bfe: 1230 |0067: const/4 v0, #int 3 // #3
+004c00: fa20 c300 0b00 0500 |0068: invoke-polymorphic {v11, v0}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (I)Linvokecustom/InvokeCustom; // method@00c3, proto@0005
+004c08: 0c00 |006c: move-result-object v0
+004c0a: fa20 be00 0c00 1c00 |006d: invoke-polymorphic {v12, v0}, Ljava/lang/invoke/MethodHandle;.invoke:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)V // method@00be, proto@001c
+004c12: 7100 c900 0000 |0071: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+004c18: 0c00 |0074: move-result-object v0
+004c1a: 6e10 c800 0000 |0075: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+004c20: 0c01 |0078: move-result-object v1
+004c22: 6e40 c700 1054 |0079: invoke-virtual {v0, v1, v4, v5}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+004c28: 0c00 |007c: move-result-object v0
+004c2a: 2201 1b00 |007d: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+004c2e: 6e20 bd00 5000 |007f: invoke-virtual {v0, v5}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+004c34: 0c00 |0082: move-result-object v0
+004c36: 7020 bc00 0100 |0083: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+004c3c: 1101 |0086: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=166
+ 0x003c line=168
+ 0x0058 line=171
+ 0x005b line=172
+ 0x0060 line=173
+ 0x0063 line=176
+ 0x0067 line=178
+ 0x006d line=179
+ 0x0071 line=181
+ 0x0075 line=182
+ 0x007d line=183
+ locals :
+ 0x0000 - 0x0087 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0087 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0087 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0087 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=8 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=9 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=10 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=11 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=12 (null) Ljava/lang/invoke/MethodHandle;
+
+ #7 : (in Linvokecustom/InvokeCustom2;)
+ name : 'checkFieldTest9'
+ type : '(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V'
+ access : 0x0002 (PRIVATE)
+ code -
+ registers : 9
+ ins : 3
+ outs : 3
+ insns size : 82 16-bit code units
+004c40: |[004c40] invokecustom.InvokeCustom2.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+004c50: 1405 0ff0 6a20 |0000: const v5, #float 1.99e-19 // #206af00f
+004c56: fa20 c300 6700 0100 |0003: invoke-polymorphic {v7, v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)F // method@00c3, proto@0001
+004c5e: 0a00 |0007: move-result v0
+004c60: fa30 c300 6805 1d00 |0008: invoke-polymorphic {v8, v6, v5}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;F)V // method@00c3, proto@001d
+004c68: fa20 c300 6700 0100 |000c: invoke-polymorphic {v7, v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)F // method@00c3, proto@0001
+004c70: 0a01 |0010: move-result v1
+004c72: 6202 1000 |0011: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004c76: 2203 1700 |0013: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+004c7a: 7010 b400 0300 |0015: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+004c80: 1a04 5e00 |0018: const-string v4, "checkFieldTest9: old " // string@005e
+004c84: 6e20 ba00 4300 |001a: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004c8a: 0c03 |001d: move-result-object v3
+004c8c: 6e20 b600 0300 |001e: invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+004c92: 0c00 |0021: move-result-object v0
+004c94: 1a03 0600 |0022: const-string v3, " new " // string@0006
+004c98: 6e20 ba00 3000 |0024: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004c9e: 0c00 |0027: move-result-object v0
+004ca0: 6e20 b600 1000 |0028: invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+004ca6: 0c00 |002b: move-result-object v0
+004ca8: 1a03 0500 |002c: const-string v3, " expected " // string@0005
+004cac: 6e20 ba00 3000 |002e: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004cb2: 0c00 |0031: move-result-object v0
+004cb4: 6e20 b600 5000 |0032: invoke-virtual {v0, v5}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+004cba: 0c00 |0035: move-result-object v0
+004cbc: 1a03 0000 |0036: const-string v3, " " // string@0000
+004cc0: 6e20 ba00 3000 |0038: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004cc6: 0c00 |003b: move-result-object v0
+004cc8: 6e10 bb00 0000 |003c: invoke-virtual {v0}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+004cce: 0c00 |003f: move-result-object v0
+004cd0: 6e20 ab00 0200 |0040: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.print:(Ljava/lang/String;)V // method@00ab
+004cd6: 6202 1000 |0043: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004cda: 2d00 0105 |0045: cmpl-float v0, v1, v5
+004cde: 3900 0800 |0047: if-nez v0, 004f // +0008
+004ce2: 1a00 4000 |0049: const-string v0, "OK" // string@0040
+004ce6: 6e20 b100 0200 |004b: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004cec: 0e00 |004e: return-void
+004cee: 1a00 1000 |004f: const-string v0, "ERROR" // string@0010
+004cf2: 28fa |0051: goto 004b // -0006
+ catches : (none)
+ positions :
+ 0x0003 line=116
+ 0x0008 line=117
+ 0x000c line=118
+ 0x0011 line=119
+ 0x0043 line=121
+ 0x004e line=122
+ 0x004f line=121
+ locals :
+ 0x0000 - 0x0052 reg=6 this Linvokecustom/InvokeCustom2;
+ 0x0000 - 0x0052 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0052 reg=8 (null) Ljava/lang/invoke/MethodHandle;
+
+ #8 : (in Linvokecustom/InvokeCustom2;)
+ name : 'checkStaticFieldTest9'
+ type : '(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 8
+ ins : 2
+ outs : 2
+ insns size : 80 16-bit code units
+004cf4: |[004cf4] invokecustom.InvokeCustom2.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+004d04: 1405 1032 5476 |0000: const v5, #float 1.07596e+33 // #76543210
+004d0a: fa10 c300 0600 0200 |0003: invoke-polymorphic {v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, ()I // method@00c3, proto@0002
+004d12: 0a00 |0007: move-result v0
+004d14: fa20 c300 5700 1a00 |0008: invoke-polymorphic {v7, v5}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (I)V // method@00c3, proto@001a
+004d1c: fa10 c300 0600 0200 |000c: invoke-polymorphic {v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, ()I // method@00c3, proto@0002
+004d24: 0a01 |0010: move-result v1
+004d26: 6202 1000 |0011: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004d2a: 2203 1700 |0013: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+004d2e: 7010 b400 0300 |0015: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+004d34: 1a04 6000 |0018: const-string v4, "checkStaticFieldTest9: old " // string@0060
+004d38: 6e20 ba00 4300 |001a: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004d3e: 0c03 |001d: move-result-object v3
+004d40: 6e20 b700 0300 |001e: invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+004d46: 0c00 |0021: move-result-object v0
+004d48: 1a03 0600 |0022: const-string v3, " new " // string@0006
+004d4c: 6e20 ba00 3000 |0024: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004d52: 0c00 |0027: move-result-object v0
+004d54: 6e20 b700 1000 |0028: invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+004d5a: 0c00 |002b: move-result-object v0
+004d5c: 1a03 0500 |002c: const-string v3, " expected " // string@0005
+004d60: 6e20 ba00 3000 |002e: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004d66: 0c00 |0031: move-result-object v0
+004d68: 6e20 b700 5000 |0032: invoke-virtual {v0, v5}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+004d6e: 0c00 |0035: move-result-object v0
+004d70: 1a03 0000 |0036: const-string v3, " " // string@0000
+004d74: 6e20 ba00 3000 |0038: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004d7a: 0c00 |003b: move-result-object v0
+004d7c: 6e10 bb00 0000 |003c: invoke-virtual {v0}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+004d82: 0c00 |003f: move-result-object v0
+004d84: 6e20 ab00 0200 |0040: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.print:(Ljava/lang/String;)V // method@00ab
+004d8a: 6202 1000 |0043: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004d8e: 3351 0800 |0045: if-ne v1, v5, 004d // +0008
+004d92: 1a00 4000 |0047: const-string v0, "OK" // string@0040
+004d96: 6e20 b100 0200 |0049: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004d9c: 0e00 |004c: return-void
+004d9e: 1a00 1000 |004d: const-string v0, "ERROR" // string@0010
+004da2: 28fa |004f: goto 0049 // -0006
+ catches : (none)
+ positions :
+ 0x0003 line=103
+ 0x0008 line=104
+ 0x000c line=105
+ 0x0011 line=106
+ 0x0043 line=108
+ 0x004c line=109
+ 0x004d line=108
+ locals :
+ 0x0000 - 0x0050 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0050 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+
+ #9 : (in Linvokecustom/InvokeCustom2;)
+ name : 'targetMethodTest1'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+004da4: |[004da4] invokecustom.InvokeCustom2.targetMethodTest1:()V
+004db4: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004db8: 1a01 1500 |0002: const-string v1, "Hello World!" // string@0015
+004dbc: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004dc2: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=41
+ 0x0007 line=42
+ locals :
+
+ #10 : (in Linvokecustom/InvokeCustom2;)
+ name : 'targetMethodTest2'
+ type : '(ZBCSIFJDLjava/lang/String;)V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 13
+ ins : 11
+ outs : 3
+ insns size : 46 16-bit code units
+004dc4: |[004dc4] invokecustom.InvokeCustom2.targetMethodTest2:(ZBCSIFJDLjava/lang/String;)V
+004dd4: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004dd8: 6e20 b200 2000 |0002: invoke-virtual {v0, v2}, Ljava/io/PrintStream;.println:(Z)V // method@00b2
+004dde: 6200 1000 |0005: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004de2: 6e20 af00 3000 |0007: invoke-virtual {v0, v3}, Ljava/io/PrintStream;.println:(I)V // method@00af
+004de8: 6200 1000 |000a: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004dec: 6e20 ac00 4000 |000c: invoke-virtual {v0, v4}, Ljava/io/PrintStream;.println:(C)V // method@00ac
+004df2: 6200 1000 |000f: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004df6: 6e20 af00 5000 |0011: invoke-virtual {v0, v5}, Ljava/io/PrintStream;.println:(I)V // method@00af
+004dfc: 6200 1000 |0014: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004e00: 6e20 af00 6000 |0016: invoke-virtual {v0, v6}, Ljava/io/PrintStream;.println:(I)V // method@00af
+004e06: 6200 1000 |0019: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004e0a: 6e20 ae00 7000 |001b: invoke-virtual {v0, v7}, Ljava/io/PrintStream;.println:(F)V // method@00ae
+004e10: 6200 1000 |001e: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004e14: 6e30 b000 8009 |0020: invoke-virtual {v0, v8, v9}, Ljava/io/PrintStream;.println:(J)V // method@00b0
+004e1a: 6200 1000 |0023: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004e1e: 6e30 ad00 a00b |0025: invoke-virtual {v0, v10, v11}, Ljava/io/PrintStream;.println:(D)V // method@00ad
+004e24: 6200 1000 |0028: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004e28: 6e20 b100 c000 |002a: invoke-virtual {v0, v12}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004e2e: 0e00 |002d: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=46
+ 0x0005 line=47
+ 0x000a line=48
+ 0x000f line=49
+ 0x0014 line=50
+ 0x0019 line=51
+ 0x001e line=52
+ 0x0023 line=53
+ 0x0028 line=54
+ 0x002d line=55
+ locals :
+ 0x0000 - 0x002e reg=2 (null) Z
+ 0x0000 - 0x002e reg=3 (null) B
+ 0x0000 - 0x002e reg=4 (null) C
+ 0x0000 - 0x002e reg=5 (null) S
+ 0x0000 - 0x002e reg=6 (null) I
+ 0x0000 - 0x002e reg=7 (null) F
+ 0x0000 - 0x002e reg=8 (null) J
+ 0x0000 - 0x002e reg=10 (null) D
+ 0x0000 - 0x002e reg=12 (null) Ljava/lang/String;
+
+ #11 : (in Linvokecustom/InvokeCustom2;)
+ name : 'targetMethodTest3'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+004e30: |[004e30] invokecustom.InvokeCustom2.targetMethodTest3:()V
+004e40: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004e44: 1a01 7300 |0002: const-string v1, "targetMethodTest3 from InvokeCustom" // string@0073
+004e48: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004e4e: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=58
+ 0x0007 line=59
+ locals :
+
+ #12 : (in Linvokecustom/InvokeCustom2;)
+ name : 'targetMethodTest5'
+ type : '(III)I'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 7
+ ins : 3
+ outs : 2
+ insns size : 83 16-bit code units
+004e50: |[004e50] invokecustom.InvokeCustom2.targetMethodTest5:(III)I
+004e60: 9000 0405 |0000: add-int v0, v4, v5
+004e64: 6201 1000 |0002: sget-object v1, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004e68: 2202 1700 |0004: new-instance v2, Ljava/lang/StringBuilder; // type@0017
+004e6c: 7010 b400 0200 |0006: invoke-direct {v2}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+004e72: 1a03 7800 |0009: const-string v3, "targetMethodTest5 " // string@0078
+004e76: 6e20 ba00 3200 |000b: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004e7c: 0c02 |000e: move-result-object v2
+004e7e: 6e20 b700 4200 |000f: invoke-virtual {v2, v4}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+004e84: 0c02 |0012: move-result-object v2
+004e86: 1a03 0300 |0013: const-string v3, " + " // string@0003
+004e8a: 6e20 ba00 3200 |0015: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004e90: 0c02 |0018: move-result-object v2
+004e92: 6e20 b700 5200 |0019: invoke-virtual {v2, v5}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+004e98: 0c02 |001c: move-result-object v2
+004e9a: 1a03 0400 |001d: const-string v3, " = " // string@0004
+004e9e: 6e20 ba00 3200 |001f: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004ea4: 0c02 |0022: move-result-object v2
+004ea6: 6e20 b700 0200 |0023: invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+004eac: 0c02 |0026: move-result-object v2
+004eae: 6e10 bb00 0200 |0027: invoke-virtual {v2}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+004eb4: 0c02 |002a: move-result-object v2
+004eb6: 6e20 b100 2100 |002b: invoke-virtual {v1, v2}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004ebc: 3260 2400 |002e: if-eq v0, v6, 0052 // +0024
+004ec0: 6201 1000 |0030: sget-object v1, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004ec4: 2202 1700 |0032: new-instance v2, Ljava/lang/StringBuilder; // type@0017
+004ec8: 7010 b400 0200 |0034: invoke-direct {v2}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+004ece: 1a03 1300 |0037: const-string v3, "Failed " // string@0013
+004ed2: 6e20 ba00 3200 |0039: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004ed8: 0c02 |003c: move-result-object v2
+004eda: 6e20 b700 0200 |003d: invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+004ee0: 0c02 |0040: move-result-object v2
+004ee2: 1a03 0100 |0041: const-string v3, " != " // string@0001
+004ee6: 6e20 ba00 3200 |0043: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004eec: 0c02 |0046: move-result-object v2
+004eee: 6e20 b700 6200 |0047: invoke-virtual {v2, v6}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+004ef4: 0c02 |004a: move-result-object v2
+004ef6: 6e10 bb00 0200 |004b: invoke-virtual {v2}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+004efc: 0c02 |004e: move-result-object v2
+004efe: 6e20 b100 2100 |004f: invoke-virtual {v1, v2}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004f04: 0f00 |0052: return v0
+ catches : (none)
+ positions :
+ 0x0000 line=68
+ 0x0002 line=69
+ 0x002e line=70
+ 0x0030 line=71
+ 0x0052 line=73
+ locals :
+ 0x0000 - 0x0053 reg=4 (null) I
+ 0x0000 - 0x0053 reg=5 (null) I
+ 0x0000 - 0x0053 reg=6 (null) I
+
+ #13 : (in Linvokecustom/InvokeCustom2;)
+ name : 'targetMethodTest6'
+ type : '(JJJ)J'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 12
+ ins : 6
+ outs : 3
+ insns size : 85 16-bit code units
+004f08: |[004f08] invokecustom.InvokeCustom2.targetMethodTest6:(JJJ)J
+004f18: 9b00 0608 |0000: add-long v0, v6, v8
+004f1c: 6202 1000 |0002: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004f20: 2203 1700 |0004: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+004f24: 7010 b400 0300 |0006: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+004f2a: 1a04 7b00 |0009: const-string v4, "targetMethodTest6 " // string@007b
+004f2e: 6e20 ba00 4300 |000b: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004f34: 0c03 |000e: move-result-object v3
+004f36: 6e30 b800 6307 |000f: invoke-virtual {v3, v6, v7}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+004f3c: 0c03 |0012: move-result-object v3
+004f3e: 1a04 0300 |0013: const-string v4, " + " // string@0003
+004f42: 6e20 ba00 4300 |0015: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004f48: 0c03 |0018: move-result-object v3
+004f4a: 6e30 b800 8309 |0019: invoke-virtual {v3, v8, v9}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+004f50: 0c03 |001c: move-result-object v3
+004f52: 1a04 0400 |001d: const-string v4, " = " // string@0004
+004f56: 6e20 ba00 4300 |001f: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004f5c: 0c03 |0022: move-result-object v3
+004f5e: 6e30 b800 0301 |0023: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+004f64: 0c03 |0026: move-result-object v3
+004f66: 6e10 bb00 0300 |0027: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+004f6c: 0c03 |002a: move-result-object v3
+004f6e: 6e20 b100 3200 |002b: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004f74: 3102 000a |002e: cmp-long v2, v0, v10
+004f78: 3802 2400 |0030: if-eqz v2, 0054 // +0024
+004f7c: 6202 1000 |0032: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004f80: 2203 1700 |0034: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+004f84: 7010 b400 0300 |0036: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+004f8a: 1a04 1300 |0039: const-string v4, "Failed " // string@0013
+004f8e: 6e20 ba00 4300 |003b: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004f94: 0c03 |003e: move-result-object v3
+004f96: 6e30 b800 0301 |003f: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+004f9c: 0c03 |0042: move-result-object v3
+004f9e: 1a04 0100 |0043: const-string v4, " != " // string@0001
+004fa2: 6e20 ba00 4300 |0045: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004fa8: 0c03 |0048: move-result-object v3
+004faa: 6e30 b800 a30b |0049: invoke-virtual {v3, v10, v11}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+004fb0: 0c03 |004c: move-result-object v3
+004fb2: 6e10 bb00 0300 |004d: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+004fb8: 0c03 |0050: move-result-object v3
+004fba: 6e20 b100 3200 |0051: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+004fc0: 1000 |0054: return-wide v0
+ catches : (none)
+ positions :
+ 0x0000 line=77
+ 0x0002 line=78
+ 0x002e line=79
+ 0x0032 line=80
+ 0x0054 line=82
+ locals :
+ 0x0000 - 0x0055 reg=6 (null) J
+ 0x0000 - 0x0055 reg=8 (null) J
+ 0x0000 - 0x0055 reg=10 (null) J
+
+ #14 : (in Linvokecustom/InvokeCustom2;)
+ name : 'targetMethodTest7'
+ type : '(FFD)D'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 10
+ ins : 4
+ outs : 3
+ insns size : 86 16-bit code units
+004fc4: |[004fc4] invokecustom.InvokeCustom2.targetMethodTest7:(FFD)D
+004fd4: a800 0607 |0000: mul-float v0, v6, v7
+004fd8: 8900 |0002: float-to-double v0, v0
+004fda: 6202 1000 |0003: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+004fde: 2203 1700 |0005: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+004fe2: 7010 b400 0300 |0007: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+004fe8: 1a04 7e00 |000a: const-string v4, "targetMethodTest7 " // string@007e
+004fec: 6e20 ba00 4300 |000c: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+004ff2: 0c03 |000f: move-result-object v3
+004ff4: 6e20 b600 6300 |0010: invoke-virtual {v3, v6}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+004ffa: 0c03 |0013: move-result-object v3
+004ffc: 1a04 0200 |0014: const-string v4, " * " // string@0002
+005000: 6e20 ba00 4300 |0016: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005006: 0c03 |0019: move-result-object v3
+005008: 6e20 b600 7300 |001a: invoke-virtual {v3, v7}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+00500e: 0c03 |001d: move-result-object v3
+005010: 1a04 0400 |001e: const-string v4, " = " // string@0004
+005014: 6e20 ba00 4300 |0020: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00501a: 0c03 |0023: move-result-object v3
+00501c: 6e30 b500 0301 |0024: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+005022: 0c03 |0027: move-result-object v3
+005024: 6e10 bb00 0300 |0028: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00502a: 0c03 |002b: move-result-object v3
+00502c: 6e20 b100 3200 |002c: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005032: 2f02 0008 |002f: cmpl-double v2, v0, v8
+005036: 3802 2400 |0031: if-eqz v2, 0055 // +0024
+00503a: 6202 1000 |0033: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00503e: 2203 1700 |0035: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+005042: 7010 b400 0300 |0037: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+005048: 1a04 1300 |003a: const-string v4, "Failed " // string@0013
+00504c: 6e20 ba00 4300 |003c: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005052: 0c03 |003f: move-result-object v3
+005054: 6e30 b500 0301 |0040: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+00505a: 0c03 |0043: move-result-object v3
+00505c: 1a04 0100 |0044: const-string v4, " != " // string@0001
+005060: 6e20 ba00 4300 |0046: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005066: 0c03 |0049: move-result-object v3
+005068: 6e30 b500 8309 |004a: invoke-virtual {v3, v8, v9}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+00506e: 0c03 |004d: move-result-object v3
+005070: 6e10 bb00 0300 |004e: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+005076: 0c03 |0051: move-result-object v3
+005078: 6e20 b100 3200 |0052: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00507e: 1000 |0055: return-wide v0
+ catches : (none)
+ positions :
+ 0x0000 line=86
+ 0x0003 line=87
+ 0x002f line=88
+ 0x0033 line=89
+ 0x0055 line=91
+ locals :
+ 0x0000 - 0x0056 reg=6 (null) F
+ 0x0000 - 0x0056 reg=7 (null) F
+ 0x0000 - 0x0056 reg=8 (null) D
+
+ #15 : (in Linvokecustom/InvokeCustom2;)
+ name : 'targetMethodTest8'
+ type : '(Ljava/lang/String;)V'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 4
+ ins : 1
+ outs : 2
+ insns size : 25 16-bit code units
+005080: |[005080] invokecustom.InvokeCustom2.targetMethodTest8:(Ljava/lang/String;)V
+005090: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005094: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+005098: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00509e: 1a02 8000 |0007: const-string v2, "targetMethodTest8 " // string@0080
+0050a2: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0050a8: 0c01 |000c: move-result-object v1
+0050aa: 6e20 ba00 3100 |000d: invoke-virtual {v1, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0050b0: 0c01 |0010: move-result-object v1
+0050b2: 6e10 bb00 0100 |0011: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0050b8: 0c01 |0014: move-result-object v1
+0050ba: 6e20 b100 1000 |0015: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0050c0: 0e00 |0018: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=95
+ 0x0018 line=96
+ locals :
+ 0x0000 - 0x0019 reg=3 (null) Ljava/lang/String;
+
+ #16 : (in Linvokecustom/InvokeCustom2;)
+ name : 'targetMethodTest9'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+0050c4: |[0050c4] invokecustom.InvokeCustom2.targetMethodTest9:()V
+0050d4: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0050d8: 1a01 8200 |0002: const-string v1, "targetMethodTest9()" // string@0082
+0050dc: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0050e2: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=129
+ 0x0007 line=130
+ locals :
+
+ #17 : (in Linvokecustom/InvokeCustom2;)
+ name : 'test2'
+ type : '()V'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 11
+ ins : 0
+ outs : 11
+ insns size : 27 16-bit code units
+0050e4: |[0050e4] invokecustom.InvokeCustom2.test2:()V
+0050f4: 1210 |0000: const/4 v0, #int 1 // #1
+0050f6: 1301 7f00 |0001: const/16 v1, #int 127 // #7f
+0050fa: 1302 6300 |0003: const/16 v2, #int 99 // #63
+0050fe: 1303 0004 |0005: const/16 v3, #int 1024 // #400
+005102: 1404 40e2 0100 |0007: const v4, #float 1.72999e-40 // #0001e240
+005108: 1405 9a99 993f |000a: const v5, #float 1.2 // #3f99999a
+00510e: 1706 15cd 5b07 |000d: const-wide/32 v6, #float 1.6536e-34 // #075bcd15
+005114: 1808 b6fa f8b0 4819 0c40 |0010: const-wide v8, #double 3.51235 // #400c1948b0f8fab6
+00511e: 1a0a 4300 |0015: const-string v10, "String" // string@0043
+005122: fd0b 0100 0000 |0017: invoke-custom/range {v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10}, call_site@0001
+005128: 0e00 |001a: return-void
+ catches : (none)
+ positions :
+ locals :
+
+ Virtual methods -
+ #0 : (in Linvokecustom/InvokeCustom2;)
+ name : 'helperMethodTest9'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 4
+ ins : 1
+ outs : 2
+ insns size : 27 16-bit code units
+00512c: |[00512c] invokecustom.InvokeCustom2.helperMethodTest9:()V
+00513c: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005140: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+005144: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00514a: 1a02 6400 |0007: const-string v2, "helperMethodTest9 in " // string@0064
+00514e: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005154: 0c01 |000c: move-result-object v1
+005156: 1c02 0e00 |000d: const-class v2, Linvokecustom/InvokeCustom; // type@000e
+00515a: 6e20 b900 2100 |000f: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+005160: 0c01 |0012: move-result-object v1
+005162: 6e10 bb00 0100 |0013: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+005168: 0c01 |0016: move-result-object v1
+00516a: 6e20 b100 1000 |0017: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005170: 0e00 |001a: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=125
+ 0x001a line=126
+ locals :
+ 0x0000 - 0x001b reg=3 this Linvokecustom/InvokeCustom2;
+
+ #1 : (in Linvokecustom/InvokeCustom2;)
+ name : 'run'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 3
+ ins : 1
+ outs : 2
+ insns size : 8 16-bit code units
+005174: |[005174] invokecustom.InvokeCustom2.run:()V
+005184: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005188: 1a01 6e00 |0002: const-string v1, "run() for Test9" // string@006e
+00518c: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005192: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=133
+ 0x0007 line=134
+ locals :
+ 0x0000 - 0x0008 reg=2 this Linvokecustom/InvokeCustom2;
+
+ #2 : (in Linvokecustom/InvokeCustom2;)
+ name : 'targetMethodTest4'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 3
+ ins : 1
+ outs : 2
+ insns size : 8 16-bit code units
+005194: |[005194] invokecustom.InvokeCustom2.targetMethodTest4:()V
+0051a4: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0051a8: 1a01 7500 |0002: const-string v1, "targetMethodTest4 from InvokeCustom (oops!)" // string@0075
+0051ac: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0051b2: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=64
+ 0x0007 line=65
+ locals :
+ 0x0000 - 0x0008 reg=2 this Linvokecustom/InvokeCustom2;
+
+ source_file_idx : 25 (InvokeCustom.java)
+
+Class #3 -
+ Class descriptor : 'Linvokecustom/InvokeCustom3;'
+ Access flags : 0x0001 (PUBLIC)
+ Superclass : 'Linvokecustom/Super;'
+ Interfaces -
+ #0 : 'Ljava/lang/Runnable;'
+ Static fields -
+ #0 : (in Linvokecustom/InvokeCustom3;)
+ name : 'staticFieldTest9'
+ type : 'I'
+ access : 0x000a (PRIVATE STATIC)
+ Instance fields -
+ #0 : (in Linvokecustom/InvokeCustom3;)
+ name : 'fieldTest9'
+ type : 'F'
+ access : 0x0002 (PRIVATE)
+ Direct methods -
+ #0 : (in Linvokecustom/InvokeCustom3;)
+ name : '<clinit>'
+ type : '()V'
+ access : 0x10008 (STATIC CONSTRUCTOR)
+ code -
+ registers : 1
+ ins : 0
+ outs : 0
+ insns size : 4 16-bit code units
+0051b4: |[0051b4] invokecustom.InvokeCustom3.<clinit>:()V
+0051c4: 1200 |0000: const/4 v0, #int 0 // #0
+0051c6: 6700 0f00 |0001: sput v0, Linvokecustom/InvokeCustom;.staticFieldTest9:I // field@000f
+0051ca: 0e00 |0003: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=98
+ locals :
+
+ #1 : (in Linvokecustom/InvokeCustom3;)
+ name : '<init>'
+ type : '()V'
+ access : 0x10001 (PUBLIC CONSTRUCTOR)
+ code -
+ registers : 2
+ ins : 1
+ outs : 1
+ insns size : 7 16-bit code units
+0051cc: |[0051cc] invokecustom.InvokeCustom3.<init>:()V
+0051dc: 7010 a800 0100 |0000: invoke-direct {v1}, Linvokecustom/Super;.<init>:()V // method@00a8
+0051e2: 1200 |0003: const/4 v0, #int 0 // #0
+0051e4: 5910 0e00 |0004: iput v0, v1, Linvokecustom/InvokeCustom;.fieldTest9:F // field@000e
+0051e8: 0e00 |0006: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=35
+ 0x0003 line=111
+ 0x0006 line=35
+ locals :
+ 0x0000 - 0x0007 reg=1 this Linvokecustom/InvokeCustom3;
+
+ #2 : (in Linvokecustom/InvokeCustom3;)
+ name : '<init>'
+ type : '(I)V'
+ access : 0x10001 (PUBLIC CONSTRUCTOR)
+ code -
+ registers : 5
+ ins : 2
+ outs : 2
+ insns size : 37 16-bit code units
+0051ec: |[0051ec] invokecustom.InvokeCustom3.<init>:(I)V
+0051fc: 7010 a800 0300 |0000: invoke-direct {v3}, Linvokecustom/Super;.<init>:()V // method@00a8
+005202: 1200 |0003: const/4 v0, #int 0 // #0
+005204: 5930 0e00 |0004: iput v0, v3, Linvokecustom/InvokeCustom;.fieldTest9:F // field@000e
+005208: 6200 1000 |0006: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00520c: 2201 1700 |0008: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+005210: 7010 b400 0100 |000a: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+005216: 1a02 1800 |000d: const-string v2, "InvokeCustom.<init>(" // string@0018
+00521a: 6e20 ba00 2100 |000f: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005220: 0c01 |0012: move-result-object v1
+005222: 6e20 b700 4100 |0013: invoke-virtual {v1, v4}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+005228: 0c01 |0016: move-result-object v1
+00522a: 1a02 0700 |0017: const-string v2, ")" // string@0007
+00522e: 6e20 ba00 2100 |0019: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005234: 0c01 |001c: move-result-object v1
+005236: 6e10 bb00 0100 |001d: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00523c: 0c01 |0020: move-result-object v1
+00523e: 6e20 b100 1000 |0021: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005244: 0e00 |0024: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=36
+ 0x0003 line=111
+ 0x0006 line=37
+ 0x0024 line=38
+ locals :
+ 0x0000 - 0x0025 reg=3 this Linvokecustom/InvokeCustom3;
+ 0x0000 - 0x0025 reg=4 (null) I
+
+ #3 : (in Linvokecustom/InvokeCustom3;)
+ name : 'bsmCreateCallSite'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 7
+ ins : 4
+ outs : 2
+ insns size : 36 16-bit code units
+005248: |[005248] invokecustom.InvokeCustom3.bsmCreateCallSite:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+005258: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00525c: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+005260: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+005266: 1a02 5600 |0007: const-string v2, "bsmCreateCallSite [" // string@0056
+00526a: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005270: 0c01 |000c: move-result-object v1
+005272: 6e20 b900 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+005278: 0c01 |0010: move-result-object v1
+00527a: 1a02 5200 |0011: const-string v2, "]" // string@0052
+00527e: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005284: 0c01 |0016: move-result-object v1
+005286: 6e10 bb00 0100 |0017: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00528c: 0c01 |001a: move-result-object v1
+00528e: 6e20 b100 1000 |001b: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005294: 2200 1b00 |001e: new-instance v0, Ljava/lang/invoke/ConstantCallSite; // type@001b
+005298: 7020 bc00 6000 |0020: invoke-direct {v0, v6}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+00529e: 1100 |0023: return-object v0
+ catches : (none)
+ positions :
+ 0x0000 line=156
+ 0x001e line=157
+ locals :
+ 0x0000 - 0x0024 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0024 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0024 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0024 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+
+ #4 : (in Linvokecustom/InvokeCustom3;)
+ name : 'bsmLookupStatic'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 5
+ ins : 3
+ outs : 4
+ insns size : 29 16-bit code units
+0052a0: |[0052a0] invokecustom.InvokeCustom3.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
+0052b0: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0052b4: 1a01 5800 |0002: const-string v1, "bsmLookupStatic []" // string@0058
+0052b8: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0052be: 7100 c900 0000 |0007: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+0052c4: 0c00 |000a: move-result-object v0
+0052c6: 6e10 c800 0000 |000b: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+0052cc: 0c01 |000e: move-result-object v1
+0052ce: 6e40 c700 1043 |000f: invoke-virtual {v0, v1, v3, v4}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+0052d4: 0c00 |0012: move-result-object v0
+0052d6: 2201 1b00 |0013: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+0052da: 6e20 bd00 4000 |0015: invoke-virtual {v0, v4}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+0052e0: 0c00 |0018: move-result-object v0
+0052e2: 7020 bc00 0100 |0019: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+0052e8: 1101 |001c: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=138
+ 0x0007 line=139
+ 0x000b line=140
+ 0x0013 line=141
+ locals :
+ 0x0000 - 0x001d reg=2 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x001d reg=3 (null) Ljava/lang/String;
+ 0x0000 - 0x001d reg=4 (null) Ljava/lang/invoke/MethodType;
+
+ #5 : (in Linvokecustom/InvokeCustom3;)
+ name : 'bsmLookupStaticWithExtraArgs'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 12
+ ins : 9
+ outs : 4
+ insns size : 82 16-bit code units
+0052ec: |[0052ec] invokecustom.InvokeCustom3.bsmLookupStaticWithExtraArgs:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;
+0052fc: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005300: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+005304: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00530a: 1a02 5a00 |0007: const-string v2, "bsmLookupStaticWithExtraArgs [" // string@005a
+00530e: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005314: 0c01 |000c: move-result-object v1
+005316: 6e20 b700 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+00531c: 0c01 |0010: move-result-object v1
+00531e: 1a02 0800 |0011: const-string v2, ", " // string@0008
+005322: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005328: 0c01 |0016: move-result-object v1
+00532a: 6e30 b800 7108 |0017: invoke-virtual {v1, v7, v8}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+005330: 0c01 |001a: move-result-object v1
+005332: 1a02 0800 |001b: const-string v2, ", " // string@0008
+005336: 6e20 ba00 2100 |001d: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00533c: 0c01 |0020: move-result-object v1
+00533e: 6e20 b600 9100 |0021: invoke-virtual {v1, v9}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+005344: 0c01 |0024: move-result-object v1
+005346: 1a02 0800 |0025: const-string v2, ", " // string@0008
+00534a: 6e20 ba00 2100 |0027: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005350: 0c01 |002a: move-result-object v1
+005352: 6e30 b500 a10b |002b: invoke-virtual {v1, v10, v11}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+005358: 0c01 |002e: move-result-object v1
+00535a: 1a02 5200 |002f: const-string v2, "]" // string@0052
+00535e: 6e20 ba00 2100 |0031: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005364: 0c01 |0034: move-result-object v1
+005366: 6e10 bb00 0100 |0035: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00536c: 0c01 |0038: move-result-object v1
+00536e: 6e20 b100 1000 |0039: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005374: 7100 c900 0000 |003c: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+00537a: 0c00 |003f: move-result-object v0
+00537c: 6e10 c800 0000 |0040: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+005382: 0c01 |0043: move-result-object v1
+005384: 6e40 c700 1054 |0044: invoke-virtual {v0, v1, v4, v5}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+00538a: 0c00 |0047: move-result-object v0
+00538c: 2201 1b00 |0048: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+005390: 6e20 bd00 5000 |004a: invoke-virtual {v0, v5}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+005396: 0c00 |004d: move-result-object v0
+005398: 7020 bc00 0100 |004e: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+00539e: 1101 |0051: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=147
+ 0x003c line=148
+ 0x0040 line=149
+ 0x0048 line=150
+ locals :
+ 0x0000 - 0x0052 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0052 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0052 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0052 reg=6 (null) I
+ 0x0000 - 0x0052 reg=7 (null) J
+ 0x0000 - 0x0052 reg=9 (null) F
+ 0x0000 - 0x0052 reg=10 (null) D
+
+ #6 : (in Linvokecustom/InvokeCustom3;)
+ name : 'bsmLookupTest9'
+ type : '(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;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 13
+ ins : 10
+ outs : 4
+ insns size : 135 16-bit code units
+0053a0: |[0053a0] invokecustom.InvokeCustom3.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;
+0053b0: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0053b4: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+0053b8: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0053be: 1a02 5c00 |0007: const-string v2, "bsmLookupTest9 [" // string@005c
+0053c2: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0053c8: 0c01 |000c: move-result-object v1
+0053ca: 6e20 b900 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+0053d0: 0c01 |0010: move-result-object v1
+0053d2: 1a02 0800 |0011: const-string v2, ", " // string@0008
+0053d6: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0053dc: 0c01 |0016: move-result-object v1
+0053de: 6e20 b900 7100 |0017: invoke-virtual {v1, v7}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+0053e4: 0c01 |001a: move-result-object v1
+0053e6: 1a02 0800 |001b: const-string v2, ", " // string@0008
+0053ea: 6e20 ba00 2100 |001d: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0053f0: 0c01 |0020: move-result-object v1
+0053f2: 6e20 b900 8100 |0021: invoke-virtual {v1, v8}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+0053f8: 0c01 |0024: move-result-object v1
+0053fa: 1a02 0800 |0025: const-string v2, ", " // string@0008
+0053fe: 6e20 ba00 2100 |0027: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005404: 0c01 |002a: move-result-object v1
+005406: 6e20 b900 9100 |002b: invoke-virtual {v1, v9}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+00540c: 0c01 |002e: move-result-object v1
+00540e: 1a02 5200 |002f: const-string v2, "]" // string@0052
+005412: 6e20 ba00 2100 |0031: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005418: 0c01 |0034: move-result-object v1
+00541a: 6e10 bb00 0100 |0035: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+005420: 0c01 |0038: move-result-object v1
+005422: 6e20 b100 1000 |0039: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005428: 6200 1000 |003c: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00542c: 2201 1700 |003e: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+005430: 7010 b400 0100 |0040: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+005436: 6e20 ba00 4100 |0043: invoke-virtual {v1, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00543c: 0c01 |0046: move-result-object v1
+00543e: 1a02 0000 |0047: const-string v2, " " // string@0000
+005442: 6e20 ba00 2100 |0049: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005448: 0c01 |004c: move-result-object v1
+00544a: 6e20 b900 5100 |004d: invoke-virtual {v1, v5}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+005450: 0c01 |0050: move-result-object v1
+005452: 6e10 bb00 0100 |0051: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+005458: 0c01 |0054: move-result-object v1
+00545a: 6e20 b100 1000 |0055: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005460: 7120 9b00 7600 |0058: invoke-static {v6, v7}, Linvokecustom/InvokeCustom;.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V // method@009b
+005466: 2200 0e00 |005b: new-instance v0, Linvokecustom/InvokeCustom; // type@000e
+00546a: 7010 9400 0000 |005d: invoke-direct {v0}, Linvokecustom/InvokeCustom;.<init>:()V // method@0094
+005470: 6f30 9a00 8009 |0060: invoke-super {v0, v8, v9}, Linvokecustom/InvokeCustom;.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V // method@009a
+005476: fa20 c300 0a00 1c00 |0063: invoke-polymorphic {v10, v0}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)V // method@00c3, proto@001c
+00547e: 1230 |0067: const/4 v0, #int 3 // #3
+005480: fa20 c300 0b00 0500 |0068: invoke-polymorphic {v11, v0}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (I)Linvokecustom/InvokeCustom; // method@00c3, proto@0005
+005488: 0c00 |006c: move-result-object v0
+00548a: fa20 be00 0c00 1c00 |006d: invoke-polymorphic {v12, v0}, Ljava/lang/invoke/MethodHandle;.invoke:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)V // method@00be, proto@001c
+005492: 7100 c900 0000 |0071: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+005498: 0c00 |0074: move-result-object v0
+00549a: 6e10 c800 0000 |0075: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+0054a0: 0c01 |0078: move-result-object v1
+0054a2: 6e40 c700 1054 |0079: invoke-virtual {v0, v1, v4, v5}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+0054a8: 0c00 |007c: move-result-object v0
+0054aa: 2201 1b00 |007d: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+0054ae: 6e20 bd00 5000 |007f: invoke-virtual {v0, v5}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+0054b4: 0c00 |0082: move-result-object v0
+0054b6: 7020 bc00 0100 |0083: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+0054bc: 1101 |0086: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=166
+ 0x003c line=168
+ 0x0058 line=171
+ 0x005b line=172
+ 0x0060 line=173
+ 0x0063 line=176
+ 0x0067 line=178
+ 0x006d line=179
+ 0x0071 line=181
+ 0x0075 line=182
+ 0x007d line=183
+ locals :
+ 0x0000 - 0x0087 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0087 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0087 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0087 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=8 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=9 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=10 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=11 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=12 (null) Ljava/lang/invoke/MethodHandle;
+
+ #7 : (in Linvokecustom/InvokeCustom3;)
+ name : 'checkFieldTest9'
+ type : '(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V'
+ access : 0x0002 (PRIVATE)
+ code -
+ registers : 9
+ ins : 3
+ outs : 3
+ insns size : 82 16-bit code units
+0054c0: |[0054c0] invokecustom.InvokeCustom3.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+0054d0: 1405 0ff0 6a20 |0000: const v5, #float 1.99e-19 // #206af00f
+0054d6: fa20 c300 6700 0100 |0003: invoke-polymorphic {v7, v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)F // method@00c3, proto@0001
+0054de: 0a00 |0007: move-result v0
+0054e0: fa30 c300 6805 1d00 |0008: invoke-polymorphic {v8, v6, v5}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;F)V // method@00c3, proto@001d
+0054e8: fa20 c300 6700 0100 |000c: invoke-polymorphic {v7, v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)F // method@00c3, proto@0001
+0054f0: 0a01 |0010: move-result v1
+0054f2: 6202 1000 |0011: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0054f6: 2203 1700 |0013: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+0054fa: 7010 b400 0300 |0015: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+005500: 1a04 5e00 |0018: const-string v4, "checkFieldTest9: old " // string@005e
+005504: 6e20 ba00 4300 |001a: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00550a: 0c03 |001d: move-result-object v3
+00550c: 6e20 b600 0300 |001e: invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+005512: 0c00 |0021: move-result-object v0
+005514: 1a03 0600 |0022: const-string v3, " new " // string@0006
+005518: 6e20 ba00 3000 |0024: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00551e: 0c00 |0027: move-result-object v0
+005520: 6e20 b600 1000 |0028: invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+005526: 0c00 |002b: move-result-object v0
+005528: 1a03 0500 |002c: const-string v3, " expected " // string@0005
+00552c: 6e20 ba00 3000 |002e: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005532: 0c00 |0031: move-result-object v0
+005534: 6e20 b600 5000 |0032: invoke-virtual {v0, v5}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+00553a: 0c00 |0035: move-result-object v0
+00553c: 1a03 0000 |0036: const-string v3, " " // string@0000
+005540: 6e20 ba00 3000 |0038: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005546: 0c00 |003b: move-result-object v0
+005548: 6e10 bb00 0000 |003c: invoke-virtual {v0}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00554e: 0c00 |003f: move-result-object v0
+005550: 6e20 ab00 0200 |0040: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.print:(Ljava/lang/String;)V // method@00ab
+005556: 6202 1000 |0043: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00555a: 2d00 0105 |0045: cmpl-float v0, v1, v5
+00555e: 3900 0800 |0047: if-nez v0, 004f // +0008
+005562: 1a00 4000 |0049: const-string v0, "OK" // string@0040
+005566: 6e20 b100 0200 |004b: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00556c: 0e00 |004e: return-void
+00556e: 1a00 1000 |004f: const-string v0, "ERROR" // string@0010
+005572: 28fa |0051: goto 004b // -0006
+ catches : (none)
+ positions :
+ 0x0003 line=116
+ 0x0008 line=117
+ 0x000c line=118
+ 0x0011 line=119
+ 0x0043 line=121
+ 0x004e line=122
+ 0x004f line=121
+ locals :
+ 0x0000 - 0x0052 reg=6 this Linvokecustom/InvokeCustom3;
+ 0x0000 - 0x0052 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0052 reg=8 (null) Ljava/lang/invoke/MethodHandle;
+
+ #8 : (in Linvokecustom/InvokeCustom3;)
+ name : 'checkStaticFieldTest9'
+ type : '(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 8
+ ins : 2
+ outs : 2
+ insns size : 80 16-bit code units
+005574: |[005574] invokecustom.InvokeCustom3.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+005584: 1405 1032 5476 |0000: const v5, #float 1.07596e+33 // #76543210
+00558a: fa10 c300 0600 0200 |0003: invoke-polymorphic {v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, ()I // method@00c3, proto@0002
+005592: 0a00 |0007: move-result v0
+005594: fa20 c300 5700 1a00 |0008: invoke-polymorphic {v7, v5}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (I)V // method@00c3, proto@001a
+00559c: fa10 c300 0600 0200 |000c: invoke-polymorphic {v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, ()I // method@00c3, proto@0002
+0055a4: 0a01 |0010: move-result v1
+0055a6: 6202 1000 |0011: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0055aa: 2203 1700 |0013: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+0055ae: 7010 b400 0300 |0015: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0055b4: 1a04 6000 |0018: const-string v4, "checkStaticFieldTest9: old " // string@0060
+0055b8: 6e20 ba00 4300 |001a: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0055be: 0c03 |001d: move-result-object v3
+0055c0: 6e20 b700 0300 |001e: invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+0055c6: 0c00 |0021: move-result-object v0
+0055c8: 1a03 0600 |0022: const-string v3, " new " // string@0006
+0055cc: 6e20 ba00 3000 |0024: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0055d2: 0c00 |0027: move-result-object v0
+0055d4: 6e20 b700 1000 |0028: invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+0055da: 0c00 |002b: move-result-object v0
+0055dc: 1a03 0500 |002c: const-string v3, " expected " // string@0005
+0055e0: 6e20 ba00 3000 |002e: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0055e6: 0c00 |0031: move-result-object v0
+0055e8: 6e20 b700 5000 |0032: invoke-virtual {v0, v5}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+0055ee: 0c00 |0035: move-result-object v0
+0055f0: 1a03 0000 |0036: const-string v3, " " // string@0000
+0055f4: 6e20 ba00 3000 |0038: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0055fa: 0c00 |003b: move-result-object v0
+0055fc: 6e10 bb00 0000 |003c: invoke-virtual {v0}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+005602: 0c00 |003f: move-result-object v0
+005604: 6e20 ab00 0200 |0040: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.print:(Ljava/lang/String;)V // method@00ab
+00560a: 6202 1000 |0043: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00560e: 3351 0800 |0045: if-ne v1, v5, 004d // +0008
+005612: 1a00 4000 |0047: const-string v0, "OK" // string@0040
+005616: 6e20 b100 0200 |0049: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00561c: 0e00 |004c: return-void
+00561e: 1a00 1000 |004d: const-string v0, "ERROR" // string@0010
+005622: 28fa |004f: goto 0049 // -0006
+ catches : (none)
+ positions :
+ 0x0003 line=103
+ 0x0008 line=104
+ 0x000c line=105
+ 0x0011 line=106
+ 0x0043 line=108
+ 0x004c line=109
+ 0x004d line=108
+ locals :
+ 0x0000 - 0x0050 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0050 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+
+ #9 : (in Linvokecustom/InvokeCustom3;)
+ name : 'targetMethodTest1'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+005624: |[005624] invokecustom.InvokeCustom3.targetMethodTest1:()V
+005634: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005638: 1a01 1500 |0002: const-string v1, "Hello World!" // string@0015
+00563c: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005642: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=41
+ 0x0007 line=42
+ locals :
+
+ #10 : (in Linvokecustom/InvokeCustom3;)
+ name : 'targetMethodTest2'
+ type : '(ZBCSIFJDLjava/lang/String;)V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 13
+ ins : 11
+ outs : 3
+ insns size : 46 16-bit code units
+005644: |[005644] invokecustom.InvokeCustom3.targetMethodTest2:(ZBCSIFJDLjava/lang/String;)V
+005654: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005658: 6e20 b200 2000 |0002: invoke-virtual {v0, v2}, Ljava/io/PrintStream;.println:(Z)V // method@00b2
+00565e: 6200 1000 |0005: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005662: 6e20 af00 3000 |0007: invoke-virtual {v0, v3}, Ljava/io/PrintStream;.println:(I)V // method@00af
+005668: 6200 1000 |000a: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00566c: 6e20 ac00 4000 |000c: invoke-virtual {v0, v4}, Ljava/io/PrintStream;.println:(C)V // method@00ac
+005672: 6200 1000 |000f: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005676: 6e20 af00 5000 |0011: invoke-virtual {v0, v5}, Ljava/io/PrintStream;.println:(I)V // method@00af
+00567c: 6200 1000 |0014: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005680: 6e20 af00 6000 |0016: invoke-virtual {v0, v6}, Ljava/io/PrintStream;.println:(I)V // method@00af
+005686: 6200 1000 |0019: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00568a: 6e20 ae00 7000 |001b: invoke-virtual {v0, v7}, Ljava/io/PrintStream;.println:(F)V // method@00ae
+005690: 6200 1000 |001e: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005694: 6e30 b000 8009 |0020: invoke-virtual {v0, v8, v9}, Ljava/io/PrintStream;.println:(J)V // method@00b0
+00569a: 6200 1000 |0023: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00569e: 6e30 ad00 a00b |0025: invoke-virtual {v0, v10, v11}, Ljava/io/PrintStream;.println:(D)V // method@00ad
+0056a4: 6200 1000 |0028: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0056a8: 6e20 b100 c000 |002a: invoke-virtual {v0, v12}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0056ae: 0e00 |002d: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=46
+ 0x0005 line=47
+ 0x000a line=48
+ 0x000f line=49
+ 0x0014 line=50
+ 0x0019 line=51
+ 0x001e line=52
+ 0x0023 line=53
+ 0x0028 line=54
+ 0x002d line=55
+ locals :
+ 0x0000 - 0x002e reg=2 (null) Z
+ 0x0000 - 0x002e reg=3 (null) B
+ 0x0000 - 0x002e reg=4 (null) C
+ 0x0000 - 0x002e reg=5 (null) S
+ 0x0000 - 0x002e reg=6 (null) I
+ 0x0000 - 0x002e reg=7 (null) F
+ 0x0000 - 0x002e reg=8 (null) J
+ 0x0000 - 0x002e reg=10 (null) D
+ 0x0000 - 0x002e reg=12 (null) Ljava/lang/String;
+
+ #11 : (in Linvokecustom/InvokeCustom3;)
+ name : 'targetMethodTest3'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+0056b0: |[0056b0] invokecustom.InvokeCustom3.targetMethodTest3:()V
+0056c0: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0056c4: 1a01 7300 |0002: const-string v1, "targetMethodTest3 from InvokeCustom" // string@0073
+0056c8: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0056ce: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=58
+ 0x0007 line=59
+ locals :
+
+ #12 : (in Linvokecustom/InvokeCustom3;)
+ name : 'targetMethodTest5'
+ type : '(III)I'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 7
+ ins : 3
+ outs : 2
+ insns size : 83 16-bit code units
+0056d0: |[0056d0] invokecustom.InvokeCustom3.targetMethodTest5:(III)I
+0056e0: 9000 0405 |0000: add-int v0, v4, v5
+0056e4: 6201 1000 |0002: sget-object v1, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0056e8: 2202 1700 |0004: new-instance v2, Ljava/lang/StringBuilder; // type@0017
+0056ec: 7010 b400 0200 |0006: invoke-direct {v2}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0056f2: 1a03 7800 |0009: const-string v3, "targetMethodTest5 " // string@0078
+0056f6: 6e20 ba00 3200 |000b: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0056fc: 0c02 |000e: move-result-object v2
+0056fe: 6e20 b700 4200 |000f: invoke-virtual {v2, v4}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+005704: 0c02 |0012: move-result-object v2
+005706: 1a03 0300 |0013: const-string v3, " + " // string@0003
+00570a: 6e20 ba00 3200 |0015: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005710: 0c02 |0018: move-result-object v2
+005712: 6e20 b700 5200 |0019: invoke-virtual {v2, v5}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+005718: 0c02 |001c: move-result-object v2
+00571a: 1a03 0400 |001d: const-string v3, " = " // string@0004
+00571e: 6e20 ba00 3200 |001f: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005724: 0c02 |0022: move-result-object v2
+005726: 6e20 b700 0200 |0023: invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+00572c: 0c02 |0026: move-result-object v2
+00572e: 6e10 bb00 0200 |0027: invoke-virtual {v2}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+005734: 0c02 |002a: move-result-object v2
+005736: 6e20 b100 2100 |002b: invoke-virtual {v1, v2}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00573c: 3260 2400 |002e: if-eq v0, v6, 0052 // +0024
+005740: 6201 1000 |0030: sget-object v1, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005744: 2202 1700 |0032: new-instance v2, Ljava/lang/StringBuilder; // type@0017
+005748: 7010 b400 0200 |0034: invoke-direct {v2}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00574e: 1a03 1300 |0037: const-string v3, "Failed " // string@0013
+005752: 6e20 ba00 3200 |0039: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005758: 0c02 |003c: move-result-object v2
+00575a: 6e20 b700 0200 |003d: invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+005760: 0c02 |0040: move-result-object v2
+005762: 1a03 0100 |0041: const-string v3, " != " // string@0001
+005766: 6e20 ba00 3200 |0043: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00576c: 0c02 |0046: move-result-object v2
+00576e: 6e20 b700 6200 |0047: invoke-virtual {v2, v6}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+005774: 0c02 |004a: move-result-object v2
+005776: 6e10 bb00 0200 |004b: invoke-virtual {v2}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00577c: 0c02 |004e: move-result-object v2
+00577e: 6e20 b100 2100 |004f: invoke-virtual {v1, v2}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005784: 0f00 |0052: return v0
+ catches : (none)
+ positions :
+ 0x0000 line=68
+ 0x0002 line=69
+ 0x002e line=70
+ 0x0030 line=71
+ 0x0052 line=73
+ locals :
+ 0x0000 - 0x0053 reg=4 (null) I
+ 0x0000 - 0x0053 reg=5 (null) I
+ 0x0000 - 0x0053 reg=6 (null) I
+
+ #13 : (in Linvokecustom/InvokeCustom3;)
+ name : 'targetMethodTest6'
+ type : '(JJJ)J'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 12
+ ins : 6
+ outs : 3
+ insns size : 85 16-bit code units
+005788: |[005788] invokecustom.InvokeCustom3.targetMethodTest6:(JJJ)J
+005798: 9b00 0608 |0000: add-long v0, v6, v8
+00579c: 6202 1000 |0002: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0057a0: 2203 1700 |0004: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+0057a4: 7010 b400 0300 |0006: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0057aa: 1a04 7b00 |0009: const-string v4, "targetMethodTest6 " // string@007b
+0057ae: 6e20 ba00 4300 |000b: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0057b4: 0c03 |000e: move-result-object v3
+0057b6: 6e30 b800 6307 |000f: invoke-virtual {v3, v6, v7}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+0057bc: 0c03 |0012: move-result-object v3
+0057be: 1a04 0300 |0013: const-string v4, " + " // string@0003
+0057c2: 6e20 ba00 4300 |0015: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0057c8: 0c03 |0018: move-result-object v3
+0057ca: 6e30 b800 8309 |0019: invoke-virtual {v3, v8, v9}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+0057d0: 0c03 |001c: move-result-object v3
+0057d2: 1a04 0400 |001d: const-string v4, " = " // string@0004
+0057d6: 6e20 ba00 4300 |001f: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0057dc: 0c03 |0022: move-result-object v3
+0057de: 6e30 b800 0301 |0023: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+0057e4: 0c03 |0026: move-result-object v3
+0057e6: 6e10 bb00 0300 |0027: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0057ec: 0c03 |002a: move-result-object v3
+0057ee: 6e20 b100 3200 |002b: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0057f4: 3102 000a |002e: cmp-long v2, v0, v10
+0057f8: 3802 2400 |0030: if-eqz v2, 0054 // +0024
+0057fc: 6202 1000 |0032: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005800: 2203 1700 |0034: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+005804: 7010 b400 0300 |0036: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00580a: 1a04 1300 |0039: const-string v4, "Failed " // string@0013
+00580e: 6e20 ba00 4300 |003b: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005814: 0c03 |003e: move-result-object v3
+005816: 6e30 b800 0301 |003f: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+00581c: 0c03 |0042: move-result-object v3
+00581e: 1a04 0100 |0043: const-string v4, " != " // string@0001
+005822: 6e20 ba00 4300 |0045: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005828: 0c03 |0048: move-result-object v3
+00582a: 6e30 b800 a30b |0049: invoke-virtual {v3, v10, v11}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+005830: 0c03 |004c: move-result-object v3
+005832: 6e10 bb00 0300 |004d: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+005838: 0c03 |0050: move-result-object v3
+00583a: 6e20 b100 3200 |0051: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005840: 1000 |0054: return-wide v0
+ catches : (none)
+ positions :
+ 0x0000 line=77
+ 0x0002 line=78
+ 0x002e line=79
+ 0x0032 line=80
+ 0x0054 line=82
+ locals :
+ 0x0000 - 0x0055 reg=6 (null) J
+ 0x0000 - 0x0055 reg=8 (null) J
+ 0x0000 - 0x0055 reg=10 (null) J
+
+ #14 : (in Linvokecustom/InvokeCustom3;)
+ name : 'targetMethodTest7'
+ type : '(FFD)D'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 10
+ ins : 4
+ outs : 3
+ insns size : 86 16-bit code units
+005844: |[005844] invokecustom.InvokeCustom3.targetMethodTest7:(FFD)D
+005854: a800 0607 |0000: mul-float v0, v6, v7
+005858: 8900 |0002: float-to-double v0, v0
+00585a: 6202 1000 |0003: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00585e: 2203 1700 |0005: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+005862: 7010 b400 0300 |0007: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+005868: 1a04 7e00 |000a: const-string v4, "targetMethodTest7 " // string@007e
+00586c: 6e20 ba00 4300 |000c: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005872: 0c03 |000f: move-result-object v3
+005874: 6e20 b600 6300 |0010: invoke-virtual {v3, v6}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+00587a: 0c03 |0013: move-result-object v3
+00587c: 1a04 0200 |0014: const-string v4, " * " // string@0002
+005880: 6e20 ba00 4300 |0016: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005886: 0c03 |0019: move-result-object v3
+005888: 6e20 b600 7300 |001a: invoke-virtual {v3, v7}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+00588e: 0c03 |001d: move-result-object v3
+005890: 1a04 0400 |001e: const-string v4, " = " // string@0004
+005894: 6e20 ba00 4300 |0020: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00589a: 0c03 |0023: move-result-object v3
+00589c: 6e30 b500 0301 |0024: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+0058a2: 0c03 |0027: move-result-object v3
+0058a4: 6e10 bb00 0300 |0028: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0058aa: 0c03 |002b: move-result-object v3
+0058ac: 6e20 b100 3200 |002c: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0058b2: 2f02 0008 |002f: cmpl-double v2, v0, v8
+0058b6: 3802 2400 |0031: if-eqz v2, 0055 // +0024
+0058ba: 6202 1000 |0033: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0058be: 2203 1700 |0035: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+0058c2: 7010 b400 0300 |0037: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0058c8: 1a04 1300 |003a: const-string v4, "Failed " // string@0013
+0058cc: 6e20 ba00 4300 |003c: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0058d2: 0c03 |003f: move-result-object v3
+0058d4: 6e30 b500 0301 |0040: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+0058da: 0c03 |0043: move-result-object v3
+0058dc: 1a04 0100 |0044: const-string v4, " != " // string@0001
+0058e0: 6e20 ba00 4300 |0046: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0058e6: 0c03 |0049: move-result-object v3
+0058e8: 6e30 b500 8309 |004a: invoke-virtual {v3, v8, v9}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+0058ee: 0c03 |004d: move-result-object v3
+0058f0: 6e10 bb00 0300 |004e: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0058f6: 0c03 |0051: move-result-object v3
+0058f8: 6e20 b100 3200 |0052: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0058fe: 1000 |0055: return-wide v0
+ catches : (none)
+ positions :
+ 0x0000 line=86
+ 0x0003 line=87
+ 0x002f line=88
+ 0x0033 line=89
+ 0x0055 line=91
+ locals :
+ 0x0000 - 0x0056 reg=6 (null) F
+ 0x0000 - 0x0056 reg=7 (null) F
+ 0x0000 - 0x0056 reg=8 (null) D
+
+ #15 : (in Linvokecustom/InvokeCustom3;)
+ name : 'targetMethodTest8'
+ type : '(Ljava/lang/String;)V'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 4
+ ins : 1
+ outs : 2
+ insns size : 25 16-bit code units
+005900: |[005900] invokecustom.InvokeCustom3.targetMethodTest8:(Ljava/lang/String;)V
+005910: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005914: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+005918: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00591e: 1a02 8000 |0007: const-string v2, "targetMethodTest8 " // string@0080
+005922: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005928: 0c01 |000c: move-result-object v1
+00592a: 6e20 ba00 3100 |000d: invoke-virtual {v1, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005930: 0c01 |0010: move-result-object v1
+005932: 6e10 bb00 0100 |0011: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+005938: 0c01 |0014: move-result-object v1
+00593a: 6e20 b100 1000 |0015: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005940: 0e00 |0018: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=95
+ 0x0018 line=96
+ locals :
+ 0x0000 - 0x0019 reg=3 (null) Ljava/lang/String;
+
+ #16 : (in Linvokecustom/InvokeCustom3;)
+ name : 'targetMethodTest9'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+005944: |[005944] invokecustom.InvokeCustom3.targetMethodTest9:()V
+005954: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005958: 1a01 8200 |0002: const-string v1, "targetMethodTest9()" // string@0082
+00595c: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005962: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=129
+ 0x0007 line=130
+ locals :
+
+ #17 : (in Linvokecustom/InvokeCustom3;)
+ name : 'test3'
+ type : '()V'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 0
+ ins : 0
+ outs : 0
+ insns size : 4 16-bit code units
+005964: |[005964] invokecustom.InvokeCustom3.test3:()V
+005974: fc00 0200 0000 |0000: invoke-custom {}, call_site@0002
+00597a: 0e00 |0003: return-void
+ catches : (none)
+ positions :
+ locals :
+
+ Virtual methods -
+ #0 : (in Linvokecustom/InvokeCustom3;)
+ name : 'helperMethodTest9'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 4
+ ins : 1
+ outs : 2
+ insns size : 27 16-bit code units
+00597c: |[00597c] invokecustom.InvokeCustom3.helperMethodTest9:()V
+00598c: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005990: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+005994: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00599a: 1a02 6400 |0007: const-string v2, "helperMethodTest9 in " // string@0064
+00599e: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0059a4: 0c01 |000c: move-result-object v1
+0059a6: 1c02 0e00 |000d: const-class v2, Linvokecustom/InvokeCustom; // type@000e
+0059aa: 6e20 b900 2100 |000f: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+0059b0: 0c01 |0012: move-result-object v1
+0059b2: 6e10 bb00 0100 |0013: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0059b8: 0c01 |0016: move-result-object v1
+0059ba: 6e20 b100 1000 |0017: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0059c0: 0e00 |001a: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=125
+ 0x001a line=126
+ locals :
+ 0x0000 - 0x001b reg=3 this Linvokecustom/InvokeCustom3;
+
+ #1 : (in Linvokecustom/InvokeCustom3;)
+ name : 'run'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 3
+ ins : 1
+ outs : 2
+ insns size : 8 16-bit code units
+0059c4: |[0059c4] invokecustom.InvokeCustom3.run:()V
+0059d4: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0059d8: 1a01 6e00 |0002: const-string v1, "run() for Test9" // string@006e
+0059dc: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0059e2: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=133
+ 0x0007 line=134
+ locals :
+ 0x0000 - 0x0008 reg=2 this Linvokecustom/InvokeCustom3;
+
+ #2 : (in Linvokecustom/InvokeCustom3;)
+ name : 'targetMethodTest4'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 3
+ ins : 1
+ outs : 2
+ insns size : 8 16-bit code units
+0059e4: |[0059e4] invokecustom.InvokeCustom3.targetMethodTest4:()V
+0059f4: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0059f8: 1a01 7500 |0002: const-string v1, "targetMethodTest4 from InvokeCustom (oops!)" // string@0075
+0059fc: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005a02: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=64
+ 0x0007 line=65
+ locals :
+ 0x0000 - 0x0008 reg=2 this Linvokecustom/InvokeCustom3;
+
+ source_file_idx : 25 (InvokeCustom.java)
+
+Class #4 -
+ Class descriptor : 'Linvokecustom/InvokeCustom5;'
+ Access flags : 0x0001 (PUBLIC)
+ Superclass : 'Linvokecustom/Super;'
+ Interfaces -
+ #0 : 'Ljava/lang/Runnable;'
+ Static fields -
+ #0 : (in Linvokecustom/InvokeCustom5;)
+ name : 'staticFieldTest9'
+ type : 'I'
+ access : 0x000a (PRIVATE STATIC)
+ Instance fields -
+ #0 : (in Linvokecustom/InvokeCustom5;)
+ name : 'fieldTest9'
+ type : 'F'
+ access : 0x0002 (PRIVATE)
+ Direct methods -
+ #0 : (in Linvokecustom/InvokeCustom5;)
+ name : '<clinit>'
+ type : '()V'
+ access : 0x10008 (STATIC CONSTRUCTOR)
+ code -
+ registers : 1
+ ins : 0
+ outs : 0
+ insns size : 4 16-bit code units
+005a04: |[005a04] invokecustom.InvokeCustom5.<clinit>:()V
+005a14: 1200 |0000: const/4 v0, #int 0 // #0
+005a16: 6700 0f00 |0001: sput v0, Linvokecustom/InvokeCustom;.staticFieldTest9:I // field@000f
+005a1a: 0e00 |0003: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=98
+ locals :
+
+ #1 : (in Linvokecustom/InvokeCustom5;)
+ name : '<init>'
+ type : '()V'
+ access : 0x10001 (PUBLIC CONSTRUCTOR)
+ code -
+ registers : 2
+ ins : 1
+ outs : 1
+ insns size : 7 16-bit code units
+005a1c: |[005a1c] invokecustom.InvokeCustom5.<init>:()V
+005a2c: 7010 a800 0100 |0000: invoke-direct {v1}, Linvokecustom/Super;.<init>:()V // method@00a8
+005a32: 1200 |0003: const/4 v0, #int 0 // #0
+005a34: 5910 0e00 |0004: iput v0, v1, Linvokecustom/InvokeCustom;.fieldTest9:F // field@000e
+005a38: 0e00 |0006: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=35
+ 0x0003 line=111
+ 0x0006 line=35
+ locals :
+ 0x0000 - 0x0007 reg=1 this Linvokecustom/InvokeCustom5;
+
+ #2 : (in Linvokecustom/InvokeCustom5;)
+ name : '<init>'
+ type : '(I)V'
+ access : 0x10001 (PUBLIC CONSTRUCTOR)
+ code -
+ registers : 5
+ ins : 2
+ outs : 2
+ insns size : 37 16-bit code units
+005a3c: |[005a3c] invokecustom.InvokeCustom5.<init>:(I)V
+005a4c: 7010 a800 0300 |0000: invoke-direct {v3}, Linvokecustom/Super;.<init>:()V // method@00a8
+005a52: 1200 |0003: const/4 v0, #int 0 // #0
+005a54: 5930 0e00 |0004: iput v0, v3, Linvokecustom/InvokeCustom;.fieldTest9:F // field@000e
+005a58: 6200 1000 |0006: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005a5c: 2201 1700 |0008: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+005a60: 7010 b400 0100 |000a: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+005a66: 1a02 1800 |000d: const-string v2, "InvokeCustom.<init>(" // string@0018
+005a6a: 6e20 ba00 2100 |000f: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005a70: 0c01 |0012: move-result-object v1
+005a72: 6e20 b700 4100 |0013: invoke-virtual {v1, v4}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+005a78: 0c01 |0016: move-result-object v1
+005a7a: 1a02 0700 |0017: const-string v2, ")" // string@0007
+005a7e: 6e20 ba00 2100 |0019: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005a84: 0c01 |001c: move-result-object v1
+005a86: 6e10 bb00 0100 |001d: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+005a8c: 0c01 |0020: move-result-object v1
+005a8e: 6e20 b100 1000 |0021: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005a94: 0e00 |0024: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=36
+ 0x0003 line=111
+ 0x0006 line=37
+ 0x0024 line=38
+ locals :
+ 0x0000 - 0x0025 reg=3 this Linvokecustom/InvokeCustom5;
+ 0x0000 - 0x0025 reg=4 (null) I
+
+ #3 : (in Linvokecustom/InvokeCustom5;)
+ name : 'bsmCreateCallSite'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 7
+ ins : 4
+ outs : 2
+ insns size : 36 16-bit code units
+005a98: |[005a98] invokecustom.InvokeCustom5.bsmCreateCallSite:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+005aa8: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005aac: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+005ab0: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+005ab6: 1a02 5600 |0007: const-string v2, "bsmCreateCallSite [" // string@0056
+005aba: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005ac0: 0c01 |000c: move-result-object v1
+005ac2: 6e20 b900 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+005ac8: 0c01 |0010: move-result-object v1
+005aca: 1a02 5200 |0011: const-string v2, "]" // string@0052
+005ace: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005ad4: 0c01 |0016: move-result-object v1
+005ad6: 6e10 bb00 0100 |0017: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+005adc: 0c01 |001a: move-result-object v1
+005ade: 6e20 b100 1000 |001b: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005ae4: 2200 1b00 |001e: new-instance v0, Ljava/lang/invoke/ConstantCallSite; // type@001b
+005ae8: 7020 bc00 6000 |0020: invoke-direct {v0, v6}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+005aee: 1100 |0023: return-object v0
+ catches : (none)
+ positions :
+ 0x0000 line=156
+ 0x001e line=157
+ locals :
+ 0x0000 - 0x0024 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0024 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0024 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0024 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+
+ #4 : (in Linvokecustom/InvokeCustom5;)
+ name : 'bsmLookupStatic'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 5
+ ins : 3
+ outs : 4
+ insns size : 29 16-bit code units
+005af0: |[005af0] invokecustom.InvokeCustom5.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
+005b00: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005b04: 1a01 5800 |0002: const-string v1, "bsmLookupStatic []" // string@0058
+005b08: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005b0e: 7100 c900 0000 |0007: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+005b14: 0c00 |000a: move-result-object v0
+005b16: 6e10 c800 0000 |000b: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+005b1c: 0c01 |000e: move-result-object v1
+005b1e: 6e40 c700 1043 |000f: invoke-virtual {v0, v1, v3, v4}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+005b24: 0c00 |0012: move-result-object v0
+005b26: 2201 1b00 |0013: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+005b2a: 6e20 bd00 4000 |0015: invoke-virtual {v0, v4}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+005b30: 0c00 |0018: move-result-object v0
+005b32: 7020 bc00 0100 |0019: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+005b38: 1101 |001c: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=138
+ 0x0007 line=139
+ 0x000b line=140
+ 0x0013 line=141
+ locals :
+ 0x0000 - 0x001d reg=2 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x001d reg=3 (null) Ljava/lang/String;
+ 0x0000 - 0x001d reg=4 (null) Ljava/lang/invoke/MethodType;
+
+ #5 : (in Linvokecustom/InvokeCustom5;)
+ name : 'bsmLookupStaticWithExtraArgs'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 12
+ ins : 9
+ outs : 4
+ insns size : 82 16-bit code units
+005b3c: |[005b3c] invokecustom.InvokeCustom5.bsmLookupStaticWithExtraArgs:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;
+005b4c: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005b50: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+005b54: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+005b5a: 1a02 5a00 |0007: const-string v2, "bsmLookupStaticWithExtraArgs [" // string@005a
+005b5e: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005b64: 0c01 |000c: move-result-object v1
+005b66: 6e20 b700 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+005b6c: 0c01 |0010: move-result-object v1
+005b6e: 1a02 0800 |0011: const-string v2, ", " // string@0008
+005b72: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005b78: 0c01 |0016: move-result-object v1
+005b7a: 6e30 b800 7108 |0017: invoke-virtual {v1, v7, v8}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+005b80: 0c01 |001a: move-result-object v1
+005b82: 1a02 0800 |001b: const-string v2, ", " // string@0008
+005b86: 6e20 ba00 2100 |001d: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005b8c: 0c01 |0020: move-result-object v1
+005b8e: 6e20 b600 9100 |0021: invoke-virtual {v1, v9}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+005b94: 0c01 |0024: move-result-object v1
+005b96: 1a02 0800 |0025: const-string v2, ", " // string@0008
+005b9a: 6e20 ba00 2100 |0027: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005ba0: 0c01 |002a: move-result-object v1
+005ba2: 6e30 b500 a10b |002b: invoke-virtual {v1, v10, v11}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+005ba8: 0c01 |002e: move-result-object v1
+005baa: 1a02 5200 |002f: const-string v2, "]" // string@0052
+005bae: 6e20 ba00 2100 |0031: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005bb4: 0c01 |0034: move-result-object v1
+005bb6: 6e10 bb00 0100 |0035: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+005bbc: 0c01 |0038: move-result-object v1
+005bbe: 6e20 b100 1000 |0039: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005bc4: 7100 c900 0000 |003c: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+005bca: 0c00 |003f: move-result-object v0
+005bcc: 6e10 c800 0000 |0040: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+005bd2: 0c01 |0043: move-result-object v1
+005bd4: 6e40 c700 1054 |0044: invoke-virtual {v0, v1, v4, v5}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+005bda: 0c00 |0047: move-result-object v0
+005bdc: 2201 1b00 |0048: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+005be0: 6e20 bd00 5000 |004a: invoke-virtual {v0, v5}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+005be6: 0c00 |004d: move-result-object v0
+005be8: 7020 bc00 0100 |004e: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+005bee: 1101 |0051: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=147
+ 0x003c line=148
+ 0x0040 line=149
+ 0x0048 line=150
+ locals :
+ 0x0000 - 0x0052 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0052 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0052 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0052 reg=6 (null) I
+ 0x0000 - 0x0052 reg=7 (null) J
+ 0x0000 - 0x0052 reg=9 (null) F
+ 0x0000 - 0x0052 reg=10 (null) D
+
+ #6 : (in Linvokecustom/InvokeCustom5;)
+ name : 'bsmLookupTest9'
+ type : '(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;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 13
+ ins : 10
+ outs : 4
+ insns size : 135 16-bit code units
+005bf0: |[005bf0] invokecustom.InvokeCustom5.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;
+005c00: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005c04: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+005c08: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+005c0e: 1a02 5c00 |0007: const-string v2, "bsmLookupTest9 [" // string@005c
+005c12: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005c18: 0c01 |000c: move-result-object v1
+005c1a: 6e20 b900 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+005c20: 0c01 |0010: move-result-object v1
+005c22: 1a02 0800 |0011: const-string v2, ", " // string@0008
+005c26: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005c2c: 0c01 |0016: move-result-object v1
+005c2e: 6e20 b900 7100 |0017: invoke-virtual {v1, v7}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+005c34: 0c01 |001a: move-result-object v1
+005c36: 1a02 0800 |001b: const-string v2, ", " // string@0008
+005c3a: 6e20 ba00 2100 |001d: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005c40: 0c01 |0020: move-result-object v1
+005c42: 6e20 b900 8100 |0021: invoke-virtual {v1, v8}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+005c48: 0c01 |0024: move-result-object v1
+005c4a: 1a02 0800 |0025: const-string v2, ", " // string@0008
+005c4e: 6e20 ba00 2100 |0027: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005c54: 0c01 |002a: move-result-object v1
+005c56: 6e20 b900 9100 |002b: invoke-virtual {v1, v9}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+005c5c: 0c01 |002e: move-result-object v1
+005c5e: 1a02 5200 |002f: const-string v2, "]" // string@0052
+005c62: 6e20 ba00 2100 |0031: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005c68: 0c01 |0034: move-result-object v1
+005c6a: 6e10 bb00 0100 |0035: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+005c70: 0c01 |0038: move-result-object v1
+005c72: 6e20 b100 1000 |0039: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005c78: 6200 1000 |003c: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005c7c: 2201 1700 |003e: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+005c80: 7010 b400 0100 |0040: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+005c86: 6e20 ba00 4100 |0043: invoke-virtual {v1, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005c8c: 0c01 |0046: move-result-object v1
+005c8e: 1a02 0000 |0047: const-string v2, " " // string@0000
+005c92: 6e20 ba00 2100 |0049: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005c98: 0c01 |004c: move-result-object v1
+005c9a: 6e20 b900 5100 |004d: invoke-virtual {v1, v5}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+005ca0: 0c01 |0050: move-result-object v1
+005ca2: 6e10 bb00 0100 |0051: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+005ca8: 0c01 |0054: move-result-object v1
+005caa: 6e20 b100 1000 |0055: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005cb0: 7120 9b00 7600 |0058: invoke-static {v6, v7}, Linvokecustom/InvokeCustom;.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V // method@009b
+005cb6: 2200 0e00 |005b: new-instance v0, Linvokecustom/InvokeCustom; // type@000e
+005cba: 7010 9400 0000 |005d: invoke-direct {v0}, Linvokecustom/InvokeCustom;.<init>:()V // method@0094
+005cc0: 6f30 9a00 8009 |0060: invoke-super {v0, v8, v9}, Linvokecustom/InvokeCustom;.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V // method@009a
+005cc6: fa20 c300 0a00 1c00 |0063: invoke-polymorphic {v10, v0}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)V // method@00c3, proto@001c
+005cce: 1230 |0067: const/4 v0, #int 3 // #3
+005cd0: fa20 c300 0b00 0500 |0068: invoke-polymorphic {v11, v0}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (I)Linvokecustom/InvokeCustom; // method@00c3, proto@0005
+005cd8: 0c00 |006c: move-result-object v0
+005cda: fa20 be00 0c00 1c00 |006d: invoke-polymorphic {v12, v0}, Ljava/lang/invoke/MethodHandle;.invoke:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)V // method@00be, proto@001c
+005ce2: 7100 c900 0000 |0071: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+005ce8: 0c00 |0074: move-result-object v0
+005cea: 6e10 c800 0000 |0075: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+005cf0: 0c01 |0078: move-result-object v1
+005cf2: 6e40 c700 1054 |0079: invoke-virtual {v0, v1, v4, v5}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+005cf8: 0c00 |007c: move-result-object v0
+005cfa: 2201 1b00 |007d: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+005cfe: 6e20 bd00 5000 |007f: invoke-virtual {v0, v5}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+005d04: 0c00 |0082: move-result-object v0
+005d06: 7020 bc00 0100 |0083: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+005d0c: 1101 |0086: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=166
+ 0x003c line=168
+ 0x0058 line=171
+ 0x005b line=172
+ 0x0060 line=173
+ 0x0063 line=176
+ 0x0067 line=178
+ 0x006d line=179
+ 0x0071 line=181
+ 0x0075 line=182
+ 0x007d line=183
+ locals :
+ 0x0000 - 0x0087 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0087 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0087 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0087 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=8 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=9 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=10 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=11 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=12 (null) Ljava/lang/invoke/MethodHandle;
+
+ #7 : (in Linvokecustom/InvokeCustom5;)
+ name : 'checkFieldTest9'
+ type : '(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V'
+ access : 0x0002 (PRIVATE)
+ code -
+ registers : 9
+ ins : 3
+ outs : 3
+ insns size : 82 16-bit code units
+005d10: |[005d10] invokecustom.InvokeCustom5.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+005d20: 1405 0ff0 6a20 |0000: const v5, #float 1.99e-19 // #206af00f
+005d26: fa20 c300 6700 0100 |0003: invoke-polymorphic {v7, v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)F // method@00c3, proto@0001
+005d2e: 0a00 |0007: move-result v0
+005d30: fa30 c300 6805 1d00 |0008: invoke-polymorphic {v8, v6, v5}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;F)V // method@00c3, proto@001d
+005d38: fa20 c300 6700 0100 |000c: invoke-polymorphic {v7, v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)F // method@00c3, proto@0001
+005d40: 0a01 |0010: move-result v1
+005d42: 6202 1000 |0011: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005d46: 2203 1700 |0013: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+005d4a: 7010 b400 0300 |0015: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+005d50: 1a04 5e00 |0018: const-string v4, "checkFieldTest9: old " // string@005e
+005d54: 6e20 ba00 4300 |001a: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005d5a: 0c03 |001d: move-result-object v3
+005d5c: 6e20 b600 0300 |001e: invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+005d62: 0c00 |0021: move-result-object v0
+005d64: 1a03 0600 |0022: const-string v3, " new " // string@0006
+005d68: 6e20 ba00 3000 |0024: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005d6e: 0c00 |0027: move-result-object v0
+005d70: 6e20 b600 1000 |0028: invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+005d76: 0c00 |002b: move-result-object v0
+005d78: 1a03 0500 |002c: const-string v3, " expected " // string@0005
+005d7c: 6e20 ba00 3000 |002e: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005d82: 0c00 |0031: move-result-object v0
+005d84: 6e20 b600 5000 |0032: invoke-virtual {v0, v5}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+005d8a: 0c00 |0035: move-result-object v0
+005d8c: 1a03 0000 |0036: const-string v3, " " // string@0000
+005d90: 6e20 ba00 3000 |0038: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005d96: 0c00 |003b: move-result-object v0
+005d98: 6e10 bb00 0000 |003c: invoke-virtual {v0}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+005d9e: 0c00 |003f: move-result-object v0
+005da0: 6e20 ab00 0200 |0040: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.print:(Ljava/lang/String;)V // method@00ab
+005da6: 6202 1000 |0043: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005daa: 2d00 0105 |0045: cmpl-float v0, v1, v5
+005dae: 3900 0800 |0047: if-nez v0, 004f // +0008
+005db2: 1a00 4000 |0049: const-string v0, "OK" // string@0040
+005db6: 6e20 b100 0200 |004b: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005dbc: 0e00 |004e: return-void
+005dbe: 1a00 1000 |004f: const-string v0, "ERROR" // string@0010
+005dc2: 28fa |0051: goto 004b // -0006
+ catches : (none)
+ positions :
+ 0x0003 line=116
+ 0x0008 line=117
+ 0x000c line=118
+ 0x0011 line=119
+ 0x0043 line=121
+ 0x004e line=122
+ 0x004f line=121
+ locals :
+ 0x0000 - 0x0052 reg=6 this Linvokecustom/InvokeCustom5;
+ 0x0000 - 0x0052 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0052 reg=8 (null) Ljava/lang/invoke/MethodHandle;
+
+ #8 : (in Linvokecustom/InvokeCustom5;)
+ name : 'checkStaticFieldTest9'
+ type : '(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 8
+ ins : 2
+ outs : 2
+ insns size : 80 16-bit code units
+005dc4: |[005dc4] invokecustom.InvokeCustom5.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+005dd4: 1405 1032 5476 |0000: const v5, #float 1.07596e+33 // #76543210
+005dda: fa10 c300 0600 0200 |0003: invoke-polymorphic {v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, ()I // method@00c3, proto@0002
+005de2: 0a00 |0007: move-result v0
+005de4: fa20 c300 5700 1a00 |0008: invoke-polymorphic {v7, v5}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (I)V // method@00c3, proto@001a
+005dec: fa10 c300 0600 0200 |000c: invoke-polymorphic {v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, ()I // method@00c3, proto@0002
+005df4: 0a01 |0010: move-result v1
+005df6: 6202 1000 |0011: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005dfa: 2203 1700 |0013: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+005dfe: 7010 b400 0300 |0015: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+005e04: 1a04 6000 |0018: const-string v4, "checkStaticFieldTest9: old " // string@0060
+005e08: 6e20 ba00 4300 |001a: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005e0e: 0c03 |001d: move-result-object v3
+005e10: 6e20 b700 0300 |001e: invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+005e16: 0c00 |0021: move-result-object v0
+005e18: 1a03 0600 |0022: const-string v3, " new " // string@0006
+005e1c: 6e20 ba00 3000 |0024: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005e22: 0c00 |0027: move-result-object v0
+005e24: 6e20 b700 1000 |0028: invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+005e2a: 0c00 |002b: move-result-object v0
+005e2c: 1a03 0500 |002c: const-string v3, " expected " // string@0005
+005e30: 6e20 ba00 3000 |002e: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005e36: 0c00 |0031: move-result-object v0
+005e38: 6e20 b700 5000 |0032: invoke-virtual {v0, v5}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+005e3e: 0c00 |0035: move-result-object v0
+005e40: 1a03 0000 |0036: const-string v3, " " // string@0000
+005e44: 6e20 ba00 3000 |0038: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005e4a: 0c00 |003b: move-result-object v0
+005e4c: 6e10 bb00 0000 |003c: invoke-virtual {v0}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+005e52: 0c00 |003f: move-result-object v0
+005e54: 6e20 ab00 0200 |0040: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.print:(Ljava/lang/String;)V // method@00ab
+005e5a: 6202 1000 |0043: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005e5e: 3351 0800 |0045: if-ne v1, v5, 004d // +0008
+005e62: 1a00 4000 |0047: const-string v0, "OK" // string@0040
+005e66: 6e20 b100 0200 |0049: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005e6c: 0e00 |004c: return-void
+005e6e: 1a00 1000 |004d: const-string v0, "ERROR" // string@0010
+005e72: 28fa |004f: goto 0049 // -0006
+ catches : (none)
+ positions :
+ 0x0003 line=103
+ 0x0008 line=104
+ 0x000c line=105
+ 0x0011 line=106
+ 0x0043 line=108
+ 0x004c line=109
+ 0x004d line=108
+ locals :
+ 0x0000 - 0x0050 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0050 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+
+ #9 : (in Linvokecustom/InvokeCustom5;)
+ name : 'targetMethodTest1'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+005e74: |[005e74] invokecustom.InvokeCustom5.targetMethodTest1:()V
+005e84: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005e88: 1a01 1500 |0002: const-string v1, "Hello World!" // string@0015
+005e8c: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005e92: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=41
+ 0x0007 line=42
+ locals :
+
+ #10 : (in Linvokecustom/InvokeCustom5;)
+ name : 'targetMethodTest2'
+ type : '(ZBCSIFJDLjava/lang/String;)V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 13
+ ins : 11
+ outs : 3
+ insns size : 46 16-bit code units
+005e94: |[005e94] invokecustom.InvokeCustom5.targetMethodTest2:(ZBCSIFJDLjava/lang/String;)V
+005ea4: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005ea8: 6e20 b200 2000 |0002: invoke-virtual {v0, v2}, Ljava/io/PrintStream;.println:(Z)V // method@00b2
+005eae: 6200 1000 |0005: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005eb2: 6e20 af00 3000 |0007: invoke-virtual {v0, v3}, Ljava/io/PrintStream;.println:(I)V // method@00af
+005eb8: 6200 1000 |000a: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005ebc: 6e20 ac00 4000 |000c: invoke-virtual {v0, v4}, Ljava/io/PrintStream;.println:(C)V // method@00ac
+005ec2: 6200 1000 |000f: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005ec6: 6e20 af00 5000 |0011: invoke-virtual {v0, v5}, Ljava/io/PrintStream;.println:(I)V // method@00af
+005ecc: 6200 1000 |0014: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005ed0: 6e20 af00 6000 |0016: invoke-virtual {v0, v6}, Ljava/io/PrintStream;.println:(I)V // method@00af
+005ed6: 6200 1000 |0019: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005eda: 6e20 ae00 7000 |001b: invoke-virtual {v0, v7}, Ljava/io/PrintStream;.println:(F)V // method@00ae
+005ee0: 6200 1000 |001e: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005ee4: 6e30 b000 8009 |0020: invoke-virtual {v0, v8, v9}, Ljava/io/PrintStream;.println:(J)V // method@00b0
+005eea: 6200 1000 |0023: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005eee: 6e30 ad00 a00b |0025: invoke-virtual {v0, v10, v11}, Ljava/io/PrintStream;.println:(D)V // method@00ad
+005ef4: 6200 1000 |0028: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005ef8: 6e20 b100 c000 |002a: invoke-virtual {v0, v12}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005efe: 0e00 |002d: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=46
+ 0x0005 line=47
+ 0x000a line=48
+ 0x000f line=49
+ 0x0014 line=50
+ 0x0019 line=51
+ 0x001e line=52
+ 0x0023 line=53
+ 0x0028 line=54
+ 0x002d line=55
+ locals :
+ 0x0000 - 0x002e reg=2 (null) Z
+ 0x0000 - 0x002e reg=3 (null) B
+ 0x0000 - 0x002e reg=4 (null) C
+ 0x0000 - 0x002e reg=5 (null) S
+ 0x0000 - 0x002e reg=6 (null) I
+ 0x0000 - 0x002e reg=7 (null) F
+ 0x0000 - 0x002e reg=8 (null) J
+ 0x0000 - 0x002e reg=10 (null) D
+ 0x0000 - 0x002e reg=12 (null) Ljava/lang/String;
+
+ #11 : (in Linvokecustom/InvokeCustom5;)
+ name : 'targetMethodTest3'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+005f00: |[005f00] invokecustom.InvokeCustom5.targetMethodTest3:()V
+005f10: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005f14: 1a01 7300 |0002: const-string v1, "targetMethodTest3 from InvokeCustom" // string@0073
+005f18: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005f1e: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=58
+ 0x0007 line=59
+ locals :
+
+ #12 : (in Linvokecustom/InvokeCustom5;)
+ name : 'targetMethodTest5'
+ type : '(III)I'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 7
+ ins : 3
+ outs : 2
+ insns size : 83 16-bit code units
+005f20: |[005f20] invokecustom.InvokeCustom5.targetMethodTest5:(III)I
+005f30: 9000 0405 |0000: add-int v0, v4, v5
+005f34: 6201 1000 |0002: sget-object v1, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005f38: 2202 1700 |0004: new-instance v2, Ljava/lang/StringBuilder; // type@0017
+005f3c: 7010 b400 0200 |0006: invoke-direct {v2}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+005f42: 1a03 7800 |0009: const-string v3, "targetMethodTest5 " // string@0078
+005f46: 6e20 ba00 3200 |000b: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005f4c: 0c02 |000e: move-result-object v2
+005f4e: 6e20 b700 4200 |000f: invoke-virtual {v2, v4}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+005f54: 0c02 |0012: move-result-object v2
+005f56: 1a03 0300 |0013: const-string v3, " + " // string@0003
+005f5a: 6e20 ba00 3200 |0015: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005f60: 0c02 |0018: move-result-object v2
+005f62: 6e20 b700 5200 |0019: invoke-virtual {v2, v5}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+005f68: 0c02 |001c: move-result-object v2
+005f6a: 1a03 0400 |001d: const-string v3, " = " // string@0004
+005f6e: 6e20 ba00 3200 |001f: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005f74: 0c02 |0022: move-result-object v2
+005f76: 6e20 b700 0200 |0023: invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+005f7c: 0c02 |0026: move-result-object v2
+005f7e: 6e10 bb00 0200 |0027: invoke-virtual {v2}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+005f84: 0c02 |002a: move-result-object v2
+005f86: 6e20 b100 2100 |002b: invoke-virtual {v1, v2}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005f8c: 3260 2400 |002e: if-eq v0, v6, 0052 // +0024
+005f90: 6201 1000 |0030: sget-object v1, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005f94: 2202 1700 |0032: new-instance v2, Ljava/lang/StringBuilder; // type@0017
+005f98: 7010 b400 0200 |0034: invoke-direct {v2}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+005f9e: 1a03 1300 |0037: const-string v3, "Failed " // string@0013
+005fa2: 6e20 ba00 3200 |0039: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005fa8: 0c02 |003c: move-result-object v2
+005faa: 6e20 b700 0200 |003d: invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+005fb0: 0c02 |0040: move-result-object v2
+005fb2: 1a03 0100 |0041: const-string v3, " != " // string@0001
+005fb6: 6e20 ba00 3200 |0043: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+005fbc: 0c02 |0046: move-result-object v2
+005fbe: 6e20 b700 6200 |0047: invoke-virtual {v2, v6}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+005fc4: 0c02 |004a: move-result-object v2
+005fc6: 6e10 bb00 0200 |004b: invoke-virtual {v2}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+005fcc: 0c02 |004e: move-result-object v2
+005fce: 6e20 b100 2100 |004f: invoke-virtual {v1, v2}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+005fd4: 0f00 |0052: return v0
+ catches : (none)
+ positions :
+ 0x0000 line=68
+ 0x0002 line=69
+ 0x002e line=70
+ 0x0030 line=71
+ 0x0052 line=73
+ locals :
+ 0x0000 - 0x0053 reg=4 (null) I
+ 0x0000 - 0x0053 reg=5 (null) I
+ 0x0000 - 0x0053 reg=6 (null) I
+
+ #13 : (in Linvokecustom/InvokeCustom5;)
+ name : 'targetMethodTest6'
+ type : '(JJJ)J'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 12
+ ins : 6
+ outs : 3
+ insns size : 85 16-bit code units
+005fd8: |[005fd8] invokecustom.InvokeCustom5.targetMethodTest6:(JJJ)J
+005fe8: 9b00 0608 |0000: add-long v0, v6, v8
+005fec: 6202 1000 |0002: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+005ff0: 2203 1700 |0004: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+005ff4: 7010 b400 0300 |0006: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+005ffa: 1a04 7b00 |0009: const-string v4, "targetMethodTest6 " // string@007b
+005ffe: 6e20 ba00 4300 |000b: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006004: 0c03 |000e: move-result-object v3
+006006: 6e30 b800 6307 |000f: invoke-virtual {v3, v6, v7}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+00600c: 0c03 |0012: move-result-object v3
+00600e: 1a04 0300 |0013: const-string v4, " + " // string@0003
+006012: 6e20 ba00 4300 |0015: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006018: 0c03 |0018: move-result-object v3
+00601a: 6e30 b800 8309 |0019: invoke-virtual {v3, v8, v9}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+006020: 0c03 |001c: move-result-object v3
+006022: 1a04 0400 |001d: const-string v4, " = " // string@0004
+006026: 6e20 ba00 4300 |001f: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00602c: 0c03 |0022: move-result-object v3
+00602e: 6e30 b800 0301 |0023: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+006034: 0c03 |0026: move-result-object v3
+006036: 6e10 bb00 0300 |0027: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00603c: 0c03 |002a: move-result-object v3
+00603e: 6e20 b100 3200 |002b: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006044: 3102 000a |002e: cmp-long v2, v0, v10
+006048: 3802 2400 |0030: if-eqz v2, 0054 // +0024
+00604c: 6202 1000 |0032: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006050: 2203 1700 |0034: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+006054: 7010 b400 0300 |0036: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00605a: 1a04 1300 |0039: const-string v4, "Failed " // string@0013
+00605e: 6e20 ba00 4300 |003b: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006064: 0c03 |003e: move-result-object v3
+006066: 6e30 b800 0301 |003f: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+00606c: 0c03 |0042: move-result-object v3
+00606e: 1a04 0100 |0043: const-string v4, " != " // string@0001
+006072: 6e20 ba00 4300 |0045: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006078: 0c03 |0048: move-result-object v3
+00607a: 6e30 b800 a30b |0049: invoke-virtual {v3, v10, v11}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+006080: 0c03 |004c: move-result-object v3
+006082: 6e10 bb00 0300 |004d: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+006088: 0c03 |0050: move-result-object v3
+00608a: 6e20 b100 3200 |0051: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006090: 1000 |0054: return-wide v0
+ catches : (none)
+ positions :
+ 0x0000 line=77
+ 0x0002 line=78
+ 0x002e line=79
+ 0x0032 line=80
+ 0x0054 line=82
+ locals :
+ 0x0000 - 0x0055 reg=6 (null) J
+ 0x0000 - 0x0055 reg=8 (null) J
+ 0x0000 - 0x0055 reg=10 (null) J
+
+ #14 : (in Linvokecustom/InvokeCustom5;)
+ name : 'targetMethodTest7'
+ type : '(FFD)D'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 10
+ ins : 4
+ outs : 3
+ insns size : 86 16-bit code units
+006094: |[006094] invokecustom.InvokeCustom5.targetMethodTest7:(FFD)D
+0060a4: a800 0607 |0000: mul-float v0, v6, v7
+0060a8: 8900 |0002: float-to-double v0, v0
+0060aa: 6202 1000 |0003: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0060ae: 2203 1700 |0005: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+0060b2: 7010 b400 0300 |0007: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0060b8: 1a04 7e00 |000a: const-string v4, "targetMethodTest7 " // string@007e
+0060bc: 6e20 ba00 4300 |000c: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0060c2: 0c03 |000f: move-result-object v3
+0060c4: 6e20 b600 6300 |0010: invoke-virtual {v3, v6}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+0060ca: 0c03 |0013: move-result-object v3
+0060cc: 1a04 0200 |0014: const-string v4, " * " // string@0002
+0060d0: 6e20 ba00 4300 |0016: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0060d6: 0c03 |0019: move-result-object v3
+0060d8: 6e20 b600 7300 |001a: invoke-virtual {v3, v7}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+0060de: 0c03 |001d: move-result-object v3
+0060e0: 1a04 0400 |001e: const-string v4, " = " // string@0004
+0060e4: 6e20 ba00 4300 |0020: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0060ea: 0c03 |0023: move-result-object v3
+0060ec: 6e30 b500 0301 |0024: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+0060f2: 0c03 |0027: move-result-object v3
+0060f4: 6e10 bb00 0300 |0028: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0060fa: 0c03 |002b: move-result-object v3
+0060fc: 6e20 b100 3200 |002c: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006102: 2f02 0008 |002f: cmpl-double v2, v0, v8
+006106: 3802 2400 |0031: if-eqz v2, 0055 // +0024
+00610a: 6202 1000 |0033: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00610e: 2203 1700 |0035: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+006112: 7010 b400 0300 |0037: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+006118: 1a04 1300 |003a: const-string v4, "Failed " // string@0013
+00611c: 6e20 ba00 4300 |003c: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006122: 0c03 |003f: move-result-object v3
+006124: 6e30 b500 0301 |0040: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+00612a: 0c03 |0043: move-result-object v3
+00612c: 1a04 0100 |0044: const-string v4, " != " // string@0001
+006130: 6e20 ba00 4300 |0046: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006136: 0c03 |0049: move-result-object v3
+006138: 6e30 b500 8309 |004a: invoke-virtual {v3, v8, v9}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+00613e: 0c03 |004d: move-result-object v3
+006140: 6e10 bb00 0300 |004e: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+006146: 0c03 |0051: move-result-object v3
+006148: 6e20 b100 3200 |0052: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00614e: 1000 |0055: return-wide v0
+ catches : (none)
+ positions :
+ 0x0000 line=86
+ 0x0003 line=87
+ 0x002f line=88
+ 0x0033 line=89
+ 0x0055 line=91
+ locals :
+ 0x0000 - 0x0056 reg=6 (null) F
+ 0x0000 - 0x0056 reg=7 (null) F
+ 0x0000 - 0x0056 reg=8 (null) D
+
+ #15 : (in Linvokecustom/InvokeCustom5;)
+ name : 'targetMethodTest8'
+ type : '(Ljava/lang/String;)V'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 4
+ ins : 1
+ outs : 2
+ insns size : 25 16-bit code units
+006150: |[006150] invokecustom.InvokeCustom5.targetMethodTest8:(Ljava/lang/String;)V
+006160: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006164: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+006168: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00616e: 1a02 8000 |0007: const-string v2, "targetMethodTest8 " // string@0080
+006172: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006178: 0c01 |000c: move-result-object v1
+00617a: 6e20 ba00 3100 |000d: invoke-virtual {v1, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006180: 0c01 |0010: move-result-object v1
+006182: 6e10 bb00 0100 |0011: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+006188: 0c01 |0014: move-result-object v1
+00618a: 6e20 b100 1000 |0015: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006190: 0e00 |0018: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=95
+ 0x0018 line=96
+ locals :
+ 0x0000 - 0x0019 reg=3 (null) Ljava/lang/String;
+
+ #16 : (in Linvokecustom/InvokeCustom5;)
+ name : 'targetMethodTest9'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+006194: |[006194] invokecustom.InvokeCustom5.targetMethodTest9:()V
+0061a4: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0061a8: 1a01 8200 |0002: const-string v1, "targetMethodTest9()" // string@0082
+0061ac: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0061b2: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=129
+ 0x0007 line=130
+ locals :
+
+ #17 : (in Linvokecustom/InvokeCustom5;)
+ name : 'test5'
+ type : '()V'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 4
+ ins : 0
+ outs : 3
+ insns size : 35 16-bit code units
+0061b4: |[0061b4] invokecustom.InvokeCustom5.test5:()V
+0061c4: 1300 e803 |0000: const/16 v0, #int 1000 // #3e8
+0061c8: 1301 65fc |0002: const/16 v1, #int -923 // #fc65
+0061cc: 1302 4d00 |0004: const/16 v2, #int 77 // #4d
+0061d0: fc30 0300 1002 |0006: invoke-custom {v0, v1, v2}, call_site@0003
+0061d6: 0a00 |0009: move-result v0
+0061d8: 6201 1000 |000a: sget-object v1, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0061dc: 2202 1700 |000c: new-instance v2, Ljava/lang/StringBuilder; // type@0017
+0061e0: 7010 b400 0200 |000e: invoke-direct {v2}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0061e6: 1a03 7900 |0011: const-string v3, "targetMethodTest5 returned: " // string@0079
+0061ea: 6e20 ba00 3200 |0013: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0061f0: 0c02 |0016: move-result-object v2
+0061f2: 6e20 b700 0200 |0017: invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+0061f8: 0c00 |001a: move-result-object v0
+0061fa: 6e10 bb00 0000 |001b: invoke-virtual {v0}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+006200: 0c00 |001e: move-result-object v0
+006202: 6e20 b100 0100 |001f: invoke-virtual {v1, v0}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006208: 0e00 |0022: return-void
+ catches : (none)
+ positions :
+ locals :
+
+ Virtual methods -
+ #0 : (in Linvokecustom/InvokeCustom5;)
+ name : 'helperMethodTest9'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 4
+ ins : 1
+ outs : 2
+ insns size : 27 16-bit code units
+00620c: |[00620c] invokecustom.InvokeCustom5.helperMethodTest9:()V
+00621c: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006220: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+006224: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00622a: 1a02 6400 |0007: const-string v2, "helperMethodTest9 in " // string@0064
+00622e: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006234: 0c01 |000c: move-result-object v1
+006236: 1c02 0e00 |000d: const-class v2, Linvokecustom/InvokeCustom; // type@000e
+00623a: 6e20 b900 2100 |000f: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+006240: 0c01 |0012: move-result-object v1
+006242: 6e10 bb00 0100 |0013: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+006248: 0c01 |0016: move-result-object v1
+00624a: 6e20 b100 1000 |0017: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006250: 0e00 |001a: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=125
+ 0x001a line=126
+ locals :
+ 0x0000 - 0x001b reg=3 this Linvokecustom/InvokeCustom5;
+
+ #1 : (in Linvokecustom/InvokeCustom5;)
+ name : 'run'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 3
+ ins : 1
+ outs : 2
+ insns size : 8 16-bit code units
+006254: |[006254] invokecustom.InvokeCustom5.run:()V
+006264: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006268: 1a01 6e00 |0002: const-string v1, "run() for Test9" // string@006e
+00626c: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006272: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=133
+ 0x0007 line=134
+ locals :
+ 0x0000 - 0x0008 reg=2 this Linvokecustom/InvokeCustom5;
+
+ #2 : (in Linvokecustom/InvokeCustom5;)
+ name : 'targetMethodTest4'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 3
+ ins : 1
+ outs : 2
+ insns size : 8 16-bit code units
+006274: |[006274] invokecustom.InvokeCustom5.targetMethodTest4:()V
+006284: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006288: 1a01 7500 |0002: const-string v1, "targetMethodTest4 from InvokeCustom (oops!)" // string@0075
+00628c: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006292: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=64
+ 0x0007 line=65
+ locals :
+ 0x0000 - 0x0008 reg=2 this Linvokecustom/InvokeCustom5;
+
+ source_file_idx : 25 (InvokeCustom.java)
+
+Class #5 -
+ Class descriptor : 'Linvokecustom/InvokeCustom6;'
+ Access flags : 0x0001 (PUBLIC)
+ Superclass : 'Linvokecustom/Super;'
+ Interfaces -
+ #0 : 'Ljava/lang/Runnable;'
+ Static fields -
+ #0 : (in Linvokecustom/InvokeCustom6;)
+ name : 'staticFieldTest9'
+ type : 'I'
+ access : 0x000a (PRIVATE STATIC)
+ Instance fields -
+ #0 : (in Linvokecustom/InvokeCustom6;)
+ name : 'fieldTest9'
+ type : 'F'
+ access : 0x0002 (PRIVATE)
+ Direct methods -
+ #0 : (in Linvokecustom/InvokeCustom6;)
+ name : '<clinit>'
+ type : '()V'
+ access : 0x10008 (STATIC CONSTRUCTOR)
+ code -
+ registers : 1
+ ins : 0
+ outs : 0
+ insns size : 4 16-bit code units
+006294: |[006294] invokecustom.InvokeCustom6.<clinit>:()V
+0062a4: 1200 |0000: const/4 v0, #int 0 // #0
+0062a6: 6700 0f00 |0001: sput v0, Linvokecustom/InvokeCustom;.staticFieldTest9:I // field@000f
+0062aa: 0e00 |0003: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=98
+ locals :
+
+ #1 : (in Linvokecustom/InvokeCustom6;)
+ name : '<init>'
+ type : '()V'
+ access : 0x10001 (PUBLIC CONSTRUCTOR)
+ code -
+ registers : 2
+ ins : 1
+ outs : 1
+ insns size : 7 16-bit code units
+0062ac: |[0062ac] invokecustom.InvokeCustom6.<init>:()V
+0062bc: 7010 a800 0100 |0000: invoke-direct {v1}, Linvokecustom/Super;.<init>:()V // method@00a8
+0062c2: 1200 |0003: const/4 v0, #int 0 // #0
+0062c4: 5910 0e00 |0004: iput v0, v1, Linvokecustom/InvokeCustom;.fieldTest9:F // field@000e
+0062c8: 0e00 |0006: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=35
+ 0x0003 line=111
+ 0x0006 line=35
+ locals :
+ 0x0000 - 0x0007 reg=1 this Linvokecustom/InvokeCustom6;
+
+ #2 : (in Linvokecustom/InvokeCustom6;)
+ name : '<init>'
+ type : '(I)V'
+ access : 0x10001 (PUBLIC CONSTRUCTOR)
+ code -
+ registers : 5
+ ins : 2
+ outs : 2
+ insns size : 37 16-bit code units
+0062cc: |[0062cc] invokecustom.InvokeCustom6.<init>:(I)V
+0062dc: 7010 a800 0300 |0000: invoke-direct {v3}, Linvokecustom/Super;.<init>:()V // method@00a8
+0062e2: 1200 |0003: const/4 v0, #int 0 // #0
+0062e4: 5930 0e00 |0004: iput v0, v3, Linvokecustom/InvokeCustom;.fieldTest9:F // field@000e
+0062e8: 6200 1000 |0006: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0062ec: 2201 1700 |0008: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+0062f0: 7010 b400 0100 |000a: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0062f6: 1a02 1800 |000d: const-string v2, "InvokeCustom.<init>(" // string@0018
+0062fa: 6e20 ba00 2100 |000f: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006300: 0c01 |0012: move-result-object v1
+006302: 6e20 b700 4100 |0013: invoke-virtual {v1, v4}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+006308: 0c01 |0016: move-result-object v1
+00630a: 1a02 0700 |0017: const-string v2, ")" // string@0007
+00630e: 6e20 ba00 2100 |0019: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006314: 0c01 |001c: move-result-object v1
+006316: 6e10 bb00 0100 |001d: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00631c: 0c01 |0020: move-result-object v1
+00631e: 6e20 b100 1000 |0021: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006324: 0e00 |0024: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=36
+ 0x0003 line=111
+ 0x0006 line=37
+ 0x0024 line=38
+ locals :
+ 0x0000 - 0x0025 reg=3 this Linvokecustom/InvokeCustom6;
+ 0x0000 - 0x0025 reg=4 (null) I
+
+ #3 : (in Linvokecustom/InvokeCustom6;)
+ name : 'bsmCreateCallSite'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 7
+ ins : 4
+ outs : 2
+ insns size : 36 16-bit code units
+006328: |[006328] invokecustom.InvokeCustom6.bsmCreateCallSite:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+006338: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00633c: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+006340: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+006346: 1a02 5600 |0007: const-string v2, "bsmCreateCallSite [" // string@0056
+00634a: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006350: 0c01 |000c: move-result-object v1
+006352: 6e20 b900 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+006358: 0c01 |0010: move-result-object v1
+00635a: 1a02 5200 |0011: const-string v2, "]" // string@0052
+00635e: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006364: 0c01 |0016: move-result-object v1
+006366: 6e10 bb00 0100 |0017: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00636c: 0c01 |001a: move-result-object v1
+00636e: 6e20 b100 1000 |001b: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006374: 2200 1b00 |001e: new-instance v0, Ljava/lang/invoke/ConstantCallSite; // type@001b
+006378: 7020 bc00 6000 |0020: invoke-direct {v0, v6}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+00637e: 1100 |0023: return-object v0
+ catches : (none)
+ positions :
+ 0x0000 line=156
+ 0x001e line=157
+ locals :
+ 0x0000 - 0x0024 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0024 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0024 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0024 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+
+ #4 : (in Linvokecustom/InvokeCustom6;)
+ name : 'bsmLookupStatic'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 5
+ ins : 3
+ outs : 4
+ insns size : 29 16-bit code units
+006380: |[006380] invokecustom.InvokeCustom6.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
+006390: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006394: 1a01 5800 |0002: const-string v1, "bsmLookupStatic []" // string@0058
+006398: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00639e: 7100 c900 0000 |0007: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+0063a4: 0c00 |000a: move-result-object v0
+0063a6: 6e10 c800 0000 |000b: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+0063ac: 0c01 |000e: move-result-object v1
+0063ae: 6e40 c700 1043 |000f: invoke-virtual {v0, v1, v3, v4}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+0063b4: 0c00 |0012: move-result-object v0
+0063b6: 2201 1b00 |0013: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+0063ba: 6e20 bd00 4000 |0015: invoke-virtual {v0, v4}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+0063c0: 0c00 |0018: move-result-object v0
+0063c2: 7020 bc00 0100 |0019: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+0063c8: 1101 |001c: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=138
+ 0x0007 line=139
+ 0x000b line=140
+ 0x0013 line=141
+ locals :
+ 0x0000 - 0x001d reg=2 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x001d reg=3 (null) Ljava/lang/String;
+ 0x0000 - 0x001d reg=4 (null) Ljava/lang/invoke/MethodType;
+
+ #5 : (in Linvokecustom/InvokeCustom6;)
+ name : 'bsmLookupStaticWithExtraArgs'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 12
+ ins : 9
+ outs : 4
+ insns size : 82 16-bit code units
+0063cc: |[0063cc] invokecustom.InvokeCustom6.bsmLookupStaticWithExtraArgs:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;
+0063dc: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0063e0: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+0063e4: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0063ea: 1a02 5a00 |0007: const-string v2, "bsmLookupStaticWithExtraArgs [" // string@005a
+0063ee: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0063f4: 0c01 |000c: move-result-object v1
+0063f6: 6e20 b700 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+0063fc: 0c01 |0010: move-result-object v1
+0063fe: 1a02 0800 |0011: const-string v2, ", " // string@0008
+006402: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006408: 0c01 |0016: move-result-object v1
+00640a: 6e30 b800 7108 |0017: invoke-virtual {v1, v7, v8}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+006410: 0c01 |001a: move-result-object v1
+006412: 1a02 0800 |001b: const-string v2, ", " // string@0008
+006416: 6e20 ba00 2100 |001d: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00641c: 0c01 |0020: move-result-object v1
+00641e: 6e20 b600 9100 |0021: invoke-virtual {v1, v9}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+006424: 0c01 |0024: move-result-object v1
+006426: 1a02 0800 |0025: const-string v2, ", " // string@0008
+00642a: 6e20 ba00 2100 |0027: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006430: 0c01 |002a: move-result-object v1
+006432: 6e30 b500 a10b |002b: invoke-virtual {v1, v10, v11}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+006438: 0c01 |002e: move-result-object v1
+00643a: 1a02 5200 |002f: const-string v2, "]" // string@0052
+00643e: 6e20 ba00 2100 |0031: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006444: 0c01 |0034: move-result-object v1
+006446: 6e10 bb00 0100 |0035: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00644c: 0c01 |0038: move-result-object v1
+00644e: 6e20 b100 1000 |0039: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006454: 7100 c900 0000 |003c: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+00645a: 0c00 |003f: move-result-object v0
+00645c: 6e10 c800 0000 |0040: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+006462: 0c01 |0043: move-result-object v1
+006464: 6e40 c700 1054 |0044: invoke-virtual {v0, v1, v4, v5}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+00646a: 0c00 |0047: move-result-object v0
+00646c: 2201 1b00 |0048: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+006470: 6e20 bd00 5000 |004a: invoke-virtual {v0, v5}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+006476: 0c00 |004d: move-result-object v0
+006478: 7020 bc00 0100 |004e: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+00647e: 1101 |0051: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=147
+ 0x003c line=148
+ 0x0040 line=149
+ 0x0048 line=150
+ locals :
+ 0x0000 - 0x0052 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0052 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0052 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0052 reg=6 (null) I
+ 0x0000 - 0x0052 reg=7 (null) J
+ 0x0000 - 0x0052 reg=9 (null) F
+ 0x0000 - 0x0052 reg=10 (null) D
+
+ #6 : (in Linvokecustom/InvokeCustom6;)
+ name : 'bsmLookupTest9'
+ type : '(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;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 13
+ ins : 10
+ outs : 4
+ insns size : 135 16-bit code units
+006480: |[006480] invokecustom.InvokeCustom6.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;
+006490: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006494: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+006498: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00649e: 1a02 5c00 |0007: const-string v2, "bsmLookupTest9 [" // string@005c
+0064a2: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0064a8: 0c01 |000c: move-result-object v1
+0064aa: 6e20 b900 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+0064b0: 0c01 |0010: move-result-object v1
+0064b2: 1a02 0800 |0011: const-string v2, ", " // string@0008
+0064b6: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0064bc: 0c01 |0016: move-result-object v1
+0064be: 6e20 b900 7100 |0017: invoke-virtual {v1, v7}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+0064c4: 0c01 |001a: move-result-object v1
+0064c6: 1a02 0800 |001b: const-string v2, ", " // string@0008
+0064ca: 6e20 ba00 2100 |001d: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0064d0: 0c01 |0020: move-result-object v1
+0064d2: 6e20 b900 8100 |0021: invoke-virtual {v1, v8}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+0064d8: 0c01 |0024: move-result-object v1
+0064da: 1a02 0800 |0025: const-string v2, ", " // string@0008
+0064de: 6e20 ba00 2100 |0027: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0064e4: 0c01 |002a: move-result-object v1
+0064e6: 6e20 b900 9100 |002b: invoke-virtual {v1, v9}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+0064ec: 0c01 |002e: move-result-object v1
+0064ee: 1a02 5200 |002f: const-string v2, "]" // string@0052
+0064f2: 6e20 ba00 2100 |0031: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0064f8: 0c01 |0034: move-result-object v1
+0064fa: 6e10 bb00 0100 |0035: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+006500: 0c01 |0038: move-result-object v1
+006502: 6e20 b100 1000 |0039: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006508: 6200 1000 |003c: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00650c: 2201 1700 |003e: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+006510: 7010 b400 0100 |0040: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+006516: 6e20 ba00 4100 |0043: invoke-virtual {v1, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00651c: 0c01 |0046: move-result-object v1
+00651e: 1a02 0000 |0047: const-string v2, " " // string@0000
+006522: 6e20 ba00 2100 |0049: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006528: 0c01 |004c: move-result-object v1
+00652a: 6e20 b900 5100 |004d: invoke-virtual {v1, v5}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+006530: 0c01 |0050: move-result-object v1
+006532: 6e10 bb00 0100 |0051: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+006538: 0c01 |0054: move-result-object v1
+00653a: 6e20 b100 1000 |0055: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006540: 7120 9b00 7600 |0058: invoke-static {v6, v7}, Linvokecustom/InvokeCustom;.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V // method@009b
+006546: 2200 0e00 |005b: new-instance v0, Linvokecustom/InvokeCustom; // type@000e
+00654a: 7010 9400 0000 |005d: invoke-direct {v0}, Linvokecustom/InvokeCustom;.<init>:()V // method@0094
+006550: 6f30 9a00 8009 |0060: invoke-super {v0, v8, v9}, Linvokecustom/InvokeCustom;.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V // method@009a
+006556: fa20 c300 0a00 1c00 |0063: invoke-polymorphic {v10, v0}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)V // method@00c3, proto@001c
+00655e: 1230 |0067: const/4 v0, #int 3 // #3
+006560: fa20 c300 0b00 0500 |0068: invoke-polymorphic {v11, v0}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (I)Linvokecustom/InvokeCustom; // method@00c3, proto@0005
+006568: 0c00 |006c: move-result-object v0
+00656a: fa20 be00 0c00 1c00 |006d: invoke-polymorphic {v12, v0}, Ljava/lang/invoke/MethodHandle;.invoke:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)V // method@00be, proto@001c
+006572: 7100 c900 0000 |0071: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+006578: 0c00 |0074: move-result-object v0
+00657a: 6e10 c800 0000 |0075: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+006580: 0c01 |0078: move-result-object v1
+006582: 6e40 c700 1054 |0079: invoke-virtual {v0, v1, v4, v5}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+006588: 0c00 |007c: move-result-object v0
+00658a: 2201 1b00 |007d: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+00658e: 6e20 bd00 5000 |007f: invoke-virtual {v0, v5}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+006594: 0c00 |0082: move-result-object v0
+006596: 7020 bc00 0100 |0083: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+00659c: 1101 |0086: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=166
+ 0x003c line=168
+ 0x0058 line=171
+ 0x005b line=172
+ 0x0060 line=173
+ 0x0063 line=176
+ 0x0067 line=178
+ 0x006d line=179
+ 0x0071 line=181
+ 0x0075 line=182
+ 0x007d line=183
+ locals :
+ 0x0000 - 0x0087 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0087 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0087 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0087 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=8 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=9 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=10 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=11 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=12 (null) Ljava/lang/invoke/MethodHandle;
+
+ #7 : (in Linvokecustom/InvokeCustom6;)
+ name : 'checkFieldTest9'
+ type : '(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V'
+ access : 0x0002 (PRIVATE)
+ code -
+ registers : 9
+ ins : 3
+ outs : 3
+ insns size : 82 16-bit code units
+0065a0: |[0065a0] invokecustom.InvokeCustom6.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+0065b0: 1405 0ff0 6a20 |0000: const v5, #float 1.99e-19 // #206af00f
+0065b6: fa20 c300 6700 0100 |0003: invoke-polymorphic {v7, v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)F // method@00c3, proto@0001
+0065be: 0a00 |0007: move-result v0
+0065c0: fa30 c300 6805 1d00 |0008: invoke-polymorphic {v8, v6, v5}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;F)V // method@00c3, proto@001d
+0065c8: fa20 c300 6700 0100 |000c: invoke-polymorphic {v7, v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)F // method@00c3, proto@0001
+0065d0: 0a01 |0010: move-result v1
+0065d2: 6202 1000 |0011: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0065d6: 2203 1700 |0013: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+0065da: 7010 b400 0300 |0015: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0065e0: 1a04 5e00 |0018: const-string v4, "checkFieldTest9: old " // string@005e
+0065e4: 6e20 ba00 4300 |001a: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0065ea: 0c03 |001d: move-result-object v3
+0065ec: 6e20 b600 0300 |001e: invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+0065f2: 0c00 |0021: move-result-object v0
+0065f4: 1a03 0600 |0022: const-string v3, " new " // string@0006
+0065f8: 6e20 ba00 3000 |0024: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0065fe: 0c00 |0027: move-result-object v0
+006600: 6e20 b600 1000 |0028: invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+006606: 0c00 |002b: move-result-object v0
+006608: 1a03 0500 |002c: const-string v3, " expected " // string@0005
+00660c: 6e20 ba00 3000 |002e: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006612: 0c00 |0031: move-result-object v0
+006614: 6e20 b600 5000 |0032: invoke-virtual {v0, v5}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+00661a: 0c00 |0035: move-result-object v0
+00661c: 1a03 0000 |0036: const-string v3, " " // string@0000
+006620: 6e20 ba00 3000 |0038: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006626: 0c00 |003b: move-result-object v0
+006628: 6e10 bb00 0000 |003c: invoke-virtual {v0}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00662e: 0c00 |003f: move-result-object v0
+006630: 6e20 ab00 0200 |0040: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.print:(Ljava/lang/String;)V // method@00ab
+006636: 6202 1000 |0043: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00663a: 2d00 0105 |0045: cmpl-float v0, v1, v5
+00663e: 3900 0800 |0047: if-nez v0, 004f // +0008
+006642: 1a00 4000 |0049: const-string v0, "OK" // string@0040
+006646: 6e20 b100 0200 |004b: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00664c: 0e00 |004e: return-void
+00664e: 1a00 1000 |004f: const-string v0, "ERROR" // string@0010
+006652: 28fa |0051: goto 004b // -0006
+ catches : (none)
+ positions :
+ 0x0003 line=116
+ 0x0008 line=117
+ 0x000c line=118
+ 0x0011 line=119
+ 0x0043 line=121
+ 0x004e line=122
+ 0x004f line=121
+ locals :
+ 0x0000 - 0x0052 reg=6 this Linvokecustom/InvokeCustom6;
+ 0x0000 - 0x0052 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0052 reg=8 (null) Ljava/lang/invoke/MethodHandle;
+
+ #8 : (in Linvokecustom/InvokeCustom6;)
+ name : 'checkStaticFieldTest9'
+ type : '(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 8
+ ins : 2
+ outs : 2
+ insns size : 80 16-bit code units
+006654: |[006654] invokecustom.InvokeCustom6.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+006664: 1405 1032 5476 |0000: const v5, #float 1.07596e+33 // #76543210
+00666a: fa10 c300 0600 0200 |0003: invoke-polymorphic {v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, ()I // method@00c3, proto@0002
+006672: 0a00 |0007: move-result v0
+006674: fa20 c300 5700 1a00 |0008: invoke-polymorphic {v7, v5}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (I)V // method@00c3, proto@001a
+00667c: fa10 c300 0600 0200 |000c: invoke-polymorphic {v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, ()I // method@00c3, proto@0002
+006684: 0a01 |0010: move-result v1
+006686: 6202 1000 |0011: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00668a: 2203 1700 |0013: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+00668e: 7010 b400 0300 |0015: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+006694: 1a04 6000 |0018: const-string v4, "checkStaticFieldTest9: old " // string@0060
+006698: 6e20 ba00 4300 |001a: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00669e: 0c03 |001d: move-result-object v3
+0066a0: 6e20 b700 0300 |001e: invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+0066a6: 0c00 |0021: move-result-object v0
+0066a8: 1a03 0600 |0022: const-string v3, " new " // string@0006
+0066ac: 6e20 ba00 3000 |0024: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0066b2: 0c00 |0027: move-result-object v0
+0066b4: 6e20 b700 1000 |0028: invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+0066ba: 0c00 |002b: move-result-object v0
+0066bc: 1a03 0500 |002c: const-string v3, " expected " // string@0005
+0066c0: 6e20 ba00 3000 |002e: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0066c6: 0c00 |0031: move-result-object v0
+0066c8: 6e20 b700 5000 |0032: invoke-virtual {v0, v5}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+0066ce: 0c00 |0035: move-result-object v0
+0066d0: 1a03 0000 |0036: const-string v3, " " // string@0000
+0066d4: 6e20 ba00 3000 |0038: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0066da: 0c00 |003b: move-result-object v0
+0066dc: 6e10 bb00 0000 |003c: invoke-virtual {v0}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0066e2: 0c00 |003f: move-result-object v0
+0066e4: 6e20 ab00 0200 |0040: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.print:(Ljava/lang/String;)V // method@00ab
+0066ea: 6202 1000 |0043: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0066ee: 3351 0800 |0045: if-ne v1, v5, 004d // +0008
+0066f2: 1a00 4000 |0047: const-string v0, "OK" // string@0040
+0066f6: 6e20 b100 0200 |0049: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0066fc: 0e00 |004c: return-void
+0066fe: 1a00 1000 |004d: const-string v0, "ERROR" // string@0010
+006702: 28fa |004f: goto 0049 // -0006
+ catches : (none)
+ positions :
+ 0x0003 line=103
+ 0x0008 line=104
+ 0x000c line=105
+ 0x0011 line=106
+ 0x0043 line=108
+ 0x004c line=109
+ 0x004d line=108
+ locals :
+ 0x0000 - 0x0050 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0050 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+
+ #9 : (in Linvokecustom/InvokeCustom6;)
+ name : 'targetMethodTest1'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+006704: |[006704] invokecustom.InvokeCustom6.targetMethodTest1:()V
+006714: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006718: 1a01 1500 |0002: const-string v1, "Hello World!" // string@0015
+00671c: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006722: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=41
+ 0x0007 line=42
+ locals :
+
+ #10 : (in Linvokecustom/InvokeCustom6;)
+ name : 'targetMethodTest2'
+ type : '(ZBCSIFJDLjava/lang/String;)V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 13
+ ins : 11
+ outs : 3
+ insns size : 46 16-bit code units
+006724: |[006724] invokecustom.InvokeCustom6.targetMethodTest2:(ZBCSIFJDLjava/lang/String;)V
+006734: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006738: 6e20 b200 2000 |0002: invoke-virtual {v0, v2}, Ljava/io/PrintStream;.println:(Z)V // method@00b2
+00673e: 6200 1000 |0005: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006742: 6e20 af00 3000 |0007: invoke-virtual {v0, v3}, Ljava/io/PrintStream;.println:(I)V // method@00af
+006748: 6200 1000 |000a: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00674c: 6e20 ac00 4000 |000c: invoke-virtual {v0, v4}, Ljava/io/PrintStream;.println:(C)V // method@00ac
+006752: 6200 1000 |000f: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006756: 6e20 af00 5000 |0011: invoke-virtual {v0, v5}, Ljava/io/PrintStream;.println:(I)V // method@00af
+00675c: 6200 1000 |0014: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006760: 6e20 af00 6000 |0016: invoke-virtual {v0, v6}, Ljava/io/PrintStream;.println:(I)V // method@00af
+006766: 6200 1000 |0019: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00676a: 6e20 ae00 7000 |001b: invoke-virtual {v0, v7}, Ljava/io/PrintStream;.println:(F)V // method@00ae
+006770: 6200 1000 |001e: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006774: 6e30 b000 8009 |0020: invoke-virtual {v0, v8, v9}, Ljava/io/PrintStream;.println:(J)V // method@00b0
+00677a: 6200 1000 |0023: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00677e: 6e30 ad00 a00b |0025: invoke-virtual {v0, v10, v11}, Ljava/io/PrintStream;.println:(D)V // method@00ad
+006784: 6200 1000 |0028: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006788: 6e20 b100 c000 |002a: invoke-virtual {v0, v12}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00678e: 0e00 |002d: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=46
+ 0x0005 line=47
+ 0x000a line=48
+ 0x000f line=49
+ 0x0014 line=50
+ 0x0019 line=51
+ 0x001e line=52
+ 0x0023 line=53
+ 0x0028 line=54
+ 0x002d line=55
+ locals :
+ 0x0000 - 0x002e reg=2 (null) Z
+ 0x0000 - 0x002e reg=3 (null) B
+ 0x0000 - 0x002e reg=4 (null) C
+ 0x0000 - 0x002e reg=5 (null) S
+ 0x0000 - 0x002e reg=6 (null) I
+ 0x0000 - 0x002e reg=7 (null) F
+ 0x0000 - 0x002e reg=8 (null) J
+ 0x0000 - 0x002e reg=10 (null) D
+ 0x0000 - 0x002e reg=12 (null) Ljava/lang/String;
+
+ #11 : (in Linvokecustom/InvokeCustom6;)
+ name : 'targetMethodTest3'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+006790: |[006790] invokecustom.InvokeCustom6.targetMethodTest3:()V
+0067a0: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0067a4: 1a01 7300 |0002: const-string v1, "targetMethodTest3 from InvokeCustom" // string@0073
+0067a8: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0067ae: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=58
+ 0x0007 line=59
+ locals :
+
+ #12 : (in Linvokecustom/InvokeCustom6;)
+ name : 'targetMethodTest5'
+ type : '(III)I'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 7
+ ins : 3
+ outs : 2
+ insns size : 83 16-bit code units
+0067b0: |[0067b0] invokecustom.InvokeCustom6.targetMethodTest5:(III)I
+0067c0: 9000 0405 |0000: add-int v0, v4, v5
+0067c4: 6201 1000 |0002: sget-object v1, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0067c8: 2202 1700 |0004: new-instance v2, Ljava/lang/StringBuilder; // type@0017
+0067cc: 7010 b400 0200 |0006: invoke-direct {v2}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0067d2: 1a03 7800 |0009: const-string v3, "targetMethodTest5 " // string@0078
+0067d6: 6e20 ba00 3200 |000b: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0067dc: 0c02 |000e: move-result-object v2
+0067de: 6e20 b700 4200 |000f: invoke-virtual {v2, v4}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+0067e4: 0c02 |0012: move-result-object v2
+0067e6: 1a03 0300 |0013: const-string v3, " + " // string@0003
+0067ea: 6e20 ba00 3200 |0015: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0067f0: 0c02 |0018: move-result-object v2
+0067f2: 6e20 b700 5200 |0019: invoke-virtual {v2, v5}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+0067f8: 0c02 |001c: move-result-object v2
+0067fa: 1a03 0400 |001d: const-string v3, " = " // string@0004
+0067fe: 6e20 ba00 3200 |001f: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006804: 0c02 |0022: move-result-object v2
+006806: 6e20 b700 0200 |0023: invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+00680c: 0c02 |0026: move-result-object v2
+00680e: 6e10 bb00 0200 |0027: invoke-virtual {v2}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+006814: 0c02 |002a: move-result-object v2
+006816: 6e20 b100 2100 |002b: invoke-virtual {v1, v2}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00681c: 3260 2400 |002e: if-eq v0, v6, 0052 // +0024
+006820: 6201 1000 |0030: sget-object v1, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006824: 2202 1700 |0032: new-instance v2, Ljava/lang/StringBuilder; // type@0017
+006828: 7010 b400 0200 |0034: invoke-direct {v2}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00682e: 1a03 1300 |0037: const-string v3, "Failed " // string@0013
+006832: 6e20 ba00 3200 |0039: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006838: 0c02 |003c: move-result-object v2
+00683a: 6e20 b700 0200 |003d: invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+006840: 0c02 |0040: move-result-object v2
+006842: 1a03 0100 |0041: const-string v3, " != " // string@0001
+006846: 6e20 ba00 3200 |0043: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00684c: 0c02 |0046: move-result-object v2
+00684e: 6e20 b700 6200 |0047: invoke-virtual {v2, v6}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+006854: 0c02 |004a: move-result-object v2
+006856: 6e10 bb00 0200 |004b: invoke-virtual {v2}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00685c: 0c02 |004e: move-result-object v2
+00685e: 6e20 b100 2100 |004f: invoke-virtual {v1, v2}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006864: 0f00 |0052: return v0
+ catches : (none)
+ positions :
+ 0x0000 line=68
+ 0x0002 line=69
+ 0x002e line=70
+ 0x0030 line=71
+ 0x0052 line=73
+ locals :
+ 0x0000 - 0x0053 reg=4 (null) I
+ 0x0000 - 0x0053 reg=5 (null) I
+ 0x0000 - 0x0053 reg=6 (null) I
+
+ #13 : (in Linvokecustom/InvokeCustom6;)
+ name : 'targetMethodTest6'
+ type : '(JJJ)J'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 12
+ ins : 6
+ outs : 3
+ insns size : 85 16-bit code units
+006868: |[006868] invokecustom.InvokeCustom6.targetMethodTest6:(JJJ)J
+006878: 9b00 0608 |0000: add-long v0, v6, v8
+00687c: 6202 1000 |0002: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006880: 2203 1700 |0004: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+006884: 7010 b400 0300 |0006: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00688a: 1a04 7b00 |0009: const-string v4, "targetMethodTest6 " // string@007b
+00688e: 6e20 ba00 4300 |000b: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006894: 0c03 |000e: move-result-object v3
+006896: 6e30 b800 6307 |000f: invoke-virtual {v3, v6, v7}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+00689c: 0c03 |0012: move-result-object v3
+00689e: 1a04 0300 |0013: const-string v4, " + " // string@0003
+0068a2: 6e20 ba00 4300 |0015: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0068a8: 0c03 |0018: move-result-object v3
+0068aa: 6e30 b800 8309 |0019: invoke-virtual {v3, v8, v9}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+0068b0: 0c03 |001c: move-result-object v3
+0068b2: 1a04 0400 |001d: const-string v4, " = " // string@0004
+0068b6: 6e20 ba00 4300 |001f: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0068bc: 0c03 |0022: move-result-object v3
+0068be: 6e30 b800 0301 |0023: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+0068c4: 0c03 |0026: move-result-object v3
+0068c6: 6e10 bb00 0300 |0027: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0068cc: 0c03 |002a: move-result-object v3
+0068ce: 6e20 b100 3200 |002b: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0068d4: 3102 000a |002e: cmp-long v2, v0, v10
+0068d8: 3802 2400 |0030: if-eqz v2, 0054 // +0024
+0068dc: 6202 1000 |0032: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0068e0: 2203 1700 |0034: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+0068e4: 7010 b400 0300 |0036: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0068ea: 1a04 1300 |0039: const-string v4, "Failed " // string@0013
+0068ee: 6e20 ba00 4300 |003b: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0068f4: 0c03 |003e: move-result-object v3
+0068f6: 6e30 b800 0301 |003f: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+0068fc: 0c03 |0042: move-result-object v3
+0068fe: 1a04 0100 |0043: const-string v4, " != " // string@0001
+006902: 6e20 ba00 4300 |0045: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006908: 0c03 |0048: move-result-object v3
+00690a: 6e30 b800 a30b |0049: invoke-virtual {v3, v10, v11}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+006910: 0c03 |004c: move-result-object v3
+006912: 6e10 bb00 0300 |004d: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+006918: 0c03 |0050: move-result-object v3
+00691a: 6e20 b100 3200 |0051: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006920: 1000 |0054: return-wide v0
+ catches : (none)
+ positions :
+ 0x0000 line=77
+ 0x0002 line=78
+ 0x002e line=79
+ 0x0032 line=80
+ 0x0054 line=82
+ locals :
+ 0x0000 - 0x0055 reg=6 (null) J
+ 0x0000 - 0x0055 reg=8 (null) J
+ 0x0000 - 0x0055 reg=10 (null) J
+
+ #14 : (in Linvokecustom/InvokeCustom6;)
+ name : 'targetMethodTest7'
+ type : '(FFD)D'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 10
+ ins : 4
+ outs : 3
+ insns size : 86 16-bit code units
+006924: |[006924] invokecustom.InvokeCustom6.targetMethodTest7:(FFD)D
+006934: a800 0607 |0000: mul-float v0, v6, v7
+006938: 8900 |0002: float-to-double v0, v0
+00693a: 6202 1000 |0003: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00693e: 2203 1700 |0005: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+006942: 7010 b400 0300 |0007: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+006948: 1a04 7e00 |000a: const-string v4, "targetMethodTest7 " // string@007e
+00694c: 6e20 ba00 4300 |000c: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006952: 0c03 |000f: move-result-object v3
+006954: 6e20 b600 6300 |0010: invoke-virtual {v3, v6}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+00695a: 0c03 |0013: move-result-object v3
+00695c: 1a04 0200 |0014: const-string v4, " * " // string@0002
+006960: 6e20 ba00 4300 |0016: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006966: 0c03 |0019: move-result-object v3
+006968: 6e20 b600 7300 |001a: invoke-virtual {v3, v7}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+00696e: 0c03 |001d: move-result-object v3
+006970: 1a04 0400 |001e: const-string v4, " = " // string@0004
+006974: 6e20 ba00 4300 |0020: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00697a: 0c03 |0023: move-result-object v3
+00697c: 6e30 b500 0301 |0024: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+006982: 0c03 |0027: move-result-object v3
+006984: 6e10 bb00 0300 |0028: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00698a: 0c03 |002b: move-result-object v3
+00698c: 6e20 b100 3200 |002c: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006992: 2f02 0008 |002f: cmpl-double v2, v0, v8
+006996: 3802 2400 |0031: if-eqz v2, 0055 // +0024
+00699a: 6202 1000 |0033: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00699e: 2203 1700 |0035: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+0069a2: 7010 b400 0300 |0037: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0069a8: 1a04 1300 |003a: const-string v4, "Failed " // string@0013
+0069ac: 6e20 ba00 4300 |003c: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0069b2: 0c03 |003f: move-result-object v3
+0069b4: 6e30 b500 0301 |0040: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+0069ba: 0c03 |0043: move-result-object v3
+0069bc: 1a04 0100 |0044: const-string v4, " != " // string@0001
+0069c0: 6e20 ba00 4300 |0046: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0069c6: 0c03 |0049: move-result-object v3
+0069c8: 6e30 b500 8309 |004a: invoke-virtual {v3, v8, v9}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+0069ce: 0c03 |004d: move-result-object v3
+0069d0: 6e10 bb00 0300 |004e: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0069d6: 0c03 |0051: move-result-object v3
+0069d8: 6e20 b100 3200 |0052: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0069de: 1000 |0055: return-wide v0
+ catches : (none)
+ positions :
+ 0x0000 line=86
+ 0x0003 line=87
+ 0x002f line=88
+ 0x0033 line=89
+ 0x0055 line=91
+ locals :
+ 0x0000 - 0x0056 reg=6 (null) F
+ 0x0000 - 0x0056 reg=7 (null) F
+ 0x0000 - 0x0056 reg=8 (null) D
+
+ #15 : (in Linvokecustom/InvokeCustom6;)
+ name : 'targetMethodTest8'
+ type : '(Ljava/lang/String;)V'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 4
+ ins : 1
+ outs : 2
+ insns size : 25 16-bit code units
+0069e0: |[0069e0] invokecustom.InvokeCustom6.targetMethodTest8:(Ljava/lang/String;)V
+0069f0: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0069f4: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+0069f8: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0069fe: 1a02 8000 |0007: const-string v2, "targetMethodTest8 " // string@0080
+006a02: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006a08: 0c01 |000c: move-result-object v1
+006a0a: 6e20 ba00 3100 |000d: invoke-virtual {v1, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006a10: 0c01 |0010: move-result-object v1
+006a12: 6e10 bb00 0100 |0011: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+006a18: 0c01 |0014: move-result-object v1
+006a1a: 6e20 b100 1000 |0015: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006a20: 0e00 |0018: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=95
+ 0x0018 line=96
+ locals :
+ 0x0000 - 0x0019 reg=3 (null) Ljava/lang/String;
+
+ #16 : (in Linvokecustom/InvokeCustom6;)
+ name : 'targetMethodTest9'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+006a24: |[006a24] invokecustom.InvokeCustom6.targetMethodTest9:()V
+006a34: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006a38: 1a01 8200 |0002: const-string v1, "targetMethodTest9()" // string@0082
+006a3c: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006a42: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=129
+ 0x0007 line=130
+ locals :
+
+ #17 : (in Linvokecustom/InvokeCustom6;)
+ name : 'test6'
+ type : '()V'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 6
+ ins : 0
+ outs : 6
+ insns size : 44 16-bit code units
+006a44: |[006a44] invokecustom.InvokeCustom6.test6:()V
+006a54: 1800 7777 7777 7707 0000 |0000: const-wide v0, #double 4.05612e-311 // #0000077777777777
+006a5e: 1802 efee eeee eefe ffff |0005: const-wide v2, #double -nan // #fffffeeeeeeeeeef
+006a68: 1804 6666 6666 6606 0000 |000a: const-wide v4, #double 3.47668e-311 // #0000066666666666
+006a72: fd06 0400 0000 |000f: invoke-custom/range {v0, v1, v2, v3, v4, v5}, call_site@0004
+006a78: 0b00 |0012: move-result-wide v0
+006a7a: 6202 1000 |0013: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006a7e: 2203 1700 |0015: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+006a82: 7010 b400 0300 |0017: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+006a88: 1a04 7c00 |001a: const-string v4, "targetMethodTest6 returned: " // string@007c
+006a8c: 6e20 ba00 4300 |001c: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006a92: 0c03 |001f: move-result-object v3
+006a94: 6e30 b800 0301 |0020: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+006a9a: 0c00 |0023: move-result-object v0
+006a9c: 6e10 bb00 0000 |0024: invoke-virtual {v0}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+006aa2: 0c00 |0027: move-result-object v0
+006aa4: 6e20 b100 0200 |0028: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006aaa: 0e00 |002b: return-void
+ catches : (none)
+ positions :
+ locals :
+
+ Virtual methods -
+ #0 : (in Linvokecustom/InvokeCustom6;)
+ name : 'helperMethodTest9'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 4
+ ins : 1
+ outs : 2
+ insns size : 27 16-bit code units
+006aac: |[006aac] invokecustom.InvokeCustom6.helperMethodTest9:()V
+006abc: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006ac0: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+006ac4: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+006aca: 1a02 6400 |0007: const-string v2, "helperMethodTest9 in " // string@0064
+006ace: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006ad4: 0c01 |000c: move-result-object v1
+006ad6: 1c02 0e00 |000d: const-class v2, Linvokecustom/InvokeCustom; // type@000e
+006ada: 6e20 b900 2100 |000f: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+006ae0: 0c01 |0012: move-result-object v1
+006ae2: 6e10 bb00 0100 |0013: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+006ae8: 0c01 |0016: move-result-object v1
+006aea: 6e20 b100 1000 |0017: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006af0: 0e00 |001a: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=125
+ 0x001a line=126
+ locals :
+ 0x0000 - 0x001b reg=3 this Linvokecustom/InvokeCustom6;
+
+ #1 : (in Linvokecustom/InvokeCustom6;)
+ name : 'run'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 3
+ ins : 1
+ outs : 2
+ insns size : 8 16-bit code units
+006af4: |[006af4] invokecustom.InvokeCustom6.run:()V
+006b04: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006b08: 1a01 6e00 |0002: const-string v1, "run() for Test9" // string@006e
+006b0c: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006b12: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=133
+ 0x0007 line=134
+ locals :
+ 0x0000 - 0x0008 reg=2 this Linvokecustom/InvokeCustom6;
+
+ #2 : (in Linvokecustom/InvokeCustom6;)
+ name : 'targetMethodTest4'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 3
+ ins : 1
+ outs : 2
+ insns size : 8 16-bit code units
+006b14: |[006b14] invokecustom.InvokeCustom6.targetMethodTest4:()V
+006b24: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006b28: 1a01 7500 |0002: const-string v1, "targetMethodTest4 from InvokeCustom (oops!)" // string@0075
+006b2c: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006b32: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=64
+ 0x0007 line=65
+ locals :
+ 0x0000 - 0x0008 reg=2 this Linvokecustom/InvokeCustom6;
+
+ source_file_idx : 25 (InvokeCustom.java)
+
+Class #6 -
+ Class descriptor : 'Linvokecustom/InvokeCustom7;'
+ Access flags : 0x0001 (PUBLIC)
+ Superclass : 'Linvokecustom/Super;'
+ Interfaces -
+ #0 : 'Ljava/lang/Runnable;'
+ Static fields -
+ #0 : (in Linvokecustom/InvokeCustom7;)
+ name : 'staticFieldTest9'
+ type : 'I'
+ access : 0x000a (PRIVATE STATIC)
+ Instance fields -
+ #0 : (in Linvokecustom/InvokeCustom7;)
+ name : 'fieldTest9'
+ type : 'F'
+ access : 0x0002 (PRIVATE)
+ Direct methods -
+ #0 : (in Linvokecustom/InvokeCustom7;)
+ name : '<clinit>'
+ type : '()V'
+ access : 0x10008 (STATIC CONSTRUCTOR)
+ code -
+ registers : 1
+ ins : 0
+ outs : 0
+ insns size : 4 16-bit code units
+006b34: |[006b34] invokecustom.InvokeCustom7.<clinit>:()V
+006b44: 1200 |0000: const/4 v0, #int 0 // #0
+006b46: 6700 0f00 |0001: sput v0, Linvokecustom/InvokeCustom;.staticFieldTest9:I // field@000f
+006b4a: 0e00 |0003: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=98
+ locals :
+
+ #1 : (in Linvokecustom/InvokeCustom7;)
+ name : '<init>'
+ type : '()V'
+ access : 0x10001 (PUBLIC CONSTRUCTOR)
+ code -
+ registers : 2
+ ins : 1
+ outs : 1
+ insns size : 7 16-bit code units
+006b4c: |[006b4c] invokecustom.InvokeCustom7.<init>:()V
+006b5c: 7010 a800 0100 |0000: invoke-direct {v1}, Linvokecustom/Super;.<init>:()V // method@00a8
+006b62: 1200 |0003: const/4 v0, #int 0 // #0
+006b64: 5910 0e00 |0004: iput v0, v1, Linvokecustom/InvokeCustom;.fieldTest9:F // field@000e
+006b68: 0e00 |0006: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=35
+ 0x0003 line=111
+ 0x0006 line=35
+ locals :
+ 0x0000 - 0x0007 reg=1 this Linvokecustom/InvokeCustom7;
+
+ #2 : (in Linvokecustom/InvokeCustom7;)
+ name : '<init>'
+ type : '(I)V'
+ access : 0x10001 (PUBLIC CONSTRUCTOR)
+ code -
+ registers : 5
+ ins : 2
+ outs : 2
+ insns size : 37 16-bit code units
+006b6c: |[006b6c] invokecustom.InvokeCustom7.<init>:(I)V
+006b7c: 7010 a800 0300 |0000: invoke-direct {v3}, Linvokecustom/Super;.<init>:()V // method@00a8
+006b82: 1200 |0003: const/4 v0, #int 0 // #0
+006b84: 5930 0e00 |0004: iput v0, v3, Linvokecustom/InvokeCustom;.fieldTest9:F // field@000e
+006b88: 6200 1000 |0006: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006b8c: 2201 1700 |0008: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+006b90: 7010 b400 0100 |000a: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+006b96: 1a02 1800 |000d: const-string v2, "InvokeCustom.<init>(" // string@0018
+006b9a: 6e20 ba00 2100 |000f: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006ba0: 0c01 |0012: move-result-object v1
+006ba2: 6e20 b700 4100 |0013: invoke-virtual {v1, v4}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+006ba8: 0c01 |0016: move-result-object v1
+006baa: 1a02 0700 |0017: const-string v2, ")" // string@0007
+006bae: 6e20 ba00 2100 |0019: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006bb4: 0c01 |001c: move-result-object v1
+006bb6: 6e10 bb00 0100 |001d: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+006bbc: 0c01 |0020: move-result-object v1
+006bbe: 6e20 b100 1000 |0021: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006bc4: 0e00 |0024: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=36
+ 0x0003 line=111
+ 0x0006 line=37
+ 0x0024 line=38
+ locals :
+ 0x0000 - 0x0025 reg=3 this Linvokecustom/InvokeCustom7;
+ 0x0000 - 0x0025 reg=4 (null) I
+
+ #3 : (in Linvokecustom/InvokeCustom7;)
+ name : 'bsmCreateCallSite'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 7
+ ins : 4
+ outs : 2
+ insns size : 36 16-bit code units
+006bc8: |[006bc8] invokecustom.InvokeCustom7.bsmCreateCallSite:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+006bd8: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006bdc: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+006be0: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+006be6: 1a02 5600 |0007: const-string v2, "bsmCreateCallSite [" // string@0056
+006bea: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006bf0: 0c01 |000c: move-result-object v1
+006bf2: 6e20 b900 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+006bf8: 0c01 |0010: move-result-object v1
+006bfa: 1a02 5200 |0011: const-string v2, "]" // string@0052
+006bfe: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006c04: 0c01 |0016: move-result-object v1
+006c06: 6e10 bb00 0100 |0017: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+006c0c: 0c01 |001a: move-result-object v1
+006c0e: 6e20 b100 1000 |001b: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006c14: 2200 1b00 |001e: new-instance v0, Ljava/lang/invoke/ConstantCallSite; // type@001b
+006c18: 7020 bc00 6000 |0020: invoke-direct {v0, v6}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+006c1e: 1100 |0023: return-object v0
+ catches : (none)
+ positions :
+ 0x0000 line=156
+ 0x001e line=157
+ locals :
+ 0x0000 - 0x0024 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0024 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0024 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0024 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+
+ #4 : (in Linvokecustom/InvokeCustom7;)
+ name : 'bsmLookupStatic'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 5
+ ins : 3
+ outs : 4
+ insns size : 29 16-bit code units
+006c20: |[006c20] invokecustom.InvokeCustom7.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
+006c30: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006c34: 1a01 5800 |0002: const-string v1, "bsmLookupStatic []" // string@0058
+006c38: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006c3e: 7100 c900 0000 |0007: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+006c44: 0c00 |000a: move-result-object v0
+006c46: 6e10 c800 0000 |000b: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+006c4c: 0c01 |000e: move-result-object v1
+006c4e: 6e40 c700 1043 |000f: invoke-virtual {v0, v1, v3, v4}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+006c54: 0c00 |0012: move-result-object v0
+006c56: 2201 1b00 |0013: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+006c5a: 6e20 bd00 4000 |0015: invoke-virtual {v0, v4}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+006c60: 0c00 |0018: move-result-object v0
+006c62: 7020 bc00 0100 |0019: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+006c68: 1101 |001c: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=138
+ 0x0007 line=139
+ 0x000b line=140
+ 0x0013 line=141
+ locals :
+ 0x0000 - 0x001d reg=2 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x001d reg=3 (null) Ljava/lang/String;
+ 0x0000 - 0x001d reg=4 (null) Ljava/lang/invoke/MethodType;
+
+ #5 : (in Linvokecustom/InvokeCustom7;)
+ name : 'bsmLookupStaticWithExtraArgs'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 12
+ ins : 9
+ outs : 4
+ insns size : 82 16-bit code units
+006c6c: |[006c6c] invokecustom.InvokeCustom7.bsmLookupStaticWithExtraArgs:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;
+006c7c: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006c80: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+006c84: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+006c8a: 1a02 5a00 |0007: const-string v2, "bsmLookupStaticWithExtraArgs [" // string@005a
+006c8e: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006c94: 0c01 |000c: move-result-object v1
+006c96: 6e20 b700 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+006c9c: 0c01 |0010: move-result-object v1
+006c9e: 1a02 0800 |0011: const-string v2, ", " // string@0008
+006ca2: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006ca8: 0c01 |0016: move-result-object v1
+006caa: 6e30 b800 7108 |0017: invoke-virtual {v1, v7, v8}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+006cb0: 0c01 |001a: move-result-object v1
+006cb2: 1a02 0800 |001b: const-string v2, ", " // string@0008
+006cb6: 6e20 ba00 2100 |001d: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006cbc: 0c01 |0020: move-result-object v1
+006cbe: 6e20 b600 9100 |0021: invoke-virtual {v1, v9}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+006cc4: 0c01 |0024: move-result-object v1
+006cc6: 1a02 0800 |0025: const-string v2, ", " // string@0008
+006cca: 6e20 ba00 2100 |0027: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006cd0: 0c01 |002a: move-result-object v1
+006cd2: 6e30 b500 a10b |002b: invoke-virtual {v1, v10, v11}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+006cd8: 0c01 |002e: move-result-object v1
+006cda: 1a02 5200 |002f: const-string v2, "]" // string@0052
+006cde: 6e20 ba00 2100 |0031: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006ce4: 0c01 |0034: move-result-object v1
+006ce6: 6e10 bb00 0100 |0035: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+006cec: 0c01 |0038: move-result-object v1
+006cee: 6e20 b100 1000 |0039: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006cf4: 7100 c900 0000 |003c: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+006cfa: 0c00 |003f: move-result-object v0
+006cfc: 6e10 c800 0000 |0040: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+006d02: 0c01 |0043: move-result-object v1
+006d04: 6e40 c700 1054 |0044: invoke-virtual {v0, v1, v4, v5}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+006d0a: 0c00 |0047: move-result-object v0
+006d0c: 2201 1b00 |0048: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+006d10: 6e20 bd00 5000 |004a: invoke-virtual {v0, v5}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+006d16: 0c00 |004d: move-result-object v0
+006d18: 7020 bc00 0100 |004e: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+006d1e: 1101 |0051: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=147
+ 0x003c line=148
+ 0x0040 line=149
+ 0x0048 line=150
+ locals :
+ 0x0000 - 0x0052 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0052 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0052 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0052 reg=6 (null) I
+ 0x0000 - 0x0052 reg=7 (null) J
+ 0x0000 - 0x0052 reg=9 (null) F
+ 0x0000 - 0x0052 reg=10 (null) D
+
+ #6 : (in Linvokecustom/InvokeCustom7;)
+ name : 'bsmLookupTest9'
+ type : '(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;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 13
+ ins : 10
+ outs : 4
+ insns size : 135 16-bit code units
+006d20: |[006d20] invokecustom.InvokeCustom7.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;
+006d30: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006d34: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+006d38: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+006d3e: 1a02 5c00 |0007: const-string v2, "bsmLookupTest9 [" // string@005c
+006d42: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006d48: 0c01 |000c: move-result-object v1
+006d4a: 6e20 b900 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+006d50: 0c01 |0010: move-result-object v1
+006d52: 1a02 0800 |0011: const-string v2, ", " // string@0008
+006d56: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006d5c: 0c01 |0016: move-result-object v1
+006d5e: 6e20 b900 7100 |0017: invoke-virtual {v1, v7}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+006d64: 0c01 |001a: move-result-object v1
+006d66: 1a02 0800 |001b: const-string v2, ", " // string@0008
+006d6a: 6e20 ba00 2100 |001d: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006d70: 0c01 |0020: move-result-object v1
+006d72: 6e20 b900 8100 |0021: invoke-virtual {v1, v8}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+006d78: 0c01 |0024: move-result-object v1
+006d7a: 1a02 0800 |0025: const-string v2, ", " // string@0008
+006d7e: 6e20 ba00 2100 |0027: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006d84: 0c01 |002a: move-result-object v1
+006d86: 6e20 b900 9100 |002b: invoke-virtual {v1, v9}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+006d8c: 0c01 |002e: move-result-object v1
+006d8e: 1a02 5200 |002f: const-string v2, "]" // string@0052
+006d92: 6e20 ba00 2100 |0031: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006d98: 0c01 |0034: move-result-object v1
+006d9a: 6e10 bb00 0100 |0035: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+006da0: 0c01 |0038: move-result-object v1
+006da2: 6e20 b100 1000 |0039: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006da8: 6200 1000 |003c: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006dac: 2201 1700 |003e: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+006db0: 7010 b400 0100 |0040: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+006db6: 6e20 ba00 4100 |0043: invoke-virtual {v1, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006dbc: 0c01 |0046: move-result-object v1
+006dbe: 1a02 0000 |0047: const-string v2, " " // string@0000
+006dc2: 6e20 ba00 2100 |0049: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006dc8: 0c01 |004c: move-result-object v1
+006dca: 6e20 b900 5100 |004d: invoke-virtual {v1, v5}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+006dd0: 0c01 |0050: move-result-object v1
+006dd2: 6e10 bb00 0100 |0051: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+006dd8: 0c01 |0054: move-result-object v1
+006dda: 6e20 b100 1000 |0055: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006de0: 7120 9b00 7600 |0058: invoke-static {v6, v7}, Linvokecustom/InvokeCustom;.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V // method@009b
+006de6: 2200 0e00 |005b: new-instance v0, Linvokecustom/InvokeCustom; // type@000e
+006dea: 7010 9400 0000 |005d: invoke-direct {v0}, Linvokecustom/InvokeCustom;.<init>:()V // method@0094
+006df0: 6f30 9a00 8009 |0060: invoke-super {v0, v8, v9}, Linvokecustom/InvokeCustom;.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V // method@009a
+006df6: fa20 c300 0a00 1c00 |0063: invoke-polymorphic {v10, v0}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)V // method@00c3, proto@001c
+006dfe: 1230 |0067: const/4 v0, #int 3 // #3
+006e00: fa20 c300 0b00 0500 |0068: invoke-polymorphic {v11, v0}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (I)Linvokecustom/InvokeCustom; // method@00c3, proto@0005
+006e08: 0c00 |006c: move-result-object v0
+006e0a: fa20 be00 0c00 1c00 |006d: invoke-polymorphic {v12, v0}, Ljava/lang/invoke/MethodHandle;.invoke:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)V // method@00be, proto@001c
+006e12: 7100 c900 0000 |0071: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+006e18: 0c00 |0074: move-result-object v0
+006e1a: 6e10 c800 0000 |0075: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+006e20: 0c01 |0078: move-result-object v1
+006e22: 6e40 c700 1054 |0079: invoke-virtual {v0, v1, v4, v5}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+006e28: 0c00 |007c: move-result-object v0
+006e2a: 2201 1b00 |007d: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+006e2e: 6e20 bd00 5000 |007f: invoke-virtual {v0, v5}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+006e34: 0c00 |0082: move-result-object v0
+006e36: 7020 bc00 0100 |0083: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+006e3c: 1101 |0086: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=166
+ 0x003c line=168
+ 0x0058 line=171
+ 0x005b line=172
+ 0x0060 line=173
+ 0x0063 line=176
+ 0x0067 line=178
+ 0x006d line=179
+ 0x0071 line=181
+ 0x0075 line=182
+ 0x007d line=183
+ locals :
+ 0x0000 - 0x0087 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0087 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0087 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0087 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=8 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=9 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=10 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=11 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=12 (null) Ljava/lang/invoke/MethodHandle;
+
+ #7 : (in Linvokecustom/InvokeCustom7;)
+ name : 'checkFieldTest9'
+ type : '(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V'
+ access : 0x0002 (PRIVATE)
+ code -
+ registers : 9
+ ins : 3
+ outs : 3
+ insns size : 82 16-bit code units
+006e40: |[006e40] invokecustom.InvokeCustom7.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+006e50: 1405 0ff0 6a20 |0000: const v5, #float 1.99e-19 // #206af00f
+006e56: fa20 c300 6700 0100 |0003: invoke-polymorphic {v7, v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)F // method@00c3, proto@0001
+006e5e: 0a00 |0007: move-result v0
+006e60: fa30 c300 6805 1d00 |0008: invoke-polymorphic {v8, v6, v5}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;F)V // method@00c3, proto@001d
+006e68: fa20 c300 6700 0100 |000c: invoke-polymorphic {v7, v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)F // method@00c3, proto@0001
+006e70: 0a01 |0010: move-result v1
+006e72: 6202 1000 |0011: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006e76: 2203 1700 |0013: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+006e7a: 7010 b400 0300 |0015: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+006e80: 1a04 5e00 |0018: const-string v4, "checkFieldTest9: old " // string@005e
+006e84: 6e20 ba00 4300 |001a: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006e8a: 0c03 |001d: move-result-object v3
+006e8c: 6e20 b600 0300 |001e: invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+006e92: 0c00 |0021: move-result-object v0
+006e94: 1a03 0600 |0022: const-string v3, " new " // string@0006
+006e98: 6e20 ba00 3000 |0024: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006e9e: 0c00 |0027: move-result-object v0
+006ea0: 6e20 b600 1000 |0028: invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+006ea6: 0c00 |002b: move-result-object v0
+006ea8: 1a03 0500 |002c: const-string v3, " expected " // string@0005
+006eac: 6e20 ba00 3000 |002e: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006eb2: 0c00 |0031: move-result-object v0
+006eb4: 6e20 b600 5000 |0032: invoke-virtual {v0, v5}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+006eba: 0c00 |0035: move-result-object v0
+006ebc: 1a03 0000 |0036: const-string v3, " " // string@0000
+006ec0: 6e20 ba00 3000 |0038: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006ec6: 0c00 |003b: move-result-object v0
+006ec8: 6e10 bb00 0000 |003c: invoke-virtual {v0}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+006ece: 0c00 |003f: move-result-object v0
+006ed0: 6e20 ab00 0200 |0040: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.print:(Ljava/lang/String;)V // method@00ab
+006ed6: 6202 1000 |0043: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006eda: 2d00 0105 |0045: cmpl-float v0, v1, v5
+006ede: 3900 0800 |0047: if-nez v0, 004f // +0008
+006ee2: 1a00 4000 |0049: const-string v0, "OK" // string@0040
+006ee6: 6e20 b100 0200 |004b: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006eec: 0e00 |004e: return-void
+006eee: 1a00 1000 |004f: const-string v0, "ERROR" // string@0010
+006ef2: 28fa |0051: goto 004b // -0006
+ catches : (none)
+ positions :
+ 0x0003 line=116
+ 0x0008 line=117
+ 0x000c line=118
+ 0x0011 line=119
+ 0x0043 line=121
+ 0x004e line=122
+ 0x004f line=121
+ locals :
+ 0x0000 - 0x0052 reg=6 this Linvokecustom/InvokeCustom7;
+ 0x0000 - 0x0052 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0052 reg=8 (null) Ljava/lang/invoke/MethodHandle;
+
+ #8 : (in Linvokecustom/InvokeCustom7;)
+ name : 'checkStaticFieldTest9'
+ type : '(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 8
+ ins : 2
+ outs : 2
+ insns size : 80 16-bit code units
+006ef4: |[006ef4] invokecustom.InvokeCustom7.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+006f04: 1405 1032 5476 |0000: const v5, #float 1.07596e+33 // #76543210
+006f0a: fa10 c300 0600 0200 |0003: invoke-polymorphic {v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, ()I // method@00c3, proto@0002
+006f12: 0a00 |0007: move-result v0
+006f14: fa20 c300 5700 1a00 |0008: invoke-polymorphic {v7, v5}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (I)V // method@00c3, proto@001a
+006f1c: fa10 c300 0600 0200 |000c: invoke-polymorphic {v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, ()I // method@00c3, proto@0002
+006f24: 0a01 |0010: move-result v1
+006f26: 6202 1000 |0011: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006f2a: 2203 1700 |0013: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+006f2e: 7010 b400 0300 |0015: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+006f34: 1a04 6000 |0018: const-string v4, "checkStaticFieldTest9: old " // string@0060
+006f38: 6e20 ba00 4300 |001a: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006f3e: 0c03 |001d: move-result-object v3
+006f40: 6e20 b700 0300 |001e: invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+006f46: 0c00 |0021: move-result-object v0
+006f48: 1a03 0600 |0022: const-string v3, " new " // string@0006
+006f4c: 6e20 ba00 3000 |0024: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006f52: 0c00 |0027: move-result-object v0
+006f54: 6e20 b700 1000 |0028: invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+006f5a: 0c00 |002b: move-result-object v0
+006f5c: 1a03 0500 |002c: const-string v3, " expected " // string@0005
+006f60: 6e20 ba00 3000 |002e: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006f66: 0c00 |0031: move-result-object v0
+006f68: 6e20 b700 5000 |0032: invoke-virtual {v0, v5}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+006f6e: 0c00 |0035: move-result-object v0
+006f70: 1a03 0000 |0036: const-string v3, " " // string@0000
+006f74: 6e20 ba00 3000 |0038: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+006f7a: 0c00 |003b: move-result-object v0
+006f7c: 6e10 bb00 0000 |003c: invoke-virtual {v0}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+006f82: 0c00 |003f: move-result-object v0
+006f84: 6e20 ab00 0200 |0040: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.print:(Ljava/lang/String;)V // method@00ab
+006f8a: 6202 1000 |0043: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006f8e: 3351 0800 |0045: if-ne v1, v5, 004d // +0008
+006f92: 1a00 4000 |0047: const-string v0, "OK" // string@0040
+006f96: 6e20 b100 0200 |0049: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006f9c: 0e00 |004c: return-void
+006f9e: 1a00 1000 |004d: const-string v0, "ERROR" // string@0010
+006fa2: 28fa |004f: goto 0049 // -0006
+ catches : (none)
+ positions :
+ 0x0003 line=103
+ 0x0008 line=104
+ 0x000c line=105
+ 0x0011 line=106
+ 0x0043 line=108
+ 0x004c line=109
+ 0x004d line=108
+ locals :
+ 0x0000 - 0x0050 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0050 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+
+ #9 : (in Linvokecustom/InvokeCustom7;)
+ name : 'targetMethodTest1'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+006fa4: |[006fa4] invokecustom.InvokeCustom7.targetMethodTest1:()V
+006fb4: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006fb8: 1a01 1500 |0002: const-string v1, "Hello World!" // string@0015
+006fbc: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+006fc2: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=41
+ 0x0007 line=42
+ locals :
+
+ #10 : (in Linvokecustom/InvokeCustom7;)
+ name : 'targetMethodTest2'
+ type : '(ZBCSIFJDLjava/lang/String;)V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 13
+ ins : 11
+ outs : 3
+ insns size : 46 16-bit code units
+006fc4: |[006fc4] invokecustom.InvokeCustom7.targetMethodTest2:(ZBCSIFJDLjava/lang/String;)V
+006fd4: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006fd8: 6e20 b200 2000 |0002: invoke-virtual {v0, v2}, Ljava/io/PrintStream;.println:(Z)V // method@00b2
+006fde: 6200 1000 |0005: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006fe2: 6e20 af00 3000 |0007: invoke-virtual {v0, v3}, Ljava/io/PrintStream;.println:(I)V // method@00af
+006fe8: 6200 1000 |000a: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006fec: 6e20 ac00 4000 |000c: invoke-virtual {v0, v4}, Ljava/io/PrintStream;.println:(C)V // method@00ac
+006ff2: 6200 1000 |000f: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+006ff6: 6e20 af00 5000 |0011: invoke-virtual {v0, v5}, Ljava/io/PrintStream;.println:(I)V // method@00af
+006ffc: 6200 1000 |0014: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007000: 6e20 af00 6000 |0016: invoke-virtual {v0, v6}, Ljava/io/PrintStream;.println:(I)V // method@00af
+007006: 6200 1000 |0019: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00700a: 6e20 ae00 7000 |001b: invoke-virtual {v0, v7}, Ljava/io/PrintStream;.println:(F)V // method@00ae
+007010: 6200 1000 |001e: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007014: 6e30 b000 8009 |0020: invoke-virtual {v0, v8, v9}, Ljava/io/PrintStream;.println:(J)V // method@00b0
+00701a: 6200 1000 |0023: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00701e: 6e30 ad00 a00b |0025: invoke-virtual {v0, v10, v11}, Ljava/io/PrintStream;.println:(D)V // method@00ad
+007024: 6200 1000 |0028: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007028: 6e20 b100 c000 |002a: invoke-virtual {v0, v12}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00702e: 0e00 |002d: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=46
+ 0x0005 line=47
+ 0x000a line=48
+ 0x000f line=49
+ 0x0014 line=50
+ 0x0019 line=51
+ 0x001e line=52
+ 0x0023 line=53
+ 0x0028 line=54
+ 0x002d line=55
+ locals :
+ 0x0000 - 0x002e reg=2 (null) Z
+ 0x0000 - 0x002e reg=3 (null) B
+ 0x0000 - 0x002e reg=4 (null) C
+ 0x0000 - 0x002e reg=5 (null) S
+ 0x0000 - 0x002e reg=6 (null) I
+ 0x0000 - 0x002e reg=7 (null) F
+ 0x0000 - 0x002e reg=8 (null) J
+ 0x0000 - 0x002e reg=10 (null) D
+ 0x0000 - 0x002e reg=12 (null) Ljava/lang/String;
+
+ #11 : (in Linvokecustom/InvokeCustom7;)
+ name : 'targetMethodTest3'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+007030: |[007030] invokecustom.InvokeCustom7.targetMethodTest3:()V
+007040: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007044: 1a01 7300 |0002: const-string v1, "targetMethodTest3 from InvokeCustom" // string@0073
+007048: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00704e: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=58
+ 0x0007 line=59
+ locals :
+
+ #12 : (in Linvokecustom/InvokeCustom7;)
+ name : 'targetMethodTest5'
+ type : '(III)I'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 7
+ ins : 3
+ outs : 2
+ insns size : 83 16-bit code units
+007050: |[007050] invokecustom.InvokeCustom7.targetMethodTest5:(III)I
+007060: 9000 0405 |0000: add-int v0, v4, v5
+007064: 6201 1000 |0002: sget-object v1, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007068: 2202 1700 |0004: new-instance v2, Ljava/lang/StringBuilder; // type@0017
+00706c: 7010 b400 0200 |0006: invoke-direct {v2}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+007072: 1a03 7800 |0009: const-string v3, "targetMethodTest5 " // string@0078
+007076: 6e20 ba00 3200 |000b: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00707c: 0c02 |000e: move-result-object v2
+00707e: 6e20 b700 4200 |000f: invoke-virtual {v2, v4}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+007084: 0c02 |0012: move-result-object v2
+007086: 1a03 0300 |0013: const-string v3, " + " // string@0003
+00708a: 6e20 ba00 3200 |0015: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007090: 0c02 |0018: move-result-object v2
+007092: 6e20 b700 5200 |0019: invoke-virtual {v2, v5}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+007098: 0c02 |001c: move-result-object v2
+00709a: 1a03 0400 |001d: const-string v3, " = " // string@0004
+00709e: 6e20 ba00 3200 |001f: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0070a4: 0c02 |0022: move-result-object v2
+0070a6: 6e20 b700 0200 |0023: invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+0070ac: 0c02 |0026: move-result-object v2
+0070ae: 6e10 bb00 0200 |0027: invoke-virtual {v2}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0070b4: 0c02 |002a: move-result-object v2
+0070b6: 6e20 b100 2100 |002b: invoke-virtual {v1, v2}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0070bc: 3260 2400 |002e: if-eq v0, v6, 0052 // +0024
+0070c0: 6201 1000 |0030: sget-object v1, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0070c4: 2202 1700 |0032: new-instance v2, Ljava/lang/StringBuilder; // type@0017
+0070c8: 7010 b400 0200 |0034: invoke-direct {v2}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0070ce: 1a03 1300 |0037: const-string v3, "Failed " // string@0013
+0070d2: 6e20 ba00 3200 |0039: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0070d8: 0c02 |003c: move-result-object v2
+0070da: 6e20 b700 0200 |003d: invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+0070e0: 0c02 |0040: move-result-object v2
+0070e2: 1a03 0100 |0041: const-string v3, " != " // string@0001
+0070e6: 6e20 ba00 3200 |0043: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0070ec: 0c02 |0046: move-result-object v2
+0070ee: 6e20 b700 6200 |0047: invoke-virtual {v2, v6}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+0070f4: 0c02 |004a: move-result-object v2
+0070f6: 6e10 bb00 0200 |004b: invoke-virtual {v2}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0070fc: 0c02 |004e: move-result-object v2
+0070fe: 6e20 b100 2100 |004f: invoke-virtual {v1, v2}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007104: 0f00 |0052: return v0
+ catches : (none)
+ positions :
+ 0x0000 line=68
+ 0x0002 line=69
+ 0x002e line=70
+ 0x0030 line=71
+ 0x0052 line=73
+ locals :
+ 0x0000 - 0x0053 reg=4 (null) I
+ 0x0000 - 0x0053 reg=5 (null) I
+ 0x0000 - 0x0053 reg=6 (null) I
+
+ #13 : (in Linvokecustom/InvokeCustom7;)
+ name : 'targetMethodTest6'
+ type : '(JJJ)J'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 12
+ ins : 6
+ outs : 3
+ insns size : 85 16-bit code units
+007108: |[007108] invokecustom.InvokeCustom7.targetMethodTest6:(JJJ)J
+007118: 9b00 0608 |0000: add-long v0, v6, v8
+00711c: 6202 1000 |0002: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007120: 2203 1700 |0004: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+007124: 7010 b400 0300 |0006: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00712a: 1a04 7b00 |0009: const-string v4, "targetMethodTest6 " // string@007b
+00712e: 6e20 ba00 4300 |000b: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007134: 0c03 |000e: move-result-object v3
+007136: 6e30 b800 6307 |000f: invoke-virtual {v3, v6, v7}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+00713c: 0c03 |0012: move-result-object v3
+00713e: 1a04 0300 |0013: const-string v4, " + " // string@0003
+007142: 6e20 ba00 4300 |0015: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007148: 0c03 |0018: move-result-object v3
+00714a: 6e30 b800 8309 |0019: invoke-virtual {v3, v8, v9}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+007150: 0c03 |001c: move-result-object v3
+007152: 1a04 0400 |001d: const-string v4, " = " // string@0004
+007156: 6e20 ba00 4300 |001f: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00715c: 0c03 |0022: move-result-object v3
+00715e: 6e30 b800 0301 |0023: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+007164: 0c03 |0026: move-result-object v3
+007166: 6e10 bb00 0300 |0027: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00716c: 0c03 |002a: move-result-object v3
+00716e: 6e20 b100 3200 |002b: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007174: 3102 000a |002e: cmp-long v2, v0, v10
+007178: 3802 2400 |0030: if-eqz v2, 0054 // +0024
+00717c: 6202 1000 |0032: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007180: 2203 1700 |0034: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+007184: 7010 b400 0300 |0036: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00718a: 1a04 1300 |0039: const-string v4, "Failed " // string@0013
+00718e: 6e20 ba00 4300 |003b: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007194: 0c03 |003e: move-result-object v3
+007196: 6e30 b800 0301 |003f: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+00719c: 0c03 |0042: move-result-object v3
+00719e: 1a04 0100 |0043: const-string v4, " != " // string@0001
+0071a2: 6e20 ba00 4300 |0045: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0071a8: 0c03 |0048: move-result-object v3
+0071aa: 6e30 b800 a30b |0049: invoke-virtual {v3, v10, v11}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+0071b0: 0c03 |004c: move-result-object v3
+0071b2: 6e10 bb00 0300 |004d: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0071b8: 0c03 |0050: move-result-object v3
+0071ba: 6e20 b100 3200 |0051: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0071c0: 1000 |0054: return-wide v0
+ catches : (none)
+ positions :
+ 0x0000 line=77
+ 0x0002 line=78
+ 0x002e line=79
+ 0x0032 line=80
+ 0x0054 line=82
+ locals :
+ 0x0000 - 0x0055 reg=6 (null) J
+ 0x0000 - 0x0055 reg=8 (null) J
+ 0x0000 - 0x0055 reg=10 (null) J
+
+ #14 : (in Linvokecustom/InvokeCustom7;)
+ name : 'targetMethodTest7'
+ type : '(FFD)D'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 10
+ ins : 4
+ outs : 3
+ insns size : 86 16-bit code units
+0071c4: |[0071c4] invokecustom.InvokeCustom7.targetMethodTest7:(FFD)D
+0071d4: a800 0607 |0000: mul-float v0, v6, v7
+0071d8: 8900 |0002: float-to-double v0, v0
+0071da: 6202 1000 |0003: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0071de: 2203 1700 |0005: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+0071e2: 7010 b400 0300 |0007: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0071e8: 1a04 7e00 |000a: const-string v4, "targetMethodTest7 " // string@007e
+0071ec: 6e20 ba00 4300 |000c: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0071f2: 0c03 |000f: move-result-object v3
+0071f4: 6e20 b600 6300 |0010: invoke-virtual {v3, v6}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+0071fa: 0c03 |0013: move-result-object v3
+0071fc: 1a04 0200 |0014: const-string v4, " * " // string@0002
+007200: 6e20 ba00 4300 |0016: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007206: 0c03 |0019: move-result-object v3
+007208: 6e20 b600 7300 |001a: invoke-virtual {v3, v7}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+00720e: 0c03 |001d: move-result-object v3
+007210: 1a04 0400 |001e: const-string v4, " = " // string@0004
+007214: 6e20 ba00 4300 |0020: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00721a: 0c03 |0023: move-result-object v3
+00721c: 6e30 b500 0301 |0024: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+007222: 0c03 |0027: move-result-object v3
+007224: 6e10 bb00 0300 |0028: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00722a: 0c03 |002b: move-result-object v3
+00722c: 6e20 b100 3200 |002c: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007232: 2f02 0008 |002f: cmpl-double v2, v0, v8
+007236: 3802 2400 |0031: if-eqz v2, 0055 // +0024
+00723a: 6202 1000 |0033: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00723e: 2203 1700 |0035: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+007242: 7010 b400 0300 |0037: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+007248: 1a04 1300 |003a: const-string v4, "Failed " // string@0013
+00724c: 6e20 ba00 4300 |003c: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007252: 0c03 |003f: move-result-object v3
+007254: 6e30 b500 0301 |0040: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+00725a: 0c03 |0043: move-result-object v3
+00725c: 1a04 0100 |0044: const-string v4, " != " // string@0001
+007260: 6e20 ba00 4300 |0046: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007266: 0c03 |0049: move-result-object v3
+007268: 6e30 b500 8309 |004a: invoke-virtual {v3, v8, v9}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+00726e: 0c03 |004d: move-result-object v3
+007270: 6e10 bb00 0300 |004e: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+007276: 0c03 |0051: move-result-object v3
+007278: 6e20 b100 3200 |0052: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00727e: 1000 |0055: return-wide v0
+ catches : (none)
+ positions :
+ 0x0000 line=86
+ 0x0003 line=87
+ 0x002f line=88
+ 0x0033 line=89
+ 0x0055 line=91
+ locals :
+ 0x0000 - 0x0056 reg=6 (null) F
+ 0x0000 - 0x0056 reg=7 (null) F
+ 0x0000 - 0x0056 reg=8 (null) D
+
+ #15 : (in Linvokecustom/InvokeCustom7;)
+ name : 'targetMethodTest8'
+ type : '(Ljava/lang/String;)V'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 4
+ ins : 1
+ outs : 2
+ insns size : 25 16-bit code units
+007280: |[007280] invokecustom.InvokeCustom7.targetMethodTest8:(Ljava/lang/String;)V
+007290: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007294: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+007298: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00729e: 1a02 8000 |0007: const-string v2, "targetMethodTest8 " // string@0080
+0072a2: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0072a8: 0c01 |000c: move-result-object v1
+0072aa: 6e20 ba00 3100 |000d: invoke-virtual {v1, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0072b0: 0c01 |0010: move-result-object v1
+0072b2: 6e10 bb00 0100 |0011: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0072b8: 0c01 |0014: move-result-object v1
+0072ba: 6e20 b100 1000 |0015: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0072c0: 0e00 |0018: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=95
+ 0x0018 line=96
+ locals :
+ 0x0000 - 0x0019 reg=3 (null) Ljava/lang/String;
+
+ #16 : (in Linvokecustom/InvokeCustom7;)
+ name : 'targetMethodTest9'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+0072c4: |[0072c4] invokecustom.InvokeCustom7.targetMethodTest9:()V
+0072d4: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0072d8: 1a01 8200 |0002: const-string v1, "targetMethodTest9()" // string@0082
+0072dc: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0072e2: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=129
+ 0x0007 line=130
+ locals :
+
+ #17 : (in Linvokecustom/InvokeCustom7;)
+ name : 'test7'
+ type : '()V'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 5
+ ins : 0
+ outs : 4
+ insns size : 40 16-bit code units
+0072e4: |[0072e4] invokecustom.InvokeCustom7.test7:()V
+0072f4: 1400 0040 003f |0000: const v0, #float 0.500977 // #3f004000
+0072fa: 1401 0040 00bf |0003: const v1, #float -0.500977 // #bf004000
+007300: 1802 0000 0000 0410 d0bf |0006: const-wide v2, #double -0.250978 // #bfd0100400000000
+00730a: fc40 0500 1032 |000b: invoke-custom {v0, v1, v2, v3}, call_site@0005
+007310: 0b00 |000e: move-result-wide v0
+007312: 6202 1000 |000f: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007316: 2203 1700 |0011: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+00731a: 7010 b400 0300 |0013: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+007320: 1a04 7c00 |0016: const-string v4, "targetMethodTest6 returned: " // string@007c
+007324: 6e20 ba00 4300 |0018: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00732a: 0c03 |001b: move-result-object v3
+00732c: 6e30 b500 0301 |001c: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+007332: 0c00 |001f: move-result-object v0
+007334: 6e10 bb00 0000 |0020: invoke-virtual {v0}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00733a: 0c00 |0023: move-result-object v0
+00733c: 6e20 b100 0200 |0024: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007342: 0e00 |0027: return-void
+ catches : (none)
+ positions :
+ locals :
+
+ Virtual methods -
+ #0 : (in Linvokecustom/InvokeCustom7;)
+ name : 'helperMethodTest9'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 4
+ ins : 1
+ outs : 2
+ insns size : 27 16-bit code units
+007344: |[007344] invokecustom.InvokeCustom7.helperMethodTest9:()V
+007354: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007358: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+00735c: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+007362: 1a02 6400 |0007: const-string v2, "helperMethodTest9 in " // string@0064
+007366: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00736c: 0c01 |000c: move-result-object v1
+00736e: 1c02 0e00 |000d: const-class v2, Linvokecustom/InvokeCustom; // type@000e
+007372: 6e20 b900 2100 |000f: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+007378: 0c01 |0012: move-result-object v1
+00737a: 6e10 bb00 0100 |0013: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+007380: 0c01 |0016: move-result-object v1
+007382: 6e20 b100 1000 |0017: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007388: 0e00 |001a: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=125
+ 0x001a line=126
+ locals :
+ 0x0000 - 0x001b reg=3 this Linvokecustom/InvokeCustom7;
+
+ #1 : (in Linvokecustom/InvokeCustom7;)
+ name : 'run'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 3
+ ins : 1
+ outs : 2
+ insns size : 8 16-bit code units
+00738c: |[00738c] invokecustom.InvokeCustom7.run:()V
+00739c: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0073a0: 1a01 6e00 |0002: const-string v1, "run() for Test9" // string@006e
+0073a4: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0073aa: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=133
+ 0x0007 line=134
+ locals :
+ 0x0000 - 0x0008 reg=2 this Linvokecustom/InvokeCustom7;
+
+ #2 : (in Linvokecustom/InvokeCustom7;)
+ name : 'targetMethodTest4'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 3
+ ins : 1
+ outs : 2
+ insns size : 8 16-bit code units
+0073ac: |[0073ac] invokecustom.InvokeCustom7.targetMethodTest4:()V
+0073bc: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0073c0: 1a01 7500 |0002: const-string v1, "targetMethodTest4 from InvokeCustom (oops!)" // string@0075
+0073c4: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0073ca: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=64
+ 0x0007 line=65
+ locals :
+ 0x0000 - 0x0008 reg=2 this Linvokecustom/InvokeCustom7;
+
+ source_file_idx : 25 (InvokeCustom.java)
+
+Class #7 -
+ Class descriptor : 'Linvokecustom/InvokeCustom8;'
+ Access flags : 0x0001 (PUBLIC)
+ Superclass : 'Linvokecustom/Super;'
+ Interfaces -
+ #0 : 'Ljava/lang/Runnable;'
+ Static fields -
+ #0 : (in Linvokecustom/InvokeCustom8;)
+ name : 'staticFieldTest9'
+ type : 'I'
+ access : 0x000a (PRIVATE STATIC)
+ Instance fields -
+ #0 : (in Linvokecustom/InvokeCustom8;)
+ name : 'fieldTest9'
+ type : 'F'
+ access : 0x0002 (PRIVATE)
+ Direct methods -
+ #0 : (in Linvokecustom/InvokeCustom8;)
+ name : '<clinit>'
+ type : '()V'
+ access : 0x10008 (STATIC CONSTRUCTOR)
+ code -
+ registers : 1
+ ins : 0
+ outs : 0
+ insns size : 4 16-bit code units
+0073cc: |[0073cc] invokecustom.InvokeCustom8.<clinit>:()V
+0073dc: 1200 |0000: const/4 v0, #int 0 // #0
+0073de: 6700 0f00 |0001: sput v0, Linvokecustom/InvokeCustom;.staticFieldTest9:I // field@000f
+0073e2: 0e00 |0003: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=98
+ locals :
+
+ #1 : (in Linvokecustom/InvokeCustom8;)
+ name : '<init>'
+ type : '()V'
+ access : 0x10001 (PUBLIC CONSTRUCTOR)
+ code -
+ registers : 2
+ ins : 1
+ outs : 1
+ insns size : 7 16-bit code units
+0073e4: |[0073e4] invokecustom.InvokeCustom8.<init>:()V
+0073f4: 7010 a800 0100 |0000: invoke-direct {v1}, Linvokecustom/Super;.<init>:()V // method@00a8
+0073fa: 1200 |0003: const/4 v0, #int 0 // #0
+0073fc: 5910 0e00 |0004: iput v0, v1, Linvokecustom/InvokeCustom;.fieldTest9:F // field@000e
+007400: 0e00 |0006: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=35
+ 0x0003 line=111
+ 0x0006 line=35
+ locals :
+ 0x0000 - 0x0007 reg=1 this Linvokecustom/InvokeCustom8;
+
+ #2 : (in Linvokecustom/InvokeCustom8;)
+ name : '<init>'
+ type : '(I)V'
+ access : 0x10001 (PUBLIC CONSTRUCTOR)
+ code -
+ registers : 5
+ ins : 2
+ outs : 2
+ insns size : 37 16-bit code units
+007404: |[007404] invokecustom.InvokeCustom8.<init>:(I)V
+007414: 7010 a800 0300 |0000: invoke-direct {v3}, Linvokecustom/Super;.<init>:()V // method@00a8
+00741a: 1200 |0003: const/4 v0, #int 0 // #0
+00741c: 5930 0e00 |0004: iput v0, v3, Linvokecustom/InvokeCustom;.fieldTest9:F // field@000e
+007420: 6200 1000 |0006: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007424: 2201 1700 |0008: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+007428: 7010 b400 0100 |000a: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00742e: 1a02 1800 |000d: const-string v2, "InvokeCustom.<init>(" // string@0018
+007432: 6e20 ba00 2100 |000f: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007438: 0c01 |0012: move-result-object v1
+00743a: 6e20 b700 4100 |0013: invoke-virtual {v1, v4}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+007440: 0c01 |0016: move-result-object v1
+007442: 1a02 0700 |0017: const-string v2, ")" // string@0007
+007446: 6e20 ba00 2100 |0019: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00744c: 0c01 |001c: move-result-object v1
+00744e: 6e10 bb00 0100 |001d: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+007454: 0c01 |0020: move-result-object v1
+007456: 6e20 b100 1000 |0021: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00745c: 0e00 |0024: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=36
+ 0x0003 line=111
+ 0x0006 line=37
+ 0x0024 line=38
+ locals :
+ 0x0000 - 0x0025 reg=3 this Linvokecustom/InvokeCustom8;
+ 0x0000 - 0x0025 reg=4 (null) I
+
+ #3 : (in Linvokecustom/InvokeCustom8;)
+ name : 'bsmCreateCallSite'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 7
+ ins : 4
+ outs : 2
+ insns size : 36 16-bit code units
+007460: |[007460] invokecustom.InvokeCustom8.bsmCreateCallSite:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+007470: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007474: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+007478: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00747e: 1a02 5600 |0007: const-string v2, "bsmCreateCallSite [" // string@0056
+007482: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007488: 0c01 |000c: move-result-object v1
+00748a: 6e20 b900 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+007490: 0c01 |0010: move-result-object v1
+007492: 1a02 5200 |0011: const-string v2, "]" // string@0052
+007496: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00749c: 0c01 |0016: move-result-object v1
+00749e: 6e10 bb00 0100 |0017: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0074a4: 0c01 |001a: move-result-object v1
+0074a6: 6e20 b100 1000 |001b: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0074ac: 2200 1b00 |001e: new-instance v0, Ljava/lang/invoke/ConstantCallSite; // type@001b
+0074b0: 7020 bc00 6000 |0020: invoke-direct {v0, v6}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+0074b6: 1100 |0023: return-object v0
+ catches : (none)
+ positions :
+ 0x0000 line=156
+ 0x001e line=157
+ locals :
+ 0x0000 - 0x0024 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0024 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0024 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0024 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+
+ #4 : (in Linvokecustom/InvokeCustom8;)
+ name : 'bsmLookupStatic'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 5
+ ins : 3
+ outs : 4
+ insns size : 29 16-bit code units
+0074b8: |[0074b8] invokecustom.InvokeCustom8.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
+0074c8: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0074cc: 1a01 5800 |0002: const-string v1, "bsmLookupStatic []" // string@0058
+0074d0: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0074d6: 7100 c900 0000 |0007: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+0074dc: 0c00 |000a: move-result-object v0
+0074de: 6e10 c800 0000 |000b: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+0074e4: 0c01 |000e: move-result-object v1
+0074e6: 6e40 c700 1043 |000f: invoke-virtual {v0, v1, v3, v4}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+0074ec: 0c00 |0012: move-result-object v0
+0074ee: 2201 1b00 |0013: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+0074f2: 6e20 bd00 4000 |0015: invoke-virtual {v0, v4}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+0074f8: 0c00 |0018: move-result-object v0
+0074fa: 7020 bc00 0100 |0019: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+007500: 1101 |001c: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=138
+ 0x0007 line=139
+ 0x000b line=140
+ 0x0013 line=141
+ locals :
+ 0x0000 - 0x001d reg=2 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x001d reg=3 (null) Ljava/lang/String;
+ 0x0000 - 0x001d reg=4 (null) Ljava/lang/invoke/MethodType;
+
+ #5 : (in Linvokecustom/InvokeCustom8;)
+ name : 'bsmLookupStaticWithExtraArgs'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 12
+ ins : 9
+ outs : 4
+ insns size : 82 16-bit code units
+007504: |[007504] invokecustom.InvokeCustom8.bsmLookupStaticWithExtraArgs:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;
+007514: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007518: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+00751c: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+007522: 1a02 5a00 |0007: const-string v2, "bsmLookupStaticWithExtraArgs [" // string@005a
+007526: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00752c: 0c01 |000c: move-result-object v1
+00752e: 6e20 b700 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+007534: 0c01 |0010: move-result-object v1
+007536: 1a02 0800 |0011: const-string v2, ", " // string@0008
+00753a: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007540: 0c01 |0016: move-result-object v1
+007542: 6e30 b800 7108 |0017: invoke-virtual {v1, v7, v8}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+007548: 0c01 |001a: move-result-object v1
+00754a: 1a02 0800 |001b: const-string v2, ", " // string@0008
+00754e: 6e20 ba00 2100 |001d: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007554: 0c01 |0020: move-result-object v1
+007556: 6e20 b600 9100 |0021: invoke-virtual {v1, v9}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+00755c: 0c01 |0024: move-result-object v1
+00755e: 1a02 0800 |0025: const-string v2, ", " // string@0008
+007562: 6e20 ba00 2100 |0027: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007568: 0c01 |002a: move-result-object v1
+00756a: 6e30 b500 a10b |002b: invoke-virtual {v1, v10, v11}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+007570: 0c01 |002e: move-result-object v1
+007572: 1a02 5200 |002f: const-string v2, "]" // string@0052
+007576: 6e20 ba00 2100 |0031: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00757c: 0c01 |0034: move-result-object v1
+00757e: 6e10 bb00 0100 |0035: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+007584: 0c01 |0038: move-result-object v1
+007586: 6e20 b100 1000 |0039: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00758c: 7100 c900 0000 |003c: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+007592: 0c00 |003f: move-result-object v0
+007594: 6e10 c800 0000 |0040: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+00759a: 0c01 |0043: move-result-object v1
+00759c: 6e40 c700 1054 |0044: invoke-virtual {v0, v1, v4, v5}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+0075a2: 0c00 |0047: move-result-object v0
+0075a4: 2201 1b00 |0048: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+0075a8: 6e20 bd00 5000 |004a: invoke-virtual {v0, v5}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+0075ae: 0c00 |004d: move-result-object v0
+0075b0: 7020 bc00 0100 |004e: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+0075b6: 1101 |0051: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=147
+ 0x003c line=148
+ 0x0040 line=149
+ 0x0048 line=150
+ locals :
+ 0x0000 - 0x0052 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0052 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0052 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0052 reg=6 (null) I
+ 0x0000 - 0x0052 reg=7 (null) J
+ 0x0000 - 0x0052 reg=9 (null) F
+ 0x0000 - 0x0052 reg=10 (null) D
+
+ #6 : (in Linvokecustom/InvokeCustom8;)
+ name : 'bsmLookupTest9'
+ type : '(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;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 13
+ ins : 10
+ outs : 4
+ insns size : 135 16-bit code units
+0075b8: |[0075b8] invokecustom.InvokeCustom8.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;
+0075c8: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0075cc: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+0075d0: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0075d6: 1a02 5c00 |0007: const-string v2, "bsmLookupTest9 [" // string@005c
+0075da: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0075e0: 0c01 |000c: move-result-object v1
+0075e2: 6e20 b900 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+0075e8: 0c01 |0010: move-result-object v1
+0075ea: 1a02 0800 |0011: const-string v2, ", " // string@0008
+0075ee: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0075f4: 0c01 |0016: move-result-object v1
+0075f6: 6e20 b900 7100 |0017: invoke-virtual {v1, v7}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+0075fc: 0c01 |001a: move-result-object v1
+0075fe: 1a02 0800 |001b: const-string v2, ", " // string@0008
+007602: 6e20 ba00 2100 |001d: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007608: 0c01 |0020: move-result-object v1
+00760a: 6e20 b900 8100 |0021: invoke-virtual {v1, v8}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+007610: 0c01 |0024: move-result-object v1
+007612: 1a02 0800 |0025: const-string v2, ", " // string@0008
+007616: 6e20 ba00 2100 |0027: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00761c: 0c01 |002a: move-result-object v1
+00761e: 6e20 b900 9100 |002b: invoke-virtual {v1, v9}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+007624: 0c01 |002e: move-result-object v1
+007626: 1a02 5200 |002f: const-string v2, "]" // string@0052
+00762a: 6e20 ba00 2100 |0031: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007630: 0c01 |0034: move-result-object v1
+007632: 6e10 bb00 0100 |0035: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+007638: 0c01 |0038: move-result-object v1
+00763a: 6e20 b100 1000 |0039: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007640: 6200 1000 |003c: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007644: 2201 1700 |003e: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+007648: 7010 b400 0100 |0040: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00764e: 6e20 ba00 4100 |0043: invoke-virtual {v1, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007654: 0c01 |0046: move-result-object v1
+007656: 1a02 0000 |0047: const-string v2, " " // string@0000
+00765a: 6e20 ba00 2100 |0049: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007660: 0c01 |004c: move-result-object v1
+007662: 6e20 b900 5100 |004d: invoke-virtual {v1, v5}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+007668: 0c01 |0050: move-result-object v1
+00766a: 6e10 bb00 0100 |0051: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+007670: 0c01 |0054: move-result-object v1
+007672: 6e20 b100 1000 |0055: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007678: 7120 9b00 7600 |0058: invoke-static {v6, v7}, Linvokecustom/InvokeCustom;.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V // method@009b
+00767e: 2200 0e00 |005b: new-instance v0, Linvokecustom/InvokeCustom; // type@000e
+007682: 7010 9400 0000 |005d: invoke-direct {v0}, Linvokecustom/InvokeCustom;.<init>:()V // method@0094
+007688: 6f30 9a00 8009 |0060: invoke-super {v0, v8, v9}, Linvokecustom/InvokeCustom;.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V // method@009a
+00768e: fa20 c300 0a00 1c00 |0063: invoke-polymorphic {v10, v0}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)V // method@00c3, proto@001c
+007696: 1230 |0067: const/4 v0, #int 3 // #3
+007698: fa20 c300 0b00 0500 |0068: invoke-polymorphic {v11, v0}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (I)Linvokecustom/InvokeCustom; // method@00c3, proto@0005
+0076a0: 0c00 |006c: move-result-object v0
+0076a2: fa20 be00 0c00 1c00 |006d: invoke-polymorphic {v12, v0}, Ljava/lang/invoke/MethodHandle;.invoke:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)V // method@00be, proto@001c
+0076aa: 7100 c900 0000 |0071: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+0076b0: 0c00 |0074: move-result-object v0
+0076b2: 6e10 c800 0000 |0075: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+0076b8: 0c01 |0078: move-result-object v1
+0076ba: 6e40 c700 1054 |0079: invoke-virtual {v0, v1, v4, v5}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+0076c0: 0c00 |007c: move-result-object v0
+0076c2: 2201 1b00 |007d: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+0076c6: 6e20 bd00 5000 |007f: invoke-virtual {v0, v5}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+0076cc: 0c00 |0082: move-result-object v0
+0076ce: 7020 bc00 0100 |0083: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+0076d4: 1101 |0086: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=166
+ 0x003c line=168
+ 0x0058 line=171
+ 0x005b line=172
+ 0x0060 line=173
+ 0x0063 line=176
+ 0x0067 line=178
+ 0x006d line=179
+ 0x0071 line=181
+ 0x0075 line=182
+ 0x007d line=183
+ locals :
+ 0x0000 - 0x0087 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0087 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0087 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0087 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=8 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=9 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=10 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=11 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=12 (null) Ljava/lang/invoke/MethodHandle;
+
+ #7 : (in Linvokecustom/InvokeCustom8;)
+ name : 'checkFieldTest9'
+ type : '(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V'
+ access : 0x0002 (PRIVATE)
+ code -
+ registers : 9
+ ins : 3
+ outs : 3
+ insns size : 82 16-bit code units
+0076d8: |[0076d8] invokecustom.InvokeCustom8.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+0076e8: 1405 0ff0 6a20 |0000: const v5, #float 1.99e-19 // #206af00f
+0076ee: fa20 c300 6700 0100 |0003: invoke-polymorphic {v7, v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)F // method@00c3, proto@0001
+0076f6: 0a00 |0007: move-result v0
+0076f8: fa30 c300 6805 1d00 |0008: invoke-polymorphic {v8, v6, v5}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;F)V // method@00c3, proto@001d
+007700: fa20 c300 6700 0100 |000c: invoke-polymorphic {v7, v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)F // method@00c3, proto@0001
+007708: 0a01 |0010: move-result v1
+00770a: 6202 1000 |0011: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00770e: 2203 1700 |0013: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+007712: 7010 b400 0300 |0015: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+007718: 1a04 5e00 |0018: const-string v4, "checkFieldTest9: old " // string@005e
+00771c: 6e20 ba00 4300 |001a: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007722: 0c03 |001d: move-result-object v3
+007724: 6e20 b600 0300 |001e: invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+00772a: 0c00 |0021: move-result-object v0
+00772c: 1a03 0600 |0022: const-string v3, " new " // string@0006
+007730: 6e20 ba00 3000 |0024: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007736: 0c00 |0027: move-result-object v0
+007738: 6e20 b600 1000 |0028: invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+00773e: 0c00 |002b: move-result-object v0
+007740: 1a03 0500 |002c: const-string v3, " expected " // string@0005
+007744: 6e20 ba00 3000 |002e: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00774a: 0c00 |0031: move-result-object v0
+00774c: 6e20 b600 5000 |0032: invoke-virtual {v0, v5}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+007752: 0c00 |0035: move-result-object v0
+007754: 1a03 0000 |0036: const-string v3, " " // string@0000
+007758: 6e20 ba00 3000 |0038: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00775e: 0c00 |003b: move-result-object v0
+007760: 6e10 bb00 0000 |003c: invoke-virtual {v0}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+007766: 0c00 |003f: move-result-object v0
+007768: 6e20 ab00 0200 |0040: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.print:(Ljava/lang/String;)V // method@00ab
+00776e: 6202 1000 |0043: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007772: 2d00 0105 |0045: cmpl-float v0, v1, v5
+007776: 3900 0800 |0047: if-nez v0, 004f // +0008
+00777a: 1a00 4000 |0049: const-string v0, "OK" // string@0040
+00777e: 6e20 b100 0200 |004b: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007784: 0e00 |004e: return-void
+007786: 1a00 1000 |004f: const-string v0, "ERROR" // string@0010
+00778a: 28fa |0051: goto 004b // -0006
+ catches : (none)
+ positions :
+ 0x0003 line=116
+ 0x0008 line=117
+ 0x000c line=118
+ 0x0011 line=119
+ 0x0043 line=121
+ 0x004e line=122
+ 0x004f line=121
+ locals :
+ 0x0000 - 0x0052 reg=6 this Linvokecustom/InvokeCustom8;
+ 0x0000 - 0x0052 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0052 reg=8 (null) Ljava/lang/invoke/MethodHandle;
+
+ #8 : (in Linvokecustom/InvokeCustom8;)
+ name : 'checkStaticFieldTest9'
+ type : '(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 8
+ ins : 2
+ outs : 2
+ insns size : 80 16-bit code units
+00778c: |[00778c] invokecustom.InvokeCustom8.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+00779c: 1405 1032 5476 |0000: const v5, #float 1.07596e+33 // #76543210
+0077a2: fa10 c300 0600 0200 |0003: invoke-polymorphic {v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, ()I // method@00c3, proto@0002
+0077aa: 0a00 |0007: move-result v0
+0077ac: fa20 c300 5700 1a00 |0008: invoke-polymorphic {v7, v5}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (I)V // method@00c3, proto@001a
+0077b4: fa10 c300 0600 0200 |000c: invoke-polymorphic {v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, ()I // method@00c3, proto@0002
+0077bc: 0a01 |0010: move-result v1
+0077be: 6202 1000 |0011: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0077c2: 2203 1700 |0013: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+0077c6: 7010 b400 0300 |0015: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0077cc: 1a04 6000 |0018: const-string v4, "checkStaticFieldTest9: old " // string@0060
+0077d0: 6e20 ba00 4300 |001a: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0077d6: 0c03 |001d: move-result-object v3
+0077d8: 6e20 b700 0300 |001e: invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+0077de: 0c00 |0021: move-result-object v0
+0077e0: 1a03 0600 |0022: const-string v3, " new " // string@0006
+0077e4: 6e20 ba00 3000 |0024: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0077ea: 0c00 |0027: move-result-object v0
+0077ec: 6e20 b700 1000 |0028: invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+0077f2: 0c00 |002b: move-result-object v0
+0077f4: 1a03 0500 |002c: const-string v3, " expected " // string@0005
+0077f8: 6e20 ba00 3000 |002e: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0077fe: 0c00 |0031: move-result-object v0
+007800: 6e20 b700 5000 |0032: invoke-virtual {v0, v5}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+007806: 0c00 |0035: move-result-object v0
+007808: 1a03 0000 |0036: const-string v3, " " // string@0000
+00780c: 6e20 ba00 3000 |0038: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007812: 0c00 |003b: move-result-object v0
+007814: 6e10 bb00 0000 |003c: invoke-virtual {v0}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00781a: 0c00 |003f: move-result-object v0
+00781c: 6e20 ab00 0200 |0040: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.print:(Ljava/lang/String;)V // method@00ab
+007822: 6202 1000 |0043: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007826: 3351 0800 |0045: if-ne v1, v5, 004d // +0008
+00782a: 1a00 4000 |0047: const-string v0, "OK" // string@0040
+00782e: 6e20 b100 0200 |0049: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007834: 0e00 |004c: return-void
+007836: 1a00 1000 |004d: const-string v0, "ERROR" // string@0010
+00783a: 28fa |004f: goto 0049 // -0006
+ catches : (none)
+ positions :
+ 0x0003 line=103
+ 0x0008 line=104
+ 0x000c line=105
+ 0x0011 line=106
+ 0x0043 line=108
+ 0x004c line=109
+ 0x004d line=108
+ locals :
+ 0x0000 - 0x0050 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0050 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+
+ #9 : (in Linvokecustom/InvokeCustom8;)
+ name : 'targetMethodTest1'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+00783c: |[00783c] invokecustom.InvokeCustom8.targetMethodTest1:()V
+00784c: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007850: 1a01 1500 |0002: const-string v1, "Hello World!" // string@0015
+007854: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00785a: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=41
+ 0x0007 line=42
+ locals :
+
+ #10 : (in Linvokecustom/InvokeCustom8;)
+ name : 'targetMethodTest2'
+ type : '(ZBCSIFJDLjava/lang/String;)V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 13
+ ins : 11
+ outs : 3
+ insns size : 46 16-bit code units
+00785c: |[00785c] invokecustom.InvokeCustom8.targetMethodTest2:(ZBCSIFJDLjava/lang/String;)V
+00786c: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007870: 6e20 b200 2000 |0002: invoke-virtual {v0, v2}, Ljava/io/PrintStream;.println:(Z)V // method@00b2
+007876: 6200 1000 |0005: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00787a: 6e20 af00 3000 |0007: invoke-virtual {v0, v3}, Ljava/io/PrintStream;.println:(I)V // method@00af
+007880: 6200 1000 |000a: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007884: 6e20 ac00 4000 |000c: invoke-virtual {v0, v4}, Ljava/io/PrintStream;.println:(C)V // method@00ac
+00788a: 6200 1000 |000f: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00788e: 6e20 af00 5000 |0011: invoke-virtual {v0, v5}, Ljava/io/PrintStream;.println:(I)V // method@00af
+007894: 6200 1000 |0014: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007898: 6e20 af00 6000 |0016: invoke-virtual {v0, v6}, Ljava/io/PrintStream;.println:(I)V // method@00af
+00789e: 6200 1000 |0019: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0078a2: 6e20 ae00 7000 |001b: invoke-virtual {v0, v7}, Ljava/io/PrintStream;.println:(F)V // method@00ae
+0078a8: 6200 1000 |001e: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0078ac: 6e30 b000 8009 |0020: invoke-virtual {v0, v8, v9}, Ljava/io/PrintStream;.println:(J)V // method@00b0
+0078b2: 6200 1000 |0023: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0078b6: 6e30 ad00 a00b |0025: invoke-virtual {v0, v10, v11}, Ljava/io/PrintStream;.println:(D)V // method@00ad
+0078bc: 6200 1000 |0028: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0078c0: 6e20 b100 c000 |002a: invoke-virtual {v0, v12}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0078c6: 0e00 |002d: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=46
+ 0x0005 line=47
+ 0x000a line=48
+ 0x000f line=49
+ 0x0014 line=50
+ 0x0019 line=51
+ 0x001e line=52
+ 0x0023 line=53
+ 0x0028 line=54
+ 0x002d line=55
+ locals :
+ 0x0000 - 0x002e reg=2 (null) Z
+ 0x0000 - 0x002e reg=3 (null) B
+ 0x0000 - 0x002e reg=4 (null) C
+ 0x0000 - 0x002e reg=5 (null) S
+ 0x0000 - 0x002e reg=6 (null) I
+ 0x0000 - 0x002e reg=7 (null) F
+ 0x0000 - 0x002e reg=8 (null) J
+ 0x0000 - 0x002e reg=10 (null) D
+ 0x0000 - 0x002e reg=12 (null) Ljava/lang/String;
+
+ #11 : (in Linvokecustom/InvokeCustom8;)
+ name : 'targetMethodTest3'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+0078c8: |[0078c8] invokecustom.InvokeCustom8.targetMethodTest3:()V
+0078d8: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0078dc: 1a01 7300 |0002: const-string v1, "targetMethodTest3 from InvokeCustom" // string@0073
+0078e0: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0078e6: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=58
+ 0x0007 line=59
+ locals :
+
+ #12 : (in Linvokecustom/InvokeCustom8;)
+ name : 'targetMethodTest5'
+ type : '(III)I'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 7
+ ins : 3
+ outs : 2
+ insns size : 83 16-bit code units
+0078e8: |[0078e8] invokecustom.InvokeCustom8.targetMethodTest5:(III)I
+0078f8: 9000 0405 |0000: add-int v0, v4, v5
+0078fc: 6201 1000 |0002: sget-object v1, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007900: 2202 1700 |0004: new-instance v2, Ljava/lang/StringBuilder; // type@0017
+007904: 7010 b400 0200 |0006: invoke-direct {v2}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00790a: 1a03 7800 |0009: const-string v3, "targetMethodTest5 " // string@0078
+00790e: 6e20 ba00 3200 |000b: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007914: 0c02 |000e: move-result-object v2
+007916: 6e20 b700 4200 |000f: invoke-virtual {v2, v4}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+00791c: 0c02 |0012: move-result-object v2
+00791e: 1a03 0300 |0013: const-string v3, " + " // string@0003
+007922: 6e20 ba00 3200 |0015: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007928: 0c02 |0018: move-result-object v2
+00792a: 6e20 b700 5200 |0019: invoke-virtual {v2, v5}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+007930: 0c02 |001c: move-result-object v2
+007932: 1a03 0400 |001d: const-string v3, " = " // string@0004
+007936: 6e20 ba00 3200 |001f: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00793c: 0c02 |0022: move-result-object v2
+00793e: 6e20 b700 0200 |0023: invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+007944: 0c02 |0026: move-result-object v2
+007946: 6e10 bb00 0200 |0027: invoke-virtual {v2}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00794c: 0c02 |002a: move-result-object v2
+00794e: 6e20 b100 2100 |002b: invoke-virtual {v1, v2}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007954: 3260 2400 |002e: if-eq v0, v6, 0052 // +0024
+007958: 6201 1000 |0030: sget-object v1, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00795c: 2202 1700 |0032: new-instance v2, Ljava/lang/StringBuilder; // type@0017
+007960: 7010 b400 0200 |0034: invoke-direct {v2}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+007966: 1a03 1300 |0037: const-string v3, "Failed " // string@0013
+00796a: 6e20 ba00 3200 |0039: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007970: 0c02 |003c: move-result-object v2
+007972: 6e20 b700 0200 |003d: invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+007978: 0c02 |0040: move-result-object v2
+00797a: 1a03 0100 |0041: const-string v3, " != " // string@0001
+00797e: 6e20 ba00 3200 |0043: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007984: 0c02 |0046: move-result-object v2
+007986: 6e20 b700 6200 |0047: invoke-virtual {v2, v6}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+00798c: 0c02 |004a: move-result-object v2
+00798e: 6e10 bb00 0200 |004b: invoke-virtual {v2}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+007994: 0c02 |004e: move-result-object v2
+007996: 6e20 b100 2100 |004f: invoke-virtual {v1, v2}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00799c: 0f00 |0052: return v0
+ catches : (none)
+ positions :
+ 0x0000 line=68
+ 0x0002 line=69
+ 0x002e line=70
+ 0x0030 line=71
+ 0x0052 line=73
+ locals :
+ 0x0000 - 0x0053 reg=4 (null) I
+ 0x0000 - 0x0053 reg=5 (null) I
+ 0x0000 - 0x0053 reg=6 (null) I
+
+ #13 : (in Linvokecustom/InvokeCustom8;)
+ name : 'targetMethodTest6'
+ type : '(JJJ)J'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 12
+ ins : 6
+ outs : 3
+ insns size : 85 16-bit code units
+0079a0: |[0079a0] invokecustom.InvokeCustom8.targetMethodTest6:(JJJ)J
+0079b0: 9b00 0608 |0000: add-long v0, v6, v8
+0079b4: 6202 1000 |0002: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0079b8: 2203 1700 |0004: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+0079bc: 7010 b400 0300 |0006: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0079c2: 1a04 7b00 |0009: const-string v4, "targetMethodTest6 " // string@007b
+0079c6: 6e20 ba00 4300 |000b: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0079cc: 0c03 |000e: move-result-object v3
+0079ce: 6e30 b800 6307 |000f: invoke-virtual {v3, v6, v7}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+0079d4: 0c03 |0012: move-result-object v3
+0079d6: 1a04 0300 |0013: const-string v4, " + " // string@0003
+0079da: 6e20 ba00 4300 |0015: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0079e0: 0c03 |0018: move-result-object v3
+0079e2: 6e30 b800 8309 |0019: invoke-virtual {v3, v8, v9}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+0079e8: 0c03 |001c: move-result-object v3
+0079ea: 1a04 0400 |001d: const-string v4, " = " // string@0004
+0079ee: 6e20 ba00 4300 |001f: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0079f4: 0c03 |0022: move-result-object v3
+0079f6: 6e30 b800 0301 |0023: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+0079fc: 0c03 |0026: move-result-object v3
+0079fe: 6e10 bb00 0300 |0027: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+007a04: 0c03 |002a: move-result-object v3
+007a06: 6e20 b100 3200 |002b: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007a0c: 3102 000a |002e: cmp-long v2, v0, v10
+007a10: 3802 2400 |0030: if-eqz v2, 0054 // +0024
+007a14: 6202 1000 |0032: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007a18: 2203 1700 |0034: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+007a1c: 7010 b400 0300 |0036: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+007a22: 1a04 1300 |0039: const-string v4, "Failed " // string@0013
+007a26: 6e20 ba00 4300 |003b: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007a2c: 0c03 |003e: move-result-object v3
+007a2e: 6e30 b800 0301 |003f: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+007a34: 0c03 |0042: move-result-object v3
+007a36: 1a04 0100 |0043: const-string v4, " != " // string@0001
+007a3a: 6e20 ba00 4300 |0045: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007a40: 0c03 |0048: move-result-object v3
+007a42: 6e30 b800 a30b |0049: invoke-virtual {v3, v10, v11}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+007a48: 0c03 |004c: move-result-object v3
+007a4a: 6e10 bb00 0300 |004d: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+007a50: 0c03 |0050: move-result-object v3
+007a52: 6e20 b100 3200 |0051: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007a58: 1000 |0054: return-wide v0
+ catches : (none)
+ positions :
+ 0x0000 line=77
+ 0x0002 line=78
+ 0x002e line=79
+ 0x0032 line=80
+ 0x0054 line=82
+ locals :
+ 0x0000 - 0x0055 reg=6 (null) J
+ 0x0000 - 0x0055 reg=8 (null) J
+ 0x0000 - 0x0055 reg=10 (null) J
+
+ #14 : (in Linvokecustom/InvokeCustom8;)
+ name : 'targetMethodTest7'
+ type : '(FFD)D'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 10
+ ins : 4
+ outs : 3
+ insns size : 86 16-bit code units
+007a5c: |[007a5c] invokecustom.InvokeCustom8.targetMethodTest7:(FFD)D
+007a6c: a800 0607 |0000: mul-float v0, v6, v7
+007a70: 8900 |0002: float-to-double v0, v0
+007a72: 6202 1000 |0003: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007a76: 2203 1700 |0005: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+007a7a: 7010 b400 0300 |0007: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+007a80: 1a04 7e00 |000a: const-string v4, "targetMethodTest7 " // string@007e
+007a84: 6e20 ba00 4300 |000c: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007a8a: 0c03 |000f: move-result-object v3
+007a8c: 6e20 b600 6300 |0010: invoke-virtual {v3, v6}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+007a92: 0c03 |0013: move-result-object v3
+007a94: 1a04 0200 |0014: const-string v4, " * " // string@0002
+007a98: 6e20 ba00 4300 |0016: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007a9e: 0c03 |0019: move-result-object v3
+007aa0: 6e20 b600 7300 |001a: invoke-virtual {v3, v7}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+007aa6: 0c03 |001d: move-result-object v3
+007aa8: 1a04 0400 |001e: const-string v4, " = " // string@0004
+007aac: 6e20 ba00 4300 |0020: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007ab2: 0c03 |0023: move-result-object v3
+007ab4: 6e30 b500 0301 |0024: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+007aba: 0c03 |0027: move-result-object v3
+007abc: 6e10 bb00 0300 |0028: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+007ac2: 0c03 |002b: move-result-object v3
+007ac4: 6e20 b100 3200 |002c: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007aca: 2f02 0008 |002f: cmpl-double v2, v0, v8
+007ace: 3802 2400 |0031: if-eqz v2, 0055 // +0024
+007ad2: 6202 1000 |0033: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007ad6: 2203 1700 |0035: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+007ada: 7010 b400 0300 |0037: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+007ae0: 1a04 1300 |003a: const-string v4, "Failed " // string@0013
+007ae4: 6e20 ba00 4300 |003c: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007aea: 0c03 |003f: move-result-object v3
+007aec: 6e30 b500 0301 |0040: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+007af2: 0c03 |0043: move-result-object v3
+007af4: 1a04 0100 |0044: const-string v4, " != " // string@0001
+007af8: 6e20 ba00 4300 |0046: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007afe: 0c03 |0049: move-result-object v3
+007b00: 6e30 b500 8309 |004a: invoke-virtual {v3, v8, v9}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+007b06: 0c03 |004d: move-result-object v3
+007b08: 6e10 bb00 0300 |004e: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+007b0e: 0c03 |0051: move-result-object v3
+007b10: 6e20 b100 3200 |0052: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007b16: 1000 |0055: return-wide v0
+ catches : (none)
+ positions :
+ 0x0000 line=86
+ 0x0003 line=87
+ 0x002f line=88
+ 0x0033 line=89
+ 0x0055 line=91
+ locals :
+ 0x0000 - 0x0056 reg=6 (null) F
+ 0x0000 - 0x0056 reg=7 (null) F
+ 0x0000 - 0x0056 reg=8 (null) D
+
+ #15 : (in Linvokecustom/InvokeCustom8;)
+ name : 'targetMethodTest8'
+ type : '(Ljava/lang/String;)V'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 4
+ ins : 1
+ outs : 2
+ insns size : 25 16-bit code units
+007b18: |[007b18] invokecustom.InvokeCustom8.targetMethodTest8:(Ljava/lang/String;)V
+007b28: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007b2c: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+007b30: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+007b36: 1a02 8000 |0007: const-string v2, "targetMethodTest8 " // string@0080
+007b3a: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007b40: 0c01 |000c: move-result-object v1
+007b42: 6e20 ba00 3100 |000d: invoke-virtual {v1, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007b48: 0c01 |0010: move-result-object v1
+007b4a: 6e10 bb00 0100 |0011: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+007b50: 0c01 |0014: move-result-object v1
+007b52: 6e20 b100 1000 |0015: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007b58: 0e00 |0018: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=95
+ 0x0018 line=96
+ locals :
+ 0x0000 - 0x0019 reg=3 (null) Ljava/lang/String;
+
+ #16 : (in Linvokecustom/InvokeCustom8;)
+ name : 'targetMethodTest9'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+007b5c: |[007b5c] invokecustom.InvokeCustom8.targetMethodTest9:()V
+007b6c: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007b70: 1a01 8200 |0002: const-string v1, "targetMethodTest9()" // string@0082
+007b74: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007b7a: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=129
+ 0x0007 line=130
+ locals :
+
+ #17 : (in Linvokecustom/InvokeCustom8;)
+ name : 'test8'
+ type : '()V'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 1
+ ins : 0
+ outs : 1
+ insns size : 16 16-bit code units
+007b7c: |[007b7c] invokecustom.InvokeCustom8.test8:()V
+007b8c: 1a00 1400 |0000: const-string v0, "First invokedynamic invocation" // string@0014
+007b90: fc10 0600 0000 |0002: invoke-custom {v0}, call_site@0006
+007b96: 1a00 4200 |0005: const-string v0, "Second invokedynamic invocation" // string@0042
+007b9a: fc10 0700 0000 |0007: invoke-custom {v0}, call_site@0007
+007ba0: 1a00 0f00 |000a: const-string v0, "Dupe first invokedynamic invocation" // string@000f
+007ba4: fc10 0800 0000 |000c: invoke-custom {v0}, call_site@0008
+007baa: 0e00 |000f: return-void
+ catches : (none)
+ positions :
+ locals :
+
+ Virtual methods -
+ #0 : (in Linvokecustom/InvokeCustom8;)
+ name : 'helperMethodTest9'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 4
+ ins : 1
+ outs : 2
+ insns size : 27 16-bit code units
+007bac: |[007bac] invokecustom.InvokeCustom8.helperMethodTest9:()V
+007bbc: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007bc0: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+007bc4: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+007bca: 1a02 6400 |0007: const-string v2, "helperMethodTest9 in " // string@0064
+007bce: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007bd4: 0c01 |000c: move-result-object v1
+007bd6: 1c02 0e00 |000d: const-class v2, Linvokecustom/InvokeCustom; // type@000e
+007bda: 6e20 b900 2100 |000f: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+007be0: 0c01 |0012: move-result-object v1
+007be2: 6e10 bb00 0100 |0013: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+007be8: 0c01 |0016: move-result-object v1
+007bea: 6e20 b100 1000 |0017: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007bf0: 0e00 |001a: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=125
+ 0x001a line=126
+ locals :
+ 0x0000 - 0x001b reg=3 this Linvokecustom/InvokeCustom8;
+
+ #1 : (in Linvokecustom/InvokeCustom8;)
+ name : 'run'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 3
+ ins : 1
+ outs : 2
+ insns size : 8 16-bit code units
+007bf4: |[007bf4] invokecustom.InvokeCustom8.run:()V
+007c04: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007c08: 1a01 6e00 |0002: const-string v1, "run() for Test9" // string@006e
+007c0c: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007c12: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=133
+ 0x0007 line=134
+ locals :
+ 0x0000 - 0x0008 reg=2 this Linvokecustom/InvokeCustom8;
+
+ #2 : (in Linvokecustom/InvokeCustom8;)
+ name : 'targetMethodTest4'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 3
+ ins : 1
+ outs : 2
+ insns size : 8 16-bit code units
+007c14: |[007c14] invokecustom.InvokeCustom8.targetMethodTest4:()V
+007c24: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007c28: 1a01 7500 |0002: const-string v1, "targetMethodTest4 from InvokeCustom (oops!)" // string@0075
+007c2c: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007c32: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=64
+ 0x0007 line=65
+ locals :
+ 0x0000 - 0x0008 reg=2 this Linvokecustom/InvokeCustom8;
+
+ source_file_idx : 25 (InvokeCustom.java)
+
+Class #8 -
+ Class descriptor : 'Linvokecustom/InvokeCustom;'
+ Access flags : 0x0001 (PUBLIC)
+ Superclass : 'Linvokecustom/Super;'
+ Interfaces -
+ #0 : 'Ljava/lang/Runnable;'
+ Static fields -
+ #0 : (in Linvokecustom/InvokeCustom;)
+ name : 'staticFieldTest9'
+ type : 'I'
+ access : 0x000a (PRIVATE STATIC)
+ Instance fields -
+ #0 : (in Linvokecustom/InvokeCustom;)
+ name : 'fieldTest9'
+ type : 'F'
+ access : 0x0002 (PRIVATE)
+ Direct methods -
+ #0 : (in Linvokecustom/InvokeCustom;)
+ name : '<clinit>'
+ type : '()V'
+ access : 0x10008 (STATIC CONSTRUCTOR)
+ code -
+ registers : 1
+ ins : 0
+ outs : 0
+ insns size : 4 16-bit code units
+007c34: |[007c34] invokecustom.InvokeCustom.<clinit>:()V
+007c44: 1200 |0000: const/4 v0, #int 0 // #0
+007c46: 6700 0f00 |0001: sput v0, Linvokecustom/InvokeCustom;.staticFieldTest9:I // field@000f
+007c4a: 0e00 |0003: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=98
+ locals :
+
+ #1 : (in Linvokecustom/InvokeCustom;)
+ name : '<init>'
+ type : '()V'
+ access : 0x10001 (PUBLIC CONSTRUCTOR)
+ code -
+ registers : 2
+ ins : 1
+ outs : 1
+ insns size : 7 16-bit code units
+007c4c: |[007c4c] invokecustom.InvokeCustom.<init>:()V
+007c5c: 7010 a800 0100 |0000: invoke-direct {v1}, Linvokecustom/Super;.<init>:()V // method@00a8
+007c62: 1200 |0003: const/4 v0, #int 0 // #0
+007c64: 5910 0e00 |0004: iput v0, v1, Linvokecustom/InvokeCustom;.fieldTest9:F // field@000e
+007c68: 0e00 |0006: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=35
+ 0x0003 line=111
+ 0x0006 line=35
+ locals :
+ 0x0000 - 0x0007 reg=1 this Linvokecustom/InvokeCustom;
+
+ #2 : (in Linvokecustom/InvokeCustom;)
+ name : '<init>'
+ type : '(I)V'
+ access : 0x10001 (PUBLIC CONSTRUCTOR)
+ code -
+ registers : 5
+ ins : 2
+ outs : 2
+ insns size : 37 16-bit code units
+007c6c: |[007c6c] invokecustom.InvokeCustom.<init>:(I)V
+007c7c: 7010 a800 0300 |0000: invoke-direct {v3}, Linvokecustom/Super;.<init>:()V // method@00a8
+007c82: 1200 |0003: const/4 v0, #int 0 // #0
+007c84: 5930 0e00 |0004: iput v0, v3, Linvokecustom/InvokeCustom;.fieldTest9:F // field@000e
+007c88: 6200 1000 |0006: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007c8c: 2201 1700 |0008: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+007c90: 7010 b400 0100 |000a: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+007c96: 1a02 1800 |000d: const-string v2, "InvokeCustom.<init>(" // string@0018
+007c9a: 6e20 ba00 2100 |000f: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007ca0: 0c01 |0012: move-result-object v1
+007ca2: 6e20 b700 4100 |0013: invoke-virtual {v1, v4}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+007ca8: 0c01 |0016: move-result-object v1
+007caa: 1a02 0700 |0017: const-string v2, ")" // string@0007
+007cae: 6e20 ba00 2100 |0019: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007cb4: 0c01 |001c: move-result-object v1
+007cb6: 6e10 bb00 0100 |001d: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+007cbc: 0c01 |0020: move-result-object v1
+007cbe: 6e20 b100 1000 |0021: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007cc4: 0e00 |0024: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=36
+ 0x0003 line=111
+ 0x0006 line=37
+ 0x0024 line=38
+ locals :
+ 0x0000 - 0x0025 reg=3 this Linvokecustom/InvokeCustom;
+ 0x0000 - 0x0025 reg=4 (null) I
+
+ #3 : (in Linvokecustom/InvokeCustom;)
+ name : 'bsmCreateCallSite'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 7
+ ins : 4
+ outs : 2
+ insns size : 36 16-bit code units
+007cc8: |[007cc8] invokecustom.InvokeCustom.bsmCreateCallSite:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+007cd8: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007cdc: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+007ce0: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+007ce6: 1a02 5600 |0007: const-string v2, "bsmCreateCallSite [" // string@0056
+007cea: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007cf0: 0c01 |000c: move-result-object v1
+007cf2: 6e20 b900 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+007cf8: 0c01 |0010: move-result-object v1
+007cfa: 1a02 5200 |0011: const-string v2, "]" // string@0052
+007cfe: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007d04: 0c01 |0016: move-result-object v1
+007d06: 6e10 bb00 0100 |0017: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+007d0c: 0c01 |001a: move-result-object v1
+007d0e: 6e20 b100 1000 |001b: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007d14: 2200 1b00 |001e: new-instance v0, Ljava/lang/invoke/ConstantCallSite; // type@001b
+007d18: 7020 bc00 6000 |0020: invoke-direct {v0, v6}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+007d1e: 1100 |0023: return-object v0
+ catches : (none)
+ positions :
+ 0x0000 line=156
+ 0x001e line=157
+ locals :
+ 0x0000 - 0x0024 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0024 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0024 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0024 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+
+ #4 : (in Linvokecustom/InvokeCustom;)
+ name : 'bsmLookupStatic'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 5
+ ins : 3
+ outs : 4
+ insns size : 29 16-bit code units
+007d20: |[007d20] invokecustom.InvokeCustom.bsmLookupStatic:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
+007d30: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007d34: 1a01 5800 |0002: const-string v1, "bsmLookupStatic []" // string@0058
+007d38: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007d3e: 7100 c900 0000 |0007: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+007d44: 0c00 |000a: move-result-object v0
+007d46: 6e10 c800 0000 |000b: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+007d4c: 0c01 |000e: move-result-object v1
+007d4e: 6e40 c700 1043 |000f: invoke-virtual {v0, v1, v3, v4}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+007d54: 0c00 |0012: move-result-object v0
+007d56: 2201 1b00 |0013: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+007d5a: 6e20 bd00 4000 |0015: invoke-virtual {v0, v4}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+007d60: 0c00 |0018: move-result-object v0
+007d62: 7020 bc00 0100 |0019: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+007d68: 1101 |001c: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=138
+ 0x0007 line=139
+ 0x000b line=140
+ 0x0013 line=141
+ locals :
+ 0x0000 - 0x001d reg=2 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x001d reg=3 (null) Ljava/lang/String;
+ 0x0000 - 0x001d reg=4 (null) Ljava/lang/invoke/MethodType;
+
+ #5 : (in Linvokecustom/InvokeCustom;)
+ name : 'bsmLookupStaticWithExtraArgs'
+ type : '(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 12
+ ins : 9
+ outs : 4
+ insns size : 82 16-bit code units
+007d6c: |[007d6c] invokecustom.InvokeCustom.bsmLookupStaticWithExtraArgs:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;
+007d7c: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007d80: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+007d84: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+007d8a: 1a02 5a00 |0007: const-string v2, "bsmLookupStaticWithExtraArgs [" // string@005a
+007d8e: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007d94: 0c01 |000c: move-result-object v1
+007d96: 6e20 b700 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+007d9c: 0c01 |0010: move-result-object v1
+007d9e: 1a02 0800 |0011: const-string v2, ", " // string@0008
+007da2: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007da8: 0c01 |0016: move-result-object v1
+007daa: 6e30 b800 7108 |0017: invoke-virtual {v1, v7, v8}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+007db0: 0c01 |001a: move-result-object v1
+007db2: 1a02 0800 |001b: const-string v2, ", " // string@0008
+007db6: 6e20 ba00 2100 |001d: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007dbc: 0c01 |0020: move-result-object v1
+007dbe: 6e20 b600 9100 |0021: invoke-virtual {v1, v9}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+007dc4: 0c01 |0024: move-result-object v1
+007dc6: 1a02 0800 |0025: const-string v2, ", " // string@0008
+007dca: 6e20 ba00 2100 |0027: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007dd0: 0c01 |002a: move-result-object v1
+007dd2: 6e30 b500 a10b |002b: invoke-virtual {v1, v10, v11}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+007dd8: 0c01 |002e: move-result-object v1
+007dda: 1a02 5200 |002f: const-string v2, "]" // string@0052
+007dde: 6e20 ba00 2100 |0031: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007de4: 0c01 |0034: move-result-object v1
+007de6: 6e10 bb00 0100 |0035: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+007dec: 0c01 |0038: move-result-object v1
+007dee: 6e20 b100 1000 |0039: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007df4: 7100 c900 0000 |003c: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+007dfa: 0c00 |003f: move-result-object v0
+007dfc: 6e10 c800 0000 |0040: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+007e02: 0c01 |0043: move-result-object v1
+007e04: 6e40 c700 1054 |0044: invoke-virtual {v0, v1, v4, v5}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+007e0a: 0c00 |0047: move-result-object v0
+007e0c: 2201 1b00 |0048: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+007e10: 6e20 bd00 5000 |004a: invoke-virtual {v0, v5}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+007e16: 0c00 |004d: move-result-object v0
+007e18: 7020 bc00 0100 |004e: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+007e1e: 1101 |0051: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=147
+ 0x003c line=148
+ 0x0040 line=149
+ 0x0048 line=150
+ locals :
+ 0x0000 - 0x0052 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0052 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0052 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0052 reg=6 (null) I
+ 0x0000 - 0x0052 reg=7 (null) J
+ 0x0000 - 0x0052 reg=9 (null) F
+ 0x0000 - 0x0052 reg=10 (null) D
+
+ #6 : (in Linvokecustom/InvokeCustom;)
+ name : 'bsmLookupTest9'
+ type : '(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;'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 13
+ ins : 10
+ outs : 4
+ insns size : 135 16-bit code units
+007e20: |[007e20] 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;
+007e30: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007e34: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+007e38: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+007e3e: 1a02 5c00 |0007: const-string v2, "bsmLookupTest9 [" // string@005c
+007e42: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007e48: 0c01 |000c: move-result-object v1
+007e4a: 6e20 b900 6100 |000d: invoke-virtual {v1, v6}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+007e50: 0c01 |0010: move-result-object v1
+007e52: 1a02 0800 |0011: const-string v2, ", " // string@0008
+007e56: 6e20 ba00 2100 |0013: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007e5c: 0c01 |0016: move-result-object v1
+007e5e: 6e20 b900 7100 |0017: invoke-virtual {v1, v7}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+007e64: 0c01 |001a: move-result-object v1
+007e66: 1a02 0800 |001b: const-string v2, ", " // string@0008
+007e6a: 6e20 ba00 2100 |001d: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007e70: 0c01 |0020: move-result-object v1
+007e72: 6e20 b900 8100 |0021: invoke-virtual {v1, v8}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+007e78: 0c01 |0024: move-result-object v1
+007e7a: 1a02 0800 |0025: const-string v2, ", " // string@0008
+007e7e: 6e20 ba00 2100 |0027: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007e84: 0c01 |002a: move-result-object v1
+007e86: 6e20 b900 9100 |002b: invoke-virtual {v1, v9}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+007e8c: 0c01 |002e: move-result-object v1
+007e8e: 1a02 5200 |002f: const-string v2, "]" // string@0052
+007e92: 6e20 ba00 2100 |0031: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007e98: 0c01 |0034: move-result-object v1
+007e9a: 6e10 bb00 0100 |0035: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+007ea0: 0c01 |0038: move-result-object v1
+007ea2: 6e20 b100 1000 |0039: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007ea8: 6200 1000 |003c: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007eac: 2201 1700 |003e: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+007eb0: 7010 b400 0100 |0040: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+007eb6: 6e20 ba00 4100 |0043: invoke-virtual {v1, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007ebc: 0c01 |0046: move-result-object v1
+007ebe: 1a02 0000 |0047: const-string v2, " " // string@0000
+007ec2: 6e20 ba00 2100 |0049: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007ec8: 0c01 |004c: move-result-object v1
+007eca: 6e20 b900 5100 |004d: invoke-virtual {v1, v5}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+007ed0: 0c01 |0050: move-result-object v1
+007ed2: 6e10 bb00 0100 |0051: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+007ed8: 0c01 |0054: move-result-object v1
+007eda: 6e20 b100 1000 |0055: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007ee0: 7120 9b00 7600 |0058: invoke-static {v6, v7}, Linvokecustom/InvokeCustom;.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V // method@009b
+007ee6: 2200 0e00 |005b: new-instance v0, Linvokecustom/InvokeCustom; // type@000e
+007eea: 7010 9400 0000 |005d: invoke-direct {v0}, Linvokecustom/InvokeCustom;.<init>:()V // method@0094
+007ef0: 7030 9a00 8009 |0060: invoke-direct {v0, v8, v9}, Linvokecustom/InvokeCustom;.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V // method@009a
+007ef6: fa20 c300 0a00 1c00 |0063: invoke-polymorphic {v10, v0}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)V // method@00c3, proto@001c
+007efe: 1230 |0067: const/4 v0, #int 3 // #3
+007f00: fa20 c300 0b00 0500 |0068: invoke-polymorphic {v11, v0}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (I)Linvokecustom/InvokeCustom; // method@00c3, proto@0005
+007f08: 0c00 |006c: move-result-object v0
+007f0a: fa20 be00 0c00 1c00 |006d: invoke-polymorphic {v12, v0}, Ljava/lang/invoke/MethodHandle;.invoke:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)V // method@00be, proto@001c
+007f12: 7100 c900 0000 |0071: invoke-static {}, Ljava/lang/invoke/MethodHandles;.lookup:()Ljava/lang/invoke/MethodHandles$Lookup; // method@00c9
+007f18: 0c00 |0074: move-result-object v0
+007f1a: 6e10 c800 0000 |0075: invoke-virtual {v0}, Ljava/lang/invoke/MethodHandles$Lookup;.lookupClass:()Ljava/lang/Class; // method@00c8
+007f20: 0c01 |0078: move-result-object v1
+007f22: 6e40 c700 1054 |0079: invoke-virtual {v0, v1, v4, v5}, Ljava/lang/invoke/MethodHandles$Lookup;.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00c7
+007f28: 0c00 |007c: move-result-object v0
+007f2a: 2201 1b00 |007d: new-instance v1, Ljava/lang/invoke/ConstantCallSite; // type@001b
+007f2e: 6e20 bd00 5000 |007f: invoke-virtual {v0, v5}, Ljava/lang/invoke/MethodHandle;.asType:(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; // method@00bd
+007f34: 0c00 |0082: move-result-object v0
+007f36: 7020 bc00 0100 |0083: invoke-direct {v1, v0}, Ljava/lang/invoke/ConstantCallSite;.<init>:(Ljava/lang/invoke/MethodHandle;)V // method@00bc
+007f3c: 1101 |0086: return-object v1
+ catches : (none)
+ positions :
+ 0x0000 line=166
+ 0x003c line=168
+ 0x0058 line=171
+ 0x005b line=172
+ 0x0060 line=173
+ 0x0063 line=176
+ 0x0067 line=178
+ 0x006d line=179
+ 0x0071 line=181
+ 0x0075 line=182
+ 0x007d line=183
+ locals :
+ 0x0000 - 0x0087 reg=3 (null) Ljava/lang/invoke/MethodHandles$Lookup;
+ 0x0000 - 0x0087 reg=4 (null) Ljava/lang/String;
+ 0x0000 - 0x0087 reg=5 (null) Ljava/lang/invoke/MethodType;
+ 0x0000 - 0x0087 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=8 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=9 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=10 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=11 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0087 reg=12 (null) Ljava/lang/invoke/MethodHandle;
+
+ #7 : (in Linvokecustom/InvokeCustom;)
+ name : 'checkFieldTest9'
+ type : '(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V'
+ access : 0x0002 (PRIVATE)
+ code -
+ registers : 9
+ ins : 3
+ outs : 3
+ insns size : 82 16-bit code units
+007f40: |[007f40] invokecustom.InvokeCustom.checkFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+007f50: 1405 0ff0 6a20 |0000: const v5, #float 1.99e-19 // #206af00f
+007f56: fa20 c300 6700 0100 |0003: invoke-polymorphic {v7, v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)F // method@00c3, proto@0001
+007f5e: 0a00 |0007: move-result v0
+007f60: fa30 c300 6805 1d00 |0008: invoke-polymorphic {v8, v6, v5}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;F)V // method@00c3, proto@001d
+007f68: fa20 c300 6700 0100 |000c: invoke-polymorphic {v7, v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Linvokecustom/InvokeCustom;)F // method@00c3, proto@0001
+007f70: 0a01 |0010: move-result v1
+007f72: 6202 1000 |0011: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007f76: 2203 1700 |0013: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+007f7a: 7010 b400 0300 |0015: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+007f80: 1a04 5e00 |0018: const-string v4, "checkFieldTest9: old " // string@005e
+007f84: 6e20 ba00 4300 |001a: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007f8a: 0c03 |001d: move-result-object v3
+007f8c: 6e20 b600 0300 |001e: invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+007f92: 0c00 |0021: move-result-object v0
+007f94: 1a03 0600 |0022: const-string v3, " new " // string@0006
+007f98: 6e20 ba00 3000 |0024: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007f9e: 0c00 |0027: move-result-object v0
+007fa0: 6e20 b600 1000 |0028: invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+007fa6: 0c00 |002b: move-result-object v0
+007fa8: 1a03 0500 |002c: const-string v3, " expected " // string@0005
+007fac: 6e20 ba00 3000 |002e: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007fb2: 0c00 |0031: move-result-object v0
+007fb4: 6e20 b600 5000 |0032: invoke-virtual {v0, v5}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+007fba: 0c00 |0035: move-result-object v0
+007fbc: 1a03 0000 |0036: const-string v3, " " // string@0000
+007fc0: 6e20 ba00 3000 |0038: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+007fc6: 0c00 |003b: move-result-object v0
+007fc8: 6e10 bb00 0000 |003c: invoke-virtual {v0}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+007fce: 0c00 |003f: move-result-object v0
+007fd0: 6e20 ab00 0200 |0040: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.print:(Ljava/lang/String;)V // method@00ab
+007fd6: 6202 1000 |0043: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+007fda: 2d00 0105 |0045: cmpl-float v0, v1, v5
+007fde: 3900 0800 |0047: if-nez v0, 004f // +0008
+007fe2: 1a00 4000 |0049: const-string v0, "OK" // string@0040
+007fe6: 6e20 b100 0200 |004b: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+007fec: 0e00 |004e: return-void
+007fee: 1a00 1000 |004f: const-string v0, "ERROR" // string@0010
+007ff2: 28fa |0051: goto 004b // -0006
+ catches : (none)
+ positions :
+ 0x0003 line=116
+ 0x0008 line=117
+ 0x000c line=118
+ 0x0011 line=119
+ 0x0043 line=121
+ 0x004e line=122
+ 0x004f line=121
+ locals :
+ 0x0000 - 0x0052 reg=6 this Linvokecustom/InvokeCustom;
+ 0x0000 - 0x0052 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0052 reg=8 (null) Ljava/lang/invoke/MethodHandle;
+
+ #8 : (in Linvokecustom/InvokeCustom;)
+ name : 'checkStaticFieldTest9'
+ type : '(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 8
+ ins : 2
+ outs : 2
+ insns size : 80 16-bit code units
+007ff4: |[007ff4] invokecustom.InvokeCustom.checkStaticFieldTest9:(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
+008004: 1405 1032 5476 |0000: const v5, #float 1.07596e+33 // #76543210
+00800a: fa10 c300 0600 0200 |0003: invoke-polymorphic {v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, ()I // method@00c3, proto@0002
+008012: 0a00 |0007: move-result v0
+008014: fa20 c300 5700 1a00 |0008: invoke-polymorphic {v7, v5}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (I)V // method@00c3, proto@001a
+00801c: fa10 c300 0600 0200 |000c: invoke-polymorphic {v6}, Ljava/lang/invoke/MethodHandle;.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, ()I // method@00c3, proto@0002
+008024: 0a01 |0010: move-result v1
+008026: 6202 1000 |0011: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00802a: 2203 1700 |0013: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+00802e: 7010 b400 0300 |0015: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+008034: 1a04 6000 |0018: const-string v4, "checkStaticFieldTest9: old " // string@0060
+008038: 6e20 ba00 4300 |001a: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00803e: 0c03 |001d: move-result-object v3
+008040: 6e20 b700 0300 |001e: invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+008046: 0c00 |0021: move-result-object v0
+008048: 1a03 0600 |0022: const-string v3, " new " // string@0006
+00804c: 6e20 ba00 3000 |0024: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+008052: 0c00 |0027: move-result-object v0
+008054: 6e20 b700 1000 |0028: invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+00805a: 0c00 |002b: move-result-object v0
+00805c: 1a03 0500 |002c: const-string v3, " expected " // string@0005
+008060: 6e20 ba00 3000 |002e: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+008066: 0c00 |0031: move-result-object v0
+008068: 6e20 b700 5000 |0032: invoke-virtual {v0, v5}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+00806e: 0c00 |0035: move-result-object v0
+008070: 1a03 0000 |0036: const-string v3, " " // string@0000
+008074: 6e20 ba00 3000 |0038: invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00807a: 0c00 |003b: move-result-object v0
+00807c: 6e10 bb00 0000 |003c: invoke-virtual {v0}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+008082: 0c00 |003f: move-result-object v0
+008084: 6e20 ab00 0200 |0040: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.print:(Ljava/lang/String;)V // method@00ab
+00808a: 6202 1000 |0043: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00808e: 3351 0800 |0045: if-ne v1, v5, 004d // +0008
+008092: 1a00 4000 |0047: const-string v0, "OK" // string@0040
+008096: 6e20 b100 0200 |0049: invoke-virtual {v2, v0}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00809c: 0e00 |004c: return-void
+00809e: 1a00 1000 |004d: const-string v0, "ERROR" // string@0010
+0080a2: 28fa |004f: goto 0049 // -0006
+ catches : (none)
+ positions :
+ 0x0003 line=103
+ 0x0008 line=104
+ 0x000c line=105
+ 0x0011 line=106
+ 0x0043 line=108
+ 0x004c line=109
+ 0x004d line=108
+ locals :
+ 0x0000 - 0x0050 reg=6 (null) Ljava/lang/invoke/MethodHandle;
+ 0x0000 - 0x0050 reg=7 (null) Ljava/lang/invoke/MethodHandle;
+
+ #9 : (in Linvokecustom/InvokeCustom;)
+ name : 'main'
+ type : '([Ljava/lang/String;)V'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 1
+ ins : 1
+ outs : 0
+ insns size : 22 16-bit code units
+0080a4: |[0080a4] invokecustom.InvokeCustom.main:([Ljava/lang/String;)V
+0080b4: 7100 1400 0000 |0000: invoke-static {}, Linvokecustom/InvokeCustom1;.test1:()V // method@0014
+0080ba: 7100 2900 0000 |0003: invoke-static {}, Linvokecustom/InvokeCustom2;.test2:()V // method@0029
+0080c0: 7100 3e00 0000 |0006: invoke-static {}, Linvokecustom/InvokeCustom3;.test3:()V // method@003e
+0080c6: 7100 5300 0000 |0009: invoke-static {}, Linvokecustom/InvokeCustom5;.test5:()V // method@0053
+0080cc: 7100 6800 0000 |000c: invoke-static {}, Linvokecustom/InvokeCustom6;.test6:()V // method@0068
+0080d2: 7100 7d00 0000 |000f: invoke-static {}, Linvokecustom/InvokeCustom7;.test7:()V // method@007d
+0080d8: 7100 9200 0000 |0012: invoke-static {}, Linvokecustom/InvokeCustom8;.test8:()V // method@0092
+0080de: 0e00 |0015: return-void
+ catches : (none)
+ positions :
+ locals :
+
+ #10 : (in Linvokecustom/InvokeCustom;)
+ name : 'targetMethodTest1'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+0080e0: |[0080e0] invokecustom.InvokeCustom.targetMethodTest1:()V
+0080f0: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0080f4: 1a01 1500 |0002: const-string v1, "Hello World!" // string@0015
+0080f8: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0080fe: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=41
+ 0x0007 line=42
+ locals :
+
+ #11 : (in Linvokecustom/InvokeCustom;)
+ name : 'targetMethodTest2'
+ type : '(ZBCSIFJDLjava/lang/String;)V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 13
+ ins : 11
+ outs : 3
+ insns size : 46 16-bit code units
+008100: |[008100] invokecustom.InvokeCustom.targetMethodTest2:(ZBCSIFJDLjava/lang/String;)V
+008110: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+008114: 6e20 b200 2000 |0002: invoke-virtual {v0, v2}, Ljava/io/PrintStream;.println:(Z)V // method@00b2
+00811a: 6200 1000 |0005: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00811e: 6e20 af00 3000 |0007: invoke-virtual {v0, v3}, Ljava/io/PrintStream;.println:(I)V // method@00af
+008124: 6200 1000 |000a: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+008128: 6e20 ac00 4000 |000c: invoke-virtual {v0, v4}, Ljava/io/PrintStream;.println:(C)V // method@00ac
+00812e: 6200 1000 |000f: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+008132: 6e20 af00 5000 |0011: invoke-virtual {v0, v5}, Ljava/io/PrintStream;.println:(I)V // method@00af
+008138: 6200 1000 |0014: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00813c: 6e20 af00 6000 |0016: invoke-virtual {v0, v6}, Ljava/io/PrintStream;.println:(I)V // method@00af
+008142: 6200 1000 |0019: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+008146: 6e20 ae00 7000 |001b: invoke-virtual {v0, v7}, Ljava/io/PrintStream;.println:(F)V // method@00ae
+00814c: 6200 1000 |001e: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+008150: 6e30 b000 8009 |0020: invoke-virtual {v0, v8, v9}, Ljava/io/PrintStream;.println:(J)V // method@00b0
+008156: 6200 1000 |0023: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00815a: 6e30 ad00 a00b |0025: invoke-virtual {v0, v10, v11}, Ljava/io/PrintStream;.println:(D)V // method@00ad
+008160: 6200 1000 |0028: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+008164: 6e20 b100 c000 |002a: invoke-virtual {v0, v12}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00816a: 0e00 |002d: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=46
+ 0x0005 line=47
+ 0x000a line=48
+ 0x000f line=49
+ 0x0014 line=50
+ 0x0019 line=51
+ 0x001e line=52
+ 0x0023 line=53
+ 0x0028 line=54
+ 0x002d line=55
+ locals :
+ 0x0000 - 0x002e reg=2 (null) Z
+ 0x0000 - 0x002e reg=3 (null) B
+ 0x0000 - 0x002e reg=4 (null) C
+ 0x0000 - 0x002e reg=5 (null) S
+ 0x0000 - 0x002e reg=6 (null) I
+ 0x0000 - 0x002e reg=7 (null) F
+ 0x0000 - 0x002e reg=8 (null) J
+ 0x0000 - 0x002e reg=10 (null) D
+ 0x0000 - 0x002e reg=12 (null) Ljava/lang/String;
+
+ #12 : (in Linvokecustom/InvokeCustom;)
+ name : 'targetMethodTest3'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+00816c: |[00816c] invokecustom.InvokeCustom.targetMethodTest3:()V
+00817c: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+008180: 1a01 7300 |0002: const-string v1, "targetMethodTest3 from InvokeCustom" // string@0073
+008184: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00818a: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=58
+ 0x0007 line=59
+ locals :
+
+ #13 : (in Linvokecustom/InvokeCustom;)
+ name : 'targetMethodTest5'
+ type : '(III)I'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 7
+ ins : 3
+ outs : 2
+ insns size : 83 16-bit code units
+00818c: |[00818c] invokecustom.InvokeCustom.targetMethodTest5:(III)I
+00819c: 9000 0405 |0000: add-int v0, v4, v5
+0081a0: 6201 1000 |0002: sget-object v1, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0081a4: 2202 1700 |0004: new-instance v2, Ljava/lang/StringBuilder; // type@0017
+0081a8: 7010 b400 0200 |0006: invoke-direct {v2}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0081ae: 1a03 7800 |0009: const-string v3, "targetMethodTest5 " // string@0078
+0081b2: 6e20 ba00 3200 |000b: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0081b8: 0c02 |000e: move-result-object v2
+0081ba: 6e20 b700 4200 |000f: invoke-virtual {v2, v4}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+0081c0: 0c02 |0012: move-result-object v2
+0081c2: 1a03 0300 |0013: const-string v3, " + " // string@0003
+0081c6: 6e20 ba00 3200 |0015: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0081cc: 0c02 |0018: move-result-object v2
+0081ce: 6e20 b700 5200 |0019: invoke-virtual {v2, v5}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+0081d4: 0c02 |001c: move-result-object v2
+0081d6: 1a03 0400 |001d: const-string v3, " = " // string@0004
+0081da: 6e20 ba00 3200 |001f: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0081e0: 0c02 |0022: move-result-object v2
+0081e2: 6e20 b700 0200 |0023: invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+0081e8: 0c02 |0026: move-result-object v2
+0081ea: 6e10 bb00 0200 |0027: invoke-virtual {v2}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0081f0: 0c02 |002a: move-result-object v2
+0081f2: 6e20 b100 2100 |002b: invoke-virtual {v1, v2}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0081f8: 3260 2400 |002e: if-eq v0, v6, 0052 // +0024
+0081fc: 6201 1000 |0030: sget-object v1, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+008200: 2202 1700 |0032: new-instance v2, Ljava/lang/StringBuilder; // type@0017
+008204: 7010 b400 0200 |0034: invoke-direct {v2}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00820a: 1a03 1300 |0037: const-string v3, "Failed " // string@0013
+00820e: 6e20 ba00 3200 |0039: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+008214: 0c02 |003c: move-result-object v2
+008216: 6e20 b700 0200 |003d: invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+00821c: 0c02 |0040: move-result-object v2
+00821e: 1a03 0100 |0041: const-string v3, " != " // string@0001
+008222: 6e20 ba00 3200 |0043: invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+008228: 0c02 |0046: move-result-object v2
+00822a: 6e20 b700 6200 |0047: invoke-virtual {v2, v6}, Ljava/lang/StringBuilder;.append:(I)Ljava/lang/StringBuilder; // method@00b7
+008230: 0c02 |004a: move-result-object v2
+008232: 6e10 bb00 0200 |004b: invoke-virtual {v2}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+008238: 0c02 |004e: move-result-object v2
+00823a: 6e20 b100 2100 |004f: invoke-virtual {v1, v2}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+008240: 0f00 |0052: return v0
+ catches : (none)
+ positions :
+ 0x0000 line=68
+ 0x0002 line=69
+ 0x002e line=70
+ 0x0030 line=71
+ 0x0052 line=73
+ locals :
+ 0x0000 - 0x0053 reg=4 (null) I
+ 0x0000 - 0x0053 reg=5 (null) I
+ 0x0000 - 0x0053 reg=6 (null) I
+
+ #14 : (in Linvokecustom/InvokeCustom;)
+ name : 'targetMethodTest6'
+ type : '(JJJ)J'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 12
+ ins : 6
+ outs : 3
+ insns size : 85 16-bit code units
+008244: |[008244] invokecustom.InvokeCustom.targetMethodTest6:(JJJ)J
+008254: 9b00 0608 |0000: add-long v0, v6, v8
+008258: 6202 1000 |0002: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00825c: 2203 1700 |0004: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+008260: 7010 b400 0300 |0006: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+008266: 1a04 7b00 |0009: const-string v4, "targetMethodTest6 " // string@007b
+00826a: 6e20 ba00 4300 |000b: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+008270: 0c03 |000e: move-result-object v3
+008272: 6e30 b800 6307 |000f: invoke-virtual {v3, v6, v7}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+008278: 0c03 |0012: move-result-object v3
+00827a: 1a04 0300 |0013: const-string v4, " + " // string@0003
+00827e: 6e20 ba00 4300 |0015: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+008284: 0c03 |0018: move-result-object v3
+008286: 6e30 b800 8309 |0019: invoke-virtual {v3, v8, v9}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+00828c: 0c03 |001c: move-result-object v3
+00828e: 1a04 0400 |001d: const-string v4, " = " // string@0004
+008292: 6e20 ba00 4300 |001f: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+008298: 0c03 |0022: move-result-object v3
+00829a: 6e30 b800 0301 |0023: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+0082a0: 0c03 |0026: move-result-object v3
+0082a2: 6e10 bb00 0300 |0027: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0082a8: 0c03 |002a: move-result-object v3
+0082aa: 6e20 b100 3200 |002b: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0082b0: 3102 000a |002e: cmp-long v2, v0, v10
+0082b4: 3802 2400 |0030: if-eqz v2, 0054 // +0024
+0082b8: 6202 1000 |0032: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0082bc: 2203 1700 |0034: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+0082c0: 7010 b400 0300 |0036: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0082c6: 1a04 1300 |0039: const-string v4, "Failed " // string@0013
+0082ca: 6e20 ba00 4300 |003b: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0082d0: 0c03 |003e: move-result-object v3
+0082d2: 6e30 b800 0301 |003f: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+0082d8: 0c03 |0042: move-result-object v3
+0082da: 1a04 0100 |0043: const-string v4, " != " // string@0001
+0082de: 6e20 ba00 4300 |0045: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0082e4: 0c03 |0048: move-result-object v3
+0082e6: 6e30 b800 a30b |0049: invoke-virtual {v3, v10, v11}, Ljava/lang/StringBuilder;.append:(J)Ljava/lang/StringBuilder; // method@00b8
+0082ec: 0c03 |004c: move-result-object v3
+0082ee: 6e10 bb00 0300 |004d: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0082f4: 0c03 |0050: move-result-object v3
+0082f6: 6e20 b100 3200 |0051: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0082fc: 1000 |0054: return-wide v0
+ catches : (none)
+ positions :
+ 0x0000 line=77
+ 0x0002 line=78
+ 0x002e line=79
+ 0x0032 line=80
+ 0x0054 line=82
+ locals :
+ 0x0000 - 0x0055 reg=6 (null) J
+ 0x0000 - 0x0055 reg=8 (null) J
+ 0x0000 - 0x0055 reg=10 (null) J
+
+ #15 : (in Linvokecustom/InvokeCustom;)
+ name : 'targetMethodTest7'
+ type : '(FFD)D'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 10
+ ins : 4
+ outs : 3
+ insns size : 86 16-bit code units
+008300: |[008300] invokecustom.InvokeCustom.targetMethodTest7:(FFD)D
+008310: a800 0607 |0000: mul-float v0, v6, v7
+008314: 8900 |0002: float-to-double v0, v0
+008316: 6202 1000 |0003: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00831a: 2203 1700 |0005: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+00831e: 7010 b400 0300 |0007: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+008324: 1a04 7e00 |000a: const-string v4, "targetMethodTest7 " // string@007e
+008328: 6e20 ba00 4300 |000c: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00832e: 0c03 |000f: move-result-object v3
+008330: 6e20 b600 6300 |0010: invoke-virtual {v3, v6}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+008336: 0c03 |0013: move-result-object v3
+008338: 1a04 0200 |0014: const-string v4, " * " // string@0002
+00833c: 6e20 ba00 4300 |0016: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+008342: 0c03 |0019: move-result-object v3
+008344: 6e20 b600 7300 |001a: invoke-virtual {v3, v7}, Ljava/lang/StringBuilder;.append:(F)Ljava/lang/StringBuilder; // method@00b6
+00834a: 0c03 |001d: move-result-object v3
+00834c: 1a04 0400 |001e: const-string v4, " = " // string@0004
+008350: 6e20 ba00 4300 |0020: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+008356: 0c03 |0023: move-result-object v3
+008358: 6e30 b500 0301 |0024: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+00835e: 0c03 |0027: move-result-object v3
+008360: 6e10 bb00 0300 |0028: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+008366: 0c03 |002b: move-result-object v3
+008368: 6e20 b100 3200 |002c: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00836e: 2f02 0008 |002f: cmpl-double v2, v0, v8
+008372: 3802 2400 |0031: if-eqz v2, 0055 // +0024
+008376: 6202 1000 |0033: sget-object v2, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00837a: 2203 1700 |0035: new-instance v3, Ljava/lang/StringBuilder; // type@0017
+00837e: 7010 b400 0300 |0037: invoke-direct {v3}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+008384: 1a04 1300 |003a: const-string v4, "Failed " // string@0013
+008388: 6e20 ba00 4300 |003c: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+00838e: 0c03 |003f: move-result-object v3
+008390: 6e30 b500 0301 |0040: invoke-virtual {v3, v0, v1}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+008396: 0c03 |0043: move-result-object v3
+008398: 1a04 0100 |0044: const-string v4, " != " // string@0001
+00839c: 6e20 ba00 4300 |0046: invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0083a2: 0c03 |0049: move-result-object v3
+0083a4: 6e30 b500 8309 |004a: invoke-virtual {v3, v8, v9}, Ljava/lang/StringBuilder;.append:(D)Ljava/lang/StringBuilder; // method@00b5
+0083aa: 0c03 |004d: move-result-object v3
+0083ac: 6e10 bb00 0300 |004e: invoke-virtual {v3}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0083b2: 0c03 |0051: move-result-object v3
+0083b4: 6e20 b100 3200 |0052: invoke-virtual {v2, v3}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0083ba: 1000 |0055: return-wide v0
+ catches : (none)
+ positions :
+ 0x0000 line=86
+ 0x0003 line=87
+ 0x002f line=88
+ 0x0033 line=89
+ 0x0055 line=91
+ locals :
+ 0x0000 - 0x0056 reg=6 (null) F
+ 0x0000 - 0x0056 reg=7 (null) F
+ 0x0000 - 0x0056 reg=8 (null) D
+
+ #16 : (in Linvokecustom/InvokeCustom;)
+ name : 'targetMethodTest8'
+ type : '(Ljava/lang/String;)V'
+ access : 0x0009 (PUBLIC STATIC)
+ code -
+ registers : 4
+ ins : 1
+ outs : 2
+ insns size : 25 16-bit code units
+0083bc: |[0083bc] invokecustom.InvokeCustom.targetMethodTest8:(Ljava/lang/String;)V
+0083cc: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+0083d0: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+0083d4: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+0083da: 1a02 8000 |0007: const-string v2, "targetMethodTest8 " // string@0080
+0083de: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0083e4: 0c01 |000c: move-result-object v1
+0083e6: 6e20 ba00 3100 |000d: invoke-virtual {v1, v3}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+0083ec: 0c01 |0010: move-result-object v1
+0083ee: 6e10 bb00 0100 |0011: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+0083f4: 0c01 |0014: move-result-object v1
+0083f6: 6e20 b100 1000 |0015: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0083fc: 0e00 |0018: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=95
+ 0x0018 line=96
+ locals :
+ 0x0000 - 0x0019 reg=3 (null) Ljava/lang/String;
+
+ #17 : (in Linvokecustom/InvokeCustom;)
+ name : 'targetMethodTest9'
+ type : '()V'
+ access : 0x000a (PRIVATE STATIC)
+ code -
+ registers : 2
+ ins : 0
+ outs : 2
+ insns size : 8 16-bit code units
+008400: |[008400] invokecustom.InvokeCustom.targetMethodTest9:()V
+008410: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+008414: 1a01 8200 |0002: const-string v1, "targetMethodTest9()" // string@0082
+008418: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+00841e: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=129
+ 0x0007 line=130
+ locals :
+
+ Virtual methods -
+ #0 : (in Linvokecustom/InvokeCustom;)
+ name : 'helperMethodTest9'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 4
+ ins : 1
+ outs : 2
+ insns size : 27 16-bit code units
+008420: |[008420] invokecustom.InvokeCustom.helperMethodTest9:()V
+008430: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+008434: 2201 1700 |0002: new-instance v1, Ljava/lang/StringBuilder; // type@0017
+008438: 7010 b400 0100 |0004: invoke-direct {v1}, Ljava/lang/StringBuilder;.<init>:()V // method@00b4
+00843e: 1a02 6400 |0007: const-string v2, "helperMethodTest9 in " // string@0064
+008442: 6e20 ba00 2100 |0009: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; // method@00ba
+008448: 0c01 |000c: move-result-object v1
+00844a: 1c02 0e00 |000d: const-class v2, Linvokecustom/InvokeCustom; // type@000e
+00844e: 6e20 b900 2100 |000f: invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; // method@00b9
+008454: 0c01 |0012: move-result-object v1
+008456: 6e10 bb00 0100 |0013: invoke-virtual {v1}, Ljava/lang/StringBuilder;.toString:()Ljava/lang/String; // method@00bb
+00845c: 0c01 |0016: move-result-object v1
+00845e: 6e20 b100 1000 |0017: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+008464: 0e00 |001a: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=125
+ 0x001a line=126
+ locals :
+ 0x0000 - 0x001b reg=3 this Linvokecustom/InvokeCustom;
+
+ #1 : (in Linvokecustom/InvokeCustom;)
+ name : 'run'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 3
+ ins : 1
+ outs : 2
+ insns size : 8 16-bit code units
+008468: |[008468] invokecustom.InvokeCustom.run:()V
+008478: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00847c: 1a01 6e00 |0002: const-string v1, "run() for Test9" // string@006e
+008480: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+008486: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=133
+ 0x0007 line=134
+ locals :
+ 0x0000 - 0x0008 reg=2 this Linvokecustom/InvokeCustom;
+
+ #2 : (in Linvokecustom/InvokeCustom;)
+ name : 'targetMethodTest4'
+ type : '()V'
+ access : 0x0001 (PUBLIC)
+ code -
+ registers : 3
+ ins : 1
+ outs : 2
+ insns size : 8 16-bit code units
+008488: |[008488] invokecustom.InvokeCustom.targetMethodTest4:()V
+008498: 6200 1000 |0000: sget-object v0, Ljava/lang/System;.out:Ljava/io/PrintStream; // field@0010
+00849c: 1a01 7500 |0002: const-string v1, "targetMethodTest4 from InvokeCustom (oops!)" // string@0075
+0084a0: 6e20 b100 1000 |0004: invoke-virtual {v0, v1}, Ljava/io/PrintStream;.println:(Ljava/lang/String;)V // method@00b1
+0084a6: 0e00 |0007: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=64
+ 0x0007 line=65
+ locals :
+ 0x0000 - 0x0008 reg=2 this Linvokecustom/InvokeCustom;
+
+ source_file_idx : 25 (InvokeCustom.java)
+
+Method handle #0:
+ type : invoke-static
+ target : Linvokecustom/InvokeCustom; bsmLookupStatic
+ target_type : (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
+Method handle #1:
+ type : invoke-static
+ target : Linvokecustom/InvokeCustom; bsmLookupStaticWithExtraArgs
+ target_type : (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;IJFD)Ljava/lang/invoke/CallSite;
+Call site #0: // offset 57124
+ link_argument[0] : 0 (MethodHandle)
+ link_argument[1] : targetMethodTest1 (String)
+ link_argument[2] : ()V (MethodType)
+Call site #1: // offset 57131
+ link_argument[0] : 0 (MethodHandle)
+ link_argument[1] : targetMethodTest2 (String)
+ link_argument[2] : (ZBCSIFJDLjava/lang/String;)V (MethodType)
+Call site #2: // offset 57138
+ link_argument[0] : 0 (MethodHandle)
+ link_argument[1] : targetMethodTest3 (String)
+ link_argument[2] : ()V (MethodType)
+ link_argument[3] : 1 (int)
+ link_argument[4] : 123456789 (long)
+ link_argument[5] : 123.456 (float)
+ link_argument[6] : 123457 (double)
+Call site #3: // offset 57166
+ link_argument[0] : 0 (MethodHandle)
+ link_argument[1] : targetMethodTest5 (String)
+ link_argument[2] : (III)I (MethodType)
+Call site #4: // offset 57173
+ link_argument[0] : 0 (MethodHandle)
+ link_argument[1] : targetMethodTest6 (String)
+ link_argument[2] : (JJJ)J (MethodType)
+Call site #5: // offset 57180
+ link_argument[0] : 0 (MethodHandle)
+ link_argument[1] : targetMethodTest7 (String)
+ link_argument[2] : (FFD)D (MethodType)
+Call site #6: // offset 57187
+ link_argument[0] : 0 (MethodHandle)
+ link_argument[1] : targetMethodTest8 (String)
+ link_argument[2] : (Ljava/lang/String;)V (MethodType)
+Call site #7: // offset 57187
+ link_argument[0] : 0 (MethodHandle)
+ link_argument[1] : targetMethodTest8 (String)
+ link_argument[2] : (Ljava/lang/String;)V (MethodType)
+Call site #8: // offset 57187
+ link_argument[0] : 0 (MethodHandle)
+ link_argument[1] : targetMethodTest8 (String)
+ link_argument[2] : (Ljava/lang/String;)V (MethodType)
diff --git a/dx/tests/137-dexmerger-dex38/generate-test b/dx/tests/137-dexmerger-dex38/generate-test
new file mode 100755
index 000000000..3a89199dc
--- /dev/null
+++ b/dx/tests/137-dexmerger-dex38/generate-test
@@ -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/137-dexmerger-dex38/info.txt b/dx/tests/137-dexmerger-dex38/info.txt
new file mode 100644
index 000000000..be5c0e9ba
--- /dev/null
+++ b/dx/tests/137-dexmerger-dex38/info.txt
@@ -0,0 +1 @@
+This test checks that dexmerger supports dex 38 features.
diff --git a/dx/tests/137-dexmerger-dex38/invokecustom.jar b/dx/tests/137-dexmerger-dex38/invokecustom.jar
new file mode 100644
index 000000000..ac56f78cb
--- /dev/null
+++ b/dx/tests/137-dexmerger-dex38/invokecustom.jar
Binary files differ
diff --git a/dx/tests/137-dexmerger-dex38/run b/dx/tests/137-dexmerger-dex38/run
new file mode 100755
index 000000000..af1dc9e35
--- /dev/null
+++ b/dx/tests/137-dexmerger-dex38/run
@@ -0,0 +1,26 @@
+#!/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.
+
+jar xf invokecustom.jar
+(
+ CLASSES=(invokecustom/Super.class invokecustom/InvokeCustom*.class)
+ for CLASS in "${CLASSES[@]}"; do
+ dx --min-sdk-version=26 --dex --output="${CLASS/%.class/.dex}" "${CLASS}" 2>&1
+ done
+)
+java -cp $(dirname $(which dx))/../framework/dx.jar com.android.dx.merge.DexMerger \
+ out.dex invokecustom/*.dex >& /dev/null
+dexdump2 -d out.dex
diff --git a/dx/tests/137-dexmerger-dex38/src/invokecustom/InvokeCustom.java b/dx/tests/137-dexmerger-dex38/src/invokecustom/InvokeCustom.java
new file mode 100644
index 000000000..c6cd3c3fa
--- /dev/null
+++ b/dx/tests/137-dexmerger-dex38/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/137-dexmerger-dex38/src/invokecustom/TestGenerator.java b/dx/tests/137-dexmerger-dex38/src/invokecustom/TestGenerator.java
new file mode 100644
index 000000000..c47d1324d
--- /dev/null
+++ b/dx/tests/137-dexmerger-dex38/src/invokecustom/TestGenerator.java
@@ -0,0 +1,464 @@
+/*
+ * 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.Path;
+import java.nio.file.Paths;
+import java.util.function.Consumer;
+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 baseName;
+
+ public static void main(String[] args) throws IOException {
+ assert args.length == 1;
+ TestGenerator testGenerator = new TestGenerator(Paths.get(args[0]));
+ testGenerator.generateTests();
+ }
+
+ public TestGenerator(Path baseName) {
+ this.baseName = baseName;
+ }
+
+ private void generateTests() throws IOException {
+ generateTest(this::generateMethodTest1, "invokecustom/InvokeCustom1");
+ generateTest(this::generateMethodTest2, "invokecustom/InvokeCustom2");
+ generateTest(this::generateMethodTest3, "invokecustom/InvokeCustom3");
+ // skip generateMethodTest4 - dexdump doesn't support invoke-direct handles
+ generateTest(this::generateMethodTest5, "invokecustom/InvokeCustom5");
+ generateTest(this::generateMethodTest6, "invokecustom/InvokeCustom6");
+ generateTest(this::generateMethodTest7, "invokecustom/InvokeCustom7");
+ generateTest(this::generateMethodTest8, "invokecustom/InvokeCustom8");
+ // skip generateMethodTest9 - dexdump doesn't support invoke-interface handles
+ generateTest(this::generateMethodMain, "invokecustom/InvokeCustom");
+ }
+
+ private void generateTest(Consumer<ClassWriter> generator, String className) throws IOException {
+ ClassReader cr =
+ new ClassReader(
+ new FileInputStream(baseName.resolve("invokecustom/InvokeCustom.class").toFile()));
+ ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
+ cr.accept(
+ new ClassVisitor(Opcodes.ASM5, cw) {
+ @Override
+ public void visit(
+ int version,
+ int access,
+ String name,
+ String signature,
+ String superName,
+ String[] interfaces) {
+ super.visit(version, access, className, signature, superName, interfaces);
+ }
+
+ @Override
+ public void visitEnd() {
+ generator.accept(cw);
+ super.visitEnd();
+ }
+ },
+ 0);
+ new FileOutputStream(baseName.resolve(className + ".class").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 + "1", "test1", "()V", false);
+ mv.visitMethodInsn(Opcodes.INVOKESTATIC, internalName + "2", "test2", "()V", false);
+ mv.visitMethodInsn(Opcodes.INVOKESTATIC, internalName + "3", "test3", "()V", false);
+ // mv.visitMethodInsn(Opcodes.INVOKESTATIC, internalName + "4", "test4", "()V", false);
+ mv.visitMethodInsn(Opcodes.INVOKESTATIC, internalName + "5", "test5", "()V", false);
+ mv.visitMethodInsn(Opcodes.INVOKESTATIC, internalName + "6", "test6", "()V", false);
+ mv.visitMethodInsn(Opcodes.INVOKESTATIC, internalName + "7", "test7", "()V", false);
+ mv.visitMethodInsn(Opcodes.INVOKESTATIC, internalName + "8", "test8", "()V", false);
+ // mv.visitMethodInsn(Opcodes.INVOKESTATIC, internalName + "9", "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/138-invoke-polymorphic-again/Main.java b/dx/tests/138-invoke-polymorphic-again/Main.java
new file mode 100644
index 000000000..48de64d5e
--- /dev/null
+++ b/dx/tests/138-invoke-polymorphic-again/Main.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.MethodHandles.Lookup;
+import java.lang.invoke.MethodType;
+
+public class Main {
+ public static void assertEquals(int i1, int i2) {
+ }
+
+ public int foof(int a, int b, int c, int d,
+ int e, int f, int g, int h,
+ int i, int j, int k, int l,
+ int m, int n, int o) {
+ return a;
+ }
+
+ public static void $opt$BasicTest() throws Throwable {
+ Main m = null;
+ // OTH: >= 15 arguments to invokeExact tickles this bug. Fewer, no repro.
+ assertEquals(42, -42);
+ m.foof(0, 1, 2, 3,
+ 4, 5, 6, 7,
+ 8, 9, 10, 11,
+ 12, 13, 14);
+ MethodHandle mh0 = null;
+ mh0.invokeExact("bad");
+ }
+
+ public static int $opt$BasicTest2() throws Throwable {
+ Main m = null;
+ // OTH: >= 15 arguments to invokeExact tickles this bug. Fewer, no repro.
+ assertEquals(42, -42);
+ m.foof(0, 1, 2, 3,
+ 4, 5, 6, 7,
+ 8, 9, 10, 11,
+ 12, 13, 14);
+ MethodHandle mh0 = null;
+ return (int) mh0.invokeExact("bad");
+ }
+
+ public static void main(String[] args) throws Throwable {
+ $opt$BasicTest();
+ }
+}
diff --git a/dx/tests/138-invoke-polymorphic-again/expected.txt b/dx/tests/138-invoke-polymorphic-again/expected.txt
new file mode 100644
index 000000000..7c3fb77a5
--- /dev/null
+++ b/dx/tests/138-invoke-polymorphic-again/expected.txt
@@ -0,0 +1,88 @@
+Main.$opt$BasicTest:()V:
+regs: 0012; ins: 0000; outs: 0010
+ 0000: const/4 v1, #null // #0
+ 0001: const/16 v2, #int 42 // #002a
+ 0003: const/16 v3, #int -42 // #ffd6
+ 0005: invoke-static {v2, v3}, Main.assertEquals:(II)V
+ 0008: const/4 v2, #int 0 // #0
+ 0009: const/4 v3, #int 1 // #1
+ 000a: const/4 v4, #int 2 // #2
+ 000b: const/4 v5, #int 3 // #3
+ 000c: const/4 v6, #int 4 // #4
+ 000d: const/4 v7, #int 5 // #5
+ 000e: const/4 v8, #int 6 // #6
+ 000f: const/4 v9, #int 7 // #7
+ 0010: const/16 v10, #int 8 // #0008
+ 0012: const/16 v11, #int 9 // #0009
+ 0014: const/16 v12, #int 10 // #000a
+ 0016: const/16 v13, #int 11 // #000b
+ 0018: const/16 v14, #int 12 // #000c
+ 001a: const/16 v15, #int 13 // #000d
+ 001c: const/16 v16, #int 14 // #000e
+ 001e: invoke-virtual/range {v1..v16}, Main.foof:(IIIIIIIIIIIIIII)I
+ 0021: const/16 v17, #null // #0000
+ 0023: const-string v2, "bad"
+ 0025: move-object/from16 v0, v17
+ 0027: invoke-polymorphic {v0, v2}, java.lang.invoke.MethodHandle.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Ljava/lang/String;)V
+ 002b: return-void
+ debug info
+ line_start: 34
+ parameters_size: 0000
+ 0000: prologue end
+ 0000: line 34
+ 0001: line 36
+ 0001: +local v1 m Main
+ 0008: line 37
+ 0021: advance pc
+ 0021: line 41
+ 0023: line 42
+ 0023: +local v17 mh0 java.lang.invoke.MethodHandle
+ 002b: line 43
+ end sequence
+ source file: "Main.java"
+ method annotations:
+ system-annotation dalvik.annotation.Throws {value: {java.lang.Throwable}}
+Main.$opt$BasicTest2:()I:
+regs: 0012; ins: 0000; outs: 0010
+ 0000: const/4 v1, #null // #0
+ 0001: const/16 v2, #int 42 // #002a
+ 0003: const/16 v3, #int -42 // #ffd6
+ 0005: invoke-static {v2, v3}, Main.assertEquals:(II)V
+ 0008: const/4 v2, #int 0 // #0
+ 0009: const/4 v3, #int 1 // #1
+ 000a: const/4 v4, #int 2 // #2
+ 000b: const/4 v5, #int 3 // #3
+ 000c: const/4 v6, #int 4 // #4
+ 000d: const/4 v7, #int 5 // #5
+ 000e: const/4 v8, #int 6 // #6
+ 000f: const/4 v9, #int 7 // #7
+ 0010: const/16 v10, #int 8 // #0008
+ 0012: const/16 v11, #int 9 // #0009
+ 0014: const/16 v12, #int 10 // #000a
+ 0016: const/16 v13, #int 11 // #000b
+ 0018: const/16 v14, #int 12 // #000c
+ 001a: const/16 v15, #int 13 // #000d
+ 001c: const/16 v16, #int 14 // #000e
+ 001e: invoke-virtual/range {v1..v16}, Main.foof:(IIIIIIIIIIIIIII)I
+ 0021: const/16 v17, #null // #0000
+ 0023: const-string v2, "bad"
+ 0025: move-object/from16 v0, v17
+ 0027: invoke-polymorphic {v0, v2}, java.lang.invoke.MethodHandle.invokeExact:([Ljava/lang/Object;)Ljava/lang/Object;, (Ljava/lang/String;)I
+ 002b: move-result v2
+ 002c: return v2
+ debug info
+ line_start: 46
+ parameters_size: 0000
+ 0000: prologue end
+ 0000: line 46
+ 0001: line 48
+ 0001: +local v1 m Main
+ 0008: line 49
+ 0021: advance pc
+ 0021: line 53
+ 0023: line 54
+ 0023: +local v17 mh0 java.lang.invoke.MethodHandle
+ end sequence
+ source file: "Main.java"
+ method annotations:
+ system-annotation dalvik.annotation.Throws {value: {java.lang.Throwable}}
diff --git a/dx/tests/138-invoke-polymorphic-again/info.txt b/dx/tests/138-invoke-polymorphic-again/info.txt
new file mode 100644
index 000000000..98a8f78c6
--- /dev/null
+++ b/dx/tests/138-invoke-polymorphic-again/info.txt
@@ -0,0 +1,7 @@
+This tests the proper register preparation for invoke-polymorphic
+instructions. The test was written as the invoke-polymorphic bytecodes
+were mis-annotated in dx as having a return result. This led to a path
+that did not emit the necessary move instructions and the generated
+DEX file was rejected by ART. The issue was only visible when dx
+optimization was enabled, but the problem lay in the OutputFinisher
+register selection.
diff --git a/dx/tests/138-invoke-polymorphic-again/run b/dx/tests/138-invoke-polymorphic-again/run
new file mode 100755
index 000000000..2ee0ad64e
--- /dev/null
+++ b/dx/tests/138-invoke-polymorphic-again/run
@@ -0,0 +1,22 @@
+#!/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.
+
+SDK_VERSION=26
+
+JAVAC_FLAGS="-g -Xlint:-options -source 1.8 -target 1.8 -implicit:none"
+$JAVAC $JAVAC_FLAGS -d . Main.java
+dx --debug --dex --min-sdk-version=${SDK_VERSION} --output="classes.dex" \
+ --dump-method=Main.\$opt\$BasicTest* --dump-width=1000 --dump-to=- Main.class 2>&1
diff --git a/dx/tests/139-lambda-metafactory/Main.java b/dx/tests/139-lambda-metafactory/Main.java
new file mode 100644
index 000000000..03bd4a7d1
--- /dev/null
+++ b/dx/tests/139-lambda-metafactory/Main.java
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ */
+
+interface Consumer<T> {
+ void accept(T t);
+}
+
+class Foo {
+ int i;
+ void bar(int j) {
+ Consumer consumer = k -> System.out.println(((i + j) + (int)k));
+ consumer.accept(1);
+ }
+}
+
+class Main {
+ public static void main(String[] args) {
+ new Foo().bar(5);
+ }
+}
diff --git a/dx/tests/139-lambda-metafactory/expected.txt b/dx/tests/139-lambda-metafactory/expected.txt
new file mode 100644
index 000000000..c2643830c
--- /dev/null
+++ b/dx/tests/139-lambda-metafactory/expected.txt
@@ -0,0 +1,880 @@
+Note: Main.java uses unchecked or unsafe operations.
+Note: Recompile with -Xlint:unchecked for details.
+000000: 6465 780a 3033 3800 |magic: "dex\n038\0"
+000008: 9607 cfef |checksum
+00000c: 1d6a 9f47 2cbc a11c 1e0f|signature
+000016: f188 46fc 9b74 db32 2eab|
+000020: 3c07 0000 |file_size: 0000073c
+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: 5406 0000 |map_off: 00000654
+000038: 2c00 0000 |string_ids_size: 0000002c
+00003c: 7000 0000 |string_ids_off: 00000070
+000040: 1100 0000 |type_ids_size: 00000011
+000044: 2001 0000 |type_ids_off: 00000120
+000048: 0900 0000 |proto_ids_size: 00000009
+00004c: 6401 0000 |proto_ids_off: 00000164
+000050: 0200 0000 |field_ids_size: 00000002
+000054: d001 0000 |field_ids_off: 000001d0
+000058: 0b00 0000 |method_ids_size: 0000000b
+00005c: e001 0000 |method_ids_off: 000001e0
+000060: 0300 0000 |class_defs_size: 00000003
+000064: 3802 0000 |class_defs_off: 00000238
+000068: 8c04 0000 |data_size: 0000048c
+00006c: b002 0000 |data_off: 000002b0
+ |
+ |string_ids:
+ |[0] "(TT;)V"
+000070: be03 0000 | string_data_off: 000003be
+ |[1] "<T:"
+000074: c603 0000 | string_data_off: 000003c6
+ |[2] "<init>"
+000078: cb03 0000 | string_data_off: 000003cb
+ |[3] ">"
+00007c: d303 0000 | string_data_off: 000003d3
+ |[4] "I"
+000080: d603 0000 | string_data_off: 000003d6
+ |[5] "LConsumer;"
+000084: d903 0000 | string_data_off: 000003d9
+ |[6] "LFoo;"
+000088: e503 0000 | string_data_off: 000003e5
+ |[7] "LI"
+00008c: ec03 0000 | string_data_off: 000003ec
+ |[8] "LLI"
+000090: f003 0000 | string_data_off: 000003f0
+ |[9] "LLLLLLL"
+000094: f503 0000 | string_data_off: 000003f5
+ |[a] "LMain;"
+000098: fe03 0000 | string_data_off: 000003fe
+ |[b] "Ldalvik/annotation/Signature;"
+00009c: 0604 0000 | string_data_off: 00000406
+ |[c] "Ljava/io/PrintStream;"
+0000a0: 2504 0000 | string_data_off: 00000425
+ |[d] "Ljava/lang/Integer;"
+0000a4: 3c04 0000 | string_data_off: 0000043c
+ |[e] "Ljava/lang/Object;"
+0000a8: 5104 0000 | string_data_off: 00000451
+ |[f] "Ljava/lang/String;"
+0000ac: 6504 0000 | string_data_off: 00000465
+ |[10] "Ljava/lang/System;"
+0000b0: 7904 0000 | string_data_off: 00000479
+ |[11] "Ljava/lang/invoke/CallSite;"
+0000b4: 8d04 0000 | string_data_off: 0000048d
+ |[12] "Ljava/lang/invoke/LambdaMetafactory;"
+0000b8: aa04 0000 | string_data_off: 000004aa
+ |[13] "Ljava/lang/invoke/MethodHandle;"
+0000bc: d004 0000 | string_data_off: 000004d0
+ |[14] "Ljava/lang/invoke/MethodHandles$Lookup;"
+0000c0: f104 0000 | string_data_off: 000004f1
+ |[15] "Ljava/lang/invoke/MethodType;"
+0000c4: 1a05 0000 | string_data_off: 0000051a
+ |[16] "Main.java"
+0000c8: 3905 0000 | string_data_off: 00000539
+ |[17] "V"
+0000cc: 4405 0000 | string_data_off: 00000544
+ |[18] "VI"
+0000d0: 4705 0000 | string_data_off: 00000547
+ |[19] "VIL"
+0000d4: 4b05 0000 | string_data_off: 0000054b
+ |[1a] "VL"
+0000d8: 5005 0000 | string_data_off: 00000550
+ |[1b] "[Ljava/lang/String;"
+0000dc: 5405 0000 | string_data_off: 00000554
+ |[1c] "accept"
+0000e0: 6905 0000 | string_data_off: 00000569
+ |[1d] "args"
+0000e4: 7105 0000 | string_data_off: 00000571
+ |[1e] "bar"
+0000e8: 7705 0000 | string_data_off: 00000577
+ |[1f] "consumer"
+0000ec: 7c05 0000 | string_data_off: 0000057c
+ |[20] "i"
+0000f0: 8605 0000 | string_data_off: 00000586
+ |[21] "intValue"
+0000f4: 8905 0000 | string_data_off: 00000589
+ |[22] "j"
+0000f8: 9305 0000 | string_data_off: 00000593
+ |[23] "k"
+0000fc: 9605 0000 | string_data_off: 00000596
+ |[24] "lambda$bar$0"
+000100: 9905 0000 | string_data_off: 00000599
+ |[25] "main"
+000104: a705 0000 | string_data_off: 000005a7
+ |[26] "metafactory"
+000108: ad05 0000 | string_data_off: 000005ad
+ |[27] "out"
+00010c: ba05 0000 | string_data_off: 000005ba
+ |[28] "println"
+000110: bf05 0000 | string_data_off: 000005bf
+ |[29] "this"
+000114: c805 0000 | string_data_off: 000005c8
+ |[2a] "value"
+000118: ce05 0000 | string_data_off: 000005ce
+ |[2b] "valueOf"
+00011c: d505 0000 | string_data_off: 000005d5
+ |
+ |type_ids:
+ |[0] I
+000120: 0400 0000 | descriptor_idx: 00000004
+ |[1] LConsumer;
+000124: 0500 0000 | descriptor_idx: 00000005
+ |[2] LFoo;
+000128: 0600 0000 | descriptor_idx: 00000006
+ |[3] LMain;
+00012c: 0a00 0000 | descriptor_idx: 0000000a
+ |[4] Ldalvik/annotation/Signature;
+000130: 0b00 0000 | descriptor_idx: 0000000b
+ |[5] Ljava/io/PrintStream;
+000134: 0c00 0000 | descriptor_idx: 0000000c
+ |[6] Ljava/lang/Integer;
+000138: 0d00 0000 | descriptor_idx: 0000000d
+ |[7] Ljava/lang/Object;
+00013c: 0e00 0000 | descriptor_idx: 0000000e
+ |[8] Ljava/lang/String;
+000140: 0f00 0000 | descriptor_idx: 0000000f
+ |[9] Ljava/lang/System;
+000144: 1000 0000 | descriptor_idx: 00000010
+ |[a] Ljava/lang/invoke/CallSite;
+000148: 1100 0000 | descriptor_idx: 00000011
+ |[b] Ljava/lang/invoke/LambdaMetafactory;
+00014c: 1200 0000 | descriptor_idx: 00000012
+ |[c] Ljava/lang/invoke/MethodHandle;
+000150: 1300 0000 | descriptor_idx: 00000013
+ |[d] Ljava/lang/invoke/MethodHandles$Lookup;
+000154: 1400 0000 | descriptor_idx: 00000014
+ |[e] Ljava/lang/invoke/MethodType;
+000158: 1500 0000 | descriptor_idx: 00000015
+ |[f] V
+00015c: 1700 0000 | descriptor_idx: 00000017
+ |[10] [Ljava/lang/String;
+000160: 1b00 0000 | descriptor_idx: 0000001b
+ |
+ |proto_ids:
+ |[0] int proto()
+000164: 0400 0000 | shorty_idx: 00000004 // "I"
+000168: 0000 0000 | return_type_idx: 00000000 // int
+00016c: 0000 0000 | parameters_off: 00000000
+ |[1] Consumer proto(Foo, int)
+000170: 0800 0000 | shorty_idx: 00000008 // "LLI"
+000174: 0100 0000 | return_type_idx: 00000001 // Consumer
+000178: 8803 0000 | parameters_off: 00000388
+ |[2] java.lang.Integer proto(int)
+00017c: 0700 0000 | shorty_idx: 00000007 // "LI"
+000180: 0600 0000 | return_type_idx: 00000006 // java.lang.Integer
+000184: 9003 0000 | parameters_off: 00000390
+ |[3] java.lang.invoke.CallSite proto(java.lang.invoke.MethodHandles$Lookup, java.lang.String, java.lang.invoke.MethodType, java.lang.invoke.MethodType, java.lang.invoke.MethodHandle, java.lang.invoke.MethodType)
+000188: 0900 0000 | shorty_idx: 00000009 // "LLLLLLL"
+00018c: 0a00 0000 | return_type_idx: 0000000a // java.lang.invoke.CallSite
+000190: 9803 0000 | parameters_off: 00000398
+ |[4] void proto()
+000194: 1700 0000 | shorty_idx: 00000017 // "V"
+000198: 0f00 0000 | return_type_idx: 0000000f // void
+00019c: 0000 0000 | parameters_off: 00000000
+ |[5] void proto(int)
+0001a0: 1800 0000 | shorty_idx: 00000018 // "VI"
+0001a4: 0f00 0000 | return_type_idx: 0000000f // void
+0001a8: 9003 0000 | parameters_off: 00000390
+ |[6] void proto(int, java.lang.Object)
+0001ac: 1900 0000 | shorty_idx: 00000019 // "VIL"
+0001b0: 0f00 0000 | return_type_idx: 0000000f // void
+0001b4: a803 0000 | parameters_off: 000003a8
+ |[7] void proto(java.lang.Object)
+0001b8: 1a00 0000 | shorty_idx: 0000001a // "VL"
+0001bc: 0f00 0000 | return_type_idx: 0000000f // void
+0001c0: b003 0000 | parameters_off: 000003b0
+ |[8] void proto(java.lang.String[])
+0001c4: 1a00 0000 | shorty_idx: 0000001a // "VL"
+0001c8: 0f00 0000 | return_type_idx: 0000000f // void
+0001cc: b803 0000 | parameters_off: 000003b8
+ |
+ |field_ids:
+ |[0] Foo.i:I
+0001d0: 0200 | class_idx: 0002
+0001d2: 0000 | type_idx: 0000
+0001d4: 2000 0000 | name_idx: 00000020
+ |[1] java.lang.System.out:Ljava/io/PrintStream;
+0001d8: 0900 | class_idx: 0009
+0001da: 0500 | type_idx: 0005
+0001dc: 2700 0000 | name_idx: 00000027
+ |
+ |method_ids:
+ |[0] Consumer.accept:(Ljava/lang/Object;)V
+0001e0: 0100 | class_idx: 0001
+0001e2: 0700 | proto_idx: 0007
+0001e4: 1c00 0000 | name_idx: 0000001c
+ |[1] Foo.<init>:()V
+0001e8: 0200 | class_idx: 0002
+0001ea: 0400 | proto_idx: 0004
+0001ec: 0200 0000 | name_idx: 00000002
+ |[2] Foo.bar:(I)V
+0001f0: 0200 | class_idx: 0002
+0001f2: 0500 | proto_idx: 0005
+0001f4: 1e00 0000 | name_idx: 0000001e
+ |[3] Foo.lambda$bar$0:(ILjava/lang/Object;)V
+0001f8: 0200 | class_idx: 0002
+0001fa: 0600 | proto_idx: 0006
+0001fc: 2400 0000 | name_idx: 00000024
+ |[4] Main.<init>:()V
+000200: 0300 | class_idx: 0003
+000202: 0400 | proto_idx: 0004
+000204: 0200 0000 | name_idx: 00000002
+ |[5] Main.main:([Ljava/lang/String;)V
+000208: 0300 | class_idx: 0003
+00020a: 0800 | proto_idx: 0008
+00020c: 2500 0000 | name_idx: 00000025
+ |[6] java.io.PrintStream.println:(I)V
+000210: 0500 | class_idx: 0005
+000212: 0500 | proto_idx: 0005
+000214: 2800 0000 | name_idx: 00000028
+ |[7] java.lang.Integer.intValue:()I
+000218: 0600 | class_idx: 0006
+00021a: 0000 | proto_idx: 0000
+00021c: 2100 0000 | name_idx: 00000021
+ |[8] java.lang.Integer.valueOf:(I)Ljava/lang/Integer;
+000220: 0600 | class_idx: 0006
+000222: 0200 | proto_idx: 0002
+000224: 2b00 0000 | name_idx: 0000002b
+ |[9] java.lang.Object.<init>:()V
+000228: 0700 | class_idx: 0007
+00022a: 0400 | proto_idx: 0004
+00022c: 0200 0000 | name_idx: 00000002
+ |[a] java.lang.invoke.LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
+000230: 0b00 | class_idx: 000b
+000232: 0300 | proto_idx: 0003
+000234: 2600 0000 | name_idx: 00000026
+ |
+ |class_defs:
+ |[0] Consumer
+000238: 0100 0000 | class_idx: 00000001
+00023c: 0006 0000 | access_flags: interface|abstract
+000240: 0700 0000 | superclass_idx: 00000007 // java.lang.Object
+000244: 0000 0000 | interfaces_off: 00000000
+000248: 1600 0000 | source_file_idx: 00000016 // Main.java
+00024c: 7003 0000 | annotations_off: 00000370
+000250: 2906 0000 | class_data_off: 00000629
+000254: 0000 0000 | static_values_off: 00000000
+ |[1] Foo
+000258: 0200 0000 | class_idx: 00000002
+00025c: 0000 0000 | access_flags: 0000
+000260: 0700 0000 | superclass_idx: 00000007 // java.lang.Object
+000264: 0000 0000 | interfaces_off: 00000000
+000268: 1600 0000 | source_file_idx: 00000016 // Main.java
+00026c: 0000 0000 | annotations_off: 00000000
+000270: 3106 0000 | class_data_off: 00000631
+000274: 0000 0000 | static_values_off: 00000000
+ |[2] Main
+000278: 0300 0000 | class_idx: 00000003
+00027c: 0000 0000 | access_flags: 0000
+000280: 0700 0000 | superclass_idx: 00000007 // java.lang.Object
+000284: 0000 0000 | interfaces_off: 00000000
+000288: 1600 0000 | source_file_idx: 00000016 // Main.java
+00028c: 0000 0000 | annotations_off: 00000000
+000290: 4606 0000 | class_data_off: 00000646
+000294: 0000 0000 | static_values_off: 00000000
+ |
+ |call_site_ids:
+ |[0] call site{method-handle{invoke-static,method{java.lang.invoke.LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}}, string{"accept"}, proto{(LFoo;I)LConsumer;}, proto{(Ljava/lang/Object;)V}, method-handle{invoke-direct,method{Foo.lambda$bar$0:(ILjava/lang/Object;)V}}, proto{(Ljava/lang/Object;)V}}
+000298: 1c06 0000 |call_site_off: 0000061c
+00029c: 0000 0000 |
+ |
+ |method_handles:
+0002a0: 0400 |kind: 0004
+0002a2: 0000 |reserved:0000
+0002a4: 0a00 |methodId: 10
+0002a6: 0000 |reserved:0000
+0002a8: 0700 |kind: 0007
+0002aa: 0000 |reserved:0000
+0002ac: 0300 |methodId: 3
+0002ae: 0000 |reserved:0000
+ |
+ |word_data:
+ |[2b0] annotation set
+0002b0: 0100 0000 | size: 00000001
+0002b4: 0606 0000 | entries[0]: 00000606
+ | visibility: system
+ | type: dalvik.annotation.Signature
+ | value: array {<T:, Ljava/lang/Object;, >, Ljava/lang/Object;}
+ |
+ |[2b8] annotation set
+0002b8: 0100 0000 | size: 00000001
+0002bc: 1406 0000 | entries[0]: 00000614
+ | visibility: system
+ | type: dalvik.annotation.Signature
+ | value: array {(TT;)V}
+ |
+ |[2c0] Foo.<init>:()V
+0002c0: 0100 | registers_size: 0001
+0002c2: 0100 | ins_size: 0001
+0002c4: 0100 | outs_size: 0001
+0002c6: 0000 | tries_size: 0000
+0002c8: de05 0000 | debug_off: 000005de
+0002cc: 0400 0000 | insns_size: 00000004
+0002d0: 7010 0900 0000 | 0000: invoke-direct {v0}, java.lang.Object.<init>:()V // method@0009
+0002d6: 0e00 | 0003: return-void
+ | debug info
+ | line_start: 21
+ | parameters_size: 0000
+ | 0000: prologue end
+ | 0000: line 21
+ | end sequence
+ |
+ |[2d8] Foo.lambda$bar$0:(ILjava/lang/Object;)V
+0002d8: 0600 | registers_size: 0006
+0002da: 0300 | ins_size: 0003
+0002dc: 0200 | outs_size: 0002
+0002de: 0000 | tries_size: 0000
+0002e0: e305 0000 | debug_off: 000005e3
+0002e4: 1000 0000 | insns_size: 00000010
+0002e8: 6200 0100 | 0000: sget-object v0, java.lang.System.out:Ljava/io/PrintStream; // field@0001
+0002ec: 5231 0000 | 0002: iget v1, v3, Foo.i:I // field@0000
+0002f0: b041 | 0004: add-int/2addr v1, v4
+0002f2: 1f05 0600 | 0005: check-cast v5, java.lang.Integer // type@0006
+0002f6: 6e10 0700 0500 | 0007: invoke-virtual {v5}, java.lang.Integer.intValue:()I // method@0007
+0002fc: 0a02 | 000a: move-result v2
+0002fe: b021 | 000b: add-int/2addr v1, v2
+000300: 6e20 0600 1000 | 000c: invoke-virtual {v0, v1}, java.io.PrintStream.println:(I)V // method@0006
+000306: 0e00 | 000f: return-void
+ | debug info
+ | line_start: 24
+ | parameters_size: 0002
+ | parameter <unnamed> v4
+ | parameter k v5
+ | 0000: prologue end
+ | 0000: line 24
+ | 0007: advance pc
+ | 0007: -local v5 k java.lang.Object
+ | end sequence
+ |
+ |[308] Foo.bar:(I)V
+000308: 0400 | registers_size: 0004
+00030a: 0200 | ins_size: 0002
+00030c: 0200 | outs_size: 0002
+00030e: 0000 | tries_size: 0000
+000310: ee05 0000 | debug_off: 000005ee
+000314: 0d00 0000 | insns_size: 0000000d
+000318: fc20 0000 3200 | 0000: invoke-custom {v2, v3}, {invoke-static,method{java.lang.invoke.LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}, accept, (LFoo;I)LConsumer;, (Ljava/lang/Object;)V, invoke-direct,method{Foo.lambda$bar$0:(ILjava/lang/Object;)V}, (Ljava/lang/Object;)V} // CallSiteRef@0000
+00031e: 0c00 | 0003: move-result-object v0
+000320: 1211 | 0004: const/4 v1, #int 1 // #1
+000322: 7110 0800 0100 | 0005: invoke-static {v1}, java.lang.Integer.valueOf:(I)Ljava/lang/Integer; // method@0008
+000328: 0c01 | 0008: move-result-object v1
+00032a: 7220 0000 1000 | 0009: invoke-interface {v0, v1}, Consumer.accept:(Ljava/lang/Object;)V // method@0000
+000330: 0e00 | 000c: return-void
+ | debug info
+ | line_start: 24
+ | parameters_size: 0001
+ | parameter j v3
+ | 0000: prologue end
+ | 0000: line 24
+ | 0004: line 25
+ | 0004: +local v0 consumer Consumer
+ | 000c: line 26
+ | end sequence
+ |
+000332: 0000 |
+ |[334] Main.<init>:()V
+000334: 0100 | registers_size: 0001
+000336: 0100 | ins_size: 0001
+000338: 0100 | outs_size: 0001
+00033a: 0000 | tries_size: 0000
+00033c: fa05 0000 | debug_off: 000005fa
+000340: 0400 0000 | insns_size: 00000004
+000344: 7010 0900 0000 | 0000: invoke-direct {v0}, java.lang.Object.<init>:()V // method@0009
+00034a: 0e00 | 0003: return-void
+ | debug info
+ | line_start: 29
+ | parameters_size: 0000
+ | 0000: prologue end
+ | 0000: line 29
+ | end sequence
+ |
+ |[34c] Main.main:([Ljava/lang/String;)V
+00034c: 0300 | registers_size: 0003
+00034e: 0100 | ins_size: 0001
+000350: 0200 | outs_size: 0002
+000352: 0000 | tries_size: 0000
+000354: ff05 0000 | debug_off: 000005ff
+000358: 0a00 0000 | insns_size: 0000000a
+00035c: 2200 0200 | 0000: new-instance v0, Foo // type@0002
+000360: 7010 0100 0000 | 0002: invoke-direct {v0}, Foo.<init>:()V // method@0001
+000366: 1251 | 0005: const/4 v1, #int 5 // #5
+000368: 6e20 0200 1000 | 0006: invoke-virtual {v0, v1}, Foo.bar:(I)V // method@0002
+00036e: 0e00 | 0009: return-void
+ | debug info
+ | line_start: 31
+ | parameters_size: 0001
+ | parameter args v2
+ | 0000: prologue end
+ | 0000: line 31
+ | 0009: line 32
+ | end sequence
+ |
+ |[370] annotations directory
+000370: b002 0000 | class_annotations_off: 000002b0
+000374: 0000 0000 | fields_size: 00000000
+000378: 0100 0000 | methods_size: 00000001
+00037c: 0000 0000 | parameters_size: 00000000
+ | methods:
+ | Consumer.accept:(Ljava/lang/Object;)V
+000380: 0000 0000 | method_idx: 00000000
+000384: b802 0000 | annotations_off: 000002b8
+ |
+ |[388] type_list
+000388: 0200 0000 | size: 00000002
+00038c: 0200 | 0002 // Foo
+00038e: 0000 | 0000 // int
+ |
+ |[390] type_list
+000390: 0100 0000 | size: 00000001
+000394: 0000 | 0000 // int
+ |
+000396: 0000 |
+ |[398] type_list
+000398: 0600 0000 | size: 00000006
+00039c: 0d00 | 000d // java.lang.invoke.MethodHandles$Lookup
+00039e: 0800 | 0008 // java.lang.String
+0003a0: 0e00 | 000e // java.lang.invoke.MethodType
+0003a2: 0e00 | 000e // java.lang.invoke.MethodType
+0003a4: 0c00 | 000c // java.lang.invoke.MethodHandle
+0003a6: 0e00 | 000e // java.lang.invoke.MethodType
+ |
+ |[3a8] type_list
+0003a8: 0200 0000 | size: 00000002
+0003ac: 0000 | 0000 // int
+0003ae: 0700 | 0007 // java.lang.Object
+ |
+ |[3b0] type_list
+0003b0: 0100 0000 | size: 00000001
+0003b4: 0700 | 0007 // java.lang.Object
+ |
+0003b6: 0000 |
+ |[3b8] type_list
+0003b8: 0100 0000 | size: 00000001
+0003bc: 1000 | 0010 // java.lang.String[]
+ |
+ |string_data:
+0003be: 06 |utf16_size: 00000006
+0003bf: 2854 543b 2956 00 |"(TT;)V"
+ |
+0003c6: 03 |utf16_size: 00000003
+0003c7: 3c54 3a00 |"<T:"
+ |
+0003cb: 06 |utf16_size: 00000006
+0003cc: 3c69 6e69 743e 00 |"<init>"
+ |
+0003d3: 01 |utf16_size: 00000001
+0003d4: 3e00 |">"
+ |
+0003d6: 01 |utf16_size: 00000001
+0003d7: 4900 |"I"
+ |
+0003d9: 0a |utf16_size: 0000000a
+0003da: 4c43 6f6e 7375 6d65 723b|"LConsumer;"
+0003e4: 00 |
+ |
+0003e5: 05 |utf16_size: 00000005
+0003e6: 4c46 6f6f 3b00 |"LFoo;"
+ |
+0003ec: 02 |utf16_size: 00000002
+0003ed: 4c49 00 |"LI"
+ |
+0003f0: 03 |utf16_size: 00000003
+0003f1: 4c4c 4900 |"LLI"
+ |
+0003f5: 07 |utf16_size: 00000007
+0003f6: 4c4c 4c4c 4c4c 4c00 |"LLLLLLL"
+ |
+0003fe: 06 |utf16_size: 00000006
+0003ff: 4c4d 6169 6e3b 00 |"LMain;"
+ |
+000406: 1d |utf16_size: 0000001d
+000407: 4c64 616c 7669 6b2f 616e|"Ldalvik/annotation/Signature;"
+000411: 6e6f 7461 7469 6f6e 2f53|
+00041b: 6967 6e61 7475 7265 3b00|
+ |
+000425: 15 |utf16_size: 00000015
+000426: 4c6a 6176 612f 696f 2f50|"Ljava/io/PrintStream;"
+000430: 7269 6e74 5374 7265 616d|
+00043a: 3b00 |
+ |
+00043c: 13 |utf16_size: 00000013
+00043d: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/Integer;"
+000447: 2f49 6e74 6567 6572 3b00|
+ |
+000451: 12 |utf16_size: 00000012
+000452: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/Object;"
+00045c: 2f4f 626a 6563 743b 00 |
+ |
+000465: 12 |utf16_size: 00000012
+000466: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/String;"
+000470: 2f53 7472 696e 673b 00 |
+ |
+000479: 12 |utf16_size: 00000012
+00047a: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/System;"
+000484: 2f53 7973 7465 6d3b 00 |
+ |
+00048d: 1b |utf16_size: 0000001b
+00048e: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/invoke/CallSite;"
+000498: 2f69 6e76 6f6b 652f 4361|
+0004a2: 6c6c 5369 7465 3b00 |
+ |
+0004aa: 24 |utf16_size: 00000024
+0004ab: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/invoke/LambdaMetafactory;"
+0004b5: 2f69 6e76 6f6b 652f 4c61|
+0004bf: 6d62 6461 4d65 7461 6661|
+0004c9: 6374 6f72 793b 00 |
+ |
+0004d0: 1f |utf16_size: 0000001f
+0004d1: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/invoke/MethodHandle;"
+0004db: 2f69 6e76 6f6b 652f 4d65|
+0004e5: 7468 6f64 4861 6e64 6c65|
+0004ef: 3b00 |
+ |
+0004f1: 27 |utf16_size: 00000027
+0004f2: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/invoke/MethodHandles$Lookup;"
+0004fc: 2f69 6e76 6f6b 652f 4d65|
+000506: 7468 6f64 4861 6e64 6c65|
+000510: 7324 4c6f 6f6b 7570 3b00|
+ |
+00051a: 1d |utf16_size: 0000001d
+00051b: 4c6a 6176 612f 6c61 6e67|"Ljava/lang/invoke/MethodType;"
+000525: 2f69 6e76 6f6b 652f 4d65|
+00052f: 7468 6f64 5479 7065 3b00|
+ |
+000539: 09 |utf16_size: 00000009
+00053a: 4d61 696e 2e6a 6176 6100|"Main.java"
+ |
+000544: 01 |utf16_size: 00000001
+000545: 5600 |"V"
+ |
+000547: 02 |utf16_size: 00000002
+000548: 5649 00 |"VI"
+ |
+00054b: 03 |utf16_size: 00000003
+00054c: 5649 4c00 |"VIL"
+ |
+000550: 02 |utf16_size: 00000002
+000551: 564c 00 |"VL"
+ |
+000554: 13 |utf16_size: 00000013
+000555: 5b4c 6a61 7661 2f6c 616e|"[Ljava/lang/String;"
+00055f: 672f 5374 7269 6e67 3b00|
+ |
+000569: 06 |utf16_size: 00000006
+00056a: 6163 6365 7074 00 |"accept"
+ |
+000571: 04 |utf16_size: 00000004
+000572: 6172 6773 00 |"args"
+ |
+000577: 03 |utf16_size: 00000003
+000578: 6261 7200 |"bar"
+ |
+00057c: 08 |utf16_size: 00000008
+00057d: 636f 6e73 756d 6572 00 |"consumer"
+ |
+000586: 01 |utf16_size: 00000001
+000587: 6900 |"i"
+ |
+000589: 08 |utf16_size: 00000008
+00058a: 696e 7456 616c 7565 00 |"intValue"
+ |
+000593: 01 |utf16_size: 00000001
+000594: 6a00 |"j"
+ |
+000596: 01 |utf16_size: 00000001
+000597: 6b00 |"k"
+ |
+000599: 0c |utf16_size: 0000000c
+00059a: 6c61 6d62 6461 2462 6172|"lambda$bar$0"
+0005a4: 2430 00 |
+ |
+0005a7: 04 |utf16_size: 00000004
+0005a8: 6d61 696e 00 |"main"
+ |
+0005ad: 0b |utf16_size: 0000000b
+0005ae: 6d65 7461 6661 6374 6f72|"metafactory"
+0005b8: 7900 |
+ |
+0005ba: 03 |utf16_size: 00000003
+0005bb: 6f75 7400 |"out"
+ |
+0005bf: 07 |utf16_size: 00000007
+0005c0: 7072 696e 746c 6e00 |"println"
+ |
+0005c8: 04 |utf16_size: 00000004
+0005c9: 7468 6973 00 |"this"
+ |
+0005ce: 05 |utf16_size: 00000005
+0005cf: 7661 6c75 6500 |"value"
+ |
+0005d5: 07 |utf16_size: 00000007
+0005d6: 7661 6c75 654f 6600 |"valueOf"
+ |
+ |byte_data:
+ |[5de] debug info
+0005de: 15 |line_start: 21
+0005df: 00 |parameters_size: 0000
+0005e0: 07 |0000: prologue end
+0005e1: 0e |0000: line 21
+0005e2: 00 |end sequence
+ |
+ |[5e3] debug info
+0005e3: 18 |line_start: 24
+0005e4: 02 |parameters_size: 0002
+0005e5: 00 |parameter <unnamed> v4
+0005e6: 24 |parameter k v5
+0005e7: 07 |0000: prologue end
+0005e8: 0e |0000: line 24
+0005e9: 0107 |0007: advance pc
+0005eb: 0505 |0007: -local v5 k java.lang.Object
+0005ed: 00 |end sequence
+ |
+ |[5ee] debug info
+0005ee: 18 |line_start: 24
+0005ef: 01 |parameters_size: 0001
+0005f0: 23 |parameter j v3
+0005f1: 07 |0000: prologue end
+0005f2: 0e |0000: line 24
+0005f3: 4b |0004: line 25
+0005f4: 0300 2002 |0004: +local v0 consumer Consumer
+0005f8: 87 |000c: line 26
+0005f9: 00 |end sequence
+ |
+ |[5fa] debug info
+0005fa: 1d |line_start: 29
+0005fb: 00 |parameters_size: 0000
+0005fc: 07 |0000: prologue end
+0005fd: 0e |0000: line 29
+0005fe: 00 |end sequence
+ |
+ |[5ff] debug info
+0005ff: 1f |line_start: 31
+000600: 01 |parameters_size: 0001
+000601: 1e |parameter args v2
+000602: 07 |0000: prologue end
+000603: 0e |0000: line 31
+000604: 96 |0009: line 32
+000605: 00 |end sequence
+ |
+ |[606] annotation
+000606: 02 | visibility: VISBILITY_SYSTEM
+000607: 04 | type_idx: 00000004 // dalvik.annotation.Signature
+000608: 01 | size: 00000001
+ | elements[0]:
+000609: 2a | name_idx: 0000002a // value
+00060a: 1c04 1701 170e 1703 170e| value: array {<T:, Ljava/lang/Object;, >, Ljava/lang/Object;}
+ |
+ |[614] annotation
+000614: 02 | visibility: VISBILITY_SYSTEM
+000615: 04 | type_idx: 00000004 // dalvik.annotation.Signature
+000616: 01 | size: 00000001
+ | elements[0]:
+000617: 2a | name_idx: 0000002a // value
+000618: 1c01 1700 | value: array {(TT;)V}
+ |
+ |[61c] call site
+00061c: 06 | size: 00000006
+00061d: 1600 | [0] method handle invoke-static,method{java.lang.invoke.LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}
+00061f: 171c | [1] utf8 accept
+000621: 1501 | [2] proto (LFoo;I)LConsumer;
+000623: 1507 | [3] proto (Ljava/lang/Object;)V
+000625: 1601 | [4] method handle invoke-direct,method{Foo.lambda$bar$0:(ILjava/lang/Object;)V}
+000627: 1507 | [5] proto (Ljava/lang/Object;)V
+ |
+ |[629] class data for Consumer
+000629: 00 | static_fields_size: 00000000
+00062a: 00 | instance_fields_size: 00000000
+00062b: 00 | direct_methods_size: 00000000
+00062c: 01 | virtual_methods_size: 00000001
+ | virtual_methods:
+ | [0] Consumer.accept:(Ljava/lang/Object;)V
+00062d: 00 | method_idx: 00000000
+00062e: 8108 | access_flags: public|abstract
+000630: 00 | code_off: 00000000
+ |
+ |[631] class data for Foo
+000631: 00 | static_fields_size: 00000000
+000632: 01 | instance_fields_size: 00000001
+000633: 02 | direct_methods_size: 00000002
+000634: 01 | virtual_methods_size: 00000001
+ | instance_fields:
+ | [0] Foo.i:I
+000635: 00 | field_idx: 00000000
+000636: 00 | access_flags: 0000
+ | direct_methods:
+ | [0] Foo.<init>:()V
+000637: 01 | method_idx: 00000001
+000638: 8080 04 | access_flags: constructor
+00063b: c005 | code_off: 000002c0
+ | [1] Foo.lambda$bar$0:(ILjava/lang/Object;)V
+00063d: 02 | method_idx: 00000003
+00063e: 8220 | access_flags: private|synthetic
+000640: d805 | code_off: 000002d8
+ | virtual_methods:
+ | [0] Foo.bar:(I)V
+000642: 02 | method_idx: 00000002
+000643: 00 | access_flags: 0000
+000644: 8806 | code_off: 00000308
+ |
+ |[646] class data for Main
+000646: 00 | static_fields_size: 00000000
+000647: 00 | instance_fields_size: 00000000
+000648: 02 | direct_methods_size: 00000002
+000649: 00 | virtual_methods_size: 00000000
+ | direct_methods:
+ | [0] Main.<init>:()V
+00064a: 04 | method_idx: 00000004
+00064b: 8080 04 | access_flags: constructor
+00064e: b406 | code_off: 00000334
+ | [1] Main.main:([Ljava/lang/String;)V
+000650: 01 | method_idx: 00000005
+000651: 09 | access_flags: public|static
+000652: cc06 | code_off: 0000034c
+ |
+ |map:
+ |[654] map list
+000654: 1300 0000 | size: 00000013
+ |[658] header_item map
+000658: 0000 | type: 0000 // TYPE_HEADER_ITEM
+00065a: 0000 | unused: 0
+00065c: 0100 0000 | size: 00000001
+000660: 0000 0000 | offset: 00000000
+ |[664] string_id_item map
+000664: 0100 | type: 0001 // TYPE_STRING_ID_ITEM
+000666: 0000 | unused: 0
+000668: 2c00 0000 | size: 0000002c
+00066c: 7000 0000 | offset: 00000070
+ |[670] type_id_item map
+000670: 0200 | type: 0002 // TYPE_TYPE_ID_ITEM
+000672: 0000 | unused: 0
+000674: 1100 0000 | size: 00000011
+000678: 2001 0000 | offset: 00000120
+ |[67c] proto_id_item map
+00067c: 0300 | type: 0003 // TYPE_PROTO_ID_ITEM
+00067e: 0000 | unused: 0
+000680: 0900 0000 | size: 00000009
+000684: 6401 0000 | offset: 00000164
+ |[688] field_id_item map
+000688: 0400 | type: 0004 // TYPE_FIELD_ID_ITEM
+00068a: 0000 | unused: 0
+00068c: 0200 0000 | size: 00000002
+000690: d001 0000 | offset: 000001d0
+ |[694] method_id_item map
+000694: 0500 | type: 0005 // TYPE_METHOD_ID_ITEM
+000696: 0000 | unused: 0
+000698: 0b00 0000 | size: 0000000b
+00069c: e001 0000 | offset: 000001e0
+ |[6a0] class_def_item map
+0006a0: 0600 | type: 0006 // TYPE_CLASS_DEF_ITEM
+0006a2: 0000 | unused: 0
+0006a4: 0300 0000 | size: 00000003
+0006a8: 3802 0000 | offset: 00000238
+ |[6ac] call_site_id_item map
+0006ac: 0700 | type: 0007 // TYPE_CALL_SITE_ID_ITEM
+0006ae: 0000 | unused: 0
+0006b0: 0100 0000 | size: 00000001
+0006b4: 9802 0000 | offset: 00000298
+ |[6b8] method_handle_item map
+0006b8: 0800 | type: 0008 // TYPE_METHOD_HANDLE_ITEM
+0006ba: 0000 | unused: 0
+0006bc: 0200 0000 | size: 00000002
+0006c0: a002 0000 | offset: 000002a0
+ |[6c4] annotation_set_item map
+0006c4: 0310 | type: 1003 // TYPE_ANNOTATION_SET_ITEM
+0006c6: 0000 | unused: 0
+0006c8: 0200 0000 | size: 00000002
+0006cc: b002 0000 | offset: 000002b0
+ |[6d0] code_item map
+0006d0: 0120 | type: 2001 // TYPE_CODE_ITEM
+0006d2: 0000 | unused: 0
+0006d4: 0500 0000 | size: 00000005
+0006d8: c002 0000 | offset: 000002c0
+ |[6dc] annotations_directory_item map
+0006dc: 0620 | type: 2006 // TYPE_ANNOTATIONS_DIRECTORY_ITEM
+0006de: 0000 | unused: 0
+0006e0: 0100 0000 | size: 00000001
+0006e4: 7003 0000 | offset: 00000370
+ |[6e8] type_list map
+0006e8: 0110 | type: 1001 // TYPE_TYPE_LIST
+0006ea: 0000 | unused: 0
+0006ec: 0600 0000 | size: 00000006
+0006f0: 8803 0000 | offset: 00000388
+ |[6f4] string_data_item map
+0006f4: 0220 | type: 2002 // TYPE_STRING_DATA_ITEM
+0006f6: 0000 | unused: 0
+0006f8: 2c00 0000 | size: 0000002c
+0006fc: be03 0000 | offset: 000003be
+ |[700] debug_info_item map
+000700: 0320 | type: 2003 // TYPE_DEBUG_INFO_ITEM
+000702: 0000 | unused: 0
+000704: 0500 0000 | size: 00000005
+000708: de05 0000 | offset: 000005de
+ |[70c] annotation_item map
+00070c: 0420 | type: 2004 // TYPE_ANNOTATION_ITEM
+00070e: 0000 | unused: 0
+000710: 0200 0000 | size: 00000002
+000714: 0606 0000 | offset: 00000606
+ |[718] encoded_array_item map
+000718: 0520 | type: 2005 // TYPE_ENCODED_ARRAY_ITEM
+00071a: 0000 | unused: 0
+00071c: 0100 0000 | size: 00000001
+000720: 1c06 0000 | offset: 0000061c
+ |[724] class_data_item map
+000724: 0020 | type: 2000 // TYPE_CLASS_DATA_ITEM
+000726: 0000 | unused: 0
+000728: 0300 0000 | size: 00000003
+00072c: 2906 0000 | offset: 00000629
+ |[730] map_list map
+000730: 0010 | type: 1000 // TYPE_MAP_LIST
+000732: 0000 | unused: 0
+000734: 0100 0000 | size: 00000001
+000738: 5406 0000 | offset: 00000654
+ |
+ |method code index:
+ |
+ |[2c0] Foo.<init>:()V
+ |[308] Foo.bar:(I)V
+ |[2d8] Foo.lambda$bar$0:(ILjava/lang/Object;)V
+ |[334] Main.<init>:()V
+ |[34c] Main.main:([Ljava/lang/String;)V
+ |
+ |statistics:
+ | annotation: 2 items; 22 bytes total
+ | 8..14 bytes/item; average 11
+ | annotation set: 2 items; 16 bytes total
+ | 8 bytes/item
+ | annotations directory: 1 item; 24 bytes total
+ | 24 bytes/item
+ | call site id: 1 item; 4 bytes total
+ | 4 bytes/item
+ | class data: 3 items; 43 bytes total
+ | 8..21 bytes/item; average 14
+ | class def: 3 items; 96 bytes total
+ | 32 bytes/item
+ | code: 5 items; 176 bytes total
+ | 24..48 bytes/item; average 35
+ | debug info: 5 items; 40 bytes total
+ | 5..12 bytes/item; average 8
+ | encoded array: 1 item; 13 bytes total
+ | 13 bytes/item
+ | field id: 2 items; 16 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: 2 items; 16 bytes total
+ | 8 bytes/item
+ | method id: 11 items; 88 bytes total
+ | 8 bytes/item
+ | proto id: 9 items; 108 bytes total
+ | 12 bytes/item
+ | string data: 44 items; 544 bytes total
+ | 3..41 bytes/item; average 12
+ | string id: 44 items; 176 bytes total
+ | 4 bytes/item
+ | type id: 17 items; 68 bytes total
+ | 4 bytes/item
+ | type list: 6 items; 50 bytes total
+ | 6..16 bytes/item; average 8
diff --git a/dx/tests/139-lambda-metafactory/info.txt b/dx/tests/139-lambda-metafactory/info.txt
new file mode 100644
index 000000000..5768a8e41
--- /dev/null
+++ b/dx/tests/139-lambda-metafactory/info.txt
@@ -0,0 +1 @@
+Tests lambda metafactory constructs are convertible to DEX (b/63112734).
diff --git a/dx/tests/139-lambda-metafactory/run b/dx/tests/139-lambda-metafactory/run
new file mode 100755
index 000000000..28e8704a9
--- /dev/null
+++ b/dx/tests/139-lambda-metafactory/run
@@ -0,0 +1,22 @@
+#!/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.
+
+SDK_VERSION=26
+
+JAVAC_FLAGS="-g -Xlint:-options -source 1.8 -target 1.8 -implicit:none"
+$JAVAC $JAVAC_FLAGS -d . Main.java
+dx --debug --dex --min-sdk-version=${SDK_VERSION} --output="classes.dex" \
+ --dump-width=1000 --dump-to=- *.class 2>&1
diff --git a/dx/tests/run-test b/dx/tests/run-test
index 8c8a95f84..44f2bd70e 100755
--- a/dx/tests/run-test
+++ b/dx/tests/run-test
@@ -96,14 +96,16 @@ if [ "$usage" = "yes" ]; then
exit 1
fi
-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
+td_info="${testdir}/${info}"
+td_run="${testdir}/${run}"
+td_expected="${testdir}/${expected}"
+
+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
@@ -122,8 +124,15 @@ if [ "$dev_mode" = "yes" ]; then
echo "exit status: $?" 1>&2
good="yes"
elif [ "$update_mode" = "yes" ]; then
- "./$run" >"${progdir}/$td_expected" 2>&1
- good="yes"
+ "./$run" >"$output" 2>&1
+ if [[ $? == 0 ]]; then
+ good="yes"
+ mv "$output" "${progdir}/${td_expected}"
+ else
+ echo "Test failed during update."
+ good="no"
+ fi
+
else
"./$run" >"$output" 2>&1
cmp -s "$expected" "$output"
diff --git a/libdex/DexFile.h b/libdex/DexFile.h
index 74fce3c49..c274e64c9 100644
--- a/libdex/DexFile.h
+++ b/libdex/DexFile.h
@@ -371,6 +371,21 @@ struct DexCallSiteId {
};
/*
+ * Enumeration of method handle type codes.
+ */
+enum MethodHandleType {
+ STATIC_PUT = 0x00,
+ STATIC_GET = 0x01,
+ INSTANCE_PUT = 0x02,
+ INSTANCE_GET = 0x03,
+ INVOKE_STATIC = 0x04,
+ INVOKE_INSTANCE = 0x05,
+ INVOKE_CONSTRUCTOR = 0x06,
+ INVOKE_DIRECT = 0x07,
+ INVOKE_INTERFACE = 0x08
+};
+
+/*
* Direct-mapped "method_handle_item"
*/
struct DexMethodHandleItem {
diff --git a/libdex/DexSwapVerify.cpp b/libdex/DexSwapVerify.cpp
index bd9140cd3..efb4fb774 100644
--- a/libdex/DexSwapVerify.cpp
+++ b/libdex/DexSwapVerify.cpp
@@ -1068,23 +1068,31 @@ static void* crossVerifyMethodHandleItem(const CheckState* state, void* ptr) {
ALOGE("Verifying method handle but expecting none");
return NULL;
}
- if (item->methodHandleType <= 3 &&
- item->fieldOrMethodIdx >= state->pHeader->fieldIdsSize) {
- // 0-3 are field accessors.
- ALOGE("Method handle has invalid field id: %u\n", item->fieldOrMethodIdx);
- return NULL;
- }
- if (item->methodHandleType >= 4 &&
- item->methodHandleType <= 6 &&
- item->fieldOrMethodIdx >= state->pHeader->methodIdsSize) {
- // 4-6 are method invocations.
- ALOGE("Method handle has invalid method id: %u\n", item->fieldOrMethodIdx);
- return NULL;
- }
- if (item->methodHandleType >= 7) {
+ if (item->methodHandleType > (u2) MethodHandleType::INVOKE_INTERFACE) {
ALOGE("Unknown method handle type: %u", item->methodHandleType);
return NULL;
}
+ switch ((MethodHandleType) item->methodHandleType) {
+ case MethodHandleType::STATIC_PUT:
+ case MethodHandleType::STATIC_GET:
+ case MethodHandleType::INSTANCE_PUT:
+ case MethodHandleType::INSTANCE_GET:
+ if (item->fieldOrMethodIdx >= state->pHeader->fieldIdsSize) {
+ ALOGE("Method handle has invalid field id: %u\n", item->fieldOrMethodIdx);
+ return NULL;
+ }
+ break;
+ case MethodHandleType::INVOKE_STATIC:
+ case MethodHandleType::INVOKE_INSTANCE:
+ case MethodHandleType::INVOKE_CONSTRUCTOR:
+ case MethodHandleType::INVOKE_DIRECT:
+ case MethodHandleType::INVOKE_INTERFACE:
+ if (item->fieldOrMethodIdx >= state->pHeader->methodIdsSize) {
+ ALOGE("Method handle has invalid method id: %u\n", item->fieldOrMethodIdx);
+ return NULL;
+ }
+ break;
+ }
return (void*) (item + 1);
}
diff --git a/libdex/SysUtil.cpp b/libdex/SysUtil.cpp
index 634e94ffa..f8d8ae664 100644
--- a/libdex/SysUtil.cpp
+++ b/libdex/SysUtil.cpp
@@ -30,7 +30,7 @@
#include <limits.h>
#include <errno.h>
-#include <JNIHelp.h> // TEMP_FAILURE_RETRY may or may not be in unistd
+#include <nativehelper/JNIHelp.h> // TEMP_FAILURE_RETRY may or may not be in unistd
/*