Merge "Define distinct access-flag types for classes, methods and fields."
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index d24eb43..fef695e 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -35,6 +35,7 @@
private Optional<Boolean> treeShaking = Optional.empty();
private Optional<Boolean> discardedChecker = Optional.empty();
private Optional<Boolean> minification = Optional.empty();
+ private boolean ignoreMissingClassesWhenNotShrinking = false;
private boolean ignoreMissingClasses = false;
private boolean forceProguardCompatibility = false;
private Path proguardMapOutput = null;
@@ -43,9 +44,12 @@
super(CompilationMode.RELEASE);
}
- protected Builder(boolean ignoreDexInArchive, boolean forceProguardCompatibility) {
+ protected Builder(boolean ignoreDexInArchive, boolean forceProguardCompatibility,
+ boolean ignoreMissingClassesWhenNotShrinking, boolean ignoreMissingClasses) {
super(CompilationMode.RELEASE, ignoreDexInArchive);
this.forceProguardCompatibility = forceProguardCompatibility;
+ this.ignoreMissingClassesWhenNotShrinking = ignoreMissingClassesWhenNotShrinking;
+ this.ignoreMissingClasses = ignoreMissingClasses;
}
private Builder(AndroidApp app) {
@@ -256,6 +260,7 @@
useMinification,
ignoreMissingClasses,
forceProguardCompatibility,
+ ignoreMissingClassesWhenNotShrinking,
proguardMapOutput);
}
}
@@ -297,6 +302,7 @@
private final boolean useMinification;
private final boolean ignoreMissingClasses;
private final boolean forceProguardCompatibility;
+ private final boolean ignoreMissingClassesWhenNotShrinking;
private final Path proguardMapOutput;
public static Builder builder() {
@@ -415,6 +421,7 @@
boolean useMinification,
boolean ignoreMissingClasses,
boolean forceProguardCompatibility,
+ boolean ignoreMissingClassesWhenNotShrinking,
Path proguardMapOutput) {
super(inputApp, outputPath, outputMode, mode, minApiLevel, diagnosticsHandler,
enableDesugaring);
@@ -429,6 +436,7 @@
this.useMinification = useMinification;
this.ignoreMissingClasses = ignoreMissingClasses;
this.forceProguardCompatibility = forceProguardCompatibility;
+ this.ignoreMissingClassesWhenNotShrinking = ignoreMissingClassesWhenNotShrinking;
this.proguardMapOutput = proguardMapOutput;
}
@@ -442,6 +450,7 @@
useMinification = false;
ignoreMissingClasses = false;
forceProguardCompatibility = false;
+ ignoreMissingClassesWhenNotShrinking = false;
proguardMapOutput = null;
}
public boolean useTreeShaking() {
@@ -479,6 +488,9 @@
assert !internal.ignoreMissingClasses;
internal.ignoreMissingClasses = ignoreMissingClasses;
internal.ignoreMissingClasses |= proguardConfiguration.isIgnoreWarnings();
+ internal.ignoreMissingClasses |=
+ ignoreMissingClassesWhenNotShrinking && !proguardConfiguration.isShrinking();
+
assert !internal.verbose;
internal.mainDexKeepRules = mainDexKeepRules;
internal.minimalMainDex = internal.debug;
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 2120714..e904e53 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.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 @@
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/compatproguard/CompatProguard.java b/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
index 4c49a6a..a6b45ae 100644
--- a/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
+++ b/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
@@ -33,14 +33,16 @@
public final String output;
public final int minApi;
public final boolean forceProguardCompatibility;
+ public final boolean ignoreMissingClasses;
public final boolean multiDex;
public final List<String> proguardConfig;
CompatProguardOptions(List<String> proguardConfig, String output, int minApi,
- boolean multiDex, boolean forceProguardCompatibility) {
+ boolean multiDex, boolean forceProguardCompatibility, boolean ignoreMissingClasses) {
this.output = output;
this.minApi = minApi;
this.forceProguardCompatibility = forceProguardCompatibility;
+ this.ignoreMissingClasses = ignoreMissingClasses;
this.multiDex = multiDex;
this.proguardConfig = proguardConfig;
}
@@ -49,6 +51,7 @@
String output = null;
int minApi = 1;
boolean forceProguardCompatibility = false;
+ boolean ignoreMissingClasses = false;
boolean multiDex = false;
boolean coreLibrary = false;
@@ -62,6 +65,8 @@
minApi = Integer.valueOf(args[++i]);
} else if (arg.equals("--force-proguard-compatibility")) {
forceProguardCompatibility = true;
+ } else if (arg.equals("--ignore-missing-classes")) {
+ ignoreMissingClasses = true;
} else if (arg.equals("--output")) {
output = args[++i];
} else if (arg.equals("--multi-dex")) {
@@ -82,7 +87,7 @@
builder.add(currentLine.toString());
}
return new CompatProguardOptions(builder.build(), output, minApi, multiDex,
- forceProguardCompatibility);
+ forceProguardCompatibility, ignoreMissingClasses);
}
}
@@ -95,7 +100,8 @@
// Run R8 passing all the options from the command line as a Proguard configuration.
CompatProguardOptions options = CompatProguardOptions.parse(args);
R8Command.Builder builder =
- new CompatProguardCommandBuilder(options.forceProguardCompatibility);
+ new CompatProguardCommandBuilder(
+ options.forceProguardCompatibility, options.ignoreMissingClasses);
builder.setOutputPath(Paths.get(options.output))
.addProguardConfiguration(options.proguardConfig)
.setMinApiLevel(options.minApi);
diff --git a/src/main/java/com/android/tools/r8/compatproguard/CompatProguardCommandBuilder.java b/src/main/java/com/android/tools/r8/compatproguard/CompatProguardCommandBuilder.java
index 71bc6eb..18ec474 100644
--- a/src/main/java/com/android/tools/r8/compatproguard/CompatProguardCommandBuilder.java
+++ b/src/main/java/com/android/tools/r8/compatproguard/CompatProguardCommandBuilder.java
@@ -7,8 +7,9 @@
import com.android.tools.r8.R8Command;
public class CompatProguardCommandBuilder extends R8Command.Builder {
- public CompatProguardCommandBuilder(boolean forceProguardCompatibility) {
- super(true, forceProguardCompatibility);
+ public CompatProguardCommandBuilder(boolean forceProguardCompatibility,
+ boolean ignoreMissingClasses) {
+ super(true, forceProguardCompatibility, true, ignoreMissingClasses);
setEnableDesugaring(false);
}
}
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 dd9b325..86143c8 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 @@
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/jar/CfApplicationWriter.java b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
index 95e6e6a..483327b 100644
--- a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
@@ -13,9 +13,9 @@
import java.io.IOException;
import java.util.Collections;
import java.util.concurrent.ExecutorService;
-import jdk.internal.org.objectweb.asm.Type;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Type;
public class CfApplicationWriter {
private final DexApplication application;
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 ca9a404..76d84c2 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.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 @@
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 574fe14..e42b9c9 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 @@
}
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 ab77d32..9bbc03a 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 @@
}
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 6a837a4..e72f438 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 @@
}
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<>();
+ 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);
- }
-
- @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);
+ @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;
}
- 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;
+ super.visitLdcInsn(cst);
}
- // 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:
+ @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();
- break;
+ 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);
}
- super.visitInsn(opcode);
- }
- @Override
- public void visitIntInsn(int opcode, int operand) {
- recentConstants.clear();
- super.visitIntInsn(opcode, operand);
- }
+ 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 visitVarInsn(int opcode, int var) {
- recentConstants.clear();
- super.visitVarInsn(opcode, var);
- }
+ @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;
+ }
+ super.visitInsn(opcode);
+ }
- @Override
- public void visitTypeInsn(int opcode, String type) {
- recentConstants.clear();
- super.visitTypeInsn(opcode, type);
- }
+ @Override
+ public void visitIntInsn(int opcode, int operand) {
+ recentConstants.clear();
+ super.visitIntInsn(opcode, operand);
+ }
- @Override
- public void visitFieldInsn(int opcode, String owner, String name, String desc) {
- recentConstants.clear();
- super.visitFieldInsn(opcode, owner, name, desc);
- }
+ @Override
+ public void visitVarInsn(int opcode, int var) {
+ recentConstants.clear();
+ super.visitVarInsn(opcode, var);
+ }
- @Override
- public void visitJumpInsn(int opcode, Label label) {
- recentConstants.clear();
- super.visitJumpInsn(opcode, label);
- }
+ @Override
+ public void visitTypeInsn(int opcode, String type) {
+ recentConstants.clear();
+ super.visitTypeInsn(opcode, type);
+ }
- @Override
- public void visitIincInsn(int var, int increment) {
- recentConstants.clear();
- super.visitIincInsn(var, increment);
- }
+ @Override
+ public void visitFieldInsn(int opcode, String owner, String name, String desc) {
+ recentConstants.clear();
+ super.visitFieldInsn(opcode, owner, name, desc);
+ }
- @Override
- public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) {
- recentConstants.clear();
- super.visitTableSwitchInsn(min, max, dflt, labels);
- }
+ @Override
+ public void visitJumpInsn(int opcode, Label label) {
+ recentConstants.clear();
+ super.visitJumpInsn(opcode, label);
+ }
- @Override
- public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
- recentConstants.clear();
- super.visitLookupSwitchInsn(dflt, keys, labels);
- }
+ @Override
+ public void visitIincInsn(int var, int increment) {
+ recentConstants.clear();
+ super.visitIincInsn(var, increment);
+ }
- @Override
- public void visitMultiANewArrayInsn(String desc, int dims) {
- recentConstants.clear();
- super.visitMultiANewArrayInsn(desc, dims);
- }
- };
- }
- }, 0);
- new FileOutputStream(classNamePath.toFile()).write(cw.toByteArray());
+ @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);
+ 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 375dc34..7ee4bdc 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 @@
}
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 2b0084d..ddcbf8c 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.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 @@
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 67decf2..15cf848 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 @@
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());
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
index 1519f6c..298876f 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
@@ -55,7 +55,7 @@
private void runAnnotationsTest(boolean forceProguardCompatibility, boolean keepAnnotations) throws Exception {
R8Command.Builder builder =
- new CompatProguardCommandBuilder(forceProguardCompatibility);
+ new CompatProguardCommandBuilder(forceProguardCompatibility, false);
// Add application classes including the annotation class.
Class mainClass = TestMain.class;
Class mentionedClassWithAnnotations = TestMain.MentionedClassWithAnnotation.class;