From 0156e0d255709355b1e8f5303bd8256ab6967b0a Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Mon, 18 Dec 2017 11:43:53 -0800 Subject: Revert "Revert "Merge remote-tracking branch 'aosp/upstream-master' into desugar"" This reverts commit 67e182a0a1c1d59b5fa107a42ba3bacdc7255eba. Bug: 70415451 Test: m checkbuild Change-Id: I87e967894b53b0f18defc48868e4e3b8181ddd33 --- .../android/desugar/BytecodeTypeInference.java | 138 +++-- .../build/android/desugar/LambdaClassMaker.java | 37 +- .../android/desugar/TryWithResourcesRewriter.java | 27 +- .../build/android/desugar/ByteCodeTypePrinter.java | 34 +- .../desugar/BytecodeTypeInferenceTest.golden.txt | 627 ++++++++++++++++++++- .../android/desugar/BytecodeTypeInferenceTest.java | 41 +- .../test_subjects.jar | Bin 3361 -> 3594 bytes .../testsubjects/TestSubject.java | 18 + 8 files changed, 830 insertions(+), 92 deletions(-) diff --git a/java/com/google/devtools/build/android/desugar/BytecodeTypeInference.java b/java/com/google/devtools/build/android/desugar/BytecodeTypeInference.java index 777a4ab..783069f 100644 --- a/java/com/google/devtools/build/android/desugar/BytecodeTypeInference.java +++ b/java/com/google/devtools/build/android/desugar/BytecodeTypeInference.java @@ -14,12 +14,14 @@ package com.google.devtools.build.android.desugar; import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; import com.google.auto.value.AutoValue; import com.google.common.collect.ImmutableList; import java.util.ArrayList; -import java.util.HashMap; +import java.util.Optional; +import javax.annotation.Nullable; import org.objectweb.asm.Handle; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; @@ -41,11 +43,6 @@ public final class BytecodeTypeInference extends MethodVisitor { private FrameInfo previousFrame; /** For debugging purpose. */ private final String methodSignature; - /** - * Stores mapping from "uninitialized" value to concrete value. This is for the "new" instruction. - */ - private final HashMap uninitializedToConcreteTypeMap = - new HashMap<>(); public BytecodeTypeInference(int access, String owner, String name, String methodDescriptor) { super(Opcodes.ASM6); @@ -81,6 +78,10 @@ public final class BytecodeTypeInference extends MethodVisitor { return operandStack.toString(); } + public String getLocalsAsString() { + return localVariableSlots.toString(); + } + @Override public void visitInsn(int opcode) { switch (opcode) { @@ -476,8 +477,7 @@ public final class BytecodeTypeInference extends MethodVisitor { int argumentSize = (Type.getArgumentsAndReturnSizes(desc) >> 2); InferredType receiverType = getTypeOfOperandFromTop(argumentSize - 1); if (receiverType.isUninitialized()) { - InferredType realType = InferredType.create('L' + owner + ';'); - uninitializedToConcreteTypeMap.put(receiverType, realType); + InferredType realType = InferredType.createNonUninitializedType('L' + owner + ';'); replaceUninitializedTypeInStack(receiverType, realType); } } @@ -642,7 +642,6 @@ public final class BytecodeTypeInference extends MethodVisitor { operandStack.addAll(previousFrame.stack()); localVariableSlots.clear(); localVariableSlots.addAll(previousFrame.locals()); - super.visitFrame(type, nLocal, local, nStack, stack); } @@ -672,7 +671,7 @@ public final class BytecodeTypeInference extends MethodVisitor { checkArgument(oldType.isUninitialized(), "The old type is NOT uninitialized. %s", oldType); for (int i = 0, size = operandStack.size(); i < size; ++i) { InferredType type = operandStack.get(i); - if (type == oldType) { + if (type.equals(oldType)) { operandStack.set(i, newType); } } @@ -703,7 +702,7 @@ public final class BytecodeTypeInference extends MethodVisitor { break; case 'L': case '[': - push(InferredType.create(desc.substring(index))); + push(InferredType.createNonUninitializedType(desc.substring(index))); break; default: throw new RuntimeException("Unhandled type: " + desc); @@ -771,12 +770,6 @@ public final class BytecodeTypeInference extends MethodVisitor { return lastPopped; } - private static ImmutableList removeBackFromList( - ImmutableList list, int countToRemove) { - int newSize = list.size() - countToRemove; - return list.subList(0, newSize); - } - /** * Create the types of local variables at the very beginning of the method with the information of * the declaring class and the method descriptor. @@ -787,7 +780,7 @@ public final class BytecodeTypeInference extends MethodVisitor { if (!BitFlags.isSet(access, Opcodes.ACC_STATIC)) { // Instance method, and this is the receiver - types.add(InferredType.create(convertToDescriptor(ownerClass))); + types.add(InferredType.createNonUninitializedType(convertToDescriptor(ownerClass))); } Type[] argumentTypes = Type.getArgumentTypes(methodDescriptor); for (Type argumentType : argumentTypes) { @@ -812,7 +805,7 @@ public final class BytecodeTypeInference extends MethodVisitor { break; case Type.ARRAY: case Type.OBJECT: - types.add(InferredType.create(argumentType.getDescriptor())); + types.add(InferredType.createNonUninitializedType(argumentType.getDescriptor())); break; default: throw new RuntimeException( @@ -828,6 +821,28 @@ public final class BytecodeTypeInference extends MethodVisitor { return types; } + private static ImmutableList removeBackFromList( + ImmutableList list, int countToRemove) { + int origSize = list.size(); + int index = origSize - 1; + + while (index >= 0 && countToRemove > 0) { + InferredType type = list.get(index); + if (type.equals(InferredType.TOP) && index > 0 && list.get(index - 1).isCategory2()) { + --index; // A category 2 takes two slots. + } + --index; // Eat this local variable. + --countToRemove; + } + checkState( + countToRemove == 0, + "countToRemove is %s but not 0. index=%s, list=%s", + countToRemove, + index, + list); + return list.subList(0, index + 1); + } + private ImmutableList appendArrayToList( ImmutableList list, int size, Object[] array) { ImmutableList.Builder builder = ImmutableList.builder(); @@ -861,13 +876,13 @@ public final class BytecodeTypeInference extends MethodVisitor { } else if (typeInStackMapFrame instanceof String) { String referenceTypeName = (String) typeInStackMapFrame; if (referenceTypeName.charAt(0) == '[') { - return InferredType.create(referenceTypeName); + return InferredType.createNonUninitializedType(referenceTypeName); } else { - return InferredType.create('L' + referenceTypeName + ';'); + return InferredType.createNonUninitializedType('L' + referenceTypeName + ';'); } } else if (typeInStackMapFrame instanceof Label) { Label label = (Label) typeInStackMapFrame; - return InferredType.createUninitialized(label.getOffset()); + return InferredType.createUninitializedType(label); } else { throw new RuntimeException( "Cannot reach here. Unhandled element: value=" @@ -911,26 +926,45 @@ public final class BytecodeTypeInference extends MethodVisitor { public static final String UNINITIALIZED_PREFIX = "UNINIT@"; public static final InferredType BOOLEAN = - new AutoValue_BytecodeTypeInference_InferredType("Z"); - public static final InferredType BYTE = new AutoValue_BytecodeTypeInference_InferredType("B"); - public static final InferredType INT = new AutoValue_BytecodeTypeInference_InferredType("I"); - public static final InferredType FLOAT = new AutoValue_BytecodeTypeInference_InferredType("F"); - public static final InferredType LONG = new AutoValue_BytecodeTypeInference_InferredType("J"); - public static final InferredType DOUBLE = new AutoValue_BytecodeTypeInference_InferredType("D"); + new AutoValue_BytecodeTypeInference_InferredType("Z", /*uninitializationLabel=*/ null); + public static final InferredType BYTE = + new AutoValue_BytecodeTypeInference_InferredType("B", /*uninitializationLabel=*/ null); + public static final InferredType INT = + new AutoValue_BytecodeTypeInference_InferredType("I", /*uninitializationLabel=*/ null); + public static final InferredType FLOAT = + new AutoValue_BytecodeTypeInference_InferredType("F", /*uninitializationLabel=*/ null); + public static final InferredType LONG = + new AutoValue_BytecodeTypeInference_InferredType("J", /*uninitializationLabel=*/ null); + public static final InferredType DOUBLE = + new AutoValue_BytecodeTypeInference_InferredType("D", /*uninitializationLabel=*/ null); /** Not a real value. */ - public static final InferredType TOP = new AutoValue_BytecodeTypeInference_InferredType("TOP"); + public static final InferredType TOP = + new AutoValue_BytecodeTypeInference_InferredType("TOP", /*uninitializationLabel=*/ null); /** The value NULL */ public static final InferredType NULL = - new AutoValue_BytecodeTypeInference_InferredType("NULL"); + new AutoValue_BytecodeTypeInference_InferredType("NULL", /*uninitializationLabel=*/ null); public static final InferredType UNINITIALIZED_THIS = - new AutoValue_BytecodeTypeInference_InferredType("UNINITIALIZED_THIS"); + new AutoValue_BytecodeTypeInference_InferredType( + "UNINITIALIZED_THIS", /*uninitializationLabel=*/ null); - static InferredType create(String descriptor) { + /** + * Create a type for a value. This method is not intended to be called outside of this class. + */ + private static InferredType create(String descriptor, @Nullable Label uninitializationLabel) { + if (UNINITIALIZED_PREFIX.equals(descriptor)) { + return new AutoValue_BytecodeTypeInference_InferredType( + UNINITIALIZED_PREFIX, checkNotNull(uninitializationLabel)); + } + checkArgument( + uninitializationLabel == null, + "The uninitializationLabel should be null for non-uninitialized value. %s", + descriptor); char firstChar = descriptor.charAt(0); - if (firstChar == 'L' || firstChar == '[' || descriptor.startsWith(UNINITIALIZED_PREFIX)) { - // Reference, array, or uninitialized values. - return new AutoValue_BytecodeTypeInference_InferredType(descriptor); + if (firstChar == 'L' || firstChar == '[') { + // Reference, array. + return new AutoValue_BytecodeTypeInference_InferredType( + descriptor, /*uninitializationLabel=*/ null); } switch (descriptor) { case "Z": @@ -956,12 +990,23 @@ public final class BytecodeTypeInference extends MethodVisitor { } } - /** Create a type for uninitialized value. The label is generated by ASM. */ - static InferredType createUninitialized(int label) { - return create(UNINITIALIZED_PREFIX + label); + /** Creates all types except UNINITIALIZED. This method can also create UNINTIALIZED_THIS. */ + static InferredType createNonUninitializedType(String descriptor) { + return create(descriptor, /*uninitializationLabel=*/ null); + } + + /** Create a type for an UNINITIALIZED value. The uninitializationLabel is generated by ASM. */ + static InferredType createUninitializedType(Label uninitializationLabel) { + return create(UNINITIALIZED_PREFIX, uninitializationLabel); } abstract String descriptor(); + /** + * The label may be null. This field is meaningful if the current type is "UNINITIALIZED". For + * other types, this field is null. + */ + @Nullable + abstract Label uninitializationLabel(); @Override public String toString() { @@ -978,7 +1023,7 @@ public final class BytecodeTypeInference extends MethodVisitor { public InferredType getElementTypeIfArrayOrThrow() { String descriptor = descriptor(); checkState(descriptor.charAt(0) == '[', "This type %s is not an array.", this); - return create(descriptor.substring(1)); + return createNonUninitializedType(descriptor.substring(1)); } /** Is an uninitialized value? */ @@ -992,17 +1037,16 @@ public final class BytecodeTypeInference extends MethodVisitor { } /** - * If this type is a reference type, then return the internal name. Otherwise, throw an - * exception. + * If this type is a reference type, then return the internal name. Otherwise, returns empty. */ - public String getInternalNameOrThrow() { + public Optional getInternalName() { String descriptor = descriptor(); int length = descriptor.length(); - checkState( - descriptor.charAt(0) == 'L' && descriptor.charAt(length - 1) == ';', - "The type is expected to be either a class or an interface: %s", - descriptor); - return descriptor.substring(1, length - 1); + if (length > 0 && descriptor.charAt(0) == 'L' && descriptor.charAt(length - 1) == ';') { + return Optional.of(descriptor.substring(1, length - 1)); + } else { + return Optional.empty(); + } } } } diff --git a/java/com/google/devtools/build/android/desugar/LambdaClassMaker.java b/java/com/google/devtools/build/android/desugar/LambdaClassMaker.java index beaeb03..1f240ef 100644 --- a/java/com/google/devtools/build/android/desugar/LambdaClassMaker.java +++ b/java/com/google/devtools/build/android/desugar/LambdaClassMaker.java @@ -14,18 +14,19 @@ package com.google.devtools.build.android.desugar; import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.collect.Iterables.getOnlyElement; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Iterators; import java.io.IOException; import java.lang.invoke.MethodHandle; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; -import java.util.function.Predicate; -import java.util.stream.Stream; +import java.util.Set; class LambdaClassMaker { @@ -33,6 +34,7 @@ class LambdaClassMaker { private final Path rootDirectory; private final Map generatedClasses = new LinkedHashMap<>(); + private final Set existingPaths = new HashSet<>(); public LambdaClassMaker(Path rootDirectory) { checkArgument( @@ -42,7 +44,9 @@ class LambdaClassMaker { public void generateLambdaClass(String invokerInternalName, LambdaInfo lambdaInfo, MethodHandle bootstrapMethod, ArrayList bsmArgs) throws IOException { - // Invoking the bootstrap method will dump the generated class + // Invoking the bootstrap method will dump the generated class. Ignore any pre-existing + // matching files, which can come from desugar's implementation using classes being desugared. + existingPaths.addAll(findUnprocessed(invokerInternalName + "$$Lambda$")); try { bootstrapMethod.invokeWithArguments(bsmArgs); } catch (Throwable e) { @@ -50,8 +54,9 @@ class LambdaClassMaker { + invokerInternalName + " using " + bootstrapMethod + " with arguments " + bsmArgs, e); } - Path generatedClassFile = findOnlyUnprocessed(invokerInternalName + "$$Lambda$"); + Path generatedClassFile = getOnlyElement(findUnprocessed(invokerInternalName + "$$Lambda$")); generatedClasses.put(generatedClassFile, lambdaInfo); + existingPaths.add(generatedClassFile); } /** @@ -64,7 +69,7 @@ class LambdaClassMaker { return result; } - private Path findOnlyUnprocessed(String pathPrefix) throws IOException { + private ImmutableList findUnprocessed(String pathPrefix) throws IOException { // pathPrefix is an internal class name prefix containing '/', but paths obtained on Windows // will not contain '/' and searches will fail. So, construct an absolute path from the given // string and use its string representation to find the file we need regardless of host @@ -72,18 +77,14 @@ class LambdaClassMaker { Path rootPathPrefix = rootDirectory.resolve(pathPrefix); final String rootPathPrefixStr = rootPathPrefix.toString(); - // TODO(bazel-team): This could be much nicer with lambdas - try (Stream paths = - Files.list(rootPathPrefix.getParent()) - .filter( - new Predicate() { - @Override - public boolean test(Path path) { - return path.toString().startsWith(rootPathPrefixStr) - && !generatedClasses.containsKey(path); - } - })) { - return Iterators.getOnlyElement(paths.iterator()); + if (!Files.exists(rootPathPrefix.getParent())) { + return ImmutableList.of(); } + return Files.list(rootPathPrefix.getParent()) + .filter( + path -> + path.toString().startsWith(rootPathPrefixStr) + && !existingPaths.contains(path)) + .collect(ImmutableList.toImmutableList()); } } diff --git a/java/com/google/devtools/build/android/desugar/TryWithResourcesRewriter.java b/java/com/google/devtools/build/android/desugar/TryWithResourcesRewriter.java index e4d4da5..8e6d6d5 100644 --- a/java/com/google/devtools/build/android/desugar/TryWithResourcesRewriter.java +++ b/java/com/google/devtools/build/android/desugar/TryWithResourcesRewriter.java @@ -31,6 +31,7 @@ import com.google.common.collect.ImmutableSet; import com.google.devtools.build.android.desugar.BytecodeTypeInference.InferredType; import java.util.Collections; import java.util.LinkedHashSet; +import java.util.Optional; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import javax.annotation.Nullable; @@ -291,10 +292,16 @@ public class TryWithResourcesRewriter extends ClassVisitor { // Check the exception type. InferredType exceptionClass = typeInference.getTypeOfOperandFromTop(1); if (!exceptionClass.isNull()) { - String exceptionClassInternalName = exceptionClass.getInternalNameOrThrow(); + Optional exceptionClassInternalName = exceptionClass.getInternalName(); + checkState( + exceptionClassInternalName.isPresent(), + "The exception %s is not a reference type in %s.%s", + exceptionClass, + internalName, + methodSignature); checkState( isAssignableFrom( - "java.lang.Throwable", exceptionClassInternalName.replace('/', '.')), + "java.lang.Throwable", exceptionClassInternalName.get().replace('/', '.')), "The exception type %s in %s.%s should be a subclass of java.lang.Throwable.", exceptionClassInternalName, internalName, @@ -302,20 +309,26 @@ public class TryWithResourcesRewriter extends ClassVisitor { } } - String resourceClassInternalName = - typeInference.getTypeOfOperandFromTop(0).getInternalNameOrThrow(); + InferredType resourceType = typeInference.getTypeOfOperandFromTop(0); + Optional resourceClassInternalName = resourceType.getInternalName(); + checkState( + resourceClassInternalName.isPresent(), + "The resource class %s is not a reference type in %s.%s", + resourceType, + internalName, + methodSignature); checkState( isAssignableFrom( - "java.lang.AutoCloseable", resourceClassInternalName.replace('/', '.')), + "java.lang.AutoCloseable", resourceClassInternalName.get().replace('/', '.')), "The resource type should be a subclass of java.lang.AutoCloseable: %s", resourceClassInternalName); - resourceTypeInternalNames.add(resourceClassInternalName); + resourceTypeInternalNames.add(resourceClassInternalName.get()); super.visitMethodInsn( opcode, owner, "$closeResource", - "(Ljava/lang/Throwable;L" + resourceClassInternalName + ";)V", + "(Ljava/lang/Throwable;L" + resourceClassInternalName.get() + ";)V", itf); return; } diff --git a/test/java/com/google/devtools/build/android/desugar/ByteCodeTypePrinter.java b/test/java/com/google/devtools/build/android/desugar/ByteCodeTypePrinter.java index fefc599..d58d002 100644 --- a/test/java/com/google/devtools/build/android/desugar/ByteCodeTypePrinter.java +++ b/test/java/com/google/devtools/build/android/desugar/ByteCodeTypePrinter.java @@ -20,6 +20,7 @@ import java.io.InputStream; import java.io.PrintWriter; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Comparator; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import org.objectweb.asm.ClassReader; @@ -53,7 +54,7 @@ public class ByteCodeTypePrinter { private static ImmutableList getSortedClassEntriess(ZipFile jar) { return jar.stream() .filter(entry -> entry.getName().endsWith(".class")) - .sorted() + .sorted(Comparator.comparing(ZipEntry::getName)) .collect(ImmutableList.toImmutableList()); } @@ -116,105 +117,106 @@ public class ByteCodeTypePrinter { this.printWriter = printWriter; } - private void printTypeOfOperandStackTop() { + private void printTypeOfOperandStack() { printer.print(" |__STACK: " + inference.getOperandStackAsString() + "\n"); + printer.print(" |__LOCAL: " + inference.getLocalsAsString() + "\n"); } @Override public void visitIntInsn(int opcode, int operand) { printer.visitIntInsn(opcode, operand); - printTypeOfOperandStackTop(); + printTypeOfOperandStack(); super.visitIntInsn(opcode, operand); } @Override public void visitInsn(int opcode) { printer.visitInsn(opcode); - printTypeOfOperandStackTop(); + printTypeOfOperandStack(); super.visitInsn(opcode); } @Override public void visitMultiANewArrayInsn(String desc, int dims) { printer.visitMultiANewArrayInsn(desc, dims); - printTypeOfOperandStackTop(); + printTypeOfOperandStack(); super.visitMultiANewArrayInsn(desc, dims); } @Override public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) { printer.visitLookupSwitchInsn(dflt, keys, labels); - printTypeOfOperandStackTop(); + printTypeOfOperandStack(); super.visitLookupSwitchInsn(dflt, keys, labels); } @Override public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) { printer.visitTableSwitchInsn(min, max, dflt, labels); - printTypeOfOperandStackTop(); + printTypeOfOperandStack(); super.visitTableSwitchInsn(min, max, dflt, labels); } @Override public void visitIincInsn(int var, int increment) { printer.visitIincInsn(var, increment); - printTypeOfOperandStackTop(); + printTypeOfOperandStack(); super.visitIincInsn(var, increment); } @Override public void visitLdcInsn(Object cst) { printer.visitLdcInsn(cst); - printTypeOfOperandStackTop(); + printTypeOfOperandStack(); super.visitLdcInsn(cst); } @Override public void visitJumpInsn(int opcode, Label label) { printer.visitJumpInsn(opcode, label); - printTypeOfOperandStackTop(); + printTypeOfOperandStack(); super.visitJumpInsn(opcode, label); } @Override public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) { printer.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs); - printTypeOfOperandStackTop(); + printTypeOfOperandStack(); super.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs); } @Override public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { printer.visitMethodInsn(opcode, owner, name, desc, itf); - printTypeOfOperandStackTop(); + printTypeOfOperandStack(); super.visitMethodInsn(opcode, owner, name, desc, itf); } @Override public void visitMethodInsn(int opcode, String owner, String name, String desc) { printer.visitMethodInsn(opcode, owner, name, desc); - printTypeOfOperandStackTop(); + printTypeOfOperandStack(); super.visitMethodInsn(opcode, owner, name, desc); } @Override public void visitFieldInsn(int opcode, String owner, String name, String desc) { printer.visitFieldInsn(opcode, owner, name, desc); - printTypeOfOperandStackTop(); + printTypeOfOperandStack(); super.visitFieldInsn(opcode, owner, name, desc); } @Override public void visitTypeInsn(int opcode, String type) { printer.visitTypeInsn(opcode, type); - printTypeOfOperandStackTop(); + printTypeOfOperandStack(); super.visitTypeInsn(opcode, type); } @Override public void visitVarInsn(int opcode, int var) { printer.visitVarInsn(opcode, var); - printTypeOfOperandStackTop(); + printTypeOfOperandStack(); super.visitVarInsn(opcode, var); } diff --git a/test/java/com/google/devtools/build/android/desugar/BytecodeTypeInferenceTest.golden.txt b/test/java/com/google/devtools/build/android/desugar/BytecodeTypeInferenceTest.golden.txt index 722c2ad..dabfe14 100644 --- a/test/java/com/google/devtools/build/android/desugar/BytecodeTypeInferenceTest.golden.txt +++ b/test/java/com/google/devtools/build/android/desugar/BytecodeTypeInferenceTest.golden.txt @@ -3,1168 +3,1793 @@ Method L0 ALOAD 0 |__STACK: [Ltestsubjects/TestSubject;] + |__LOCAL: [Ltestsubjects/TestSubject;] INVOKESPECIAL java/lang/Object. ()V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;] RETURN |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;] Method catchTest L0 ALOAD 0 |__STACK: [Ljava/lang/Object;] + |__LOCAL: [Ljava/lang/Object;, Ljava/lang/Object;] INSTANCEOF java/lang/String |__STACK: [I] + |__LOCAL: [Ljava/lang/Object;, Ljava/lang/Object;] IFNE L1 |__STACK: [] + |__LOCAL: [Ljava/lang/Object;, Ljava/lang/Object;] L2 GETSTATIC testsubjects/TestSubject.VALUE_ONE : I |__STACK: [I] + |__LOCAL: [Ljava/lang/Object;, Ljava/lang/Object;] IRETURN |__STACK: [] + |__LOCAL: [Ljava/lang/Object;, Ljava/lang/Object;] L1 FRAME SAME ALOAD 0 |__STACK: [Ljava/lang/Object;] + |__LOCAL: [Ljava/lang/Object;, Ljava/lang/Object;] CHECKCAST java/lang/String |__STACK: [Ljava/lang/String;] + |__LOCAL: [Ljava/lang/Object;, Ljava/lang/Object;] INVOKESTATIC java/util/regex/Pattern.compile (Ljava/lang/String;)Ljava/util/regex/Pattern; |__STACK: [Ljava/util/regex/Pattern;] + |__LOCAL: [Ljava/lang/Object;, Ljava/lang/Object;] POP |__STACK: [] + |__LOCAL: [Ljava/lang/Object;, Ljava/lang/Object;] L3 GOTO L4 |__STACK: [] + |__LOCAL: [Ljava/lang/Object;, Ljava/lang/Object;] L5 FRAME SAME1 java/util/regex/PatternSyntaxException ASTORE 2 |__STACK: [] + |__LOCAL: [Ljava/lang/Object;, Ljava/lang/Object;, Ljava/util/regex/PatternSyntaxException;] L6 GETSTATIC testsubjects/TestSubject.VALUE_TWO : I |__STACK: [I] + |__LOCAL: [Ljava/lang/Object;, Ljava/lang/Object;, Ljava/util/regex/PatternSyntaxException;] IRETURN |__STACK: [] + |__LOCAL: [Ljava/lang/Object;, Ljava/lang/Object;, Ljava/util/regex/PatternSyntaxException;] L4 FRAME SAME GETSTATIC testsubjects/TestSubject.VALUE_ONE : I |__STACK: [I] + |__LOCAL: [Ljava/lang/Object;, Ljava/lang/Object;] IRETURN |__STACK: [] + |__LOCAL: [Ljava/lang/Object;, Ljava/lang/Object;] Method assertEquals L0 DLOAD 1 |__STACK: [D, TOP] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] DLOAD 3 |__STACK: [D, TOP, D, TOP] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] INVOKESTATIC java/lang/Double.compare (DD)I |__STACK: [I] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] IFNE L1 |__STACK: [] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] L2 RETURN |__STACK: [] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] L1 FRAME SAME DLOAD 1 |__STACK: [D, TOP] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] DLOAD 3 |__STACK: [D, TOP, D, TOP] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] DSUB |__STACK: [D, TOP] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] INVOKESTATIC java/lang/Math.abs (D)D |__STACK: [D, TOP] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] DLOAD 5 |__STACK: [D, TOP, D, TOP] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] DCMPG |__STACK: [I] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] IFLE L3 |__STACK: [] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] L4 NEW java/lang/RuntimeException |__STACK: [Ljava/lang/RuntimeException;] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] DUP |__STACK: [Ljava/lang/RuntimeException;, Ljava/lang/RuntimeException;] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] NEW java/lang/StringBuilder |__STACK: [Ljava/lang/RuntimeException;, Ljava/lang/RuntimeException;, Ljava/lang/StringBuilder;] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] DUP |__STACK: [Ljava/lang/RuntimeException;, Ljava/lang/RuntimeException;, Ljava/lang/StringBuilder;, Ljava/lang/StringBuilder;] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] INVOKESPECIAL java/lang/StringBuilder. ()V |__STACK: [Ljava/lang/RuntimeException;, Ljava/lang/RuntimeException;, Ljava/lang/StringBuilder;] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] ALOAD 0 |__STACK: [Ljava/lang/RuntimeException;, Ljava/lang/RuntimeException;, Ljava/lang/StringBuilder;, Ljava/lang/String;] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; |__STACK: [Ljava/lang/RuntimeException;, Ljava/lang/RuntimeException;, Ljava/lang/StringBuilder;] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] NEW java/lang/Double |__STACK: [Ljava/lang/RuntimeException;, Ljava/lang/RuntimeException;, Ljava/lang/StringBuilder;, Ljava/lang/Double;] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] DUP |__STACK: [Ljava/lang/RuntimeException;, Ljava/lang/RuntimeException;, Ljava/lang/StringBuilder;, Ljava/lang/Double;, Ljava/lang/Double;] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] DLOAD 1 |__STACK: [Ljava/lang/RuntimeException;, Ljava/lang/RuntimeException;, Ljava/lang/StringBuilder;, Ljava/lang/Double;, Ljava/lang/Double;, D, TOP] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] INVOKESPECIAL java/lang/Double. (D)V |__STACK: [Ljava/lang/RuntimeException;, Ljava/lang/RuntimeException;, Ljava/lang/StringBuilder;, Ljava/lang/Double;] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/Object;)Ljava/lang/StringBuilder; |__STACK: [Ljava/lang/RuntimeException;, Ljava/lang/RuntimeException;, Ljava/lang/StringBuilder;] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] NEW java/lang/Double |__STACK: [Ljava/lang/RuntimeException;, Ljava/lang/RuntimeException;, Ljava/lang/StringBuilder;, Ljava/lang/Double;] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] DUP |__STACK: [Ljava/lang/RuntimeException;, Ljava/lang/RuntimeException;, Ljava/lang/StringBuilder;, Ljava/lang/Double;, Ljava/lang/Double;] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] DLOAD 3 |__STACK: [Ljava/lang/RuntimeException;, Ljava/lang/RuntimeException;, Ljava/lang/StringBuilder;, Ljava/lang/Double;, Ljava/lang/Double;, D, TOP] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] INVOKESPECIAL java/lang/Double. (D)V |__STACK: [Ljava/lang/RuntimeException;, Ljava/lang/RuntimeException;, Ljava/lang/StringBuilder;, Ljava/lang/Double;] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/Object;)Ljava/lang/StringBuilder; |__STACK: [Ljava/lang/RuntimeException;, Ljava/lang/RuntimeException;, Ljava/lang/StringBuilder;] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String; |__STACK: [Ljava/lang/RuntimeException;, Ljava/lang/RuntimeException;, Ljava/lang/String;] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] INVOKESPECIAL java/lang/RuntimeException. (Ljava/lang/String;)V |__STACK: [Ljava/lang/RuntimeException;] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] ATHROW |__STACK: [] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] L3 FRAME SAME RETURN |__STACK: [] + |__LOCAL: [Ljava/lang/String;, D, TOP, D, TOP, D, TOP] Method simpleTryWithResources L0 NEW testsubjects/TestSubject$SimpleResource |__STACK: [Ltestsubjects/TestSubject$SimpleResource;] + |__LOCAL: [] DUP |__STACK: [Ltestsubjects/TestSubject$SimpleResource;, Ltestsubjects/TestSubject$SimpleResource;] + |__LOCAL: [] INVOKESPECIAL testsubjects/TestSubject$SimpleResource. ()V |__STACK: [Ltestsubjects/TestSubject$SimpleResource;] + |__LOCAL: [] ASTORE 0 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;] ACONST_NULL |__STACK: [NULL] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;] ASTORE 1 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, NULL] L1 ALOAD 0 |__STACK: [Ltestsubjects/TestSubject$SimpleResource;] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, NULL] ICONST_1 |__STACK: [Ltestsubjects/TestSubject$SimpleResource;, I] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, NULL] INVOKEVIRTUAL testsubjects/TestSubject$SimpleResource.call (Z)V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, NULL] L2 ALOAD 0 |__STACK: [Ltestsubjects/TestSubject$SimpleResource;] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, NULL] IFNULL L3 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, NULL] ALOAD 1 |__STACK: [NULL] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, NULL] IFNULL L4 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, NULL] L5 ALOAD 0 |__STACK: [Ltestsubjects/TestSubject$SimpleResource;] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, NULL] INVOKEVIRTUAL testsubjects/TestSubject$SimpleResource.close ()V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, NULL] L6 GOTO L3 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, NULL] L7 FRAME FULL [testsubjects/TestSubject$SimpleResource java/lang/Throwable] [java/lang/Throwable] ASTORE 2 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 1 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 2 |__STACK: [Ljava/lang/Throwable;, Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] INVOKEVIRTUAL java/lang/Throwable.addSuppressed (Ljava/lang/Throwable;)V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] GOTO L3 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] L4 FRAME SAME ALOAD 0 |__STACK: [Ltestsubjects/TestSubject$SimpleResource;] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;] INVOKEVIRTUAL testsubjects/TestSubject$SimpleResource.close ()V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;] GOTO L3 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;] L8 FRAME SAME1 java/lang/Throwable ASTORE 2 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 2 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ASTORE 1 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 2 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ATHROW |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] L9 FRAME SAME1 java/lang/Throwable ASTORE 3 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, TOP, Ljava/lang/Throwable;] L10 ALOAD 0 |__STACK: [Ltestsubjects/TestSubject$SimpleResource;] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, TOP, Ljava/lang/Throwable;] IFNULL L11 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, TOP, Ljava/lang/Throwable;] ALOAD 1 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, TOP, Ljava/lang/Throwable;] IFNULL L12 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, TOP, Ljava/lang/Throwable;] L13 ALOAD 0 |__STACK: [Ltestsubjects/TestSubject$SimpleResource;] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, TOP, Ljava/lang/Throwable;] INVOKEVIRTUAL testsubjects/TestSubject$SimpleResource.close ()V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, TOP, Ljava/lang/Throwable;] L14 GOTO L11 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, TOP, Ljava/lang/Throwable;] L15 FRAME FULL [testsubjects/TestSubject$SimpleResource java/lang/Throwable T java/lang/Throwable] [java/lang/Throwable] ASTORE 4 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, TOP, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 1 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, TOP, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 4 |__STACK: [Ljava/lang/Throwable;, Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, TOP, Ljava/lang/Throwable;, Ljava/lang/Throwable;] INVOKEVIRTUAL java/lang/Throwable.addSuppressed (Ljava/lang/Throwable;)V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, TOP, Ljava/lang/Throwable;, Ljava/lang/Throwable;] GOTO L11 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, TOP, Ljava/lang/Throwable;, Ljava/lang/Throwable;] L12 FRAME SAME ALOAD 0 |__STACK: [Ltestsubjects/TestSubject$SimpleResource;] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, TOP, Ljava/lang/Throwable;] INVOKEVIRTUAL testsubjects/TestSubject$SimpleResource.close ()V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, TOP, Ljava/lang/Throwable;] L11 FRAME SAME ALOAD 3 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, TOP, Ljava/lang/Throwable;] ATHROW |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject$SimpleResource;, Ljava/lang/Throwable;, TOP, Ljava/lang/Throwable;] L3 FRAME FULL [] [] RETURN |__STACK: [] + |__LOCAL: [] Method internalCompare L0 ALOAD 4 |__STACK: [Ljava/util/function/BinaryOperator;] + |__LOCAL: [J, TOP, J, TOP, Ljava/util/function/BinaryOperator;] LLOAD 0 |__STACK: [Ljava/util/function/BinaryOperator;, J, TOP] + |__LOCAL: [J, TOP, J, TOP, Ljava/util/function/BinaryOperator;] INVOKESTATIC java/lang/Long.valueOf (J)Ljava/lang/Long; |__STACK: [Ljava/util/function/BinaryOperator;, Ljava/lang/Long;] + |__LOCAL: [J, TOP, J, TOP, Ljava/util/function/BinaryOperator;] LLOAD 2 |__STACK: [Ljava/util/function/BinaryOperator;, Ljava/lang/Long;, J, TOP] + |__LOCAL: [J, TOP, J, TOP, Ljava/util/function/BinaryOperator;] INVOKESTATIC java/lang/Long.valueOf (J)Ljava/lang/Long; |__STACK: [Ljava/util/function/BinaryOperator;, Ljava/lang/Long;, Ljava/lang/Long;] + |__LOCAL: [J, TOP, J, TOP, Ljava/util/function/BinaryOperator;] INVOKEINTERFACE java/util/function/BinaryOperator.apply (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; |__STACK: [Ljava/lang/Object;] + |__LOCAL: [J, TOP, J, TOP, Ljava/util/function/BinaryOperator;] CHECKCAST java/lang/Long |__STACK: [Ljava/lang/Long;] + |__LOCAL: [J, TOP, J, TOP, Ljava/util/function/BinaryOperator;] INVOKEVIRTUAL java/lang/Long.longValue ()J |__STACK: [J, TOP] + |__LOCAL: [J, TOP, J, TOP, Ljava/util/function/BinaryOperator;] LRETURN |__STACK: [] + |__LOCAL: [J, TOP, J, TOP, Ljava/util/function/BinaryOperator;] Method closeResourceArray L0 ALOAD 1 |__STACK: [[Ljava/sql/Statement;] + |__LOCAL: [Ltestsubjects/TestSubject;, [Ljava/sql/Statement;] ASTORE 2 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [Ljava/sql/Statement;, [Ljava/sql/Statement;] ALOAD 2 |__STACK: [[Ljava/sql/Statement;] + |__LOCAL: [Ltestsubjects/TestSubject;, [Ljava/sql/Statement;, [Ljava/sql/Statement;] ARRAYLENGTH |__STACK: [I] + |__LOCAL: [Ltestsubjects/TestSubject;, [Ljava/sql/Statement;, [Ljava/sql/Statement;] ISTORE 3 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I] ICONST_0 |__STACK: [I] + |__LOCAL: [Ltestsubjects/TestSubject;, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I] ISTORE 4 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I] L1 FRAME APPEND [[Ljava/sql/Statement; I I] ILOAD 4 |__STACK: [I] + |__LOCAL: [Ltestsubjects/TestSubject;, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I] ILOAD 3 |__STACK: [I, I] + |__LOCAL: [Ltestsubjects/TestSubject;, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I] IF_ICMPGE L2 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I] ALOAD 2 |__STACK: [[Ljava/sql/Statement;] + |__LOCAL: [Ltestsubjects/TestSubject;, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I] ILOAD 4 |__STACK: [[Ljava/sql/Statement;, I] + |__LOCAL: [Ltestsubjects/TestSubject;, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I] AALOAD |__STACK: [Ljava/sql/Statement;] + |__LOCAL: [Ltestsubjects/TestSubject;, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I] ASTORE 5 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I, Ljava/sql/Statement;] L3 ALOAD 0 |__STACK: [Ltestsubjects/TestSubject;] + |__LOCAL: [Ltestsubjects/TestSubject;, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I, Ljava/sql/Statement;] ALOAD 5 |__STACK: [Ltestsubjects/TestSubject;, Ljava/sql/Statement;] + |__LOCAL: [Ltestsubjects/TestSubject;, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I, Ljava/sql/Statement;] ACONST_NULL |__STACK: [Ltestsubjects/TestSubject;, Ljava/sql/Statement;, NULL] + |__LOCAL: [Ltestsubjects/TestSubject;, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I, Ljava/sql/Statement;] INVOKEVIRTUAL testsubjects/TestSubject.closeResource (Ljava/lang/AutoCloseable;Ljava/lang/Throwable;)V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I, Ljava/sql/Statement;] L4 IINC 4 1 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I, Ljava/sql/Statement;] GOTO L1 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I, Ljava/sql/Statement;] L2 FRAME CHOP 3 RETURN |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [Ljava/sql/Statement;] Method closeResourceMultiArray L0 ALOAD 1 |__STACK: [[[Ljava/sql/Statement;] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;] ASTORE 2 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;] ALOAD 2 |__STACK: [[[Ljava/sql/Statement;] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;] ARRAYLENGTH |__STACK: [I] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;] ISTORE 3 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I] ICONST_0 |__STACK: [I] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I] ISTORE 4 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I] L1 FRAME APPEND [[[Ljava/sql/Statement; I I] ILOAD 4 |__STACK: [I] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I] ILOAD 3 |__STACK: [I, I] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I] IF_ICMPGE L2 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I] ALOAD 2 |__STACK: [[[Ljava/sql/Statement;] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I] ILOAD 4 |__STACK: [[[Ljava/sql/Statement;, I] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I] AALOAD |__STACK: [[Ljava/sql/Statement;] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I] ASTORE 5 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I, [Ljava/sql/Statement;] L3 ALOAD 5 |__STACK: [[Ljava/sql/Statement;] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I, [Ljava/sql/Statement;] ASTORE 6 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I, [Ljava/sql/Statement;, [Ljava/sql/Statement;] ALOAD 6 |__STACK: [[Ljava/sql/Statement;] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I, [Ljava/sql/Statement;, [Ljava/sql/Statement;] ARRAYLENGTH |__STACK: [I] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I, [Ljava/sql/Statement;, [Ljava/sql/Statement;] ISTORE 7 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I] ICONST_0 |__STACK: [I] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I] ISTORE 8 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I] L4 FRAME FULL [testsubjects/TestSubject [[Ljava/sql/Statement; [[Ljava/sql/Statement; I I [Ljava/sql/Statement; [Ljava/sql/Statement; I I] [] ILOAD 8 |__STACK: [I] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I] ILOAD 7 |__STACK: [I, I] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I] IF_ICMPGE L5 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I] ALOAD 6 |__STACK: [[Ljava/sql/Statement;] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I] ILOAD 8 |__STACK: [[Ljava/sql/Statement;, I] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I] AALOAD |__STACK: [Ljava/sql/Statement;] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I] ASTORE 9 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I, Ljava/sql/Statement;] L6 ALOAD 0 |__STACK: [Ltestsubjects/TestSubject;] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I, Ljava/sql/Statement;] ALOAD 9 |__STACK: [Ltestsubjects/TestSubject;, Ljava/sql/Statement;] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I, Ljava/sql/Statement;] ACONST_NULL |__STACK: [Ltestsubjects/TestSubject;, Ljava/sql/Statement;, NULL] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I, Ljava/sql/Statement;] INVOKEVIRTUAL testsubjects/TestSubject.closeResource (Ljava/lang/AutoCloseable;Ljava/lang/Throwable;)V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I, Ljava/sql/Statement;] L7 IINC 8 1 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I, Ljava/sql/Statement;] GOTO L4 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I, [Ljava/sql/Statement;, [Ljava/sql/Statement;, I, I, Ljava/sql/Statement;] L5 FRAME FULL [testsubjects/TestSubject [[Ljava/sql/Statement; [[Ljava/sql/Statement; I I] [] IINC 4 1 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I] GOTO L1 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;, [[Ljava/sql/Statement;, I, I] L2 FRAME CHOP 3 RETURN |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, [[Ljava/sql/Statement;] Method closeResourceArrayList L0 ALOAD 1 |__STACK: [Ljava/util/List;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/util/List;] INVOKEINTERFACE java/util/List.iterator ()Ljava/util/Iterator; |__STACK: [Ljava/util/Iterator;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/util/List;] ASTORE 2 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/util/List;, Ljava/util/Iterator;] L1 FRAME APPEND [java/util/Iterator] ALOAD 2 |__STACK: [Ljava/util/Iterator;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/util/List;, Ljava/util/Iterator;] INVOKEINTERFACE java/util/Iterator.hasNext ()Z |__STACK: [I] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/util/List;, Ljava/util/Iterator;] IFEQ L2 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/util/List;, Ljava/util/Iterator;] ALOAD 2 |__STACK: [Ljava/util/Iterator;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/util/List;, Ljava/util/Iterator;] INVOKEINTERFACE java/util/Iterator.next ()Ljava/lang/Object; |__STACK: [Ljava/lang/Object;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/util/List;, Ljava/util/Iterator;] CHECKCAST java/sql/Statement |__STACK: [Ljava/sql/Statement;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/util/List;, Ljava/util/Iterator;] ASTORE 3 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/util/List;, Ljava/util/Iterator;, Ljava/sql/Statement;] L3 ALOAD 0 |__STACK: [Ltestsubjects/TestSubject;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/util/List;, Ljava/util/Iterator;, Ljava/sql/Statement;] ALOAD 3 |__STACK: [Ltestsubjects/TestSubject;, Ljava/sql/Statement;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/util/List;, Ljava/util/Iterator;, Ljava/sql/Statement;] ACONST_NULL |__STACK: [Ltestsubjects/TestSubject;, Ljava/sql/Statement;, NULL] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/util/List;, Ljava/util/Iterator;, Ljava/sql/Statement;] INVOKEVIRTUAL testsubjects/TestSubject.closeResource (Ljava/lang/AutoCloseable;Ljava/lang/Throwable;)V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/util/List;, Ljava/util/Iterator;, Ljava/sql/Statement;] L4 GOTO L1 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/util/List;, Ljava/util/Iterator;, Ljava/sql/Statement;] L2 FRAME CHOP 1 RETURN |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/util/List;] Method closeSqlStmt L0 ACONST_NULL |__STACK: [NULL] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/sql/Connection;] ASTORE 2 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/sql/Connection;, NULL] L1 ALOAD 1 |__STACK: [Ljava/sql/Connection;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/sql/Connection;, NULL] INVOKEINTERFACE java/sql/Connection.createStatement ()Ljava/sql/Statement; |__STACK: [Ljava/sql/Statement;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/sql/Connection;, NULL] ASTORE 2 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/sql/Connection;, Ljava/sql/Statement;] L2 GOTO L3 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/sql/Connection;, Ljava/sql/Statement;] L4 FRAME FULL [testsubjects/TestSubject java/sql/Connection java/sql/Statement] [java/sql/SQLException] ASTORE 3 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/sql/Connection;, Ljava/sql/Statement;, Ljava/sql/SQLException;] L5 ALOAD 0 |__STACK: [Ltestsubjects/TestSubject;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/sql/Connection;, Ljava/sql/Statement;, Ljava/sql/SQLException;] ALOAD 2 |__STACK: [Ltestsubjects/TestSubject;, Ljava/sql/Statement;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/sql/Connection;, Ljava/sql/Statement;, Ljava/sql/SQLException;] ALOAD 3 |__STACK: [Ltestsubjects/TestSubject;, Ljava/sql/Statement;, Ljava/sql/SQLException;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/sql/Connection;, Ljava/sql/Statement;, Ljava/sql/SQLException;] INVOKEVIRTUAL testsubjects/TestSubject.closeResource (Ljava/lang/AutoCloseable;Ljava/lang/Throwable;)V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/sql/Connection;, Ljava/sql/Statement;, Ljava/sql/SQLException;] L3 FRAME SAME ALOAD 0 |__STACK: [Ltestsubjects/TestSubject;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/sql/Connection;, Ljava/sql/Statement;] ALOAD 2 |__STACK: [Ltestsubjects/TestSubject;, Ljava/sql/Statement;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/sql/Connection;, Ljava/sql/Statement;] ACONST_NULL |__STACK: [Ltestsubjects/TestSubject;, Ljava/sql/Statement;, NULL] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/sql/Connection;, Ljava/sql/Statement;] INVOKEVIRTUAL testsubjects/TestSubject.closeResource (Ljava/lang/AutoCloseable;Ljava/lang/Throwable;)V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/sql/Connection;, Ljava/sql/Statement;] L6 RETURN |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/sql/Connection;, Ljava/sql/Statement;] Method closeResource L0 ALOAD 1 |__STACK: [Ljava/lang/AutoCloseable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] IFNONNULL L1 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] L2 RETURN |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] L1 FRAME SAME ALOAD 1 |__STACK: [Ljava/lang/AutoCloseable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] INVOKEINTERFACE java/lang/AutoCloseable.close ()V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] L3 GOTO L4 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] L5 FRAME SAME1 java/lang/Exception ASTORE 3 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Exception;] L6 ALOAD 2 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Exception;] IFNULL L7 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Exception;] L8 ALOAD 2 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Exception;] ALOAD 3 |__STACK: [Ljava/lang/Throwable;, Ljava/lang/Exception;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Exception;] INVOKEVIRTUAL java/lang/Throwable.addSuppressed (Ljava/lang/Throwable;)V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Exception;] L7 FRAME APPEND [java/lang/Exception] ALOAD 3 |__STACK: [Ljava/lang/Exception;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Exception;] ATHROW |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Exception;] L4 FRAME CHOP 1 RETURN |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] Method intAdd L0 ILOAD 0 |__STACK: [I] + |__LOCAL: [I, I] ISTORE 2 |__STACK: [] + |__LOCAL: [I, I, I] L1 IINC 2 1 |__STACK: [] + |__LOCAL: [I, I, I] L2 IINC 2 1 |__STACK: [] + |__LOCAL: [I, I, I] L3 ILOAD 2 |__STACK: [I] + |__LOCAL: [I, I, I] ILOAD 1 |__STACK: [I, I] + |__LOCAL: [I, I, I] IADD |__STACK: [I] + |__LOCAL: [I, I, I] ISTORE 2 |__STACK: [] + |__LOCAL: [I, I, I] L4 IINC 2 -1 |__STACK: [] + |__LOCAL: [I, I, I] L5 IINC 2 -1 |__STACK: [] + |__LOCAL: [I, I, I] L6 ILOAD 2 |__STACK: [I] + |__LOCAL: [I, I, I] ILOAD 1 |__STACK: [I, I] + |__LOCAL: [I, I, I] ISUB |__STACK: [I] + |__LOCAL: [I, I, I] ISTORE 2 |__STACK: [] + |__LOCAL: [I, I, I] L7 ILOAD 2 |__STACK: [I] + |__LOCAL: [I, I, I] ILOAD 1 |__STACK: [I, I] + |__LOCAL: [I, I, I] IMUL |__STACK: [I] + |__LOCAL: [I, I, I] ISTORE 2 |__STACK: [] + |__LOCAL: [I, I, I] L8 ILOAD 2 |__STACK: [I] + |__LOCAL: [I, I, I] ILOAD 1 |__STACK: [I, I] + |__LOCAL: [I, I, I] IDIV |__STACK: [I] + |__LOCAL: [I, I, I] ISTORE 2 |__STACK: [] + |__LOCAL: [I, I, I] L9 ILOAD 2 |__STACK: [I] + |__LOCAL: [I, I, I] ILOAD 1 |__STACK: [I, I] + |__LOCAL: [I, I, I] IREM |__STACK: [I] + |__LOCAL: [I, I, I] ISTORE 2 |__STACK: [] + |__LOCAL: [I, I, I] L10 ILOAD 2 |__STACK: [I] + |__LOCAL: [I, I, I] ICONST_2 |__STACK: [I, I] + |__LOCAL: [I, I, I] ISHL |__STACK: [I] + |__LOCAL: [I, I, I] ISTORE 2 |__STACK: [] + |__LOCAL: [I, I, I] L11 ILOAD 2 |__STACK: [I] + |__LOCAL: [I, I, I] ILOAD 1 |__STACK: [I, I] + |__LOCAL: [I, I, I] ISHR |__STACK: [I] + |__LOCAL: [I, I, I] ISTORE 2 |__STACK: [] + |__LOCAL: [I, I, I] L12 ILOAD 2 |__STACK: [I] + |__LOCAL: [I, I, I] ICONST_3 |__STACK: [I, I] + |__LOCAL: [I, I, I] IUSHR |__STACK: [I] + |__LOCAL: [I, I, I] ISTORE 2 |__STACK: [] + |__LOCAL: [I, I, I] L13 ILOAD 2 |__STACK: [I] + |__LOCAL: [I, I, I] I2L |__STACK: [J, TOP] + |__LOCAL: [I, I, I] LSTORE 3 |__STACK: [] + |__LOCAL: [I, I, I, J, TOP] L14 LLOAD 3 |__STACK: [J, TOP] + |__LOCAL: [I, I, I, J, TOP] ILOAD 1 |__STACK: [J, TOP, I] + |__LOCAL: [I, I, I, J, TOP] LSHL |__STACK: [J, TOP] + |__LOCAL: [I, I, I, J, TOP] LSTORE 3 |__STACK: [] + |__LOCAL: [I, I, I, J, TOP] L15 LLOAD 3 |__STACK: [J, TOP] + |__LOCAL: [I, I, I, J, TOP] L2I |__STACK: [I] + |__LOCAL: [I, I, I, J, TOP] IRETURN |__STACK: [] + |__LOCAL: [I, I, I, J, TOP] Method createNumberWithDiamond L0 ACONST_NULL |__STACK: [NULL] + |__LOCAL: [I] ASTORE 1 |__STACK: [] + |__LOCAL: [I, NULL] L1 ILOAD 0 |__STACK: [I] + |__LOCAL: [I, NULL] IFEQ L2 |__STACK: [] + |__LOCAL: [I, NULL] L3 NEW java/lang/Integer |__STACK: [Ljava/lang/Integer;] + |__LOCAL: [I, NULL] DUP |__STACK: [Ljava/lang/Integer;, Ljava/lang/Integer;] + |__LOCAL: [I, NULL] ICONST_1 |__STACK: [Ljava/lang/Integer;, Ljava/lang/Integer;, I] + |__LOCAL: [I, NULL] INVOKESPECIAL java/lang/Integer. (I)V |__STACK: [Ljava/lang/Integer;] + |__LOCAL: [I, NULL] ASTORE 1 |__STACK: [] + |__LOCAL: [I, Ljava/lang/Integer;] GOTO L4 |__STACK: [] + |__LOCAL: [I, Ljava/lang/Integer;] L2 FRAME APPEND [java/lang/Number] NEW java/lang/Double |__STACK: [Ljava/lang/Double;] + |__LOCAL: [I, Ljava/lang/Number;] DUP |__STACK: [Ljava/lang/Double;, Ljava/lang/Double;] + |__LOCAL: [I, Ljava/lang/Number;] DCONST_1 |__STACK: [Ljava/lang/Double;, Ljava/lang/Double;, D, TOP] + |__LOCAL: [I, Ljava/lang/Number;] INVOKESPECIAL java/lang/Double. (D)V |__STACK: [Ljava/lang/Double;] + |__LOCAL: [I, Ljava/lang/Number;] ASTORE 1 |__STACK: [] + |__LOCAL: [I, Ljava/lang/Double;] L4 FRAME SAME ALOAD 1 |__STACK: [Ljava/lang/Number;] + |__LOCAL: [I, Ljava/lang/Number;] ARETURN |__STACK: [] + |__LOCAL: [I, Ljava/lang/Number;] Method createMultiObjectArray L0 ICONST_0 |__STACK: [I] + |__LOCAL: [] ICONST_0 |__STACK: [I, I] + |__LOCAL: [] MULTIANEWARRAY [[Ljava/lang/Object; 2 |__STACK: [[[Ljava/lang/Object;] + |__LOCAL: [] ARETURN |__STACK: [] + |__LOCAL: [] Method createObjectArray L0 ICONST_0 |__STACK: [I] + |__LOCAL: [] ANEWARRAY java/lang/Object |__STACK: [[Ljava/lang/Object;] + |__LOCAL: [] ARETURN |__STACK: [] + |__LOCAL: [] Method createIntArray L0 ICONST_0 |__STACK: [I] + |__LOCAL: [] NEWARRAY T_INT |__STACK: [[I] + |__LOCAL: [] ARETURN |__STACK: [] + |__LOCAL: [] Method staticEmpty1 L0 RETURN |__STACK: [] + |__LOCAL: [] Method instanceEmpty1 L0 RETURN |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;] Method identity L0 ILOAD 0 |__STACK: [I] + |__LOCAL: [I] IRETURN |__STACK: [] + |__LOCAL: [I] Method identity2 L0 ILOAD 0 |__STACK: [I] + |__LOCAL: [I] ISTORE 1 |__STACK: [] + |__LOCAL: [I, I] L1 ILOAD 1 |__STACK: [I] + |__LOCAL: [I, I] IRETURN |__STACK: [] + |__LOCAL: [I, I] Method readFile L0 NEW java/io/BufferedReader |__STACK: [Ljava/io/BufferedReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;] DUP |__STACK: [Ljava/io/BufferedReader;, Ljava/io/BufferedReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;] NEW java/io/FileReader |__STACK: [Ljava/io/BufferedReader;, Ljava/io/BufferedReader;, Ljava/io/FileReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;] DUP |__STACK: [Ljava/io/BufferedReader;, Ljava/io/BufferedReader;, Ljava/io/FileReader;, Ljava/io/FileReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;] ALOAD 1 |__STACK: [Ljava/io/BufferedReader;, Ljava/io/BufferedReader;, Ljava/io/FileReader;, Ljava/io/FileReader;, Ljava/io/File;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;] INVOKESPECIAL java/io/FileReader. (Ljava/io/File;)V |__STACK: [Ljava/io/BufferedReader;, Ljava/io/BufferedReader;, Ljava/io/FileReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;] INVOKESPECIAL java/io/BufferedReader. (Ljava/io/Reader;)V |__STACK: [Ljava/io/BufferedReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;] ASTORE 2 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;] ACONST_NULL |__STACK: [NULL] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;] ASTORE 3 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL] L1 NEW java/io/BufferedReader |__STACK: [Ljava/io/BufferedReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL] DUP |__STACK: [Ljava/io/BufferedReader;, Ljava/io/BufferedReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL] NEW java/io/FileReader |__STACK: [Ljava/io/BufferedReader;, Ljava/io/BufferedReader;, Ljava/io/FileReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL] DUP |__STACK: [Ljava/io/BufferedReader;, Ljava/io/BufferedReader;, Ljava/io/FileReader;, Ljava/io/FileReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL] ALOAD 1 |__STACK: [Ljava/io/BufferedReader;, Ljava/io/BufferedReader;, Ljava/io/FileReader;, Ljava/io/FileReader;, Ljava/io/File;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL] INVOKESPECIAL java/io/FileReader. (Ljava/io/File;)V |__STACK: [Ljava/io/BufferedReader;, Ljava/io/BufferedReader;, Ljava/io/FileReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL] INVOKESPECIAL java/io/BufferedReader. (Ljava/io/Reader;)V |__STACK: [Ljava/io/BufferedReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL] ASTORE 4 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;] L2 ACONST_NULL |__STACK: [NULL] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;] ASTORE 5 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] L3 NEW java/io/BufferedReader |__STACK: [Ljava/io/BufferedReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] DUP |__STACK: [Ljava/io/BufferedReader;, Ljava/io/BufferedReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] NEW java/io/FileReader |__STACK: [Ljava/io/BufferedReader;, Ljava/io/BufferedReader;, Ljava/io/FileReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] DUP |__STACK: [Ljava/io/BufferedReader;, Ljava/io/BufferedReader;, Ljava/io/FileReader;, Ljava/io/FileReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] ALOAD 1 |__STACK: [Ljava/io/BufferedReader;, Ljava/io/BufferedReader;, Ljava/io/FileReader;, Ljava/io/FileReader;, Ljava/io/File;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] INVOKESPECIAL java/io/FileReader. (Ljava/io/File;)V |__STACK: [Ljava/io/BufferedReader;, Ljava/io/BufferedReader;, Ljava/io/FileReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] INVOKESPECIAL java/io/BufferedReader. (Ljava/io/Reader;)V |__STACK: [Ljava/io/BufferedReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] ASTORE 6 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;] L4 ACONST_NULL |__STACK: [NULL] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;] ASTORE 7 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] L5 NEW java/io/BufferedReader |__STACK: [Ljava/io/BufferedReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] DUP |__STACK: [Ljava/io/BufferedReader;, Ljava/io/BufferedReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] NEW java/io/FileReader |__STACK: [Ljava/io/BufferedReader;, Ljava/io/BufferedReader;, Ljava/io/FileReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] DUP |__STACK: [Ljava/io/BufferedReader;, Ljava/io/BufferedReader;, Ljava/io/FileReader;, Ljava/io/FileReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] ALOAD 1 |__STACK: [Ljava/io/BufferedReader;, Ljava/io/BufferedReader;, Ljava/io/FileReader;, Ljava/io/FileReader;, Ljava/io/File;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] INVOKESPECIAL java/io/FileReader. (Ljava/io/File;)V |__STACK: [Ljava/io/BufferedReader;, Ljava/io/BufferedReader;, Ljava/io/FileReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] INVOKESPECIAL java/io/BufferedReader. (Ljava/io/Reader;)V |__STACK: [Ljava/io/BufferedReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] ASTORE 8 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;] L6 ACONST_NULL |__STACK: [NULL] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;] ASTORE 9 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] L7 ALOAD 8 |__STACK: [Ljava/io/BufferedReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] IFNULL L8 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] ALOAD 9 |__STACK: [NULL] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] IFNULL L9 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] L10 ALOAD 8 |__STACK: [Ljava/io/BufferedReader;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] INVOKEINTERFACE java/lang/AutoCloseable.close ()V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] L11 GOTO L8 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL, Ljava/io/BufferedReader;, NULL] L12 FRAME FULL [testsubjects/TestSubject java/io/File java/lang/AutoCloseable java/lang/Throwable java/lang/AutoCloseable java/lang/Throwable java/lang/AutoCloseable java/lang/Throwable java/lang/AutoCloseable java/lang/Throwable] [java/lang/Throwable] ASTORE 10 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 9 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 10 |__STACK: [Ljava/lang/Throwable;, Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] INVOKEVIRTUAL java/lang/Throwable.addSuppressed (Ljava/lang/Throwable;)V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] GOTO L8 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] L9 FRAME SAME ALOAD 8 |__STACK: [Ljava/lang/AutoCloseable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] INVOKEINTERFACE java/lang/AutoCloseable.close ()V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] L8 FRAME CHOP 2 ALOAD 6 |__STACK: [Ljava/lang/AutoCloseable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] IFNULL L13 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] ALOAD 7 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] IFNULL L14 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] L15 ALOAD 6 |__STACK: [Ljava/lang/AutoCloseable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] INVOKEINTERFACE java/lang/AutoCloseable.close ()V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] L16 GOTO L13 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] L17 FRAME SAME1 java/lang/Throwable ASTORE 8 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 7 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 8 |__STACK: [Ljava/lang/Throwable;, Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] INVOKEVIRTUAL java/lang/Throwable.addSuppressed (Ljava/lang/Throwable;)V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] GOTO L13 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] L14 FRAME SAME ALOAD 6 |__STACK: [Ljava/lang/AutoCloseable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] INVOKEINTERFACE java/lang/AutoCloseable.close ()V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] GOTO L13 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] L18 FRAME SAME1 java/lang/Throwable ASTORE 8 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 8 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ASTORE 7 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 8 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ATHROW |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] L19 FRAME SAME1 java/lang/Throwable ASTORE 11 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, Ljava/lang/Throwable;] L20 ALOAD 6 |__STACK: [Ljava/lang/AutoCloseable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, Ljava/lang/Throwable;] IFNULL L21 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, Ljava/lang/Throwable;] ALOAD 7 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, Ljava/lang/Throwable;] IFNULL L22 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, Ljava/lang/Throwable;] L23 ALOAD 6 |__STACK: [Ljava/lang/AutoCloseable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, Ljava/lang/Throwable;] INVOKEINTERFACE java/lang/AutoCloseable.close ()V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, Ljava/lang/Throwable;] L24 GOTO L21 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, Ljava/lang/Throwable;] L25 FRAME FULL [testsubjects/TestSubject java/io/File java/lang/AutoCloseable java/lang/Throwable java/lang/AutoCloseable java/lang/Throwable java/lang/AutoCloseable java/lang/Throwable T T T java/lang/Throwable] [java/lang/Throwable] ASTORE 12 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 7 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 12 |__STACK: [Ljava/lang/Throwable;, Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, Ljava/lang/Throwable;, Ljava/lang/Throwable;] INVOKEVIRTUAL java/lang/Throwable.addSuppressed (Ljava/lang/Throwable;)V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, Ljava/lang/Throwable;, Ljava/lang/Throwable;] GOTO L21 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, Ljava/lang/Throwable;, Ljava/lang/Throwable;] L22 FRAME SAME ALOAD 6 |__STACK: [Ljava/lang/AutoCloseable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, Ljava/lang/Throwable;] INVOKEINTERFACE java/lang/AutoCloseable.close ()V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, Ljava/lang/Throwable;] L21 FRAME SAME ALOAD 11 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, Ljava/lang/Throwable;] ATHROW |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, Ljava/lang/Throwable;] L13 FRAME FULL [testsubjects/TestSubject java/io/File java/lang/AutoCloseable java/lang/Throwable java/lang/AutoCloseable java/lang/Throwable] [] ALOAD 4 |__STACK: [Ljava/lang/AutoCloseable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] IFNULL L26 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] ALOAD 5 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] IFNULL L27 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] L28 ALOAD 4 |__STACK: [Ljava/lang/AutoCloseable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] INVOKEINTERFACE java/lang/AutoCloseable.close ()V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] L29 GOTO L26 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] L30 FRAME SAME1 java/lang/Throwable ASTORE 6 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 5 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 6 |__STACK: [Ljava/lang/Throwable;, Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] INVOKEVIRTUAL java/lang/Throwable.addSuppressed (Ljava/lang/Throwable;)V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] GOTO L26 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] L27 FRAME SAME ALOAD 4 |__STACK: [Ljava/lang/AutoCloseable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] INVOKEINTERFACE java/lang/AutoCloseable.close ()V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] GOTO L26 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] L31 FRAME SAME1 java/lang/Throwable ASTORE 6 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 6 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ASTORE 5 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 6 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ATHROW |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] L32 FRAME SAME1 java/lang/Throwable ASTORE 13 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] L33 ALOAD 4 |__STACK: [Ljava/lang/AutoCloseable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] IFNULL L34 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] ALOAD 5 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] IFNULL L35 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] L36 ALOAD 4 |__STACK: [Ljava/lang/AutoCloseable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] INVOKEINTERFACE java/lang/AutoCloseable.close ()V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] L37 GOTO L34 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] L38 FRAME FULL [testsubjects/TestSubject java/io/File java/lang/AutoCloseable java/lang/Throwable java/lang/AutoCloseable java/lang/Throwable T T T T T T T java/lang/Throwable] [java/lang/Throwable] ASTORE 14 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 5 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 14 |__STACK: [Ljava/lang/Throwable;, Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;, Ljava/lang/Throwable;] INVOKEVIRTUAL java/lang/Throwable.addSuppressed (Ljava/lang/Throwable;)V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;, Ljava/lang/Throwable;] GOTO L34 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;, Ljava/lang/Throwable;] L35 FRAME SAME ALOAD 4 |__STACK: [Ljava/lang/AutoCloseable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] INVOKEINTERFACE java/lang/AutoCloseable.close ()V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] L34 FRAME SAME ALOAD 13 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] ATHROW |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] L26 FRAME FULL [testsubjects/TestSubject java/io/File java/lang/AutoCloseable java/lang/Throwable] [] ALOAD 2 |__STACK: [Ljava/lang/AutoCloseable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] IFNULL L39 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] ALOAD 3 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] IFNULL L40 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] L41 ALOAD 2 |__STACK: [Ljava/lang/AutoCloseable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] INVOKEINTERFACE java/lang/AutoCloseable.close ()V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] L42 GOTO L39 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] L43 FRAME SAME1 java/lang/Throwable ASTORE 4 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 3 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 4 |__STACK: [Ljava/lang/Throwable;, Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] INVOKEVIRTUAL java/lang/Throwable.addSuppressed (Ljava/lang/Throwable;)V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] GOTO L39 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] L40 FRAME SAME ALOAD 2 |__STACK: [Ljava/lang/AutoCloseable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] INVOKEINTERFACE java/lang/AutoCloseable.close ()V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] GOTO L39 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;] L44 FRAME SAME1 java/lang/Throwable ASTORE 4 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 4 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ASTORE 3 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 4 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ATHROW |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, Ljava/lang/Throwable;] L45 FRAME SAME1 java/lang/Throwable ASTORE 15 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] L46 ALOAD 2 |__STACK: [Ljava/lang/AutoCloseable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] IFNULL L47 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] ALOAD 3 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] IFNULL L48 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] L49 ALOAD 2 |__STACK: [Ljava/lang/AutoCloseable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] INVOKEINTERFACE java/lang/AutoCloseable.close ()V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] L50 GOTO L47 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] L51 FRAME FULL [testsubjects/TestSubject java/io/File java/lang/AutoCloseable java/lang/Throwable T T T T T T T T T T T java/lang/Throwable] [java/lang/Throwable] ASTORE 16 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 3 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;, Ljava/lang/Throwable;] ALOAD 16 |__STACK: [Ljava/lang/Throwable;, Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;, Ljava/lang/Throwable;] INVOKEVIRTUAL java/lang/Throwable.addSuppressed (Ljava/lang/Throwable;)V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;, Ljava/lang/Throwable;] GOTO L47 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;, Ljava/lang/Throwable;] L48 FRAME SAME ALOAD 2 |__STACK: [Ljava/lang/AutoCloseable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] INVOKEINTERFACE java/lang/AutoCloseable.close ()V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] L47 FRAME SAME ALOAD 15 |__STACK: [Ljava/lang/Throwable;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] ATHROW |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/lang/AutoCloseable;, Ljava/lang/Throwable;, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, TOP, Ljava/lang/Throwable;] L39 FRAME FULL [testsubjects/TestSubject java/io/File] [] GOTO L52 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;] L53 FRAME SAME1 java/io/IOException ASTORE 2 |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/IOException;] L54 ALOAD 2 |__STACK: [Ljava/io/IOException;] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/IOException;] INVOKEVIRTUAL java/io/IOException.printStackTrace ()V |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;, Ljava/io/IOException;] L52 FRAME SAME RETURN |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;] +Method testWithDoubleTypes + L0 + DCONST_1 + |__STACK: [D, TOP] + |__LOCAL: [Ltestsubjects/TestSubject;] + DSTORE 1 + |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, D, TOP] + L1 + DCONST_1 + |__STACK: [D, TOP] + |__LOCAL: [Ltestsubjects/TestSubject;, D, TOP] + DSTORE 3 + |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, D, TOP, D, TOP] + L2 + FRAME APPEND [D D] + DLOAD 3 + |__STACK: [D, TOP] + |__LOCAL: [Ltestsubjects/TestSubject;, D, TOP, D, TOP] + LDC 22.0 + |__STACK: [D, TOP, D, TOP] + |__LOCAL: [Ltestsubjects/TestSubject;, D, TOP, D, TOP] + DCMPG + |__STACK: [I] + |__LOCAL: [Ltestsubjects/TestSubject;, D, TOP, D, TOP] + IFGE L3 + |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, D, TOP, D, TOP] + L4 + GETSTATIC java/lang/System.out : Ljava/io/PrintStream; + |__STACK: [Ljava/io/PrintStream;] + |__LOCAL: [Ltestsubjects/TestSubject;, D, TOP, D, TOP] + DLOAD 3 + |__STACK: [Ljava/io/PrintStream;, D, TOP] + |__LOCAL: [Ltestsubjects/TestSubject;, D, TOP, D, TOP] + INVOKEVIRTUAL java/io/PrintStream.println (D)V + |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, D, TOP, D, TOP] + L5 + DLOAD 1 + |__STACK: [D, TOP] + |__LOCAL: [Ltestsubjects/TestSubject;, D, TOP, D, TOP] + DLOAD 3 + |__STACK: [D, TOP, D, TOP] + |__LOCAL: [Ltestsubjects/TestSubject;, D, TOP, D, TOP] + DADD + |__STACK: [D, TOP] + |__LOCAL: [Ltestsubjects/TestSubject;, D, TOP, D, TOP] + DSTORE 1 + |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, D, TOP, D, TOP] + L6 + DLOAD 3 + |__STACK: [D, TOP] + |__LOCAL: [Ltestsubjects/TestSubject;, D, TOP, D, TOP] + DCONST_1 + |__STACK: [D, TOP, D, TOP] + |__LOCAL: [Ltestsubjects/TestSubject;, D, TOP, D, TOP] + DADD + |__STACK: [D, TOP] + |__LOCAL: [Ltestsubjects/TestSubject;, D, TOP, D, TOP] + DSTORE 3 + |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, D, TOP, D, TOP] + GOTO L2 + |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, D, TOP, D, TOP] + L3 + FRAME CHOP 1 + DLOAD 1 + |__STACK: [D, TOP] + |__LOCAL: [Ltestsubjects/TestSubject;, D, TOP] + DRETURN + |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, D, TOP] +Method testWithFloatAndDoubleTypes + L0 + FCONST_1 + |__STACK: [F] + |__LOCAL: [Ltestsubjects/TestSubject;] + FSTORE 1 + |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, F] + L1 + DCONST_1 + |__STACK: [D, TOP] + |__LOCAL: [Ltestsubjects/TestSubject;, F] + DSTORE 2 + |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, F, D, TOP] + L2 + FRAME APPEND [F D] + DLOAD 2 + |__STACK: [D, TOP] + |__LOCAL: [Ltestsubjects/TestSubject;, F, D, TOP] + LDC 22.0 + |__STACK: [D, TOP, D, TOP] + |__LOCAL: [Ltestsubjects/TestSubject;, F, D, TOP] + DCMPG + |__STACK: [I] + |__LOCAL: [Ltestsubjects/TestSubject;, F, D, TOP] + IFGE L3 + |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, F, D, TOP] + L4 + GETSTATIC java/lang/System.out : Ljava/io/PrintStream; + |__STACK: [Ljava/io/PrintStream;] + |__LOCAL: [Ltestsubjects/TestSubject;, F, D, TOP] + DLOAD 2 + |__STACK: [Ljava/io/PrintStream;, D, TOP] + |__LOCAL: [Ltestsubjects/TestSubject;, F, D, TOP] + INVOKEVIRTUAL java/io/PrintStream.println (D)V + |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, F, D, TOP] + L5 + FLOAD 1 + |__STACK: [F] + |__LOCAL: [Ltestsubjects/TestSubject;, F, D, TOP] + DLOAD 2 + |__STACK: [F, D, TOP] + |__LOCAL: [Ltestsubjects/TestSubject;, F, D, TOP] + D2F + |__STACK: [F, F] + |__LOCAL: [Ltestsubjects/TestSubject;, F, D, TOP] + FADD + |__STACK: [F] + |__LOCAL: [Ltestsubjects/TestSubject;, F, D, TOP] + FSTORE 1 + |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, F, D, TOP] + L6 + DLOAD 2 + |__STACK: [D, TOP] + |__LOCAL: [Ltestsubjects/TestSubject;, F, D, TOP] + DCONST_1 + |__STACK: [D, TOP, D, TOP] + |__LOCAL: [Ltestsubjects/TestSubject;, F, D, TOP] + DADD + |__STACK: [D, TOP] + |__LOCAL: [Ltestsubjects/TestSubject;, F, D, TOP] + DSTORE 2 + |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, F, D, TOP] + GOTO L2 + |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, F, D, TOP] + L3 + FRAME CHOP 1 + FLOAD 1 + |__STACK: [F] + |__LOCAL: [Ltestsubjects/TestSubject;, F] + FRETURN + |__STACK: [] + |__LOCAL: [Ltestsubjects/TestSubject;, F] Method L0 ICONST_1 |__STACK: [I] + |__LOCAL: [] PUTSTATIC testsubjects/TestSubject.VALUE_ONE : I |__STACK: [] + |__LOCAL: [] L1 ICONST_2 |__STACK: [I] + |__LOCAL: [] PUTSTATIC testsubjects/TestSubject.VALUE_TWO : I |__STACK: [] + |__LOCAL: [] RETURN - |__STACK: [] \ No newline at end of file + |__STACK: [] + |__LOCAL: [] \ No newline at end of file diff --git a/test/java/com/google/devtools/build/android/desugar/BytecodeTypeInferenceTest.java b/test/java/com/google/devtools/build/android/desugar/BytecodeTypeInferenceTest.java index 2573648..476da87 100644 --- a/test/java/com/google/devtools/build/android/desugar/BytecodeTypeInferenceTest.java +++ b/test/java/com/google/devtools/build/android/desugar/BytecodeTypeInferenceTest.java @@ -13,8 +13,11 @@ // limitations under the License. package com.google.devtools.build.android.desugar; +import static com.google.common.truth.Truth.assertThat; + +import com.google.common.collect.ImmutableMap; import com.google.common.io.Files; -import com.google.common.truth.Truth; +import com.google.devtools.build.android.desugar.BytecodeTypeInference.InferredType; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; @@ -24,6 +27,7 @@ import java.nio.file.Paths; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +import org.objectweb.asm.Label; /** Test for {@link BytecodeTypeInference} */ @RunWith(JUnit4.class) @@ -33,7 +37,7 @@ public class BytecodeTypeInferenceTest { private static final Path GOLDEN_PATH = Paths.get(System.getProperty("golden_file")); @Test - public void test() throws IOException { + public void testTypeInference() throws IOException { StringWriter stringWriter = new StringWriter(); try (PrintWriter printWriter = new PrintWriter(stringWriter)) { ByteCodeTypePrinter.printClassesWithTypes(JAR_PATH, printWriter); @@ -41,6 +45,37 @@ public class BytecodeTypeInferenceTest { } String inferenceResult = stringWriter.toString().trim(); String golden = Files.asCharSource(GOLDEN_PATH.toFile(), StandardCharsets.UTF_8).read().trim(); - Truth.assertThat(inferenceResult).isEqualTo(golden); + assertThat(inferenceResult).isEqualTo(golden); + } + + @Test + public void testUninitializedInferType() { + Label label = new Label(); + InferredType type = InferredType.createUninitializedType(label); + assertThat(type.descriptor()).isEqualTo(InferredType.UNINITIALIZED_PREFIX); + assertThat(type.uninitializationLabel()).isEqualTo(label); + } + + @Test + public void testNonUninitializedInferType() { + ImmutableMap map = + ImmutableMap.builder() + .put("Z", InferredType.BOOLEAN) + .put("B", InferredType.BYTE) + .put("I", InferredType.INT) + .put("F", InferredType.FLOAT) + .put("D", InferredType.DOUBLE) + .put("J", InferredType.LONG) + .put("TOP", InferredType.TOP) + .put("NULL", InferredType.NULL) + .put("UNINITIALIZED_THIS", InferredType.UNINITIALIZED_THIS) + .build(); + map.forEach( + (descriptor, expected) -> { + InferredType type = InferredType.createNonUninitializedType(descriptor); + assertThat(type.uninitializationLabel()).isNull(); + assertThat(type.descriptor()).isEqualTo(descriptor); + assertThat(type).isSameAs(expected); + }); } } diff --git a/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference/test_subjects.jar b/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference/test_subjects.jar index efa491b..f1bb726 100644 Binary files a/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference/test_subjects.jar and b/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference/test_subjects.jar differ diff --git a/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference/testsubjects/TestSubject.java b/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference/testsubjects/TestSubject.java index b5463a7..a07e73b 100644 --- a/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference/testsubjects/TestSubject.java +++ b/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference/testsubjects/TestSubject.java @@ -193,4 +193,22 @@ public class TestSubject { e.printStackTrace(); } } + + public double testWithDoubleTypes() { + double result = 1; + for (double i = 1; i < 22; i = i + 1) { + System.out.println(i); + result += i; + } + return result; + } + + public float testWithFloatAndDoubleTypes() { + float result = 1; + for (double i = 1; i < 22; i = i + 1) { + System.out.println(i); + result += (float) i; + } + return result; + } } -- cgit v1.2.3