aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/test/java/com/google/devtools/build/android/desugar/BUILD35
-rw-r--r--src/test/java/com/google/devtools/build/android/desugar/ByteCodeTypePrinter.java34
-rw-r--r--src/test/java/com/google/devtools/build/android/desugar/BytecodeTypeInferenceTest.golden.txt627
-rw-r--r--src/test/java/com/google/devtools/build/android/desugar/BytecodeTypeInferenceTest.java41
-rw-r--r--src/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference/BUILD19
-rw-r--r--src/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference/test_subjects.jarbin3361 -> 3594 bytes
-rw-r--r--src/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference/testsubjects/TestSubject.java18
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/desugar/BytecodeTypeInference.java138
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/desugar/TryWithResourcesRewriter.java27
9 files changed, 865 insertions, 74 deletions
diff --git a/src/test/java/com/google/devtools/build/android/desugar/BUILD b/src/test/java/com/google/devtools/build/android/desugar/BUILD
index 5100643926..c1e011a3bc 100644
--- a/src/test/java/com/google/devtools/build/android/desugar/BUILD
+++ b/src/test/java/com/google/devtools/build/android/desugar/BUILD
@@ -11,6 +11,7 @@ filegroup(
name = "srcs",
testonly = 0,
srcs = glob(["**"]) + [
+ "//src/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference:srcs",
"//src/test/java/com/google/devtools/build/android/desugar/dependencies:srcs",
"//src/test/java/com/google/devtools/build/android/desugar/runtime:srcs",
],
@@ -529,6 +530,28 @@ java_test(
],
)
+java_test(
+ name = "BytecodeTypeInferenceTest",
+ srcs = ["BytecodeTypeInferenceTest.java"],
+ data = [
+ "BytecodeTypeInferenceTest.golden.txt",
+ "//src/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference:test_subjects",
+ ],
+ jvm_flags = [
+ "-Djar_path=$(location //src/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference:test_subjects)",
+ "-Dgolden_file=$(location BytecodeTypeInferenceTest.golden.txt)",
+ ],
+ tags = ["no_windows"],
+ deps = [
+ ":bytecode_type_printer",
+ "//src/tools/android/java/com/google/devtools/build/android/desugar",
+ "//third_party:asm",
+ "//third_party:guava",
+ "//third_party:junit4",
+ "//third_party:truth",
+ ],
+)
+
sh_test(
name = "testdata_desugared_jar_test",
size = "small",
@@ -743,6 +766,18 @@ java_library(
],
)
+java_library(
+ name = "bytecode_type_printer",
+ srcs = ["ByteCodeTypePrinter.java"],
+ deps = [
+ "//src/tools/android/java/com/google/devtools/build/android/desugar",
+ "//third_party:asm",
+ "//third_party:asm-tree",
+ "//third_party:asm-util",
+ "//third_party:guava",
+ ],
+)
+
# The golden file for this target should NEVER contain generated lambda classes.
sh_test(
name = "desugar_testdata_by_disabling_lambda_desugaring_test",
diff --git a/src/test/java/com/google/devtools/build/android/desugar/ByteCodeTypePrinter.java b/src/test/java/com/google/devtools/build/android/desugar/ByteCodeTypePrinter.java
index fefc59918d..d58d0027ca 100644
--- a/src/test/java/com/google/devtools/build/android/desugar/ByteCodeTypePrinter.java
+++ b/src/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<ZipEntry> 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/src/test/java/com/google/devtools/build/android/desugar/BytecodeTypeInferenceTest.golden.txt b/src/test/java/com/google/devtools/build/android/desugar/BytecodeTypeInferenceTest.golden.txt
index 722c2adb1f..dabfe148fd 100644
--- a/src/test/java/com/google/devtools/build/android/desugar/BytecodeTypeInferenceTest.golden.txt
+++ b/src/test/java/com/google/devtools/build/android/desugar/BytecodeTypeInferenceTest.golden.txt
@@ -3,1168 +3,1793 @@ Method <init>
L0
ALOAD 0
|__STACK: [Ltestsubjects/TestSubject;]
+ |__LOCAL: [Ltestsubjects/TestSubject;]
INVOKESPECIAL java/lang/Object.<init> ()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.<init> ()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.<init> (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.<init> (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.<init> (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.<init> ()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.<init> (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.<init> (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.<init> (Ljava/io/File;)V
|__STACK: [Ljava/io/BufferedReader;, Ljava/io/BufferedReader;, Ljava/io/FileReader;]
+ |__LOCAL: [Ltestsubjects/TestSubject;, Ljava/io/File;]
INVOKESPECIAL java/io/BufferedReader.<init> (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.<init> (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.<init> (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.<init> (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.<init> (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.<init> (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.<init> (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 <clinit>
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/src/test/java/com/google/devtools/build/android/desugar/BytecodeTypeInferenceTest.java b/src/test/java/com/google/devtools/build/android/desugar/BytecodeTypeInferenceTest.java
index 2573648dab..476da87458 100644
--- a/src/test/java/com/google/devtools/build/android/desugar/BytecodeTypeInferenceTest.java
+++ b/src/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<String, InferredType> map =
+ ImmutableMap.<String, InferredType>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/src/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference/BUILD b/src/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference/BUILD
new file mode 100644
index 0000000000..64ba7e8725
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference/BUILD
@@ -0,0 +1,19 @@
+# Description:
+# Tests for the extension classes for desugaring try-with-resources for Android.
+package(
+ default_testonly = 1,
+ default_visibility = ["//src/test/java/com/google/devtools/build/android/desugar:__subpackages__"],
+)
+
+licenses(["notice"]) # Apache 2.0
+
+filegroup(
+ name = "srcs",
+ testonly = 0,
+ srcs = glob(["*"]),
+)
+
+java_import(
+ name = "test_subjects",
+ jars = ["test_subjects.jar"],
+)
diff --git a/src/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference/test_subjects.jar b/src/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference/test_subjects.jar
index efa491bb12..f1bb72660f 100644
--- a/src/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference/test_subjects.jar
+++ b/src/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference/test_subjects.jar
Binary files differ
diff --git a/src/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference/testsubjects/TestSubject.java b/src/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference/testsubjects/TestSubject.java
index b5463a7954..a07e73b944 100644
--- a/src/test/java/com/google/devtools/build/android/desugar/classes_for_testing_type_inference/testsubjects/TestSubject.java
+++ b/src/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;
+ }
}
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/BytecodeTypeInference.java b/src/tools/android/java/com/google/devtools/build/android/desugar/BytecodeTypeInference.java
index 777a4ab722..783069fee4 100644
--- a/src/tools/android/java/com/google/devtools/build/android/desugar/BytecodeTypeInference.java
+++ b/src/tools/android/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<InferredType, InferredType> 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<InferredType> removeBackFromList(
- ImmutableList<InferredType> 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<InferredType> removeBackFromList(
+ ImmutableList<InferredType> 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<InferredType> appendArrayToList(
ImmutableList<InferredType> list, int size, Object[] array) {
ImmutableList.Builder<InferredType> 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<String> 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/src/tools/android/java/com/google/devtools/build/android/desugar/TryWithResourcesRewriter.java b/src/tools/android/java/com/google/devtools/build/android/desugar/TryWithResourcesRewriter.java
index e4d4da5246..8e6d6d558b 100644
--- a/src/tools/android/java/com/google/devtools/build/android/desugar/TryWithResourcesRewriter.java
+++ b/src/tools/android/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<String> 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<String> 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;
}