diff options
author | Rico Wind <ricow@google.com> | 2017-10-26 13:39:32 +0200 |
---|---|---|
committer | Rico Wind <ricow@google.com> | 2017-10-26 13:39:32 +0200 |
commit | c0016d1e892affefef6ea8b3f260112e339617ae (patch) | |
tree | e0ed219fff5394fb9b32388832a569fc716b683b | |
parent | 6b06bfbaf7e8bbb3cddfe3889c04aa0f0fba4106 (diff) | |
download | r8-c0016d1e892affefef6ea8b3f260112e339617ae.tar.gz |
Remove a bunch of file descriptor leaks
Bug:
Change-Id: Idba1848b5082f95494a00c1b0fcf15a6aeee3737
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()); |