Add asmify method to ClassSubject
Change-Id: If48f8b2c3c8f1679c6a4e4e4d7bb82bba7eea744
diff --git a/build.gradle b/build.gradle
index 730d291..c47befd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -35,7 +35,7 @@
ext {
androidSupportVersion = '25.4.0'
- asmVersion = '8.0' // When updating update tools/asmifier.py as well.
+ asmVersion = '8.0' // When updating update tools/asmifier.py and Toolhelper as well.
espressoVersion = '3.0.0'
fastutilVersion = '7.2.0'
guavaVersion = '23.0'
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 7de9a9a..e6fd9e0 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -121,6 +121,9 @@
public static final String JAVA_CLASSES_DIR = BUILD_DIR + "classes/java/";
public static final String JDK_11_TESTS_CLASSES_DIR = JAVA_CLASSES_DIR + "jdk11Tests/";
+ public static final String ASM_JAR = BUILD_DIR + "deps/asm-8.0.jar";
+ public static final String ASM_UTIL_JAR = BUILD_DIR + "deps/asm-util-8.0.jar";
+
public static final Path API_SAMPLE_JAR = Paths.get("tests", "r8_api_usage_sample.jar");
public static final String LINE_SEPARATOR = StringUtils.LINE_SEPARATOR;
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
index 75c2325..fe4d4d9 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
@@ -12,6 +12,7 @@
import java.util.List;
import java.util.function.Consumer;
import kotlinx.metadata.jvm.KotlinClassMetadata;
+import org.junit.rules.TemporaryFolder;
public class AbsentClassSubject extends ClassSubject {
@@ -190,7 +191,12 @@
}
@Override
- public void disassembleUsingJavap(boolean verbose) throws Exception {
+ public String disassembleUsingJavap(boolean verbose) throws Exception {
throw new Unreachable("Cannot disassembly an absent class");
}
+
+ @Override
+ public String asmify(TemporaryFolder tempFolder, boolean debug) throws Exception {
+ throw new Unreachable("Cannot asmify an absent class");
+ }
}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
index d3c1ecc..96b0d0c 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
@@ -25,6 +25,7 @@
import java.util.function.Consumer;
import java.util.function.Predicate;
import kotlinx.metadata.jvm.KotlinClassMetadata;
+import org.junit.rules.TemporaryFolder;
public abstract class ClassSubject extends Subject {
@@ -217,5 +218,7 @@
public abstract ClassNamingForNameMapper getNaming();
- public abstract void disassembleUsingJavap(boolean verbose) throws Exception;
+ public abstract String disassembleUsingJavap(boolean verbose) throws Exception;
+
+ public abstract String asmify(TemporaryFolder tempFolder, boolean debug) throws Exception;
}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
index 1f16bb5..dbdff3d 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
@@ -30,10 +30,14 @@
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.ZipUtils;
+import java.io.File;
+import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import kotlinx.metadata.jvm.KotlinClassMetadata;
+import org.junit.rules.TemporaryFolder;
public class FoundClassSubject extends ClassSubject {
@@ -424,7 +428,7 @@
}
@Override
- public void disassembleUsingJavap(boolean verbose) throws Exception {
+ public String disassembleUsingJavap(boolean verbose) throws Exception {
assert dexClass.origin != null;
List<String> command = new ArrayList<>();
command.add(
@@ -442,5 +446,34 @@
ProcessResult processResult = ToolHelper.runProcess(new ProcessBuilder(command));
assert processResult.exitCode == 0;
System.out.println(processResult.stdout);
+ return processResult.stdout;
+ }
+
+ @Override
+ public String asmify(TemporaryFolder tempFolder, boolean debug) throws Exception {
+ assert dexClass.origin != null;
+ List<String> parts = dexClass.origin.parts();
+ assert parts.size() == 2;
+ String directory = parts.get(0);
+ String fileName = parts.get(1);
+ if (directory.endsWith(".jar") || directory.endsWith(".zip")) {
+ File tempOut = tempFolder.newFolder();
+ ZipUtils.unzip(directory, tempOut);
+ directory = tempOut.getAbsolutePath();
+ }
+ List<String> command = new ArrayList<>();
+ command.add(
+ CfRuntime.getCheckedInJdk9().getJavaHome().resolve("bin").resolve("java").toString());
+ command.add("-cp");
+ command.add(ToolHelper.ASM_JAR + ":" + ToolHelper.ASM_UTIL_JAR);
+ command.add("org.objectweb.asm.util.ASMifier");
+ if (!debug) {
+ command.add("-debug");
+ }
+ command.add(Paths.get(directory, fileName).toString());
+ ProcessResult processResult = ToolHelper.runProcess(new ProcessBuilder(command));
+ assert processResult.exitCode == 0;
+ System.out.println(processResult.stdout);
+ return processResult.stdout;
}
}