diff options
94 files changed, 18629 insertions, 287 deletions
@@ -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 Binary files differnew file mode 100644 index 000000000..c4e8a67dd --- /dev/null +++ b/dx/tests/133-source-debug-extension/HelloKt.class 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 Binary files differnew file mode 100644 index 000000000..85e1c41b2 --- /dev/null +++ b/dx/tests/135-invoke-custom/invokecustom.jar 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 Binary files differnew file mode 100644 index 000000000..ac56f78cb --- /dev/null +++ b/dx/tests/137-dexmerger-dex38/invokecustom.jar 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 /* |