Add more instructions to CfCodePrinter
* CfFieldInstruction
* CfConstClass
* CfMonitor
Change-Id: I5a054cd11bac417a4e09374568cf002a93873b77
diff --git a/src/main/java/com/android/tools/r8/cf/CfCodePrinter.java b/src/main/java/com/android/tools/r8/cf/CfCodePrinter.java
index 02aebd3..fdec52c 100644
--- a/src/main/java/com/android/tools/r8/cf/CfCodePrinter.java
+++ b/src/main/java/com/android/tools/r8/cf/CfCodePrinter.java
@@ -49,6 +49,7 @@
import com.android.tools.r8.cf.code.CfTryCatch;
import com.android.tools.r8.errors.Unimplemented;
import com.android.tools.r8.graph.CfCode;
+import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProto;
@@ -56,6 +57,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.code.If.Type;
import com.android.tools.r8.ir.code.MemberType;
+import com.android.tools.r8.ir.code.Monitor;
import com.android.tools.r8.ir.code.NumericType;
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.utils.StringUtils;
@@ -72,6 +74,7 @@
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
+import org.objectweb.asm.Opcodes;
/** Rudimentary printer to print the source representation for creating CfCode object. */
public class CfCodePrinter extends CfPrinter {
@@ -198,6 +201,14 @@
return r8Type("FrameType", ImmutableList.of("cf", "code", "CfFrame"));
}
+ private String monitorType() {
+ return r8Type("Monitor", ImmutableList.of("ir", "code"));
+ }
+
+ private String asmOpcodesType() {
+ return type("Opcodes", ImmutableList.of("org", "objectweb", "asm"));
+ }
+
private String dexItemFactoryType() {
return r8Type("DexItemFactory", "graph");
}
@@ -312,6 +323,16 @@
+ ")";
}
+ private String dexField(DexField field) {
+ return "options.itemFactory.createField("
+ + dexType(field.holder)
+ + ", "
+ + dexType(field.type)
+ + ", "
+ + dexString(field.name)
+ + ")";
+ }
+
private void ensureComma() {
if (pendingComma) {
builder.append(",");
@@ -363,7 +384,7 @@
@Override
public void print(CfConstClass constClass) {
- throw new Unimplemented(constClass.getClass().getSimpleName());
+ printNewInstruction("CfConstClass", dexType(constClass.getType()));
}
@Override
@@ -378,7 +399,11 @@
@Override
public void print(CfMonitor monitor) {
- throw new Unimplemented(monitor.getClass().getSimpleName());
+ printNewInstruction(
+ "CfMonitor",
+ monitor.getType() == Monitor.Type.ENTER
+ ? monitorType() + ".Type.ENTER"
+ : monitorType() + ".Type.EXIT");
}
@Override
@@ -500,7 +525,23 @@
@Override
public void print(CfFieldInstruction insn) {
- throw new Unimplemented(insn.getClass().getSimpleName());
+ printNewInstruction(
+ "CfFieldInstruction", fieldInstructionOpcode(insn), dexField(insn.getField()));
+ }
+
+ private String fieldInstructionOpcode(CfFieldInstruction insn) {
+ switch (insn.getOpcode()) {
+ case Opcodes.GETSTATIC:
+ return asmOpcodesType() + ".GETSTATIC";
+ case Opcodes.PUTSTATIC:
+ return asmOpcodesType() + ".PUTSTATIC";
+ case Opcodes.GETFIELD:
+ return asmOpcodesType() + ".GETFIELD";
+ case Opcodes.PUTFIELD:
+ return asmOpcodesType() + ".PUTFIELD";
+ default:
+ throw new Unimplemented();
+ }
}
@Override