Merge "Improve CfPrinter output of code"
diff --git a/src/main/java/com/android/tools/r8/cf/CfPrinter.java b/src/main/java/com/android/tools/r8/cf/CfPrinter.java
index 580b037..28bf331 100644
--- a/src/main/java/com/android/tools/r8/cf/CfPrinter.java
+++ b/src/main/java/com/android/tools/r8/cf/CfPrinter.java
@@ -35,6 +35,7 @@
 import com.android.tools.r8.cf.code.CfSwitch;
 import com.android.tools.r8.cf.code.CfSwitch.Kind;
 import com.android.tools.r8.cf.code.CfThrow;
+import com.android.tools.r8.cf.code.CfTryCatch;
 import com.android.tools.r8.cf.code.CfUnop;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.CfCode;
@@ -52,6 +53,7 @@
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.StringUtils.BraceType;
+import it.unimi.dsi.fastutil.ints.Int2ReferenceMap.Entry;
 import it.unimi.dsi.fastutil.ints.IntList;
 import java.util.HashMap;
 import java.util.List;
@@ -112,6 +114,21 @@
         appendComment(info.signature.toString());
       }
     }
+    for (CfTryCatch tryCatch : code.getTryCatchRanges()) {
+      for (int i = 0; i < tryCatch.guards.size(); i++) {
+        newline();
+        DexType guard = tryCatch.guards.get(i);
+        builder
+            .append(".catch ")
+            .append(guard == null ? "all" : guard.getInternalName())
+            .append(" from ")
+            .append(getLabel(tryCatch.start))
+            .append(" to ")
+            .append(getLabel(tryCatch.end))
+            .append(" using ")
+            .append(getLabel(tryCatch.targets.get(i)));
+      }
+    }
     for (CfInstruction instruction : code.getInstructions()) {
       instruction.print(this);
     }
@@ -210,9 +227,13 @@
   }
 
   public void print(CfFrame frame) {
-    StringBuilder builder = new StringBuilder("frame: ");
-    StringUtils.append(builder, frame.getLocals().values(), ", ", BraceType.SQUARE);
-    builder.append(' ');
+    StringBuilder builder = new StringBuilder("frame: [");
+    String separator = "";
+    for (Entry<DexType> entry : frame.getLocals().int2ReferenceEntrySet()) {
+      builder.append(separator).append(entry.getIntKey()).append(':').append(entry.getValue());
+      separator = ", ";
+    }
+    builder.append("] ");
     StringUtils.append(builder, frame.getStack(), ", ", BraceType.SQUARE);
     comment(builder.toString());
   }
diff --git a/src/main/java/com/android/tools/r8/graph/CfCode.java b/src/main/java/com/android/tools/r8/graph/CfCode.java
index 58451eb..947f77e 100644
--- a/src/main/java/com/android/tools/r8/graph/CfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/CfCode.java
@@ -91,6 +91,10 @@
     return maxLocals;
   }
 
+  public List<CfTryCatch> getTryCatchRanges() {
+    return tryCatchRanges;
+  }
+
   public List<CfInstruction> getInstructions() {
     return Collections.unmodifiableList(instructions);
   }