aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRico Wind <ricow@google.com>2017-10-26 13:39:32 +0200
committerRico Wind <ricow@google.com>2017-10-26 13:39:32 +0200
commitc0016d1e892affefef6ea8b3f260112e339617ae (patch)
treee0ed219fff5394fb9b32388832a569fc716b683b
parent6b06bfbaf7e8bbb3cddfe3889c04aa0f0fba4106 (diff)
downloadr8-c0016d1e892affefef6ea8b3f260112e339617ae.tar.gz
Remove a bunch of file descriptor leaks
Bug: Change-Id: Idba1848b5082f95494a00c1b0fcf15a6aeee3737
-rw-r--r--src/main/java/com/android/tools/r8/benchmarks/FrameworkIncrementalDexingBenchmark.java5
-rw-r--r--src/main/java/com/android/tools/r8/dex/BaseFile.java4
-rw-r--r--src/main/java/com/android/tools/r8/utils/ZipUtils.java6
-rw-r--r--src/test/examplesAndroidO/invokecustom/TestGenerator.java57
-rw-r--r--src/test/examplesAndroidO/invokecustom2/TestGenerator.java49
-rw-r--r--src/test/examplesAndroidO/stringconcat/TestGenerator.java335
-rw-r--r--src/test/examplesAndroidP/invokecustom/TestGenerator.java37
-rw-r--r--src/test/java/com/android/tools/r8/debug/JasminDebugTest.java6
-rw-r--r--src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java5
9 files changed, 268 insertions, 236 deletions
diff --git a/src/main/java/com/android/tools/r8/benchmarks/FrameworkIncrementalDexingBenchmark.java b/src/main/java/com/android/tools/r8/benchmarks/FrameworkIncrementalDexingBenchmark.java
index 2120714ba..e904e53e9 100644
--- a/src/main/java/com/android/tools/r8/benchmarks/FrameworkIncrementalDexingBenchmark.java
+++ b/src/main/java/com/android/tools/r8/benchmarks/FrameworkIncrementalDexingBenchmark.java
@@ -22,6 +22,7 @@ import com.android.tools.r8.utils.ZipUtils;
import com.google.common.collect.ImmutableMap;
import com.google.common.io.ByteStreams;
import java.io.IOException;
+import java.io.InputStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
@@ -174,7 +175,9 @@ public class FrameworkIncrementalDexingBenchmark {
throws IOException, CompilationException {
List<byte[]> bytes = new ArrayList<>(outputs.size());
for (Resource input : outputs.values()) {
- bytes.add(ByteStreams.toByteArray(input.getStream()));
+ try (InputStream inputStream = input.getStream()) {
+ bytes.add(ByteStreams.toByteArray(inputStream));
+ }
}
long start = System.nanoTime();
D8Output out =
diff --git a/src/main/java/com/android/tools/r8/dex/BaseFile.java b/src/main/java/com/android/tools/r8/dex/BaseFile.java
index dd9b325c9..86143c84a 100644
--- a/src/main/java/com/android/tools/r8/dex/BaseFile.java
+++ b/src/main/java/com/android/tools/r8/dex/BaseFile.java
@@ -18,7 +18,9 @@ public abstract class BaseFile {
protected final ByteBuffer buffer;
protected BaseFile(Resource resource) throws IOException {
- buffer = ByteBuffer.wrap(ByteStreams.toByteArray(resource.getStream()));
+ try (InputStream input = resource.getStream()) {
+ buffer = ByteBuffer.wrap(ByteStreams.toByteArray(input));
+ }
}
protected BaseFile(String name) throws IOException {
diff --git a/src/main/java/com/android/tools/r8/utils/ZipUtils.java b/src/main/java/com/android/tools/r8/utils/ZipUtils.java
index ca9a40433..76d84c2fa 100644
--- a/src/main/java/com/android/tools/r8/utils/ZipUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ZipUtils.java
@@ -9,6 +9,7 @@ import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.io.OutputStream;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Enumeration;
@@ -53,8 +54,9 @@ public class ZipUtils {
Path outPath = outDirectoryPath.resolve(name);
File outFile = outPath.toFile();
outFile.getParentFile().mkdirs();
- FileOutputStream output = new FileOutputStream(outFile);
- ByteStreams.copy(input, output);
+ try (OutputStream output = new FileOutputStream(outFile)) {
+ ByteStreams.copy(input, output);
+ }
outFiles.add(outFile);
}
});
diff --git a/src/test/examplesAndroidO/invokecustom/TestGenerator.java b/src/test/examplesAndroidO/invokecustom/TestGenerator.java
index 574fe1431..e42b9c9c9 100644
--- a/src/test/examplesAndroidO/invokecustom/TestGenerator.java
+++ b/src/test/examplesAndroidO/invokecustom/TestGenerator.java
@@ -3,13 +3,14 @@
// BSD-style license that can be found in the LICENSE file.
package invokecustom;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.lang.invoke.CallSite;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
+import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.objectweb.asm.ClassReader;
@@ -36,30 +37,34 @@ public class TestGenerator {
}
private void generateTests() throws IOException {
- ClassReader cr = new ClassReader(new FileInputStream(classNamePath.toFile()));
- ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
- cr.accept(
- new ClassVisitor(Opcodes.ASM6, cw) {
- @Override
- public void visitEnd() {
- generateMethodTest1(cw);
- generateMethodTest2(cw);
- generateMethodTest3(cw);
- generateMethodTest4(cw);
- generateMethodTest5(cw);
- generateMethodTest6(cw);
- generateMethodTest7(cw);
- generateMethodTest8(cw);
- generateMethodTest9(cw);
- generateMethodTest10(cw);
- generateMethodTest11(cw);
- generateMethodTest12(cw);
- generateMethodTest13(cw);
- generateMethodMain(cw);
- super.visitEnd();
- }
- }, 0);
- new FileOutputStream(classNamePath.toFile()).write(cw.toByteArray());
+ try (InputStream input = Files.newInputStream(classNamePath)) {
+ ClassReader cr = new ClassReader(input);
+ ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
+ cr.accept(
+ new ClassVisitor(Opcodes.ASM6, cw) {
+ @Override
+ public void visitEnd() {
+ generateMethodTest1(cw);
+ generateMethodTest2(cw);
+ generateMethodTest3(cw);
+ generateMethodTest4(cw);
+ generateMethodTest5(cw);
+ generateMethodTest6(cw);
+ generateMethodTest7(cw);
+ generateMethodTest8(cw);
+ generateMethodTest9(cw);
+ generateMethodTest10(cw);
+ generateMethodTest11(cw);
+ generateMethodTest12(cw);
+ generateMethodTest13(cw);
+ generateMethodMain(cw);
+ super.visitEnd();
+ }
+ }, 0);
+ try (OutputStream output = Files.newOutputStream(classNamePath)) {
+ output.write(cw.toByteArray());
+ }
+ }
}
/* generate main method that only call all test methods. */
diff --git a/src/test/examplesAndroidO/invokecustom2/TestGenerator.java b/src/test/examplesAndroidO/invokecustom2/TestGenerator.java
index ab77d32a1..9bbc03a59 100644
--- a/src/test/examplesAndroidO/invokecustom2/TestGenerator.java
+++ b/src/test/examplesAndroidO/invokecustom2/TestGenerator.java
@@ -4,13 +4,14 @@
package invokecustom2;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.lang.invoke.CallSite;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
+import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.objectweb.asm.ClassReader;
@@ -37,26 +38,30 @@ public class TestGenerator {
}
private void generateTests() throws IOException {
- ClassReader cr = new ClassReader(new FileInputStream(classNamePath.toFile()));
- ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
- cr.accept(
- new ClassVisitor(Opcodes.ASM6, cw) {
- @Override
- public void visitEnd() {
- generateMethodTest1(cw);
- generateMethodTest2(cw);
- generateMethodTest3(cw);
- generateMethodTest4(cw);
- generateMethodTest5(cw);
- generateMethodTest6(cw);
- generateMethodTest7(cw);
- generateMethodTest8(cw);
- generateMethodTest9(cw);
- generateMethodMain(cw);
- super.visitEnd();
- }
- }, 0);
- new FileOutputStream(classNamePath.toFile()).write(cw.toByteArray());
+ try (InputStream input = Files.newInputStream(classNamePath)) {
+ ClassReader cr = new ClassReader(input);
+ ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
+ cr.accept(
+ new ClassVisitor(Opcodes.ASM6, cw) {
+ @Override
+ public void visitEnd() {
+ generateMethodTest1(cw);
+ generateMethodTest2(cw);
+ generateMethodTest3(cw);
+ generateMethodTest4(cw);
+ generateMethodTest5(cw);
+ generateMethodTest6(cw);
+ generateMethodTest7(cw);
+ generateMethodTest8(cw);
+ generateMethodTest9(cw);
+ generateMethodMain(cw);
+ super.visitEnd();
+ }
+ }, 0);
+ try (OutputStream output = Files.newOutputStream(classNamePath)) {
+ output.write(cw.toByteArray());
+ }
+ }
}
/* generate main method that only call all test methods. */
diff --git a/src/test/examplesAndroidO/stringconcat/TestGenerator.java b/src/test/examplesAndroidO/stringconcat/TestGenerator.java
index 6a837a4f4..e72f43813 100644
--- a/src/test/examplesAndroidO/stringconcat/TestGenerator.java
+++ b/src/test/examplesAndroidO/stringconcat/TestGenerator.java
@@ -3,12 +3,13 @@
// BSD-style license that can be found in the LICENSE file.
package stringconcat;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.lang.invoke.CallSite;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
+import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
@@ -46,177 +47,181 @@ public class TestGenerator {
}
private static void generateTests(Path classNamePath) throws IOException {
- ClassReader cr = new ClassReader(new FileInputStream(classNamePath.toFile()));
- ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
- cr.accept(
- new ClassVisitor(Opcodes.ASM6, cw) {
- @Override
- public MethodVisitor visitMethod(int access,
- final String methodName, String desc, String signature, String[] exceptions) {
- MethodVisitor mv = super.visitMethod(access, methodName, desc, signature, exceptions);
- return new MethodVisitor(Opcodes.ASM6, mv) {
- private List<Object> recentConstants = new ArrayList<>();
-
- @Override
- public void visitLdcInsn(Object cst) {
- if (!recentConstants.isEmpty() ||
- (cst instanceof String && ((String) cst).startsWith(RECIPE_PREFIX))) {
- // Add the constant, don't push anything on stack.
- recentConstants.add(cst);
- return;
+ try (InputStream input = Files.newInputStream(classNamePath)) {
+ ClassReader cr = new ClassReader(input);
+ ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
+ cr.accept(
+ new ClassVisitor(Opcodes.ASM6, cw) {
+ @Override
+ public MethodVisitor visitMethod(int access,
+ final String methodName, String desc, String signature, String[] exceptions) {
+ MethodVisitor mv = super.visitMethod(access, methodName, desc, signature, exceptions);
+ return new MethodVisitor(Opcodes.ASM6, mv) {
+ private List<Object> recentConstants = new ArrayList<>();
+
+ @Override
+ public void visitLdcInsn(Object cst) {
+ if (!recentConstants.isEmpty() ||
+ (cst instanceof String && ((String) cst).startsWith(RECIPE_PREFIX))) {
+ // Add the constant, don't push anything on stack.
+ recentConstants.add(cst);
+ return;
+ }
+ super.visitLdcInsn(cst);
}
- super.visitLdcInsn(cst);
- }
-
- @Override
- public void visitMethodInsn(
- int opcode, String owner, String name, String desc, boolean itf) {
- // Replace calls to 'makeConcat(...)' with appropriate `invokedynamic`.
- if (opcode == Opcodes.INVOKESTATIC && name.equals("makeConcat")) {
- mv.visitInvokeDynamicInsn(MAKE_CONCAT.getName(), desc, MAKE_CONCAT);
- recentConstants.clear();
- return;
+
+ @Override
+ public void visitMethodInsn(
+ int opcode, String owner, String name, String desc, boolean itf) {
+ // Replace calls to 'makeConcat(...)' with appropriate `invokedynamic`.
+ if (opcode == Opcodes.INVOKESTATIC && name.equals("makeConcat")) {
+ mv.visitInvokeDynamicInsn(MAKE_CONCAT.getName(), desc, MAKE_CONCAT);
+ recentConstants.clear();
+ return;
+ }
+
+ // Replace calls to 'makeConcat(...)' with appropriate `invokedynamic`.
+ if (opcode == Opcodes.INVOKESTATIC && name.equals("makeConcatWithConstants")) {
+ if (recentConstants.isEmpty()) {
+ throw new AssertionError("No constants detected in `" +
+ methodName + "`: call to " + name + desc);
+ }
+ recentConstants.set(0,
+ ((String) recentConstants.get(0)).substring(RECIPE_PREFIX.length()));
+
+ mv.visitInvokeDynamicInsn(MAKE_CONCAT_WITH_CONSTANTS.getName(),
+ removeLastParams(desc, recentConstants.size()), MAKE_CONCAT_WITH_CONSTANTS,
+ recentConstants.toArray(new Object[recentConstants.size()]));
+ recentConstants.clear();
+ return;
+ }
+
+ // Otherwise fall back to default implementation.
+ super.visitMethodInsn(opcode, owner, name, desc, itf);
}
- // Replace calls to 'makeConcat(...)' with appropriate `invokedynamic`.
- if (opcode == Opcodes.INVOKESTATIC && name.equals("makeConcatWithConstants")) {
- if (recentConstants.isEmpty()) {
- throw new AssertionError("No constants detected in `" +
- methodName + "`: call to " + name + desc);
+ private String removeLastParams(String descr, int paramsToRemove) {
+ MethodType methodType =
+ MethodType.fromMethodDescriptorString(
+ descr, this.getClass().getClassLoader());
+ return methodType
+ .dropParameterTypes(
+ methodType.parameterCount() - paramsToRemove,
+ methodType.parameterCount())
+ .toMethodDescriptorString();
+ }
+
+ @Override
+ public void visitInsn(int opcode) {
+ switch (opcode) {
+ case Opcodes.ICONST_0:
+ if (!recentConstants.isEmpty()) {
+ recentConstants.add(0);
+ return;
+ }
+ break;
+ case Opcodes.ICONST_1:
+ if (!recentConstants.isEmpty()) {
+ recentConstants.add(1);
+ return;
+ }
+ break;
+ case Opcodes.ICONST_2:
+ if (!recentConstants.isEmpty()) {
+ recentConstants.add(2);
+ return;
+ }
+ break;
+ case Opcodes.ICONST_3:
+ if (!recentConstants.isEmpty()) {
+ recentConstants.add(3);
+ return;
+ }
+ break;
+ case Opcodes.ICONST_4:
+ if (!recentConstants.isEmpty()) {
+ recentConstants.add(4);
+ return;
+ }
+ break;
+ case Opcodes.ICONST_5:
+ if (!recentConstants.isEmpty()) {
+ recentConstants.add(5);
+ return;
+ }
+ break;
+ case Opcodes.ICONST_M1:
+ if (!recentConstants.isEmpty()) {
+ recentConstants.add(-1);
+ return;
+ }
+ break;
+ default:
+ recentConstants.clear();
+ break;
}
- recentConstants.set(0,
- ((String) recentConstants.get(0)).substring(RECIPE_PREFIX.length()));
+ super.visitInsn(opcode);
+ }
- mv.visitInvokeDynamicInsn(MAKE_CONCAT_WITH_CONSTANTS.getName(),
- removeLastParams(desc, recentConstants.size()), MAKE_CONCAT_WITH_CONSTANTS,
- recentConstants.toArray(new Object[recentConstants.size()]));
+ @Override
+ public void visitIntInsn(int opcode, int operand) {
recentConstants.clear();
- return;
+ super.visitIntInsn(opcode, operand);
}
- // Otherwise fall back to default implementation.
- super.visitMethodInsn(opcode, owner, name, desc, itf);
- }
-
- private String removeLastParams(String descr, int paramsToRemove) {
- MethodType methodType =
- MethodType.fromMethodDescriptorString(
- descr, this.getClass().getClassLoader());
- return methodType
- .dropParameterTypes(
- methodType.parameterCount() - paramsToRemove,
- methodType.parameterCount())
- .toMethodDescriptorString();
- }
-
- @Override
- public void visitInsn(int opcode) {
- switch (opcode) {
- case Opcodes.ICONST_0:
- if (!recentConstants.isEmpty()) {
- recentConstants.add(0);
- return;
- }
- break;
- case Opcodes.ICONST_1:
- if (!recentConstants.isEmpty()) {
- recentConstants.add(1);
- return;
- }
- break;
- case Opcodes.ICONST_2:
- if (!recentConstants.isEmpty()) {
- recentConstants.add(2);
- return;
- }
- break;
- case Opcodes.ICONST_3:
- if (!recentConstants.isEmpty()) {
- recentConstants.add(3);
- return;
- }
- break;
- case Opcodes.ICONST_4:
- if (!recentConstants.isEmpty()) {
- recentConstants.add(4);
- return;
- }
- break;
- case Opcodes.ICONST_5:
- if (!recentConstants.isEmpty()) {
- recentConstants.add(5);
- return;
- }
- break;
- case Opcodes.ICONST_M1:
- if (!recentConstants.isEmpty()) {
- recentConstants.add(-1);
- return;
- }
- break;
- default:
- recentConstants.clear();
- break;
+ @Override
+ public void visitVarInsn(int opcode, int var) {
+ recentConstants.clear();
+ super.visitVarInsn(opcode, var);
+ }
+
+ @Override
+ public void visitTypeInsn(int opcode, String type) {
+ recentConstants.clear();
+ super.visitTypeInsn(opcode, type);
+ }
+
+ @Override
+ public void visitFieldInsn(int opcode, String owner, String name, String desc) {
+ recentConstants.clear();
+ super.visitFieldInsn(opcode, owner, name, desc);
+ }
+
+ @Override
+ public void visitJumpInsn(int opcode, Label label) {
+ recentConstants.clear();
+ super.visitJumpInsn(opcode, label);
+ }
+
+ @Override
+ public void visitIincInsn(int var, int increment) {
+ recentConstants.clear();
+ super.visitIincInsn(var, increment);
+ }
+
+ @Override
+ public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) {
+ recentConstants.clear();
+ super.visitTableSwitchInsn(min, max, dflt, labels);
+ }
+
+ @Override
+ public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
+ recentConstants.clear();
+ super.visitLookupSwitchInsn(dflt, keys, labels);
+ }
+
+ @Override
+ public void visitMultiANewArrayInsn(String desc, int dims) {
+ recentConstants.clear();
+ super.visitMultiANewArrayInsn(desc, dims);
}
- super.visitInsn(opcode);
- }
-
- @Override
- public void visitIntInsn(int opcode, int operand) {
- recentConstants.clear();
- super.visitIntInsn(opcode, operand);
- }
-
- @Override
- public void visitVarInsn(int opcode, int var) {
- recentConstants.clear();
- super.visitVarInsn(opcode, var);
- }
-
- @Override
- public void visitTypeInsn(int opcode, String type) {
- recentConstants.clear();
- super.visitTypeInsn(opcode, type);
- }
-
- @Override
- public void visitFieldInsn(int opcode, String owner, String name, String desc) {
- recentConstants.clear();
- super.visitFieldInsn(opcode, owner, name, desc);
- }
-
- @Override
- public void visitJumpInsn(int opcode, Label label) {
- recentConstants.clear();
- super.visitJumpInsn(opcode, label);
- }
-
- @Override
- public void visitIincInsn(int var, int increment) {
- recentConstants.clear();
- super.visitIincInsn(var, increment);
- }
-
- @Override
- public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) {
- recentConstants.clear();
- super.visitTableSwitchInsn(min, max, dflt, labels);
- }
-
- @Override
- public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
- recentConstants.clear();
- super.visitLookupSwitchInsn(dflt, keys, labels);
- }
-
- @Override
- public void visitMultiANewArrayInsn(String desc, int dims) {
- recentConstants.clear();
- super.visitMultiANewArrayInsn(desc, dims);
- }
- };
- }
- }, 0);
- new FileOutputStream(classNamePath.toFile()).write(cw.toByteArray());
+ };
+ }
+ }, 0);
+ try (OutputStream output = Files.newOutputStream(classNamePath)) {
+ output.write(cw.toByteArray());
+ }
+ }
}
}
diff --git a/src/test/examplesAndroidP/invokecustom/TestGenerator.java b/src/test/examplesAndroidP/invokecustom/TestGenerator.java
index 375dc3413..7ee4bdc0b 100644
--- a/src/test/examplesAndroidP/invokecustom/TestGenerator.java
+++ b/src/test/examplesAndroidP/invokecustom/TestGenerator.java
@@ -3,13 +3,14 @@
// BSD-style license that can be found in the LICENSE file.
package invokecustom;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
+
import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.lang.invoke.CallSite;
-import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
+import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.objectweb.asm.ClassReader;
@@ -36,19 +37,23 @@ public class TestGenerator {
}
private void generateTests() throws IOException {
- ClassReader cr = new ClassReader(new FileInputStream(classNamePath.toFile()));
- ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
- cr.accept(
- new ClassVisitor(Opcodes.ASM6, cw) {
- @Override
- public void visitEnd() {
- generateMethodTest1(cw);
- generateMethodTest2(cw);
- generateMethodMain(cw);
- super.visitEnd();
- }
- }, 0);
- new FileOutputStream(classNamePath.toFile()).write(cw.toByteArray());
+ try (InputStream inputStream = Files.newInputStream(classNamePath)) {
+ ClassReader cr = new ClassReader(inputStream);
+ ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
+ cr.accept(
+ new ClassVisitor(Opcodes.ASM6, cw) {
+ @Override
+ public void visitEnd() {
+ generateMethodTest1(cw);
+ generateMethodTest2(cw);
+ generateMethodMain(cw);
+ super.visitEnd();
+ }
+ }, 0);
+ try (OutputStream output = Files.newOutputStream(classNamePath)) {
+ output.write(cw.toByteArray());
+ }
+ }
}
/* Generate main method that only call all test methods. */
diff --git a/src/test/java/com/android/tools/r8/debug/JasminDebugTest.java b/src/test/java/com/android/tools/r8/debug/JasminDebugTest.java
index 2b0084d55..ddcbf8cf5 100644
--- a/src/test/java/com/android/tools/r8/debug/JasminDebugTest.java
+++ b/src/test/java/com/android/tools/r8/debug/JasminDebugTest.java
@@ -9,7 +9,7 @@ import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
import com.google.common.collect.ImmutableList;
import jasmin.ClassFile;
import java.io.File;
-import java.io.FileOutputStream;
+import java.io.OutputStream;
import java.io.StringReader;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -88,7 +88,9 @@ public class JasminDebugTest extends DebugTestBase {
file.readJasmin(new StringReader(clazz.toString()), clazz.name, false);
Path path = out.toPath().resolve(clazz.name + ".class");
Files.createDirectories(path.getParent());
- file.write(new FileOutputStream(path.toFile()));
+ try (OutputStream outputStream = Files.newOutputStream(path)) {
+ file.write(outputStream);
+ }
if (isRunningJava()) {
extraPaths.add(path);
} else {
diff --git a/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java b/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
index 67decf2a7..15cf848b2 100644
--- a/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
+++ b/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
@@ -132,7 +132,10 @@ public class JasminTestBase {
for (ClassBuilder clazz : builder.getClasses()) {
ClassFile file = new ClassFile();
file.readJasmin(new StringReader(clazz.toString()), clazz.name, false);
- file.write(new FileOutputStream(classes.toPath().resolve(clazz.name + ".class").toFile()));
+ try (OutputStream outputStream =
+ Files.newOutputStream(classes.toPath().resolve(clazz.name + ".class"))) {
+ file.write(outputStream);
+ }
}
List<String> args = new ArrayList<>();
args.add("--output=" + dex.toString());