Move Twr test to java 9 package
Change-Id: Ib89e36424acf82fcfe3f3ecaaec7aeaa7643fe02
diff --git a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
index ecffa3a..1e32ba4 100644
--- a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
+++ b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
@@ -193,6 +193,7 @@
from(compileOutput) {
include("${exampleDir.name}/**/*.class")
exclude("**/TestGenerator*")
+ exclude("${exampleDir.name}/twr/**")
}
// Copy additional resources into the jar.
from(exampleDir) {
diff --git a/d8_r8/test/build.gradle.kts b/d8_r8/test/build.gradle.kts
index f1edea2..30933b4 100644
--- a/d8_r8/test/build.gradle.kts
+++ b/d8_r8/test/build.gradle.kts
@@ -31,6 +31,7 @@
val javaTestBaseJarTask = projectTask("testbase", "testJar")
val javaTestBaseDepsJar = projectTask("testbase", "depsJar")
val java8TestJarTask = projectTask("tests_java_8", "testJar")
+val java9TestJarTask = projectTask("tests_java_9", "testJar")
val java11TestJarTask = projectTask("tests_java_11", "testJar")
val java17TestJarTask = projectTask("tests_java_17", "testJar")
val java21TestJarTask = projectTask("tests_java_21", "testJar")
@@ -64,11 +65,13 @@
val packageTests by registering(Jar::class) {
dependsOn(java8TestJarTask)
+ dependsOn(java9TestJarTask)
dependsOn(java11TestJarTask)
dependsOn(java17TestJarTask)
dependsOn(java21TestJarTask)
dependsOn(bootstrapTestJarTask)
from(java8TestJarTask.outputs.files.map(::zipTree))
+ from(java9TestJarTask.outputs.files.map(::zipTree))
from(java11TestJarTask.outputs.files.map(::zipTree))
from(java17TestJarTask.outputs.files.map(::zipTree))
from(java21TestJarTask.outputs.files.map(::zipTree))
diff --git a/d8_r8/test_modules/tests_java_9/build.gradle.kts b/d8_r8/test_modules/tests_java_9/build.gradle.kts
index 136a506..6ac2d1b 100644
--- a/d8_r8/test_modules/tests_java_9/build.gradle.kts
+++ b/d8_r8/test_modules/tests_java_9/build.gradle.kts
@@ -19,9 +19,21 @@
}
sourceCompatibility = JavaVersion.VERSION_1_9
targetCompatibility = JavaVersion.VERSION_1_9
+ toolchain {
+ languageVersion = JavaLanguageVersion.of(JvmCompatibility.release)
+ }
}
-dependencies { }
+val testbaseJavaCompileTask = projectTask("testbase", "compileJava")
+val testbaseDepsJarTask = projectTask("testbase", "depsJar")
+val mainCompileTask = projectTask("main", "compileJava")
+
+dependencies {
+ implementation(files(testbaseDepsJarTask.outputs.files.getSingleFile()))
+ implementation(testbaseJavaCompileTask.outputs.files)
+ implementation(mainCompileTask.outputs.files)
+ implementation(projectTask("main", "processResources").outputs.files)
+}
// We just need to register the examples jars for it to be referenced by other modules.
val buildExampleJars = buildExampleJars("examplesJava9")
@@ -29,9 +41,27 @@
tasks {
withType<JavaCompile> {
dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
- options.setFork(true)
- options.forkOptions.memoryMaximumSize = "3g"
- options.forkOptions.executable = getCompilerPath(Jdk.JDK_9)
+ }
+
+ withType<Test> {
+ notCompatibleWithConfigurationCache(
+ "Failure storing the configuration cache: cannot serialize object of type 'org.gradle.api.internal.project.DefaultProject', a subtype of 'org.gradle.api.Project', as these are not supported with the configuration cache")
+ TestingState.setUpTestingState(this)
+ systemProperty("TEST_DATA_LOCATION",
+ // This should be
+ // layout.buildDirectory.dir("classes/java/test").get().toString()
+ // once the use of 'buildExampleJars' above is removed.
+ getRoot().resolveAll("build", "test", "examplesJava9", "classes"))
+ systemProperty("TESTBASE_DATA_LOCATION",
+ testbaseJavaCompileTask.outputs.files.getAsPath().split(File.pathSeparator)[0])
+ }
+
+ val testJar by registering(Jar::class) {
+ from(sourceSets.test.get().output)
+ // TODO(b/296486206): Seems like IntelliJ has a problem depending on test source sets. Renaming
+ // this from the default name (tests_java_8.jar) will allow IntelliJ to find the resources in
+ // the jar and not show red underlines. However, navigation to base classes will not work.
+ archiveFileName.set("not_named_tests_java_9.jar")
}
}
diff --git a/d8_r8/test_modules/tests_java_9/settings.gradle.kts b/d8_r8/test_modules/tests_java_9/settings.gradle.kts
index ad1c8ab..8a58cdb 100644
--- a/d8_r8/test_modules/tests_java_9/settings.gradle.kts
+++ b/d8_r8/test_modules/tests_java_9/settings.gradle.kts
@@ -23,4 +23,7 @@
rootProject.name = "tests_java_9"
val root = rootProject.projectDir.parentFile.parentFile
+
includeBuild(root.resolve("shared"))
+includeBuild(root.resolve("main"))
+includeBuild(root.resolve("test_modules").resolve("testbase"))
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/r8/desugar/suppressedexceptions/TwrSuppressedExceptionsTest.java b/src/test/examplesJava9/twr/twraddsuppressed/TwrSuppressedExceptionsTest.java
similarity index 85%
rename from src/test/java/com/android/tools/r8/desugar/suppressedexceptions/TwrSuppressedExceptionsTest.java
rename to src/test/examplesJava9/twr/twraddsuppressed/TwrSuppressedExceptionsTest.java
index 6c03e85..573fc99 100644
--- a/src/test/java/com/android/tools/r8/desugar/suppressedexceptions/TwrSuppressedExceptionsTest.java
+++ b/src/test/examplesJava9/twr/twraddsuppressed/TwrSuppressedExceptionsTest.java
@@ -1,7 +1,7 @@
// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.desugar.suppressedexceptions;
+package twr.twraddsuppressed;
import static org.junit.Assert.assertEquals;
@@ -11,14 +11,12 @@
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.TestRuntime.CfVm;
import com.android.tools.r8.ToolHelper.DexVm.Version;
-import com.android.tools.r8.examples.JavaExampleClassProxy;
import com.android.tools.r8.utils.IntBox;
import com.android.tools.r8.utils.StringUtils;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.InstructionSubject;
import com.android.tools.r8.utils.codeinspector.MethodSubject;
import com.google.common.collect.ImmutableList;
-import java.nio.file.Path;
import java.util.List;
import java.util.stream.Collectors;
import org.junit.Test;
@@ -26,13 +24,13 @@
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
+import twr.twraddsuppressed.asm.TestClass$MyClosableDump;
+import twr.twraddsuppressed.asm.TestClassDump;
@RunWith(Parameterized.class)
public class TwrSuppressedExceptionsTest extends TestBase {
- private static final String PKG = "twraddsuppressed";
- private static final String EXAMPLE = "examplesJava9/" + PKG;
- private final JavaExampleClassProxy MAIN = new JavaExampleClassProxy(EXAMPLE, PKG + ".TestClass");
+ private static final String TEST_CLASS = "twr.twraddsuppressed.TestClass";
@Parameter(0)
public TestParameters parameters;
@@ -67,21 +65,21 @@
|| parameters.getApiLevel().isGreaterThanOrEqualTo(apiLevelWithTwrCloseResourceSupport());
}
- public List<Path> getProgramInputs() {
- return ImmutableList.of(JavaExampleClassProxy.examplesJar(EXAMPLE));
+ public List<byte[]> getProgramInputs() throws Exception {
+ return ImmutableList.of(TestClassDump.dump(), TestClass$MyClosableDump.dump());
}
@Test
public void testD8() throws Exception {
testForDesugaring(parameters)
- .addProgramFiles(getProgramInputs())
- .run(parameters.getRuntime(), MAIN.typeName())
+ .addProgramClassFileData(getProgramInputs())
+ .run(parameters.getRuntime(), TEST_CLASS)
.assertSuccessWithOutput(
runtimeHasSuppressedExceptionsSupport() ? StringUtils.lines("CLOSE") : "NONE")
.inspectIf(
DesugarTestConfiguration::isDesugared,
inspector -> {
- ClassSubject clazz = inspector.clazz(MAIN.typeName());
+ ClassSubject clazz = inspector.clazz(TEST_CLASS);
hasInvokesTo(
clazz.uniqueMethodWithOriginalName("bar"),
// NOTE: The $closeResource helper is _only_ generated by the JDK-9 compiler.
@@ -102,7 +100,7 @@
.inspectIf(
DesugarTestConfiguration::isNotDesugared,
inspector -> {
- ClassSubject clazz = inspector.clazz(MAIN.typeName());
+ ClassSubject clazz = inspector.clazz(TEST_CLASS);
// NOTE: The $closeResource helper is _only_ generated by the JDK-9 compiler.
hasInvokesTo(clazz.uniqueMethodWithOriginalName("bar"), "$closeResource", 4);
hasInvokesTo(clazz.mainMethod(), "getSuppressed", 1);
@@ -113,9 +111,9 @@
public void testR8() throws Exception {
parameters.assumeR8TestParameters();
testForR8(parameters.getBackend())
- .addProgramFiles(getProgramInputs())
+ .addProgramClassFileData(getProgramInputs())
.setMinApi(parameters)
- .addKeepMainRule(MAIN.typeName())
+ .addKeepMainRule(TEST_CLASS)
// TODO(b/214250388): Don't warn about AutoClosable in synthesized code.
.apply(
b -> {
@@ -123,7 +121,7 @@
b.addDontWarn(AutoCloseable.class);
}
})
- .run(parameters.getRuntime(), MAIN.typeName())
+ .run(parameters.getRuntime(), TEST_CLASS)
.assertSuccessWithOutput(
runtimeHasSuppressedExceptionsSupport() ? StringUtils.lines("CLOSE") : "NONE")
.inspect(
@@ -138,7 +136,7 @@
adds.increment(getInvokesTo(m, "addSuppressed").size());
}));
if (apiLevelHasSuppressedExceptionsSupport(parameters.isDexRuntime())) {
- hasInvokesTo(inspector.clazz(MAIN.typeName()).mainMethod(), "getSuppressed", 1);
+ hasInvokesTo(inspector.clazz(TEST_CLASS).mainMethod(), "getSuppressed", 1);
assertEquals(1, gets.get());
assertEquals(1, adds.get());
} else {
diff --git a/src/test/examplesJava9/twr/twraddsuppressed/asm/TestClass$MyClosableDump.java b/src/test/examplesJava9/twr/twraddsuppressed/asm/TestClass$MyClosableDump.java
new file mode 100644
index 0000000..039d6c2
--- /dev/null
+++ b/src/test/examplesJava9/twr/twraddsuppressed/asm/TestClass$MyClosableDump.java
@@ -0,0 +1,80 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package twr.twraddsuppressed.asm;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.RecordComponentVisitor;
+
+public class TestClass$MyClosableDump implements Opcodes {
+
+ public static byte[] dump() throws Exception {
+
+ ClassWriter classWriter = new ClassWriter(0);
+ FieldVisitor fieldVisitor;
+ RecordComponentVisitor recordComponentVisitor;
+ MethodVisitor methodVisitor;
+ AnnotationVisitor annotationVisitor0;
+
+ classWriter.visit(
+ V9,
+ ACC_PUBLIC | ACC_SUPER,
+ "twr/twraddsuppressed/TestClass$MyClosable",
+ null,
+ "java/lang/Object",
+ new String[] {"java/io/Closeable"});
+
+ classWriter.visitSource("TestClass.java", null);
+
+ classWriter.visitInnerClass(
+ "twr/twraddsuppressed/TestClass$MyClosable",
+ "twr/twraddsuppressed/TestClass",
+ "MyClosable",
+ ACC_PUBLIC | ACC_STATIC);
+
+ {
+ methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitLineNumber(10, label0);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
+ methodVisitor.visitInsn(RETURN);
+ Label label1 = new Label();
+ methodVisitor.visitLabel(label1);
+ methodVisitor.visitLocalVariable(
+ "this", "Ltwraddsuppressed/TestClass$MyClosable;", null, label0, label1, 0);
+ methodVisitor.visitMaxs(1, 1);
+ methodVisitor.visitEnd();
+ }
+ {
+ methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "close", "()V", null, null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitLineNumber(14, label0);
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitLdcInsn("CLOSE");
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitInsn(ATHROW);
+ Label label1 = new Label();
+ methodVisitor.visitLabel(label1);
+ methodVisitor.visitLocalVariable(
+ "this", "Ltwraddsuppressed/TestClass$MyClosable;", null, label0, label1, 0);
+ methodVisitor.visitMaxs(3, 1);
+ methodVisitor.visitEnd();
+ }
+ classWriter.visitEnd();
+
+ return classWriter.toByteArray();
+ }
+}
diff --git a/src/test/examplesJava9/twr/twraddsuppressed/asm/TestClassDump.java b/src/test/examplesJava9/twr/twraddsuppressed/asm/TestClassDump.java
new file mode 100644
index 0000000..6c26a69
--- /dev/null
+++ b/src/test/examplesJava9/twr/twraddsuppressed/asm/TestClassDump.java
@@ -0,0 +1,398 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Dump of class file for twr.twraddsuppressed.TestClass
+ *
+ * <p>*
+ *
+ * <p>This is used to get the JDK-9 javac code with `$closeResource`, which `-target 9` for later
+ * javac versions does not produce.
+ *
+ * <p>package twr.twraddsuppressed;
+ *
+ * <p>import java.io.Closeable;
+ *
+ * <p>public class TestClass {
+ *
+ * <p>public static class MyClosable implements Closeable { @Override public void close() { throw
+ * new RuntimeException("CLOSE"); } }
+ *
+ * <p>public static void foo() { throw new RuntimeException("FOO"); }
+ *
+ * <p>public static void bar() { // NOTE: The $closeResource helper is _only_ generated by the JDK-9
+ * compiler. // // Use twr twice to have javac generate a shared $closeResource helper. try
+ * (MyClosable closable = new MyClosable()) { foo(); } try (MyClosable closable = new MyClosable())
+ * { foo(); } }
+ *
+ * <p>public static void main(String[] args) { try { bar(); } catch (Exception e) { Throwable[]
+ * suppressed = e.getSuppressed(); if (suppressed.length == 0) { System.out.println("NONE"); } else
+ * { for (Throwable throwable : suppressed) { System.out.println(throwable.getMessage()); } } } } }
+ */
+package twr.twraddsuppressed.asm;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.RecordComponentVisitor;
+
+public class TestClassDump implements Opcodes {
+
+ public static byte[] dump() throws Exception {
+
+ ClassWriter classWriter = new ClassWriter(0);
+ FieldVisitor fieldVisitor;
+ RecordComponentVisitor recordComponentVisitor;
+ MethodVisitor methodVisitor;
+ AnnotationVisitor annotationVisitor0;
+
+ classWriter.visit(
+ V9,
+ ACC_PUBLIC | ACC_SUPER,
+ "twr/twraddsuppressed/TestClass",
+ null,
+ "java/lang/Object",
+ null);
+
+ classWriter.visitSource("TestClass.java", null);
+
+ classWriter.visitInnerClass(
+ "twr/twraddsuppressed/TestClass$MyClosable",
+ "twr/twraddsuppressed/TestClass",
+ "MyClosable",
+ ACC_PUBLIC | ACC_STATIC);
+
+ {
+ methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitLineNumber(8, label0);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
+ methodVisitor.visitInsn(RETURN);
+ Label label1 = new Label();
+ methodVisitor.visitLabel(label1);
+ methodVisitor.visitLocalVariable(
+ "this", "Ltwraddsuppressed/TestClass;", null, label0, label1, 0);
+ methodVisitor.visitMaxs(1, 1);
+ methodVisitor.visitEnd();
+ }
+ {
+ methodVisitor = classWriter.visitMethod(ACC_PUBLIC | ACC_STATIC, "foo", "()V", null, null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitLineNumber(19, label0);
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitLdcInsn("FOO");
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitMaxs(3, 0);
+ methodVisitor.visitEnd();
+ }
+ {
+ methodVisitor = classWriter.visitMethod(ACC_PUBLIC | ACC_STATIC, "bar", "()V", null, null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ Label label1 = new Label();
+ Label label2 = new Label();
+ methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
+ Label label3 = new Label();
+ methodVisitor.visitTryCatchBlock(label0, label1, label3, null);
+ Label label4 = new Label();
+ methodVisitor.visitTryCatchBlock(label2, label4, label3, null);
+ Label label5 = new Label();
+ Label label6 = new Label();
+ Label label7 = new Label();
+ methodVisitor.visitTryCatchBlock(label5, label6, label7, "java/lang/Throwable");
+ Label label8 = new Label();
+ methodVisitor.visitTryCatchBlock(label5, label6, label8, null);
+ Label label9 = new Label();
+ methodVisitor.visitTryCatchBlock(label7, label9, label8, null);
+ Label label10 = new Label();
+ methodVisitor.visitLabel(label10);
+ methodVisitor.visitLineNumber(24, label10);
+ methodVisitor.visitTypeInsn(NEW, "twr/twraddsuppressed/TestClass$MyClosable");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "twr/twraddsuppressed/TestClass$MyClosable", "<init>", "()V", false);
+ methodVisitor.visitVarInsn(ASTORE, 0);
+ Label label11 = new Label();
+ methodVisitor.visitLabel(label11);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitLineNumber(25, label0);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC, "twr/twraddsuppressed/TestClass", "foo", "()V", false);
+ methodVisitor.visitLabel(label1);
+ methodVisitor.visitLineNumber(26, label1);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twraddsuppressed/TestClass",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ Label label12 = new Label();
+ methodVisitor.visitJumpInsn(GOTO, label12);
+ methodVisitor.visitLabel(label2);
+ methodVisitor.visitLineNumber(24, label2);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 2,
+ new Object[] {"twr/twraddsuppressed/TestClass$MyClosable", "java/lang/Throwable"},
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label3);
+ methodVisitor.visitLineNumber(26, label3);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitLabel(label4);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twraddsuppressed/TestClass",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label12);
+ methodVisitor.visitLineNumber(27, label12);
+ methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+ methodVisitor.visitTypeInsn(NEW, "twr/twraddsuppressed/TestClass$MyClosable");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "twr/twraddsuppressed/TestClass$MyClosable", "<init>", "()V", false);
+ methodVisitor.visitVarInsn(ASTORE, 0);
+ Label label13 = new Label();
+ methodVisitor.visitLabel(label13);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ methodVisitor.visitLabel(label5);
+ methodVisitor.visitLineNumber(28, label5);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC, "twr/twraddsuppressed/TestClass", "foo", "()V", false);
+ methodVisitor.visitLabel(label6);
+ methodVisitor.visitLineNumber(29, label6);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twraddsuppressed/TestClass",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ Label label14 = new Label();
+ methodVisitor.visitJumpInsn(GOTO, label14);
+ methodVisitor.visitLabel(label7);
+ methodVisitor.visitLineNumber(27, label7);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 2,
+ new Object[] {"twr/twraddsuppressed/TestClass$MyClosable", "java/lang/Throwable"},
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label8);
+ methodVisitor.visitLineNumber(29, label8);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 4);
+ methodVisitor.visitLabel(label9);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twraddsuppressed/TestClass",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label14);
+ methodVisitor.visitLineNumber(30, label14);
+ methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+ methodVisitor.visitInsn(RETURN);
+ methodVisitor.visitLocalVariable(
+ "closable", "Ltwraddsuppressed/TestClass$MyClosable;", null, label11, label12, 0);
+ methodVisitor.visitLocalVariable(
+ "closable", "Ltwraddsuppressed/TestClass$MyClosable;", null, label13, label14, 0);
+ methodVisitor.visitMaxs(2, 5);
+ methodVisitor.visitEnd();
+ }
+ {
+ methodVisitor =
+ classWriter.visitMethod(
+ ACC_PUBLIC | ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ Label label1 = new Label();
+ Label label2 = new Label();
+ methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Exception");
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitLineNumber(34, label0);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC, "twr/twraddsuppressed/TestClass", "bar", "()V", false);
+ methodVisitor.visitLabel(label1);
+ methodVisitor.visitLineNumber(44, label1);
+ Label label3 = new Label();
+ methodVisitor.visitJumpInsn(GOTO, label3);
+ methodVisitor.visitLabel(label2);
+ methodVisitor.visitLineNumber(35, label2);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Exception"});
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ Label label4 = new Label();
+ methodVisitor.visitLabel(label4);
+ methodVisitor.visitLineNumber(36, label4);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/lang/Exception", "getSuppressed", "()[Ljava/lang/Throwable;", false);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label5 = new Label();
+ methodVisitor.visitLabel(label5);
+ methodVisitor.visitLineNumber(37, label5);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitInsn(ARRAYLENGTH);
+ Label label6 = new Label();
+ methodVisitor.visitJumpInsn(IFNE, label6);
+ Label label7 = new Label();
+ methodVisitor.visitLabel(label7);
+ methodVisitor.visitLineNumber(38, label7);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("NONE");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitJumpInsn(GOTO, label3);
+ methodVisitor.visitLabel(label6);
+ methodVisitor.visitLineNumber(40, label6);
+ methodVisitor.visitFrame(
+ Opcodes.F_APPEND,
+ 2,
+ new Object[] {"java/lang/Exception", "[Ljava/lang/Throwable;"},
+ 0,
+ null);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitInsn(ARRAYLENGTH);
+ methodVisitor.visitVarInsn(ISTORE, 4);
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitVarInsn(ISTORE, 5);
+ Label label8 = new Label();
+ methodVisitor.visitLabel(label8);
+ methodVisitor.visitFrame(
+ Opcodes.F_APPEND,
+ 3,
+ new Object[] {"[Ljava/lang/Throwable;", Opcodes.INTEGER, Opcodes.INTEGER},
+ 0,
+ null);
+ methodVisitor.visitVarInsn(ILOAD, 5);
+ methodVisitor.visitVarInsn(ILOAD, 4);
+ methodVisitor.visitJumpInsn(IF_ICMPGE, label3);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ILOAD, 5);
+ methodVisitor.visitInsn(AALOAD);
+ methodVisitor.visitVarInsn(ASTORE, 6);
+ Label label9 = new Label();
+ methodVisitor.visitLabel(label9);
+ methodVisitor.visitLineNumber(41, label9);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitVarInsn(ALOAD, 6);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/lang/Throwable", "getMessage", "()Ljava/lang/String;", false);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label10 = new Label();
+ methodVisitor.visitLabel(label10);
+ methodVisitor.visitLineNumber(40, label10);
+ methodVisitor.visitIincInsn(5, 1);
+ methodVisitor.visitJumpInsn(GOTO, label8);
+ methodVisitor.visitLabel(label3);
+ methodVisitor.visitLineNumber(45, label3);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL, 1, new Object[] {"[Ljava/lang/String;"}, 0, new Object[] {});
+ methodVisitor.visitInsn(RETURN);
+ Label label11 = new Label();
+ methodVisitor.visitLabel(label11);
+ methodVisitor.visitLocalVariable(
+ "throwable", "Ljava/lang/Throwable;", null, label9, label10, 6);
+ methodVisitor.visitLocalVariable(
+ "suppressed", "[Ljava/lang/Throwable;", null, label5, label3, 2);
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label4, label3, 1);
+ methodVisitor.visitLocalVariable("args", "[Ljava/lang/String;", null, label0, label11, 0);
+ methodVisitor.visitMaxs(2, 7);
+ methodVisitor.visitEnd();
+ }
+ {
+ methodVisitor =
+ classWriter.visitMethod(
+ ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC,
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ null,
+ null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ Label label1 = new Label();
+ Label label2 = new Label();
+ methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
+ Label label3 = new Label();
+ methodVisitor.visitLabel(label3);
+ methodVisitor.visitLineNumber(26, label3);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ Label label4 = new Label();
+ methodVisitor.visitJumpInsn(IFNULL, label4);
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKEINTERFACE, "java/lang/AutoCloseable", "close", "()V", true);
+ methodVisitor.visitLabel(label1);
+ Label label5 = new Label();
+ methodVisitor.visitJumpInsn(GOTO, label5);
+ methodVisitor.visitLabel(label2);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/lang/Throwable", "addSuppressed", "(Ljava/lang/Throwable;)V", false);
+ methodVisitor.visitJumpInsn(GOTO, label5);
+ methodVisitor.visitLabel(label4);
+ methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKEINTERFACE, "java/lang/AutoCloseable", "close", "()V", true);
+ methodVisitor.visitLabel(label5);
+ methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+ methodVisitor.visitInsn(RETURN);
+ Label label6 = new Label();
+ methodVisitor.visitLabel(label6);
+ methodVisitor.visitLocalVariable("x0", "Ljava/lang/Throwable;", null, label3, label6, 0);
+ methodVisitor.visitLocalVariable("x1", "Ljava/lang/AutoCloseable;", null, label3, label6, 1);
+ methodVisitor.visitMaxs(2, 3);
+ methodVisitor.visitEnd();
+ }
+ classWriter.visitEnd();
+
+ return classWriter.toByteArray();
+ }
+}
diff --git a/src/test/examplesJava9/twr/twrcloseresource/TwrCloseResourceRunnerTest.java b/src/test/examplesJava9/twr/twrcloseresource/TwrCloseResourceRunnerTest.java
new file mode 100644
index 0000000..1f4f474
--- /dev/null
+++ b/src/test/examplesJava9/twr/twrcloseresource/TwrCloseResourceRunnerTest.java
@@ -0,0 +1,89 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package twr.twrcloseresource;
+
+import com.android.tools.r8.CompilationMode;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.TestRuntime.CfVm;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.google.common.collect.ImmutableList;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+import twr.twrcloseresource.asm.IfaceDump;
+import twr.twrcloseresource.asm.TwrCloseResourceTestDump;
+
+@RunWith(Parameterized.class)
+public class TwrCloseResourceRunnerTest extends TestBase {
+
+ public static Path ANY_REACHABLE_JAR = Paths.get(ToolHelper.EXAMPLES_JAVA9_BUILD_DIR, "flow.jar");
+
+ private static final String EXPECTED_RESULT =
+ "A\n" + "E\n" + "G\n" + "H\n" + "I\n" + "J\n" + "K\n" + "iA\n" + "iE\n" + "iG\n" + "iH\n"
+ + "iI\n" + "iJ\n" + "iK\n" + "1\n" + "2\n" + "3\n" + "4\n" + "5\n" + "6\n" + "7\n" + "8\n"
+ + "99\n" + "i1\n" + "i2\n" + "i3\n" + "i4\n" + "i5\n" + "i6\n" + "i7\n" + "i8\n"
+ + "i99\n";
+
+ @Parameter(0)
+ public TestParameters parameters;
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters()
+ .withCfRuntimesStartingFromIncluding(CfVm.JDK9)
+ .withDexRuntimes()
+ .withAllApiLevelsAlsoForCf()
+ .build();
+ }
+
+ @Test
+ public void testD8() throws Exception {
+ testForD8(parameters.getBackend())
+ .addProgramClassFileData(IfaceDump.dump(), TwrCloseResourceTestDump.dump())
+ .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.LATEST))
+ .setMinApi(parameters)
+ .run(
+ parameters.getRuntime(),
+ "twr.twrcloseresource.TwrCloseResourceTest",
+ ANY_REACHABLE_JAR.toAbsolutePath().toString())
+ .assertSuccessWithOutput(EXPECTED_RESULT);
+ }
+
+ @Test
+ public void testR8() throws Exception {
+ parameters.assumeRuntimeTestParameters();
+ testForR8(parameters.getBackend())
+ .addProgramClassFileData(IfaceDump.dump(), TwrCloseResourceTestDump.dump())
+ .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.LATEST))
+ .setMinApi(parameters)
+ .setMode(CompilationMode.DEBUG)
+ .applyIf(
+ parameters.isCfRuntime(),
+ t ->
+ t.addOptionsModification(
+ options ->
+ options.getOpenClosedInterfacesOptions().suppressAllOpenInterfaces()))
+ .apply(
+ b ->
+ b.getBuilder()
+ .setDisableTreeShaking(true)
+ .setDisableMinification(true)
+ .addProguardConfiguration(
+ ImmutableList.of("-keepattributes *"), Origin.unknown()))
+ .run(
+ parameters.getRuntime(),
+ "twr.twrcloseresource.TwrCloseResourceTest",
+ ANY_REACHABLE_JAR.toAbsolutePath().toString())
+ .assertSuccessWithOutput(EXPECTED_RESULT);
+ }
+}
diff --git a/src/test/examplesJava9/twr/twrcloseresource/asm/IfaceDump.java b/src/test/examplesJava9/twr/twrcloseresource/asm/IfaceDump.java
new file mode 100644
index 0000000..d049990
--- /dev/null
+++ b/src/test/examplesJava9/twr/twrcloseresource/asm/IfaceDump.java
@@ -0,0 +1,904 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package twr.twrcloseresource.asm;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.RecordComponentVisitor;
+
+public class IfaceDump implements Opcodes {
+
+ public static byte[] dump() throws Exception {
+
+ ClassWriter classWriter = new ClassWriter(0);
+ FieldVisitor fieldVisitor;
+ RecordComponentVisitor recordComponentVisitor;
+ MethodVisitor methodVisitor;
+ AnnotationVisitor annotationVisitor0;
+
+ classWriter.visit(
+ V9,
+ ACC_ABSTRACT | ACC_INTERFACE,
+ "twr/twrcloseresource/Iface",
+ null,
+ "java/lang/Object",
+ null);
+
+ classWriter.visitSource("TwrCloseResourceDuplication$BarDump.java", null);
+
+ {
+ methodVisitor =
+ classWriter.visitMethod(ACC_PUBLIC, "iFoo", "(Ljava/lang/String;)V", null, null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ Label label1 = new Label();
+ Label label2 = new Label();
+ methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
+ Label label3 = new Label();
+ methodVisitor.visitTryCatchBlock(label0, label1, label3, null);
+ Label label4 = new Label();
+ methodVisitor.visitTryCatchBlock(label2, label4, label3, null);
+ Label label5 = new Label();
+ Label label6 = new Label();
+ Label label7 = new Label();
+ methodVisitor.visitTryCatchBlock(label5, label6, label7, "java/lang/Exception");
+ Label label8 = new Label();
+ Label label9 = new Label();
+ Label label10 = new Label();
+ methodVisitor.visitTryCatchBlock(label8, label9, label10, "java/lang/Throwable");
+ Label label11 = new Label();
+ methodVisitor.visitTryCatchBlock(label8, label9, label11, null);
+ Label label12 = new Label();
+ methodVisitor.visitTryCatchBlock(label10, label12, label11, null);
+ Label label13 = new Label();
+ Label label14 = new Label();
+ Label label15 = new Label();
+ methodVisitor.visitTryCatchBlock(label13, label14, label15, "java/lang/Throwable");
+ Label label16 = new Label();
+ methodVisitor.visitTryCatchBlock(label13, label14, label16, null);
+ Label label17 = new Label();
+ methodVisitor.visitTryCatchBlock(label15, label17, label16, null);
+ Label label18 = new Label();
+ Label label19 = new Label();
+ methodVisitor.visitTryCatchBlock(label5, label18, label19, "java/lang/Exception");
+ Label label20 = new Label();
+ Label label21 = new Label();
+ Label label22 = new Label();
+ methodVisitor.visitTryCatchBlock(label20, label21, label22, "java/lang/Throwable");
+ Label label23 = new Label();
+ methodVisitor.visitTryCatchBlock(label20, label21, label23, null);
+ Label label24 = new Label();
+ methodVisitor.visitTryCatchBlock(label22, label24, label23, null);
+ Label label25 = new Label();
+ Label label26 = new Label();
+ Label label27 = new Label();
+ methodVisitor.visitTryCatchBlock(label25, label26, label27, null);
+ Label label28 = new Label();
+ methodVisitor.visitTryCatchBlock(label27, label28, label27, null);
+ Label label29 = new Label();
+ Label label30 = new Label();
+ methodVisitor.visitTryCatchBlock(label29, label30, label30, "java/lang/Throwable");
+ Label label31 = new Label();
+ Label label32 = new Label();
+ methodVisitor.visitTryCatchBlock(label29, label31, label32, null);
+ Label label33 = new Label();
+ Label label34 = new Label();
+ methodVisitor.visitTryCatchBlock(label33, label34, label34, "java/lang/Exception");
+ methodVisitor.visitLabel(label5);
+ methodVisitor.visitLineNumber(82, label5);
+ methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label35 = new Label();
+ methodVisitor.visitLabel(label35);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitLineNumber(83, label0);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("iA");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label1);
+ methodVisitor.visitLineNumber(84, label1);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/Iface",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ true);
+ methodVisitor.visitJumpInsn(GOTO, label6);
+ methodVisitor.visitLabel(label2);
+ methodVisitor.visitLineNumber(82, label2);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 4,
+ new Object[] {
+ "twr/twrcloseresource/Iface",
+ "java/lang/String",
+ "java/util/jar/JarFile",
+ "java/lang/Throwable"
+ },
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 4);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label3);
+ methodVisitor.visitLineNumber(84, label3);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 5);
+ methodVisitor.visitLabel(label4);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/Iface",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ true);
+ methodVisitor.visitVarInsn(ALOAD, 5);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label6);
+ methodVisitor.visitLineNumber(91, label6);
+ methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+ Label label36 = new Label();
+ methodVisitor.visitJumpInsn(GOTO, label36);
+ methodVisitor.visitLabel(label7);
+ methodVisitor.visitLineNumber(84, label7);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Exception"});
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label37 = new Label();
+ methodVisitor.visitLabel(label37);
+ methodVisitor.visitLineNumber(85, label37);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("iB");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label38 = new Label();
+ methodVisitor.visitLabel(label38);
+ methodVisitor.visitLineNumber(86, label38);
+ methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ Label label39 = new Label();
+ methodVisitor.visitLabel(label39);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 4);
+ methodVisitor.visitLabel(label8);
+ methodVisitor.visitLineNumber(87, label8);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("iC");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label9);
+ methodVisitor.visitLineNumber(88, label9);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/Iface",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ true);
+ Label label40 = new Label();
+ methodVisitor.visitJumpInsn(GOTO, label40);
+ methodVisitor.visitLabel(label10);
+ methodVisitor.visitLineNumber(86, label10);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 5,
+ new Object[] {
+ "twr/twrcloseresource/Iface",
+ "java/lang/String",
+ "java/lang/Exception",
+ "java/util/jar/JarFile",
+ "java/lang/Throwable"
+ },
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 5);
+ methodVisitor.visitVarInsn(ALOAD, 5);
+ methodVisitor.visitVarInsn(ASTORE, 4);
+ methodVisitor.visitVarInsn(ALOAD, 5);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label11);
+ methodVisitor.visitLineNumber(88, label11);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 6);
+ methodVisitor.visitLabel(label12);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/Iface",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ true);
+ methodVisitor.visitVarInsn(ALOAD, 6);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label40);
+ methodVisitor.visitLineNumber(89, label40);
+ methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("iD");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label41 = new Label();
+ methodVisitor.visitLabel(label41);
+ methodVisitor.visitLineNumber(90, label41);
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label36);
+ methodVisitor.visitLineNumber(92, label36);
+ methodVisitor.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
+ methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label42 = new Label();
+ methodVisitor.visitLabel(label42);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitLabel(label13);
+ methodVisitor.visitLineNumber(93, label13);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("iE");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label14);
+ methodVisitor.visitLineNumber(94, label14);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/Iface",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ true);
+ methodVisitor.visitJumpInsn(GOTO, label18);
+ methodVisitor.visitLabel(label15);
+ methodVisitor.visitLineNumber(92, label15);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 4,
+ new Object[] {
+ "twr/twrcloseresource/Iface",
+ "java/lang/String",
+ "java/util/jar/JarFile",
+ "java/lang/Throwable"
+ },
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 4);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label16);
+ methodVisitor.visitLineNumber(94, label16);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 7);
+ methodVisitor.visitLabel(label17);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/Iface",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ true);
+ methodVisitor.visitVarInsn(ALOAD, 7);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label18);
+ methodVisitor.visitLineNumber(97, label18);
+ methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+ methodVisitor.visitJumpInsn(GOTO, label33);
+ methodVisitor.visitLabel(label19);
+ methodVisitor.visitLineNumber(95, label19);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Exception"});
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label43 = new Label();
+ methodVisitor.visitLabel(label43);
+ methodVisitor.visitLineNumber(96, label43);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("iF");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label33);
+ methodVisitor.visitLineNumber(98, label33);
+ methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+ methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label44 = new Label();
+ methodVisitor.visitLabel(label44);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitLabel(label29);
+ methodVisitor.visitLineNumber(99, label29);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("iG");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label25);
+ methodVisitor.visitLineNumber(100, label25);
+ methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ASTORE, 4);
+ Label label45 = new Label();
+ methodVisitor.visitLabel(label45);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 5);
+ methodVisitor.visitLabel(label20);
+ methodVisitor.visitLineNumber(101, label20);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("iH");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label21);
+ methodVisitor.visitLineNumber(102, label21);
+ methodVisitor.visitVarInsn(ALOAD, 5);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/Iface",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ true);
+ methodVisitor.visitJumpInsn(GOTO, label26);
+ methodVisitor.visitLabel(label22);
+ methodVisitor.visitLineNumber(100, label22);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 6,
+ new Object[] {
+ "twr/twrcloseresource/Iface",
+ "java/lang/String",
+ "java/util/jar/JarFile",
+ "java/lang/Throwable",
+ "java/util/jar/JarFile",
+ "java/lang/Throwable"
+ },
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 6);
+ methodVisitor.visitVarInsn(ALOAD, 6);
+ methodVisitor.visitVarInsn(ASTORE, 5);
+ methodVisitor.visitVarInsn(ALOAD, 6);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label23);
+ methodVisitor.visitLineNumber(102, label23);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 8);
+ methodVisitor.visitLabel(label24);
+ methodVisitor.visitVarInsn(ALOAD, 5);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/Iface",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ true);
+ methodVisitor.visitVarInsn(ALOAD, 8);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label26);
+ methodVisitor.visitLineNumber(103, label26);
+ methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("iI");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label46 = new Label();
+ methodVisitor.visitLabel(label46);
+ methodVisitor.visitLineNumber(104, label46);
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label27);
+ methodVisitor.visitLineNumber(103, label27);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 9);
+ methodVisitor.visitLabel(label28);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("iI");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label47 = new Label();
+ methodVisitor.visitLabel(label47);
+ methodVisitor.visitLineNumber(104, label47);
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label30);
+ methodVisitor.visitLineNumber(98, label30);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 4);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label32);
+ methodVisitor.visitLineNumber(106, label32);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 10);
+ methodVisitor.visitLabel(label31);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/Iface",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ true);
+ methodVisitor.visitVarInsn(ALOAD, 10);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label34);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 2,
+ new Object[] {"twr/twrcloseresource/Iface", "java/lang/String"},
+ 1,
+ new Object[] {"java/lang/Exception"});
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label48 = new Label();
+ methodVisitor.visitLabel(label48);
+ methodVisitor.visitLineNumber(107, label48);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("iJ");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label49 = new Label();
+ methodVisitor.visitLabel(label49);
+ methodVisitor.visitLineNumber(109, label49);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("iK");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label50 = new Label();
+ methodVisitor.visitLabel(label50);
+ methodVisitor.visitLineNumber(110, label50);
+ methodVisitor.visitInsn(RETURN);
+ Label label51 = new Label();
+ methodVisitor.visitLabel(label51);
+ methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label35, label6, 2);
+ methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label39, label40, 3);
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label37, label36, 2);
+ methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label42, label18, 2);
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label43, label33, 2);
+ methodVisitor.visitLocalVariable("b", "Ljava/util/jar/JarFile;", null, label45, label26, 4);
+ methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label44, label34, 2);
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label48, label49, 2);
+ methodVisitor.visitLocalVariable(
+ "this", "Ltwrcloseresource/Iface;", null, label5, label51, 0);
+ methodVisitor.visitLocalVariable("arg", "Ljava/lang/String;", null, label5, label51, 1);
+ methodVisitor.visitMaxs(3, 11);
+ methodVisitor.visitEnd();
+ }
+ {
+ methodVisitor =
+ classWriter.visitMethod(
+ ACC_PUBLIC | ACC_STATIC, "iBar", "(Ljava/lang/String;)V", null, null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ Label label1 = new Label();
+ methodVisitor.visitTryCatchBlock(label0, label1, label1, "java/lang/Throwable");
+ Label label2 = new Label();
+ Label label3 = new Label();
+ methodVisitor.visitTryCatchBlock(label0, label2, label3, null);
+ Label label4 = new Label();
+ Label label5 = new Label();
+ methodVisitor.visitTryCatchBlock(label4, label5, label5, "java/lang/Exception");
+ Label label6 = new Label();
+ Label label7 = new Label();
+ methodVisitor.visitTryCatchBlock(label6, label7, label7, "java/lang/Throwable");
+ Label label8 = new Label();
+ Label label9 = new Label();
+ methodVisitor.visitTryCatchBlock(label6, label8, label9, null);
+ Label label10 = new Label();
+ Label label11 = new Label();
+ methodVisitor.visitTryCatchBlock(label10, label11, label11, "java/lang/Exception");
+ Label label12 = new Label();
+ Label label13 = new Label();
+ methodVisitor.visitTryCatchBlock(label12, label13, label13, "java/lang/Throwable");
+ Label label14 = new Label();
+ Label label15 = new Label();
+ methodVisitor.visitTryCatchBlock(label12, label14, label15, null);
+ Label label16 = new Label();
+ Label label17 = new Label();
+ methodVisitor.visitTryCatchBlock(label16, label17, label17, "java/lang/Exception");
+ Label label18 = new Label();
+ Label label19 = new Label();
+ methodVisitor.visitTryCatchBlock(label18, label19, label19, "java/lang/Throwable");
+ Label label20 = new Label();
+ Label label21 = new Label();
+ methodVisitor.visitTryCatchBlock(label18, label20, label21, null);
+ Label label22 = new Label();
+ Label label23 = new Label();
+ methodVisitor.visitTryCatchBlock(label22, label23, label23, "java/lang/Exception");
+ methodVisitor.visitLabel(label4);
+ methodVisitor.visitLineNumber(113, label4);
+ methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ Label label24 = new Label();
+ methodVisitor.visitLabel(label24);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitLineNumber(114, label0);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("i1");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label25 = new Label();
+ methodVisitor.visitLabel(label25);
+ methodVisitor.visitLineNumber(115, label25);
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label1);
+ methodVisitor.visitLineNumber(113, label1);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 3,
+ new Object[] {"java/lang/String", "java/util/jar/JarFile", "java/lang/Throwable"},
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label3);
+ methodVisitor.visitLineNumber(116, label3);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 4);
+ methodVisitor.visitLabel(label2);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/Iface",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ true);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label5);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 1,
+ new Object[] {"java/lang/String"},
+ 1,
+ new Object[] {"java/lang/Exception"});
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ Label label26 = new Label();
+ methodVisitor.visitLabel(label26);
+ methodVisitor.visitLineNumber(117, label26);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("i2");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label10);
+ methodVisitor.visitLineNumber(119, label10);
+ methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ Label label27 = new Label();
+ methodVisitor.visitLabel(label27);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitLabel(label6);
+ methodVisitor.visitLineNumber(120, label6);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("i3");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label28 = new Label();
+ methodVisitor.visitLabel(label28);
+ methodVisitor.visitLineNumber(121, label28);
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label7);
+ methodVisitor.visitLineNumber(119, label7);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 3,
+ new Object[] {"java/lang/String", "java/util/jar/JarFile", "java/lang/Throwable"},
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label9);
+ methodVisitor.visitLineNumber(122, label9);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 5);
+ methodVisitor.visitLabel(label8);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/Iface",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ true);
+ methodVisitor.visitVarInsn(ALOAD, 5);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label11);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 1,
+ new Object[] {"java/lang/String"},
+ 1,
+ new Object[] {"java/lang/Exception"});
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ Label label29 = new Label();
+ methodVisitor.visitLabel(label29);
+ methodVisitor.visitLineNumber(123, label29);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("i4");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label16);
+ methodVisitor.visitLineNumber(125, label16);
+ methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ Label label30 = new Label();
+ methodVisitor.visitLabel(label30);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitLabel(label12);
+ methodVisitor.visitLineNumber(126, label12);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("i5");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label31 = new Label();
+ methodVisitor.visitLabel(label31);
+ methodVisitor.visitLineNumber(127, label31);
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label13);
+ methodVisitor.visitLineNumber(125, label13);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 3,
+ new Object[] {"java/lang/String", "java/util/jar/JarFile", "java/lang/Throwable"},
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label15);
+ methodVisitor.visitLineNumber(128, label15);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 6);
+ methodVisitor.visitLabel(label14);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/Iface",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ true);
+ methodVisitor.visitVarInsn(ALOAD, 6);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label17);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 1,
+ new Object[] {"java/lang/String"},
+ 1,
+ new Object[] {"java/lang/Exception"});
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ Label label32 = new Label();
+ methodVisitor.visitLabel(label32);
+ methodVisitor.visitLineNumber(129, label32);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("i6");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label22);
+ methodVisitor.visitLineNumber(131, label22);
+ methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ Label label33 = new Label();
+ methodVisitor.visitLabel(label33);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitLabel(label18);
+ methodVisitor.visitLineNumber(132, label18);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("i7");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label34 = new Label();
+ methodVisitor.visitLabel(label34);
+ methodVisitor.visitLineNumber(133, label34);
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label19);
+ methodVisitor.visitLineNumber(131, label19);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 3,
+ new Object[] {"java/lang/String", "java/util/jar/JarFile", "java/lang/Throwable"},
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label21);
+ methodVisitor.visitLineNumber(134, label21);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 7);
+ methodVisitor.visitLabel(label20);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/Iface",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ true);
+ methodVisitor.visitVarInsn(ALOAD, 7);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label23);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 1,
+ new Object[] {"java/lang/String"},
+ 1,
+ new Object[] {"java/lang/Exception"});
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ Label label35 = new Label();
+ methodVisitor.visitLabel(label35);
+ methodVisitor.visitLineNumber(135, label35);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("i8");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label36 = new Label();
+ methodVisitor.visitLabel(label36);
+ methodVisitor.visitLineNumber(137, label36);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("i99");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label37 = new Label();
+ methodVisitor.visitLabel(label37);
+ methodVisitor.visitLineNumber(138, label37);
+ methodVisitor.visitInsn(RETURN);
+ Label label38 = new Label();
+ methodVisitor.visitLabel(label38);
+ methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label24, label5, 1);
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label26, label10, 1);
+ methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label27, label11, 1);
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label29, label16, 1);
+ methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label30, label17, 1);
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label32, label22, 1);
+ methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label33, label23, 1);
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label35, label36, 1);
+ methodVisitor.visitLocalVariable("arg", "Ljava/lang/String;", null, label4, label38, 0);
+ methodVisitor.visitMaxs(3, 8);
+ methodVisitor.visitEnd();
+ }
+ {
+ methodVisitor =
+ classWriter.visitMethod(
+ ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC,
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ null,
+ null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ Label label1 = new Label();
+ Label label2 = new Label();
+ methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
+ Label label3 = new Label();
+ methodVisitor.visitLabel(label3);
+ methodVisitor.visitLineNumber(84, label3);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ Label label4 = new Label();
+ methodVisitor.visitJumpInsn(IFNULL, label4);
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKEINTERFACE, "java/lang/AutoCloseable", "close", "()V", true);
+ methodVisitor.visitLabel(label1);
+ Label label5 = new Label();
+ methodVisitor.visitJumpInsn(GOTO, label5);
+ methodVisitor.visitLabel(label2);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/lang/Throwable", "addSuppressed", "(Ljava/lang/Throwable;)V", false);
+ methodVisitor.visitJumpInsn(GOTO, label5);
+ methodVisitor.visitLabel(label4);
+ methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKEINTERFACE, "java/lang/AutoCloseable", "close", "()V", true);
+ methodVisitor.visitLabel(label5);
+ methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+ methodVisitor.visitInsn(RETURN);
+ Label label6 = new Label();
+ methodVisitor.visitLabel(label6);
+ methodVisitor.visitLocalVariable("x0", "Ljava/lang/Throwable;", null, label3, label6, 0);
+ methodVisitor.visitLocalVariable("x1", "Ljava/lang/AutoCloseable;", null, label3, label6, 1);
+ methodVisitor.visitMaxs(2, 3);
+ methodVisitor.visitEnd();
+ }
+ classWriter.visitEnd();
+
+ return classWriter.toByteArray();
+ }
+}
diff --git a/src/test/examplesJava9/twr/twrcloseresource/asm/TwrCloseResourceTestDump.java b/src/test/examplesJava9/twr/twrcloseresource/asm/TwrCloseResourceTestDump.java
new file mode 100644
index 0000000..cdf4cba
--- /dev/null
+++ b/src/test/examplesJava9/twr/twrcloseresource/asm/TwrCloseResourceTestDump.java
@@ -0,0 +1,1042 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Dump of class file for twr.twrcloseresource.TwrCloseResourceTest
+ *
+ * <p>*
+ *
+ * <p>This is used to get the JDK-9 javac code with `$closeResource`, which `-target 9` for later
+ * javac versions does not produce.
+ *
+ * <p>package twr.twrcloseresource;
+ *
+ * <p>import java.util.jar.JarFile;
+ *
+ * <p>public class TwrCloseResourceTest implements Iface { public static void main(String[] args) {
+ * TwrCloseResourceTest o = new TwrCloseResourceTest(); o.foo(args[0]); o.iFoo(args[0]);
+ * bar(args[0]); Iface.iBar(args[0]); }
+ *
+ * <p>synchronized void foo(String arg) { try { try (JarFile a = new JarFile(arg)) {
+ * System.out.println("A"); } catch (Exception e) { System.out.println("B"); try (JarFile a = new
+ * JarFile(arg)) { System.out.println("C"); } System.out.println("D"); throw new RuntimeException();
+ * } try (JarFile a = new JarFile(arg)) { System.out.println("E"); } } catch (Exception e) {
+ * System.out.println("F"); } try (JarFile a = new JarFile(arg)) { System.out.println("G"); try
+ * (JarFile b = new JarFile(arg)) { System.out.println("H"); } finally { System.out.println("I");
+ * throw new RuntimeException(); } } catch (Exception e) { System.out.println("J"); }
+ * System.out.println("K"); }
+ *
+ * <p>static synchronized void bar(String arg) { try (JarFile a = new JarFile(arg)) {
+ * System.out.println("1"); throw new RuntimeException(); } catch (Exception e) {
+ * System.out.println("2"); } try (JarFile a = new JarFile(arg)) { System.out.println("3"); throw
+ * new RuntimeException(); } catch (Exception e) { System.out.println("4"); } try (JarFile a = new
+ * JarFile(arg)) { System.out.println("5"); throw new RuntimeException(); } catch (Exception e) {
+ * System.out.println("6"); } try (JarFile a = new JarFile(arg)) { System.out.println("7"); throw
+ * new RuntimeException(); } catch (Exception e) { System.out.println("8"); }
+ * System.out.println("99"); } }
+ *
+ * <p>interface Iface { default void iFoo(String arg) { try { try (JarFile a = new JarFile(arg)) {
+ * System.out.println("iA"); } catch (Exception e) { System.out.println("iB"); try (JarFile a = new
+ * JarFile(arg)) { System.out.println("iC"); } System.out.println("iD"); throw new
+ * RuntimeException(); } try (JarFile a = new JarFile(arg)) { System.out.println("iE"); } } catch
+ * (Exception e) { System.out.println("iF"); } try (JarFile a = new JarFile(arg)) {
+ * System.out.println("iG"); try (JarFile b = new JarFile(arg)) { System.out.println("iH"); }
+ * finally { System.out.println("iI"); throw new RuntimeException(); } } catch (Exception e) {
+ * System.out.println("iJ"); } System.out.println("iK"); }
+ *
+ * <p>static void iBar(String arg) { try (JarFile a = new JarFile(arg)) { System.out.println("i1");
+ * throw new RuntimeException(); } catch (Exception e) { System.out.println("i2"); } try (JarFile a
+ * = new JarFile(arg)) { System.out.println("i3"); throw new RuntimeException(); } catch (Exception
+ * e) { System.out.println("i4"); } try (JarFile a = new JarFile(arg)) { System.out.println("i5");
+ * throw new RuntimeException(); } catch (Exception e) { System.out.println("i6"); } try (JarFile a
+ * = new JarFile(arg)) { System.out.println("i7"); throw new RuntimeException(); } catch (Exception
+ * e) { System.out.println("i8"); } System.out.println("i99"); } }
+ */
+package twr.twrcloseresource.asm;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.RecordComponentVisitor;
+
+public class TwrCloseResourceTestDump implements Opcodes {
+
+ public static byte[] dump() throws Exception {
+
+ ClassWriter classWriter = new ClassWriter(0);
+ FieldVisitor fieldVisitor;
+ RecordComponentVisitor recordComponentVisitor;
+ MethodVisitor methodVisitor;
+ AnnotationVisitor annotationVisitor0;
+
+ classWriter.visit(
+ V9,
+ ACC_PUBLIC | ACC_SUPER,
+ "twr/twrcloseresource/TwrCloseResourceTest",
+ null,
+ "java/lang/Object",
+ new String[] {"twr/twrcloseresource/Iface"});
+
+ classWriter.visitSource("TwrCloseResourceDuplication$BarDump.java", null);
+
+ {
+ methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitLineNumber(9, label0);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
+ methodVisitor.visitInsn(RETURN);
+ Label label1 = new Label();
+ methodVisitor.visitLabel(label1);
+ methodVisitor.visitLocalVariable(
+ "this", "Ltwrcloseresource/TwrCloseResourceTest;", null, label0, label1, 0);
+ methodVisitor.visitMaxs(1, 1);
+ methodVisitor.visitEnd();
+ }
+ {
+ methodVisitor =
+ classWriter.visitMethod(
+ ACC_PUBLIC | ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitLineNumber(11, label0);
+ methodVisitor.visitTypeInsn(NEW, "twr/twrcloseresource/TwrCloseResourceTest");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "twr/twrcloseresource/TwrCloseResourceTest", "<init>", "()V", false);
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ Label label1 = new Label();
+ methodVisitor.visitLabel(label1);
+ methodVisitor.visitLineNumber(12, label1);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitInsn(AALOAD);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "twr/twrcloseresource/TwrCloseResourceTest",
+ "foo",
+ "(Ljava/lang/String;)V",
+ false);
+ Label label2 = new Label();
+ methodVisitor.visitLabel(label2);
+ methodVisitor.visitLineNumber(13, label2);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitInsn(AALOAD);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "twr/twrcloseresource/TwrCloseResourceTest",
+ "iFoo",
+ "(Ljava/lang/String;)V",
+ false);
+ Label label3 = new Label();
+ methodVisitor.visitLabel(label3);
+ methodVisitor.visitLineNumber(14, label3);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitInsn(AALOAD);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/TwrCloseResourceTest",
+ "bar",
+ "(Ljava/lang/String;)V",
+ false);
+ Label label4 = new Label();
+ methodVisitor.visitLabel(label4);
+ methodVisitor.visitLineNumber(15, label4);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitInsn(AALOAD);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC, "twr/twrcloseresource/Iface", "iBar", "(Ljava/lang/String;)V", true);
+ Label label5 = new Label();
+ methodVisitor.visitLabel(label5);
+ methodVisitor.visitLineNumber(16, label5);
+ methodVisitor.visitInsn(RETURN);
+ Label label6 = new Label();
+ methodVisitor.visitLabel(label6);
+ methodVisitor.visitLocalVariable("args", "[Ljava/lang/String;", null, label0, label6, 0);
+ methodVisitor.visitLocalVariable(
+ "o", "Ltwrcloseresource/TwrCloseResourceTest;", null, label1, label6, 1);
+ methodVisitor.visitMaxs(3, 2);
+ methodVisitor.visitEnd();
+ }
+ {
+ methodVisitor =
+ classWriter.visitMethod(ACC_SYNCHRONIZED, "foo", "(Ljava/lang/String;)V", null, null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ Label label1 = new Label();
+ Label label2 = new Label();
+ methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
+ Label label3 = new Label();
+ methodVisitor.visitTryCatchBlock(label0, label1, label3, null);
+ Label label4 = new Label();
+ methodVisitor.visitTryCatchBlock(label2, label4, label3, null);
+ Label label5 = new Label();
+ Label label6 = new Label();
+ Label label7 = new Label();
+ methodVisitor.visitTryCatchBlock(label5, label6, label7, "java/lang/Exception");
+ Label label8 = new Label();
+ Label label9 = new Label();
+ Label label10 = new Label();
+ methodVisitor.visitTryCatchBlock(label8, label9, label10, "java/lang/Throwable");
+ Label label11 = new Label();
+ methodVisitor.visitTryCatchBlock(label8, label9, label11, null);
+ Label label12 = new Label();
+ methodVisitor.visitTryCatchBlock(label10, label12, label11, null);
+ Label label13 = new Label();
+ Label label14 = new Label();
+ Label label15 = new Label();
+ methodVisitor.visitTryCatchBlock(label13, label14, label15, "java/lang/Throwable");
+ Label label16 = new Label();
+ methodVisitor.visitTryCatchBlock(label13, label14, label16, null);
+ Label label17 = new Label();
+ methodVisitor.visitTryCatchBlock(label15, label17, label16, null);
+ Label label18 = new Label();
+ Label label19 = new Label();
+ methodVisitor.visitTryCatchBlock(label5, label18, label19, "java/lang/Exception");
+ Label label20 = new Label();
+ Label label21 = new Label();
+ Label label22 = new Label();
+ methodVisitor.visitTryCatchBlock(label20, label21, label22, "java/lang/Throwable");
+ Label label23 = new Label();
+ methodVisitor.visitTryCatchBlock(label20, label21, label23, null);
+ Label label24 = new Label();
+ methodVisitor.visitTryCatchBlock(label22, label24, label23, null);
+ Label label25 = new Label();
+ Label label26 = new Label();
+ Label label27 = new Label();
+ methodVisitor.visitTryCatchBlock(label25, label26, label27, null);
+ Label label28 = new Label();
+ methodVisitor.visitTryCatchBlock(label27, label28, label27, null);
+ Label label29 = new Label();
+ Label label30 = new Label();
+ methodVisitor.visitTryCatchBlock(label29, label30, label30, "java/lang/Throwable");
+ Label label31 = new Label();
+ Label label32 = new Label();
+ methodVisitor.visitTryCatchBlock(label29, label31, label32, null);
+ Label label33 = new Label();
+ Label label34 = new Label();
+ methodVisitor.visitTryCatchBlock(label33, label34, label34, "java/lang/Exception");
+ methodVisitor.visitLabel(label5);
+ methodVisitor.visitLineNumber(20, label5);
+ methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label35 = new Label();
+ methodVisitor.visitLabel(label35);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitLineNumber(21, label0);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("A");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label1);
+ methodVisitor.visitLineNumber(22, label1);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/TwrCloseResourceTest",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ methodVisitor.visitJumpInsn(GOTO, label6);
+ methodVisitor.visitLabel(label2);
+ methodVisitor.visitLineNumber(20, label2);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 4,
+ new Object[] {
+ "twr/twrcloseresource/TwrCloseResourceTest",
+ "java/lang/String",
+ "java/util/jar/JarFile",
+ "java/lang/Throwable"
+ },
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 4);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label3);
+ methodVisitor.visitLineNumber(22, label3);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 5);
+ methodVisitor.visitLabel(label4);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/TwrCloseResourceTest",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ methodVisitor.visitVarInsn(ALOAD, 5);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label6);
+ methodVisitor.visitLineNumber(29, label6);
+ methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+ Label label36 = new Label();
+ methodVisitor.visitJumpInsn(GOTO, label36);
+ methodVisitor.visitLabel(label7);
+ methodVisitor.visitLineNumber(22, label7);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Exception"});
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label37 = new Label();
+ methodVisitor.visitLabel(label37);
+ methodVisitor.visitLineNumber(23, label37);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("B");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label38 = new Label();
+ methodVisitor.visitLabel(label38);
+ methodVisitor.visitLineNumber(24, label38);
+ methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ Label label39 = new Label();
+ methodVisitor.visitLabel(label39);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 4);
+ methodVisitor.visitLabel(label8);
+ methodVisitor.visitLineNumber(25, label8);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("C");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label9);
+ methodVisitor.visitLineNumber(26, label9);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/TwrCloseResourceTest",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ Label label40 = new Label();
+ methodVisitor.visitJumpInsn(GOTO, label40);
+ methodVisitor.visitLabel(label10);
+ methodVisitor.visitLineNumber(24, label10);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 5,
+ new Object[] {
+ "twr/twrcloseresource/TwrCloseResourceTest",
+ "java/lang/String",
+ "java/lang/Exception",
+ "java/util/jar/JarFile",
+ "java/lang/Throwable"
+ },
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 5);
+ methodVisitor.visitVarInsn(ALOAD, 5);
+ methodVisitor.visitVarInsn(ASTORE, 4);
+ methodVisitor.visitVarInsn(ALOAD, 5);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label11);
+ methodVisitor.visitLineNumber(26, label11);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 6);
+ methodVisitor.visitLabel(label12);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/TwrCloseResourceTest",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ methodVisitor.visitVarInsn(ALOAD, 6);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label40);
+ methodVisitor.visitLineNumber(27, label40);
+ methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("D");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label41 = new Label();
+ methodVisitor.visitLabel(label41);
+ methodVisitor.visitLineNumber(28, label41);
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label36);
+ methodVisitor.visitLineNumber(30, label36);
+ methodVisitor.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
+ methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label42 = new Label();
+ methodVisitor.visitLabel(label42);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitLabel(label13);
+ methodVisitor.visitLineNumber(31, label13);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("E");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label14);
+ methodVisitor.visitLineNumber(32, label14);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/TwrCloseResourceTest",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ methodVisitor.visitJumpInsn(GOTO, label18);
+ methodVisitor.visitLabel(label15);
+ methodVisitor.visitLineNumber(30, label15);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 4,
+ new Object[] {
+ "twr/twrcloseresource/TwrCloseResourceTest",
+ "java/lang/String",
+ "java/util/jar/JarFile",
+ "java/lang/Throwable"
+ },
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 4);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label16);
+ methodVisitor.visitLineNumber(32, label16);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 7);
+ methodVisitor.visitLabel(label17);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/TwrCloseResourceTest",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ methodVisitor.visitVarInsn(ALOAD, 7);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label18);
+ methodVisitor.visitLineNumber(35, label18);
+ methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+ methodVisitor.visitJumpInsn(GOTO, label33);
+ methodVisitor.visitLabel(label19);
+ methodVisitor.visitLineNumber(33, label19);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Exception"});
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label43 = new Label();
+ methodVisitor.visitLabel(label43);
+ methodVisitor.visitLineNumber(34, label43);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("F");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label33);
+ methodVisitor.visitLineNumber(36, label33);
+ methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+ methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label44 = new Label();
+ methodVisitor.visitLabel(label44);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitLabel(label29);
+ methodVisitor.visitLineNumber(37, label29);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("G");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label25);
+ methodVisitor.visitLineNumber(38, label25);
+ methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ASTORE, 4);
+ Label label45 = new Label();
+ methodVisitor.visitLabel(label45);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 5);
+ methodVisitor.visitLabel(label20);
+ methodVisitor.visitLineNumber(39, label20);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("H");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label21);
+ methodVisitor.visitLineNumber(40, label21);
+ methodVisitor.visitVarInsn(ALOAD, 5);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/TwrCloseResourceTest",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ methodVisitor.visitJumpInsn(GOTO, label26);
+ methodVisitor.visitLabel(label22);
+ methodVisitor.visitLineNumber(38, label22);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 6,
+ new Object[] {
+ "twr/twrcloseresource/TwrCloseResourceTest",
+ "java/lang/String",
+ "java/util/jar/JarFile",
+ "java/lang/Throwable",
+ "java/util/jar/JarFile",
+ "java/lang/Throwable"
+ },
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 6);
+ methodVisitor.visitVarInsn(ALOAD, 6);
+ methodVisitor.visitVarInsn(ASTORE, 5);
+ methodVisitor.visitVarInsn(ALOAD, 6);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label23);
+ methodVisitor.visitLineNumber(40, label23);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 8);
+ methodVisitor.visitLabel(label24);
+ methodVisitor.visitVarInsn(ALOAD, 5);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/TwrCloseResourceTest",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ methodVisitor.visitVarInsn(ALOAD, 8);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label26);
+ methodVisitor.visitLineNumber(41, label26);
+ methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("I");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label46 = new Label();
+ methodVisitor.visitLabel(label46);
+ methodVisitor.visitLineNumber(42, label46);
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label27);
+ methodVisitor.visitLineNumber(41, label27);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 9);
+ methodVisitor.visitLabel(label28);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("I");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label47 = new Label();
+ methodVisitor.visitLabel(label47);
+ methodVisitor.visitLineNumber(42, label47);
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label30);
+ methodVisitor.visitLineNumber(36, label30);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 4);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label32);
+ methodVisitor.visitLineNumber(44, label32);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 10);
+ methodVisitor.visitLabel(label31);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/TwrCloseResourceTest",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ methodVisitor.visitVarInsn(ALOAD, 10);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label34);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 2,
+ new Object[] {"twr/twrcloseresource/TwrCloseResourceTest", "java/lang/String"},
+ 1,
+ new Object[] {"java/lang/Exception"});
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label48 = new Label();
+ methodVisitor.visitLabel(label48);
+ methodVisitor.visitLineNumber(45, label48);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("J");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label49 = new Label();
+ methodVisitor.visitLabel(label49);
+ methodVisitor.visitLineNumber(47, label49);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("K");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label50 = new Label();
+ methodVisitor.visitLabel(label50);
+ methodVisitor.visitLineNumber(48, label50);
+ methodVisitor.visitInsn(RETURN);
+ Label label51 = new Label();
+ methodVisitor.visitLabel(label51);
+ methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label35, label6, 2);
+ methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label39, label40, 3);
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label37, label36, 2);
+ methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label42, label18, 2);
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label43, label33, 2);
+ methodVisitor.visitLocalVariable("b", "Ljava/util/jar/JarFile;", null, label45, label26, 4);
+ methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label44, label34, 2);
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label48, label49, 2);
+ methodVisitor.visitLocalVariable(
+ "this", "Ltwrcloseresource/TwrCloseResourceTest;", null, label5, label51, 0);
+ methodVisitor.visitLocalVariable("arg", "Ljava/lang/String;", null, label5, label51, 1);
+ methodVisitor.visitMaxs(3, 11);
+ methodVisitor.visitEnd();
+ }
+ {
+ methodVisitor =
+ classWriter.visitMethod(
+ ACC_STATIC | ACC_SYNCHRONIZED, "bar", "(Ljava/lang/String;)V", null, null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ Label label1 = new Label();
+ methodVisitor.visitTryCatchBlock(label0, label1, label1, "java/lang/Throwable");
+ Label label2 = new Label();
+ Label label3 = new Label();
+ methodVisitor.visitTryCatchBlock(label0, label2, label3, null);
+ Label label4 = new Label();
+ Label label5 = new Label();
+ methodVisitor.visitTryCatchBlock(label4, label5, label5, "java/lang/Exception");
+ Label label6 = new Label();
+ Label label7 = new Label();
+ methodVisitor.visitTryCatchBlock(label6, label7, label7, "java/lang/Throwable");
+ Label label8 = new Label();
+ Label label9 = new Label();
+ methodVisitor.visitTryCatchBlock(label6, label8, label9, null);
+ Label label10 = new Label();
+ Label label11 = new Label();
+ methodVisitor.visitTryCatchBlock(label10, label11, label11, "java/lang/Exception");
+ Label label12 = new Label();
+ Label label13 = new Label();
+ methodVisitor.visitTryCatchBlock(label12, label13, label13, "java/lang/Throwable");
+ Label label14 = new Label();
+ Label label15 = new Label();
+ methodVisitor.visitTryCatchBlock(label12, label14, label15, null);
+ Label label16 = new Label();
+ Label label17 = new Label();
+ methodVisitor.visitTryCatchBlock(label16, label17, label17, "java/lang/Exception");
+ Label label18 = new Label();
+ Label label19 = new Label();
+ methodVisitor.visitTryCatchBlock(label18, label19, label19, "java/lang/Throwable");
+ Label label20 = new Label();
+ Label label21 = new Label();
+ methodVisitor.visitTryCatchBlock(label18, label20, label21, null);
+ Label label22 = new Label();
+ Label label23 = new Label();
+ methodVisitor.visitTryCatchBlock(label22, label23, label23, "java/lang/Exception");
+ methodVisitor.visitLabel(label4);
+ methodVisitor.visitLineNumber(51, label4);
+ methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ Label label24 = new Label();
+ methodVisitor.visitLabel(label24);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitLineNumber(52, label0);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("1");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label25 = new Label();
+ methodVisitor.visitLabel(label25);
+ methodVisitor.visitLineNumber(53, label25);
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label1);
+ methodVisitor.visitLineNumber(51, label1);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 3,
+ new Object[] {"java/lang/String", "java/util/jar/JarFile", "java/lang/Throwable"},
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label3);
+ methodVisitor.visitLineNumber(54, label3);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 4);
+ methodVisitor.visitLabel(label2);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/TwrCloseResourceTest",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label5);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 1,
+ new Object[] {"java/lang/String"},
+ 1,
+ new Object[] {"java/lang/Exception"});
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ Label label26 = new Label();
+ methodVisitor.visitLabel(label26);
+ methodVisitor.visitLineNumber(55, label26);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("2");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label10);
+ methodVisitor.visitLineNumber(57, label10);
+ methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ Label label27 = new Label();
+ methodVisitor.visitLabel(label27);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitLabel(label6);
+ methodVisitor.visitLineNumber(58, label6);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("3");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label28 = new Label();
+ methodVisitor.visitLabel(label28);
+ methodVisitor.visitLineNumber(59, label28);
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label7);
+ methodVisitor.visitLineNumber(57, label7);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 3,
+ new Object[] {"java/lang/String", "java/util/jar/JarFile", "java/lang/Throwable"},
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label9);
+ methodVisitor.visitLineNumber(60, label9);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 5);
+ methodVisitor.visitLabel(label8);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/TwrCloseResourceTest",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ methodVisitor.visitVarInsn(ALOAD, 5);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label11);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 1,
+ new Object[] {"java/lang/String"},
+ 1,
+ new Object[] {"java/lang/Exception"});
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ Label label29 = new Label();
+ methodVisitor.visitLabel(label29);
+ methodVisitor.visitLineNumber(61, label29);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("4");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label16);
+ methodVisitor.visitLineNumber(63, label16);
+ methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ Label label30 = new Label();
+ methodVisitor.visitLabel(label30);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitLabel(label12);
+ methodVisitor.visitLineNumber(64, label12);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("5");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label31 = new Label();
+ methodVisitor.visitLabel(label31);
+ methodVisitor.visitLineNumber(65, label31);
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label13);
+ methodVisitor.visitLineNumber(63, label13);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 3,
+ new Object[] {"java/lang/String", "java/util/jar/JarFile", "java/lang/Throwable"},
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label15);
+ methodVisitor.visitLineNumber(66, label15);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 6);
+ methodVisitor.visitLabel(label14);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/TwrCloseResourceTest",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ methodVisitor.visitVarInsn(ALOAD, 6);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label17);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 1,
+ new Object[] {"java/lang/String"},
+ 1,
+ new Object[] {"java/lang/Exception"});
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ Label label32 = new Label();
+ methodVisitor.visitLabel(label32);
+ methodVisitor.visitLineNumber(67, label32);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("6");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label22);
+ methodVisitor.visitLineNumber(69, label22);
+ methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ Label label33 = new Label();
+ methodVisitor.visitLabel(label33);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitLabel(label18);
+ methodVisitor.visitLineNumber(70, label18);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("7");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label34 = new Label();
+ methodVisitor.visitLabel(label34);
+ methodVisitor.visitLineNumber(71, label34);
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label19);
+ methodVisitor.visitLineNumber(69, label19);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 3,
+ new Object[] {"java/lang/String", "java/util/jar/JarFile", "java/lang/Throwable"},
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label21);
+ methodVisitor.visitLineNumber(72, label21);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 7);
+ methodVisitor.visitLabel(label20);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresource/TwrCloseResourceTest",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ methodVisitor.visitVarInsn(ALOAD, 7);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label23);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 1,
+ new Object[] {"java/lang/String"},
+ 1,
+ new Object[] {"java/lang/Exception"});
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ Label label35 = new Label();
+ methodVisitor.visitLabel(label35);
+ methodVisitor.visitLineNumber(73, label35);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("8");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label36 = new Label();
+ methodVisitor.visitLabel(label36);
+ methodVisitor.visitLineNumber(75, label36);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("99");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label37 = new Label();
+ methodVisitor.visitLabel(label37);
+ methodVisitor.visitLineNumber(76, label37);
+ methodVisitor.visitInsn(RETURN);
+ Label label38 = new Label();
+ methodVisitor.visitLabel(label38);
+ methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label24, label5, 1);
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label26, label10, 1);
+ methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label27, label11, 1);
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label29, label16, 1);
+ methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label30, label17, 1);
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label32, label22, 1);
+ methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label33, label23, 1);
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label35, label36, 1);
+ methodVisitor.visitLocalVariable("arg", "Ljava/lang/String;", null, label4, label38, 0);
+ methodVisitor.visitMaxs(3, 8);
+ methodVisitor.visitEnd();
+ }
+ {
+ methodVisitor =
+ classWriter.visitMethod(
+ ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC,
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ null,
+ null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ Label label1 = new Label();
+ Label label2 = new Label();
+ methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
+ Label label3 = new Label();
+ methodVisitor.visitLabel(label3);
+ methodVisitor.visitLineNumber(22, label3);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ Label label4 = new Label();
+ methodVisitor.visitJumpInsn(IFNULL, label4);
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKEINTERFACE, "java/lang/AutoCloseable", "close", "()V", true);
+ methodVisitor.visitLabel(label1);
+ Label label5 = new Label();
+ methodVisitor.visitJumpInsn(GOTO, label5);
+ methodVisitor.visitLabel(label2);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/lang/Throwable", "addSuppressed", "(Ljava/lang/Throwable;)V", false);
+ methodVisitor.visitJumpInsn(GOTO, label5);
+ methodVisitor.visitLabel(label4);
+ methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKEINTERFACE, "java/lang/AutoCloseable", "close", "()V", true);
+ methodVisitor.visitLabel(label5);
+ methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+ methodVisitor.visitInsn(RETURN);
+ Label label6 = new Label();
+ methodVisitor.visitLabel(label6);
+ methodVisitor.visitLocalVariable("x0", "Ljava/lang/Throwable;", null, label3, label6, 0);
+ methodVisitor.visitLocalVariable("x1", "Ljava/lang/AutoCloseable;", null, label3, label6, 1);
+ methodVisitor.visitMaxs(2, 3);
+ methodVisitor.visitEnd();
+ }
+ classWriter.visitEnd();
+
+ return classWriter.toByteArray();
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/TwrCloseResourceDuplicationProfileRewritingTest.java b/src/test/examplesJava9/twr/twrcloseresourceduplication/TwrCloseResourceDuplicationProfileRewritingTest.java
similarity index 84%
rename from src/test/java/com/android/tools/r8/profile/art/completeness/TwrCloseResourceDuplicationProfileRewritingTest.java
rename to src/test/examplesJava9/twr/twrcloseresourceduplication/TwrCloseResourceDuplicationProfileRewritingTest.java
index 3bb5e4c..4cad84a 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/TwrCloseResourceDuplicationProfileRewritingTest.java
+++ b/src/test/examplesJava9/twr/twrcloseresourceduplication/TwrCloseResourceDuplicationProfileRewritingTest.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.profile.art.completeness;
+package twr.twrcloseresourceduplication;
import static com.android.tools.r8.desugar.LibraryFilesHelper.getJdk11LibraryFiles;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
@@ -12,8 +12,6 @@
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.desugar.twr.TwrCloseResourceDuplicationTest;
-import com.android.tools.r8.examples.JavaExampleClassProxy;
import com.android.tools.r8.profile.art.model.ExternalArtProfile;
import com.android.tools.r8.profile.art.utils.ArtProfileInspector;
import com.android.tools.r8.references.Reference;
@@ -37,7 +35,7 @@
@Test
public void testD8ProfileRewriting() throws Exception {
testForD8(parameters.getBackend())
- .addProgramFiles(TwrCloseResourceDuplicationTest.getProgramInputs())
+ .addProgramClassFileData(TwrCloseResourceDuplicationTest.getProgramInputs())
.addArtProfileForRewriting(getArtProfile())
.addOptionsModification(options -> options.testing.enableSyntheticSharing = false)
.applyIf(
@@ -52,7 +50,7 @@
.setMinApi(parameters)
.compile()
.inspectResidualArtProfile(this::inspectD8)
- .run(parameters.getRuntime(), MAIN.typeName(), getZipFile())
+ .run(parameters.getRuntime(), MAIN, getZipFile())
.assertSuccessWithOutput(TwrCloseResourceDuplicationTest.EXPECTED);
}
@@ -60,9 +58,9 @@
public void testR8ProfileRewriting() throws Exception {
parameters.assumeR8TestParameters();
testForR8(parameters.getBackend())
- .addProgramFiles(TwrCloseResourceDuplicationTest.getProgramInputs())
- .addKeepMainRule(MAIN.typeName())
- .addKeepClassAndMembersRules(FOO.typeName(), BAR.typeName())
+ .addProgramClassFileData(TwrCloseResourceDuplicationTest.getProgramInputs())
+ .addKeepMainRule(MAIN)
+ .addKeepClassAndMembersRules(FOO, BAR)
.addArtProfileForRewriting(getArtProfile())
.addOptionsModification(InlinerOptions::disableInlining)
.addOptionsModification(options -> options.testing.enableSyntheticSharing = false)
@@ -81,7 +79,7 @@
.setMinApi(parameters)
.compile()
.inspectResidualArtProfile(this::inspectR8)
- .run(parameters.getRuntime(), MAIN.typeName(), getZipFile())
+ .run(parameters.getRuntime(), MAIN, getZipFile())
.assertSuccessWithOutput(TwrCloseResourceDuplicationTest.EXPECTED);
}
@@ -93,24 +91,30 @@
return ExternalArtProfile.builder()
.addMethodRule(
Reference.method(
- FOO.getClassReference(),
+ Reference.classFromTypeName(FOO),
"foo",
ImmutableList.of(Reference.classFromClass(String.class)),
null))
.addMethodRule(
// NOTE: The $closeResource helper is _only_ generated by the JDK-9 compiler.
Reference.method(
- FOO.getClassReference(), "$closeResource", closeResourceFormalParameters, null))
+ Reference.classFromTypeName(FOO),
+ "$closeResource",
+ closeResourceFormalParameters,
+ null))
.addMethodRule(
Reference.method(
- BAR.getClassReference(),
+ Reference.classFromTypeName(BAR),
"bar",
ImmutableList.of(Reference.classFromClass(String.class)),
null))
.addMethodRule(
// NOTE: The $closeResource helper is _only_ generated by the JDK-9 compiler.
Reference.method(
- BAR.getClassReference(), "$closeResource", closeResourceFormalParameters, null))
+ Reference.classFromTypeName(BAR),
+ "$closeResource",
+ closeResourceFormalParameters,
+ null))
.build();
}
@@ -137,10 +141,10 @@
.allClasses()
.forEach(c -> System.out.println(c.getDexProgramClass().toSourceString()));
assertEquals(expectedClassCount, inspector.allClasses().size());
- assertThat(inspector.clazz(MAIN.typeName()), isPresent());
+ assertThat(inspector.clazz(MAIN), isPresent());
// Class Foo has two methods foo() and $closeResource().
- ClassSubject fooClassSubject = inspector.clazz(FOO.typeName());
+ ClassSubject fooClassSubject = inspector.clazz(FOO);
assertThat(fooClassSubject, isPresent());
MethodSubject fooMethodSubject = fooClassSubject.uniqueMethodWithOriginalName("foo");
@@ -151,7 +155,7 @@
assertThat(fooCloseResourceMethodSubject, isPresent());
// Class Bar has two methods bar() and $closeResource().
- ClassSubject barClassSubject = inspector.clazz(BAR.typeName());
+ ClassSubject barClassSubject = inspector.clazz(BAR);
assertThat(barClassSubject, isPresent());
MethodSubject barMethodSubject = barClassSubject.uniqueMethodWithOriginalName("bar");
@@ -170,15 +174,17 @@
barCloseResourceMethodSubject);
// There is 1 backport, 2 synthetic API outlines, and 3 twr classes for both Foo and Bar.
- for (JavaExampleClassProxy clazz : ImmutableList.of(FOO, BAR)) {
+ for (String clazz : ImmutableList.of(FOO, BAR)) {
ClassSubject syntheticApiOutlineClassSubject0 =
inspector.clazz(
- SyntheticItemsTestUtils.syntheticApiOutlineClass(clazz.getClassReference(), 0));
+ SyntheticItemsTestUtils.syntheticApiOutlineClass(
+ Reference.classFromTypeName(clazz), 0));
assertThat(syntheticApiOutlineClassSubject0, isPresentIf(hasTwrCloseResourceApiOutlines()));
ClassSubject syntheticApiOutlineClassSubject1 =
inspector.clazz(
- SyntheticItemsTestUtils.syntheticApiOutlineClass(clazz.getClassReference(), 1));
+ SyntheticItemsTestUtils.syntheticApiOutlineClass(
+ Reference.classFromTypeName(clazz), 1));
assertThat(syntheticApiOutlineClassSubject1, isPresentIf(hasTwrCloseResourceApiOutlines()));
int initialSyntheticId = hasTwrCloseResourceApiOutlines() ? 2 : 0;
@@ -186,27 +192,27 @@
ClassSubject syntheticBackportClassSubject =
inspector.clazz(
SyntheticItemsTestUtils.syntheticBackportClass(
- clazz.getClassReference(), initialSyntheticId));
+ Reference.classFromTypeName(clazz), initialSyntheticId));
assertThat(syntheticBackportClassSubject, notIf(isPresent(), hasTwrCloseResourceSupport));
ClassSubject syntheticTwrCloseResourceClassSubject3 =
inspector.clazz(
SyntheticItemsTestUtils.syntheticTwrCloseResourceClass(
- clazz.getClassReference(), initialSyntheticId + 1));
+ Reference.classFromTypeName(clazz), initialSyntheticId + 1));
assertThat(
syntheticTwrCloseResourceClassSubject3, notIf(isPresent(), hasTwrCloseResourceSupport));
ClassSubject syntheticTwrCloseResourceClassSubject4 =
inspector.clazz(
SyntheticItemsTestUtils.syntheticTwrCloseResourceClass(
- clazz.getClassReference(), initialSyntheticId + 2));
+ Reference.classFromTypeName(clazz), initialSyntheticId + 2));
assertThat(
syntheticTwrCloseResourceClassSubject4, notIf(isPresent(), hasTwrCloseResourceSupport));
ClassSubject syntheticTwrCloseResourceClassSubject5 =
inspector.clazz(
SyntheticItemsTestUtils.syntheticTwrCloseResourceClass(
- clazz.getClassReference(), initialSyntheticId + 3));
+ Reference.classFromTypeName(clazz), initialSyntheticId + 3));
assertThat(
syntheticTwrCloseResourceClassSubject5, notIf(isPresent(), hasTwrCloseResourceSupport));
diff --git a/src/test/java/com/android/tools/r8/desugar/twr/TwrCloseResourceDuplicationTest.java b/src/test/examplesJava9/twr/twrcloseresourceduplication/TwrCloseResourceDuplicationTest.java
similarity index 78%
rename from src/test/java/com/android/tools/r8/desugar/twr/TwrCloseResourceDuplicationTest.java
rename to src/test/examplesJava9/twr/twrcloseresourceduplication/TwrCloseResourceDuplicationTest.java
index dbea1507..930ae37 100644
--- a/src/test/java/com/android/tools/r8/desugar/twr/TwrCloseResourceDuplicationTest.java
+++ b/src/test/examplesJava9/twr/twrcloseresourceduplication/TwrCloseResourceDuplicationTest.java
@@ -1,7 +1,7 @@
// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.desugar.twr;
+package twr.twrcloseresourceduplication;
import static org.junit.Assert.assertEquals;
@@ -10,7 +10,7 @@
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.TestRuntime.CfVm;
import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.examples.JavaExampleClassProxy;
+import com.android.tools.r8.references.Reference;
import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.StringUtils;
@@ -19,7 +19,6 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import java.io.IOException;
-import java.nio.file.Path;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -29,18 +28,19 @@
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
+import twr.twrcloseresourceduplication.asm.TwrCloseResourceDuplication$BarDump;
+import twr.twrcloseresourceduplication.asm.TwrCloseResourceDuplication$FooDump;
+import twr.twrcloseresourceduplication.asm.TwrCloseResourceDuplicationDump;
@RunWith(Parameterized.class)
public class TwrCloseResourceDuplicationTest extends TestBase {
- private static final String PKG = "twrcloseresourceduplication";
- private static final String EXAMPLE = "examplesJava9/" + PKG;
- protected static final JavaExampleClassProxy MAIN =
- new JavaExampleClassProxy(EXAMPLE, PKG + "/TwrCloseResourceDuplication");
- protected static final JavaExampleClassProxy FOO =
- new JavaExampleClassProxy(EXAMPLE, PKG + "/TwrCloseResourceDuplication$Foo");
- protected static final JavaExampleClassProxy BAR =
- new JavaExampleClassProxy(EXAMPLE, PKG + "/TwrCloseResourceDuplication$Bar");
+ protected static final String MAIN =
+ "twr.twrcloseresourceduplication.TwrCloseResourceDuplication";
+ protected static final String FOO =
+ "twr.twrcloseresourceduplication.TwrCloseResourceDuplication$Foo";
+ protected static final String BAR =
+ "twr.twrcloseresourceduplication.TwrCloseResourceDuplication$Bar";
static final int INPUT_CLASSES = 3;
@@ -87,26 +87,29 @@
.toString();
}
- protected static List<Path> getProgramInputs() {
- return ImmutableList.of(JavaExampleClassProxy.examplesJar(EXAMPLE));
+ protected static List<byte[]> getProgramInputs() throws Exception {
+ return ImmutableList.of(
+ TwrCloseResourceDuplicationDump.dump(),
+ TwrCloseResourceDuplication$FooDump.dump(),
+ TwrCloseResourceDuplication$BarDump.dump());
}
@Test
public void testJvm() throws Exception {
parameters.assumeJvmTestParameters();
testForJvm(parameters)
- .addProgramFiles(getProgramInputs())
- .run(parameters.getRuntime(), MAIN.typeName(), getZipFile())
+ .addProgramClassFileData(getProgramInputs())
+ .run(parameters.getRuntime(), MAIN, getZipFile())
.assertSuccessWithOutput(EXPECTED);
}
@Test
public void testD8() throws Exception {
testForD8(parameters.getBackend())
- .addProgramFiles(getProgramInputs())
+ .addProgramClassFileData(getProgramInputs())
.addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.LATEST))
.setMinApi(parameters)
- .run(parameters.getRuntime(), MAIN.typeName(), getZipFile())
+ .run(parameters.getRuntime(), MAIN, getZipFile())
.assertSuccessWithOutput(EXPECTED)
.inspect(
inspector -> {
@@ -132,13 +135,13 @@
public void testR8() throws Exception {
parameters.assumeDexRuntime();
testForR8(parameters.getBackend())
- .addProgramFiles(getProgramInputs())
+ .addProgramClassFileData(getProgramInputs())
.addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.LATEST))
- .addKeepMainRule(MAIN.typeName())
- .addKeepClassAndMembersRules(FOO.typeName(), BAR.typeName())
+ .addKeepMainRule(MAIN)
+ .addKeepClassAndMembersRules(FOO, BAR)
.setMinApi(parameters)
.addDontObfuscate()
- .run(parameters.getRuntime(), MAIN.typeName(), getZipFile())
+ .run(parameters.getRuntime(), MAIN, getZipFile())
.assertSuccessWithOutput(EXPECTED)
.inspect(
inspector -> {
@@ -149,12 +152,12 @@
.collect(Collectors.toSet());
// R8 will optimize the generated methods for the two cases below where the thrown
// exception is known or not, thus the synthetic methods will be 2.
- Set<String> nonSyntheticClassOutput =
- ImmutableSet.of(FOO.typeName(), BAR.typeName(), MAIN.typeName());
+ Set<String> nonSyntheticClassOutput = ImmutableSet.of(FOO, BAR, MAIN);
if (!hasTwrCloseResourceSupport(parameters.isDexRuntime())) {
Set<String> classOutputWithSynthetics = new HashSet<>(nonSyntheticClassOutput);
classOutputWithSynthetics.add(
- SyntheticItemsTestUtils.syntheticApiOutlineClass(BAR.getClassReference(), 0)
+ SyntheticItemsTestUtils.syntheticApiOutlineClass(
+ Reference.classFromTypeName(BAR), 0)
.getTypeName());
assertEquals(classOutputWithSynthetics, foundClasses);
} else {
@@ -162,5 +165,4 @@
}
});
}
-
}
diff --git a/src/test/examplesJava9/twr/twrcloseresourceduplication/asm/TwrCloseResourceDuplication$BarDump.java b/src/test/examplesJava9/twr/twrcloseresourceduplication/asm/TwrCloseResourceDuplication$BarDump.java
new file mode 100644
index 0000000..de20665
--- /dev/null
+++ b/src/test/examplesJava9/twr/twrcloseresourceduplication/asm/TwrCloseResourceDuplication$BarDump.java
@@ -0,0 +1,410 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package twr.twrcloseresourceduplication.asm;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Handle;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.RecordComponentVisitor;
+
+public class TwrCloseResourceDuplication$BarDump implements Opcodes {
+
+ public static byte[] dump() throws Exception {
+
+ ClassWriter classWriter = new ClassWriter(0);
+ FieldVisitor fieldVisitor;
+ RecordComponentVisitor recordComponentVisitor;
+ MethodVisitor methodVisitor;
+ AnnotationVisitor annotationVisitor0;
+
+ classWriter.visit(
+ V9,
+ ACC_PUBLIC | ACC_SUPER,
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar",
+ null,
+ "java/lang/Object",
+ null);
+
+ classWriter.visitSource("TwrCloseResourceDuplication.java", null);
+
+ classWriter.visitInnerClass(
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar",
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication",
+ "Bar",
+ ACC_PUBLIC | ACC_STATIC);
+
+ classWriter.visitInnerClass(
+ "java/lang/invoke/MethodHandles$Lookup",
+ "java/lang/invoke/MethodHandles",
+ "Lookup",
+ ACC_PUBLIC | ACC_FINAL | ACC_STATIC);
+
+ {
+ methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitLineNumber(31, label0);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
+ methodVisitor.visitInsn(RETURN);
+ Label label1 = new Label();
+ methodVisitor.visitLabel(label1);
+ methodVisitor.visitLocalVariable(
+ "this",
+ "Ltwrcloseresourceduplication/TwrCloseResourceDuplication$Bar;",
+ null,
+ label0,
+ label1,
+ 0);
+ methodVisitor.visitMaxs(1, 1);
+ methodVisitor.visitEnd();
+ }
+ {
+ methodVisitor = classWriter.visitMethod(0, "bar", "(Ljava/lang/String;)V", null, null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ Label label1 = new Label();
+ Label label2 = new Label();
+ methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
+ Label label3 = new Label();
+ methodVisitor.visitTryCatchBlock(label0, label1, label3, null);
+ Label label4 = new Label();
+ methodVisitor.visitTryCatchBlock(label2, label4, label3, null);
+ Label label5 = new Label();
+ Label label6 = new Label();
+ Label label7 = new Label();
+ methodVisitor.visitTryCatchBlock(label5, label6, label7, "java/lang/Exception");
+ Label label8 = new Label();
+ methodVisitor.visitTryCatchBlock(label5, label6, label8, null);
+ Label label9 = new Label();
+ methodVisitor.visitTryCatchBlock(label7, label9, label8, null);
+ Label label10 = new Label();
+ methodVisitor.visitTryCatchBlock(label8, label10, label8, null);
+ Label label11 = new Label();
+ Label label12 = new Label();
+ methodVisitor.visitTryCatchBlock(label11, label12, label12, "java/lang/Throwable");
+ Label label13 = new Label();
+ Label label14 = new Label();
+ methodVisitor.visitTryCatchBlock(label11, label13, label14, null);
+ Label label15 = new Label();
+ Label label16 = new Label();
+ methodVisitor.visitTryCatchBlock(label15, label16, label16, "java/lang/Exception");
+ Label label17 = new Label();
+ Label label18 = new Label();
+ methodVisitor.visitTryCatchBlock(label15, label17, label18, null);
+ Label label19 = new Label();
+ methodVisitor.visitTryCatchBlock(label18, label19, label18, null);
+ methodVisitor.visitLabel(label5);
+ methodVisitor.visitLineNumber(34, label5);
+ methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label20 = new Label();
+ methodVisitor.visitLabel(label20);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitLineNumber(35, label0);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("bar opened 1");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label1);
+ methodVisitor.visitLineNumber(36, label1);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ methodVisitor.visitJumpInsn(GOTO, label6);
+ methodVisitor.visitLabel(label2);
+ methodVisitor.visitLineNumber(34, label2);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 4,
+ new Object[] {
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar",
+ "java/lang/String",
+ "java/util/jar/JarFile",
+ "java/lang/Throwable"
+ },
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 4);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label3);
+ methodVisitor.visitLineNumber(36, label3);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 5);
+ methodVisitor.visitLabel(label4);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ methodVisitor.visitVarInsn(ALOAD, 5);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label6);
+ methodVisitor.visitLineNumber(39, label6);
+ methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("bar post close 1");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label21 = new Label();
+ methodVisitor.visitLabel(label21);
+ methodVisitor.visitLineNumber(40, label21);
+ methodVisitor.visitJumpInsn(GOTO, label15);
+ methodVisitor.visitLabel(label7);
+ methodVisitor.visitLineNumber(36, label7);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Exception"});
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label22 = new Label();
+ methodVisitor.visitLabel(label22);
+ methodVisitor.visitLineNumber(37, label22);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/lang/Class", "getSimpleName", "()Ljava/lang/String;", false);
+ methodVisitor.visitInvokeDynamicInsn(
+ "makeConcatWithConstants",
+ "(Ljava/lang/String;)Ljava/lang/String;",
+ new Handle(
+ Opcodes.H_INVOKESTATIC,
+ "java/lang/invoke/StringConcatFactory",
+ "makeConcatWithConstants",
+ "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;",
+ false),
+ new Object[] {"bar caught from 1: \u0001"});
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label9);
+ methodVisitor.visitLineNumber(39, label9);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("bar post close 1");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label23 = new Label();
+ methodVisitor.visitLabel(label23);
+ methodVisitor.visitLineNumber(40, label23);
+ methodVisitor.visitJumpInsn(GOTO, label15);
+ methodVisitor.visitLabel(label8);
+ methodVisitor.visitLineNumber(39, label8);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 6);
+ methodVisitor.visitLabel(label10);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("bar post close 1");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ALOAD, 6);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label15);
+ methodVisitor.visitLineNumber(41, label15);
+ methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+ methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label24 = new Label();
+ methodVisitor.visitLabel(label24);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitLabel(label11);
+ methodVisitor.visitLineNumber(42, label11);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("bar opened 2");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label25 = new Label();
+ methodVisitor.visitLabel(label25);
+ methodVisitor.visitLineNumber(43, label25);
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label12);
+ methodVisitor.visitLineNumber(41, label12);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 4,
+ new Object[] {
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar",
+ "java/lang/String",
+ "java/util/jar/JarFile",
+ "java/lang/Throwable"
+ },
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 4);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label14);
+ methodVisitor.visitLineNumber(44, label14);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 7);
+ methodVisitor.visitLabel(label13);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ methodVisitor.visitVarInsn(ALOAD, 7);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label16);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 2,
+ new Object[] {
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar", "java/lang/String"
+ },
+ 1,
+ new Object[] {"java/lang/Exception"});
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label26 = new Label();
+ methodVisitor.visitLabel(label26);
+ methodVisitor.visitLineNumber(45, label26);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/lang/Class", "getSimpleName", "()Ljava/lang/String;", false);
+ methodVisitor.visitInvokeDynamicInsn(
+ "makeConcatWithConstants",
+ "(Ljava/lang/String;)Ljava/lang/String;",
+ new Handle(
+ Opcodes.H_INVOKESTATIC,
+ "java/lang/invoke/StringConcatFactory",
+ "makeConcatWithConstants",
+ "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;",
+ false),
+ new Object[] {"bar caught from 2: \u0001"});
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label17);
+ methodVisitor.visitLineNumber(47, label17);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("bar post close 2");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label27 = new Label();
+ methodVisitor.visitLabel(label27);
+ methodVisitor.visitLineNumber(48, label27);
+ Label label28 = new Label();
+ methodVisitor.visitJumpInsn(GOTO, label28);
+ methodVisitor.visitLabel(label18);
+ methodVisitor.visitLineNumber(47, label18);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 8);
+ methodVisitor.visitLabel(label19);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("bar post close 2");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ALOAD, 8);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label28);
+ methodVisitor.visitLineNumber(49, label28);
+ methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+ methodVisitor.visitInsn(RETURN);
+ Label label29 = new Label();
+ methodVisitor.visitLabel(label29);
+ methodVisitor.visitLocalVariable("f", "Ljava/util/jar/JarFile;", null, label20, label6, 2);
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label22, label9, 2);
+ methodVisitor.visitLocalVariable("f", "Ljava/util/jar/JarFile;", null, label24, label16, 2);
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label26, label17, 2);
+ methodVisitor.visitLocalVariable(
+ "this",
+ "Ltwrcloseresourceduplication/TwrCloseResourceDuplication$Bar;",
+ null,
+ label5,
+ label29,
+ 0);
+ methodVisitor.visitLocalVariable("name", "Ljava/lang/String;", null, label5, label29, 1);
+ methodVisitor.visitMaxs(3, 9);
+ methodVisitor.visitEnd();
+ }
+ {
+ methodVisitor =
+ classWriter.visitMethod(
+ ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC,
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ null,
+ null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ Label label1 = new Label();
+ Label label2 = new Label();
+ methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
+ Label label3 = new Label();
+ methodVisitor.visitLabel(label3);
+ methodVisitor.visitLineNumber(36, label3);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ Label label4 = new Label();
+ methodVisitor.visitJumpInsn(IFNULL, label4);
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKEINTERFACE, "java/lang/AutoCloseable", "close", "()V", true);
+ methodVisitor.visitLabel(label1);
+ Label label5 = new Label();
+ methodVisitor.visitJumpInsn(GOTO, label5);
+ methodVisitor.visitLabel(label2);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/lang/Throwable", "addSuppressed", "(Ljava/lang/Throwable;)V", false);
+ methodVisitor.visitJumpInsn(GOTO, label5);
+ methodVisitor.visitLabel(label4);
+ methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKEINTERFACE, "java/lang/AutoCloseable", "close", "()V", true);
+ methodVisitor.visitLabel(label5);
+ methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+ methodVisitor.visitInsn(RETURN);
+ Label label6 = new Label();
+ methodVisitor.visitLabel(label6);
+ methodVisitor.visitLocalVariable("x0", "Ljava/lang/Throwable;", null, label3, label6, 0);
+ methodVisitor.visitLocalVariable("x1", "Ljava/lang/AutoCloseable;", null, label3, label6, 1);
+ methodVisitor.visitMaxs(2, 3);
+ methodVisitor.visitEnd();
+ }
+ classWriter.visitEnd();
+
+ return classWriter.toByteArray();
+ }
+}
diff --git a/src/test/examplesJava9/twr/twrcloseresourceduplication/asm/TwrCloseResourceDuplication$FooDump.java b/src/test/examplesJava9/twr/twrcloseresourceduplication/asm/TwrCloseResourceDuplication$FooDump.java
new file mode 100644
index 0000000..68f63a3
--- /dev/null
+++ b/src/test/examplesJava9/twr/twrcloseresourceduplication/asm/TwrCloseResourceDuplication$FooDump.java
@@ -0,0 +1,410 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package twr.twrcloseresourceduplication.asm;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Handle;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.RecordComponentVisitor;
+
+public class TwrCloseResourceDuplication$FooDump implements Opcodes {
+
+ public static byte[] dump() throws Exception {
+
+ ClassWriter classWriter = new ClassWriter(0);
+ FieldVisitor fieldVisitor;
+ RecordComponentVisitor recordComponentVisitor;
+ MethodVisitor methodVisitor;
+ AnnotationVisitor annotationVisitor0;
+
+ classWriter.visit(
+ V9,
+ ACC_PUBLIC | ACC_SUPER,
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo",
+ null,
+ "java/lang/Object",
+ null);
+
+ classWriter.visitSource("TwrCloseResourceDuplication.java", null);
+
+ classWriter.visitInnerClass(
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo",
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication",
+ "Foo",
+ ACC_PUBLIC | ACC_STATIC);
+
+ classWriter.visitInnerClass(
+ "java/lang/invoke/MethodHandles$Lookup",
+ "java/lang/invoke/MethodHandles",
+ "Lookup",
+ ACC_PUBLIC | ACC_FINAL | ACC_STATIC);
+
+ {
+ methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitLineNumber(10, label0);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
+ methodVisitor.visitInsn(RETURN);
+ Label label1 = new Label();
+ methodVisitor.visitLabel(label1);
+ methodVisitor.visitLocalVariable(
+ "this",
+ "Ltwrcloseresourceduplication/TwrCloseResourceDuplication$Foo;",
+ null,
+ label0,
+ label1,
+ 0);
+ methodVisitor.visitMaxs(1, 1);
+ methodVisitor.visitEnd();
+ }
+ {
+ methodVisitor = classWriter.visitMethod(0, "foo", "(Ljava/lang/String;)V", null, null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ Label label1 = new Label();
+ Label label2 = new Label();
+ methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
+ Label label3 = new Label();
+ methodVisitor.visitTryCatchBlock(label0, label1, label3, null);
+ Label label4 = new Label();
+ methodVisitor.visitTryCatchBlock(label2, label4, label3, null);
+ Label label5 = new Label();
+ Label label6 = new Label();
+ Label label7 = new Label();
+ methodVisitor.visitTryCatchBlock(label5, label6, label7, "java/lang/Exception");
+ Label label8 = new Label();
+ methodVisitor.visitTryCatchBlock(label5, label6, label8, null);
+ Label label9 = new Label();
+ methodVisitor.visitTryCatchBlock(label7, label9, label8, null);
+ Label label10 = new Label();
+ methodVisitor.visitTryCatchBlock(label8, label10, label8, null);
+ Label label11 = new Label();
+ Label label12 = new Label();
+ methodVisitor.visitTryCatchBlock(label11, label12, label12, "java/lang/Throwable");
+ Label label13 = new Label();
+ Label label14 = new Label();
+ methodVisitor.visitTryCatchBlock(label11, label13, label14, null);
+ Label label15 = new Label();
+ Label label16 = new Label();
+ methodVisitor.visitTryCatchBlock(label15, label16, label16, "java/lang/Exception");
+ Label label17 = new Label();
+ Label label18 = new Label();
+ methodVisitor.visitTryCatchBlock(label15, label17, label18, null);
+ Label label19 = new Label();
+ methodVisitor.visitTryCatchBlock(label18, label19, label18, null);
+ methodVisitor.visitLabel(label5);
+ methodVisitor.visitLineNumber(13, label5);
+ methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label20 = new Label();
+ methodVisitor.visitLabel(label20);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitLineNumber(14, label0);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("foo opened 1");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label1);
+ methodVisitor.visitLineNumber(15, label1);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ methodVisitor.visitJumpInsn(GOTO, label6);
+ methodVisitor.visitLabel(label2);
+ methodVisitor.visitLineNumber(13, label2);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 4,
+ new Object[] {
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo",
+ "java/lang/String",
+ "java/util/jar/JarFile",
+ "java/lang/Throwable"
+ },
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 4);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label3);
+ methodVisitor.visitLineNumber(15, label3);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 5);
+ methodVisitor.visitLabel(label4);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ methodVisitor.visitVarInsn(ALOAD, 5);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label6);
+ methodVisitor.visitLineNumber(18, label6);
+ methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("foo post close 1");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label21 = new Label();
+ methodVisitor.visitLabel(label21);
+ methodVisitor.visitLineNumber(19, label21);
+ methodVisitor.visitJumpInsn(GOTO, label15);
+ methodVisitor.visitLabel(label7);
+ methodVisitor.visitLineNumber(15, label7);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Exception"});
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label22 = new Label();
+ methodVisitor.visitLabel(label22);
+ methodVisitor.visitLineNumber(16, label22);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/lang/Class", "getSimpleName", "()Ljava/lang/String;", false);
+ methodVisitor.visitInvokeDynamicInsn(
+ "makeConcatWithConstants",
+ "(Ljava/lang/String;)Ljava/lang/String;",
+ new Handle(
+ Opcodes.H_INVOKESTATIC,
+ "java/lang/invoke/StringConcatFactory",
+ "makeConcatWithConstants",
+ "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;",
+ false),
+ new Object[] {"foo caught from 1: \u0001"});
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label9);
+ methodVisitor.visitLineNumber(18, label9);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("foo post close 1");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label23 = new Label();
+ methodVisitor.visitLabel(label23);
+ methodVisitor.visitLineNumber(19, label23);
+ methodVisitor.visitJumpInsn(GOTO, label15);
+ methodVisitor.visitLabel(label8);
+ methodVisitor.visitLineNumber(18, label8);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 6);
+ methodVisitor.visitLabel(label10);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("foo post close 1");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ALOAD, 6);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label15);
+ methodVisitor.visitLineNumber(20, label15);
+ methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+ methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label24 = new Label();
+ methodVisitor.visitLabel(label24);
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitLabel(label11);
+ methodVisitor.visitLineNumber(21, label11);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("foo opened 2");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label25 = new Label();
+ methodVisitor.visitLabel(label25);
+ methodVisitor.visitLineNumber(22, label25);
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label12);
+ methodVisitor.visitLineNumber(20, label12);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 4,
+ new Object[] {
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo",
+ "java/lang/String",
+ "java/util/jar/JarFile",
+ "java/lang/Throwable"
+ },
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 4);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label14);
+ methodVisitor.visitLineNumber(23, label14);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 7);
+ methodVisitor.visitLabel(label13);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo",
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ false);
+ methodVisitor.visitVarInsn(ALOAD, 7);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label16);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 2,
+ new Object[] {
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo", "java/lang/String"
+ },
+ 1,
+ new Object[] {"java/lang/Exception"});
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label26 = new Label();
+ methodVisitor.visitLabel(label26);
+ methodVisitor.visitLineNumber(24, label26);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/lang/Class", "getSimpleName", "()Ljava/lang/String;", false);
+ methodVisitor.visitInvokeDynamicInsn(
+ "makeConcatWithConstants",
+ "(Ljava/lang/String;)Ljava/lang/String;",
+ new Handle(
+ Opcodes.H_INVOKESTATIC,
+ "java/lang/invoke/StringConcatFactory",
+ "makeConcatWithConstants",
+ "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;",
+ false),
+ new Object[] {"foo caught from 2: \u0001"});
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitLabel(label17);
+ methodVisitor.visitLineNumber(26, label17);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("foo post close 2");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ Label label27 = new Label();
+ methodVisitor.visitLabel(label27);
+ methodVisitor.visitLineNumber(27, label27);
+ Label label28 = new Label();
+ methodVisitor.visitJumpInsn(GOTO, label28);
+ methodVisitor.visitLabel(label18);
+ methodVisitor.visitLineNumber(26, label18);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 8);
+ methodVisitor.visitLabel(label19);
+ methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+ methodVisitor.visitLdcInsn("foo post close 2");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+ methodVisitor.visitVarInsn(ALOAD, 8);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label28);
+ methodVisitor.visitLineNumber(28, label28);
+ methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+ methodVisitor.visitInsn(RETURN);
+ Label label29 = new Label();
+ methodVisitor.visitLabel(label29);
+ methodVisitor.visitLocalVariable("f", "Ljava/util/jar/JarFile;", null, label20, label6, 2);
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label22, label9, 2);
+ methodVisitor.visitLocalVariable("f", "Ljava/util/jar/JarFile;", null, label24, label16, 2);
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label26, label17, 2);
+ methodVisitor.visitLocalVariable(
+ "this",
+ "Ltwrcloseresourceduplication/TwrCloseResourceDuplication$Foo;",
+ null,
+ label5,
+ label29,
+ 0);
+ methodVisitor.visitLocalVariable("name", "Ljava/lang/String;", null, label5, label29, 1);
+ methodVisitor.visitMaxs(3, 9);
+ methodVisitor.visitEnd();
+ }
+ {
+ methodVisitor =
+ classWriter.visitMethod(
+ ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC,
+ "$closeResource",
+ "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+ null,
+ null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ Label label1 = new Label();
+ Label label2 = new Label();
+ methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
+ Label label3 = new Label();
+ methodVisitor.visitLabel(label3);
+ methodVisitor.visitLineNumber(15, label3);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ Label label4 = new Label();
+ methodVisitor.visitJumpInsn(IFNULL, label4);
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKEINTERFACE, "java/lang/AutoCloseable", "close", "()V", true);
+ methodVisitor.visitLabel(label1);
+ Label label5 = new Label();
+ methodVisitor.visitJumpInsn(GOTO, label5);
+ methodVisitor.visitLabel(label2);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "java/lang/Throwable", "addSuppressed", "(Ljava/lang/Throwable;)V", false);
+ methodVisitor.visitJumpInsn(GOTO, label5);
+ methodVisitor.visitLabel(label4);
+ methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKEINTERFACE, "java/lang/AutoCloseable", "close", "()V", true);
+ methodVisitor.visitLabel(label5);
+ methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+ methodVisitor.visitInsn(RETURN);
+ Label label6 = new Label();
+ methodVisitor.visitLabel(label6);
+ methodVisitor.visitLocalVariable("x0", "Ljava/lang/Throwable;", null, label3, label6, 0);
+ methodVisitor.visitLocalVariable("x1", "Ljava/lang/AutoCloseable;", null, label3, label6, 1);
+ methodVisitor.visitMaxs(2, 3);
+ methodVisitor.visitEnd();
+ }
+ classWriter.visitEnd();
+
+ return classWriter.toByteArray();
+ }
+}
diff --git a/src/test/examplesJava9/twr/twrcloseresourceduplication/asm/TwrCloseResourceDuplicationDump.java b/src/test/examplesJava9/twr/twrcloseresourceduplication/asm/TwrCloseResourceDuplicationDump.java
new file mode 100644
index 0000000..1c05af0
--- /dev/null
+++ b/src/test/examplesJava9/twr/twrcloseresourceduplication/asm/TwrCloseResourceDuplicationDump.java
@@ -0,0 +1,163 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Dump of class file for twr.twrcloseresourceduplication.TwrCloseResourceDuplication
+ *
+ * <p>*
+ *
+ * <p>This is used to get the JDK-9 javac code with `$closeResource`, which `-target 9` for later
+ * javac versions does not produce.
+ *
+ * <p>package twr.twrcloseresourceduplication;
+ *
+ * <p>import java.util.jar.JarFile;
+ *
+ * <p>public class TwrCloseResourceDuplication {
+ *
+ * <p>public static class Foo {
+ *
+ * <p>void foo(String name) { try (JarFile f = new JarFile(name)) { System.out.println("foo opened
+ * 1"); } catch (Exception e) { System.out.println("foo caught from 1: " +
+ * e.getClass().getSimpleName()); } finally { System.out.println("foo post close 1"); } try (JarFile
+ * f = new JarFile(name)) { System.out.println("foo opened 2"); throw new RuntimeException(); }
+ * catch (Exception e) { System.out.println("foo caught from 2: " + e.getClass().getSimpleName()); }
+ * finally { System.out.println("foo post close 2"); } } }
+ *
+ * <p>public static class Bar {
+ *
+ * <p>void bar(String name) { try (JarFile f = new JarFile(name)) { System.out.println("bar opened
+ * 1"); } catch (Exception e) { System.out.println("bar caught from 1: " +
+ * e.getClass().getSimpleName()); } finally { System.out.println("bar post close 1"); } try (JarFile
+ * f = new JarFile(name)) { System.out.println("bar opened 2"); throw new RuntimeException(); }
+ * catch (Exception e) { System.out.println("bar caught from 2: " + e.getClass().getSimpleName()); }
+ * finally { System.out.println("bar post close 2"); } } }
+ *
+ * <p>public static void main(String[] args) { new Foo().foo(args[0]); new Bar().bar(args[0]); } }
+ */
+package twr.twrcloseresourceduplication.asm;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.RecordComponentVisitor;
+
+public class TwrCloseResourceDuplicationDump implements Opcodes {
+
+ public static byte[] dump() throws Exception {
+
+ ClassWriter classWriter = new ClassWriter(0);
+ FieldVisitor fieldVisitor;
+ RecordComponentVisitor recordComponentVisitor;
+ MethodVisitor methodVisitor;
+ AnnotationVisitor annotationVisitor0;
+
+ classWriter.visit(
+ V9,
+ ACC_PUBLIC | ACC_SUPER,
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication",
+ null,
+ "java/lang/Object",
+ null);
+
+ classWriter.visitSource("TwrCloseResourceDuplication.java", null);
+
+ classWriter.visitInnerClass(
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar",
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication",
+ "Bar",
+ ACC_PUBLIC | ACC_STATIC);
+
+ classWriter.visitInnerClass(
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo",
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication",
+ "Foo",
+ ACC_PUBLIC | ACC_STATIC);
+
+ {
+ methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitLineNumber(8, label0);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
+ methodVisitor.visitInsn(RETURN);
+ Label label1 = new Label();
+ methodVisitor.visitLabel(label1);
+ methodVisitor.visitLocalVariable(
+ "this",
+ "Ltwrcloseresourceduplication/TwrCloseResourceDuplication;",
+ null,
+ label0,
+ label1,
+ 0);
+ methodVisitor.visitMaxs(1, 1);
+ methodVisitor.visitEnd();
+ }
+ {
+ methodVisitor =
+ classWriter.visitMethod(
+ ACC_PUBLIC | ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitLineNumber(53, label0);
+ methodVisitor.visitTypeInsn(
+ NEW, "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL,
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo",
+ "<init>",
+ "()V",
+ false);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitInsn(AALOAD);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo",
+ "foo",
+ "(Ljava/lang/String;)V",
+ false);
+ Label label1 = new Label();
+ methodVisitor.visitLabel(label1);
+ methodVisitor.visitLineNumber(54, label1);
+ methodVisitor.visitTypeInsn(
+ NEW, "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL,
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar",
+ "<init>",
+ "()V",
+ false);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitInsn(AALOAD);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar",
+ "bar",
+ "(Ljava/lang/String;)V",
+ false);
+ Label label2 = new Label();
+ methodVisitor.visitLabel(label2);
+ methodVisitor.visitLineNumber(55, label2);
+ methodVisitor.visitInsn(RETURN);
+ Label label3 = new Label();
+ methodVisitor.visitLabel(label3);
+ methodVisitor.visitLocalVariable("args", "[Ljava/lang/String;", null, label0, label3, 0);
+ methodVisitor.visitMaxs(3, 1);
+ methodVisitor.visitEnd();
+ }
+ classWriter.visitEnd();
+
+ return classWriter.toByteArray();
+ }
+}
diff --git a/src/test/examplesJava9/twraddsuppressed/TestClass.java b/src/test/examplesJava9/twraddsuppressed/TestClass.java
deleted file mode 100644
index fcf0d6f..0000000
--- a/src/test/examplesJava9/twraddsuppressed/TestClass.java
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-package twraddsuppressed;
-
-import java.io.Closeable;
-
-public class TestClass {
-
- public static class MyClosable implements Closeable {
-
- @Override
- public void close() {
- throw new RuntimeException("CLOSE");
- }
- }
-
- public static void foo() {
- throw new RuntimeException("FOO");
- }
-
- public static void bar() {
- // NOTE: The $closeResource helper is _only_ generated by the JDK-9 compiler.
- //
- // Use twr twice to have javac generate a shared $closeResource helper.
- try (MyClosable closable = new MyClosable()) {
- foo();
- }
- try (MyClosable closable = new MyClosable()) {
- foo();
- }
- }
-
- public static void main(String[] args) {
- try {
- bar();
- } catch (Exception e) {
- Throwable[] suppressed = e.getSuppressed();
- if (suppressed.length == 0) {
- System.out.println("NONE");
- } else {
- for (Throwable throwable : suppressed) {
- System.out.println(throwable.getMessage());
- }
- }
- }
- }
-}
diff --git a/src/test/examplesJava9/twrcloseresource/TwrCloseResourceTest.java b/src/test/examplesJava9/twrcloseresource/TwrCloseResourceTest.java
deleted file mode 100644
index d4dbf5b..0000000
--- a/src/test/examplesJava9/twrcloseresource/TwrCloseResourceTest.java
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package twrcloseresource;
-
-import java.util.jar.JarFile;
-
-public class TwrCloseResourceTest implements Iface {
- public static void main(String[] args) {
- TwrCloseResourceTest o = new TwrCloseResourceTest();
- o.foo(args[0]);
- o.iFoo(args[0]);
- bar(args[0]);
- Iface.iBar(args[0]);
- }
-
- synchronized void foo(String arg) {
- try {
- try (JarFile a = new JarFile(arg)) {
- System.out.println("A");
- } catch (Exception e) {
- System.out.println("B");
- try (JarFile a = new JarFile(arg)) {
- System.out.println("C");
- }
- System.out.println("D");
- throw new RuntimeException();
- }
- try (JarFile a = new JarFile(arg)) {
- System.out.println("E");
- }
- } catch (Exception e) {
- System.out.println("F");
- }
- try (JarFile a = new JarFile(arg)) {
- System.out.println("G");
- try (JarFile b = new JarFile(arg)) {
- System.out.println("H");
- } finally {
- System.out.println("I");
- throw new RuntimeException();
- }
- } catch (Exception e) {
- System.out.println("J");
- }
- System.out.println("K");
- }
-
- static synchronized void bar(String arg) {
- try (JarFile a = new JarFile(arg)) {
- System.out.println("1");
- throw new RuntimeException();
- } catch (Exception e) {
- System.out.println("2");
- }
- try (JarFile a = new JarFile(arg)) {
- System.out.println("3");
- throw new RuntimeException();
- } catch (Exception e) {
- System.out.println("4");
- }
- try (JarFile a = new JarFile(arg)) {
- System.out.println("5");
- throw new RuntimeException();
- } catch (Exception e) {
- System.out.println("6");
- }
- try (JarFile a = new JarFile(arg)) {
- System.out.println("7");
- throw new RuntimeException();
- } catch (Exception e) {
- System.out.println("8");
- }
- System.out.println("99");
- }
-}
-
-interface Iface {
- default void iFoo(String arg) {
- try {
- try (JarFile a = new JarFile(arg)) {
- System.out.println("iA");
- } catch (Exception e) {
- System.out.println("iB");
- try (JarFile a = new JarFile(arg)) {
- System.out.println("iC");
- }
- System.out.println("iD");
- throw new RuntimeException();
- }
- try (JarFile a = new JarFile(arg)) {
- System.out.println("iE");
- }
- } catch (Exception e) {
- System.out.println("iF");
- }
- try (JarFile a = new JarFile(arg)) {
- System.out.println("iG");
- try (JarFile b = new JarFile(arg)) {
- System.out.println("iH");
- } finally {
- System.out.println("iI");
- throw new RuntimeException();
- }
- } catch (Exception e) {
- System.out.println("iJ");
- }
- System.out.println("iK");
- }
-
- static void iBar(String arg) {
- try (JarFile a = new JarFile(arg)) {
- System.out.println("i1");
- throw new RuntimeException();
- } catch (Exception e) {
- System.out.println("i2");
- }
- try (JarFile a = new JarFile(arg)) {
- System.out.println("i3");
- throw new RuntimeException();
- } catch (Exception e) {
- System.out.println("i4");
- }
- try (JarFile a = new JarFile(arg)) {
- System.out.println("i5");
- throw new RuntimeException();
- } catch (Exception e) {
- System.out.println("i6");
- }
- try (JarFile a = new JarFile(arg)) {
- System.out.println("i7");
- throw new RuntimeException();
- } catch (Exception e) {
- System.out.println("i8");
- }
- System.out.println("i99");
- }
-}
diff --git a/src/test/examplesJava9/twrcloseresourceduplication/TwrCloseResourceDuplication.java b/src/test/examplesJava9/twrcloseresourceduplication/TwrCloseResourceDuplication.java
deleted file mode 100644
index fa58d18..0000000
--- a/src/test/examplesJava9/twrcloseresourceduplication/TwrCloseResourceDuplication.java
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-package twrcloseresourceduplication;
-
-import java.util.jar.JarFile;
-
-public class TwrCloseResourceDuplication {
-
- public static class Foo {
-
- void foo(String name) {
- try (JarFile f = new JarFile(name)) {
- System.out.println("foo opened 1");
- } catch (Exception e) {
- System.out.println("foo caught from 1: " + e.getClass().getSimpleName());
- } finally {
- System.out.println("foo post close 1");
- }
- try (JarFile f = new JarFile(name)) {
- System.out.println("foo opened 2");
- throw new RuntimeException();
- } catch (Exception e) {
- System.out.println("foo caught from 2: " + e.getClass().getSimpleName());
- } finally {
- System.out.println("foo post close 2");
- }
- }
- }
-
- public static class Bar {
-
- void bar(String name) {
- try (JarFile f = new JarFile(name)) {
- System.out.println("bar opened 1");
- } catch (Exception e) {
- System.out.println("bar caught from 1: " + e.getClass().getSimpleName());
- } finally {
- System.out.println("bar post close 1");
- }
- try (JarFile f = new JarFile(name)) {
- System.out.println("bar opened 2");
- throw new RuntimeException();
- } catch (Exception e) {
- System.out.println("bar caught from 2: " + e.getClass().getSimpleName());
- } finally {
- System.out.println("bar post close 2");
- }
- }
- }
-
- public static void main(String[] args) {
- new Foo().foo(args[0]);
- new Bar().bar(args[0]);
- }
-}
diff --git a/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java b/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
index 8d43e3b..011d567 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
@@ -65,11 +65,6 @@
return self();
}
- C withArg(String arg) {
- args.add(arg);
- return self();
- }
-
void combinedOptionConsumer(InternalOptions options) {
for (Consumer<InternalOptions> consumer : optionConsumers) {
consumer.accept(options);
@@ -136,11 +131,6 @@
// Defines methods failing on JVM, specifies the output to be used for comparison.
private static Map<String, String> expectedJvmResult =
ImmutableMap.of(
- "twr-close-resource",
- "A\nE\nG\nH\nI\nJ\nK\n"
- + "iA\niE\niG\niH\niI\niJ\niK\n"
- + "1\n2\n3\n4\n5\n6\n7\n8\n99\n"
- + "i1\ni2\ni3\ni4\ni5\ni6\ni7\ni8\ni99\n",
"native-private-interface-methods",
"0: s>i>a\n" + "1: d>i>s>i>a\n" + "2: l>i>s>i>a\n" + "3: x>s\n" + "4: c>d>i>s>i>a\n",
"desugared-private-interface-methods",
@@ -200,16 +190,6 @@
.run();
}
- @Test
- public void testTwrCloseResourceMethod() throws Throwable {
- TestRunner<?> test = test("twr-close-resource", "twrcloseresource", "TwrCloseResourceTest");
- test
- .withMinApiLevel(AndroidApiLevel.I.getLevel())
- .withKeepAll()
- .withArg(test.getInputJar().toAbsolutePath().toString())
- .run();
- }
-
abstract RunExamplesJava9Test<B>.TestRunner<?> test(String testName, String packageName,
String mainClass);
diff --git a/src/test/java/com/android/tools/r8/desugar/suppressedexceptions/SuppressedExceptionsTest.java b/src/test/java/com/android/tools/r8/desugar/suppressedexceptions/SuppressedExceptionsTest.java
index 1e86eba..ba0f31f 100644
--- a/src/test/java/com/android/tools/r8/desugar/suppressedexceptions/SuppressedExceptionsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/suppressedexceptions/SuppressedExceptionsTest.java
@@ -3,8 +3,6 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.desugar.suppressedexceptions;
-import static com.android.tools.r8.desugar.suppressedexceptions.TwrSuppressedExceptionsTest.getInvokesTo;
-import static com.android.tools.r8.desugar.suppressedexceptions.TwrSuppressedExceptionsTest.hasInvokesTo;
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.DesugarTestConfiguration;
@@ -14,6 +12,10 @@
import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.android.tools.r8.utils.IntBox;
import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import java.util.List;
+import java.util.stream.Collectors;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -136,4 +138,16 @@
}
}
}
+
+ public static void hasInvokesTo(MethodSubject method, String callee, int count) {
+ List<InstructionSubject> getSuppressedCalls = getInvokesTo(method, callee);
+ assertEquals(count, getSuppressedCalls.size());
+ }
+
+ public static List<InstructionSubject> getInvokesTo(MethodSubject method, String callee) {
+ return method
+ .streamInstructions()
+ .filter(i -> i.isInvoke() && i.getMethod().getName().toString().equals(callee))
+ .collect(Collectors.toList());
+ }
}