Merge "Read frames into JarCode for CF backend fallback"
diff --git a/src/main/java/com/android/tools/r8/graph/JarCode.java b/src/main/java/com/android/tools/r8/graph/JarCode.java
index f9ea993..8933353 100644
--- a/src/main/java/com/android/tools/r8/graph/JarCode.java
+++ b/src/main/java/com/android/tools/r8/graph/JarCode.java
@@ -187,8 +187,14 @@
     if (context != null) {
       // The SecondVistor is in charge of setting the context to null.
       DexProgramClass owner = context.owner;
-      new ClassReader(context.classCache).accept(new SecondVisitor(context, application),
-          ClassReader.SKIP_FRAMES);
+      int flags = ClassReader.SKIP_FRAMES;
+      if (application.options.isGeneratingClassFiles()) {
+        // TODO(mathiasr): Keep frames in JarCode until IR->CF construction is complete.
+        // When we throw Unimplemented in IR->CF construction, the original JarCode is output
+        // instead. In this case we must output frames as well, or we will fail verification.
+        flags = 0;
+      }
+      new ClassReader(context.classCache).accept(new SecondVisitor(context, application), flags);
       assert verifyNoReparseContext(owner);
     }
   }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java
index aa51da1..894ba4f 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java
@@ -53,6 +53,7 @@
 import org.objectweb.asm.Type;
 import org.objectweb.asm.tree.AbstractInsnNode;
 import org.objectweb.asm.tree.FieldInsnNode;
+import org.objectweb.asm.tree.FrameNode;
 import org.objectweb.asm.tree.IincInsnNode;
 import org.objectweb.asm.tree.InsnNode;
 import org.objectweb.asm.tree.IntInsnNode;
@@ -1173,6 +1174,9 @@
       case AbstractInsnNode.LINE:
         updateState((LineNumberNode) insn);
         break;
+      case AbstractInsnNode.FRAME:
+        updateState((FrameNode) insn);
+        break;
       default:
         throw new Unreachable("Unexpected instruction " + insn);
     }
@@ -1794,6 +1798,11 @@
     // Intentionally empty.
   }
 
+  private void updateState(FrameNode insn) {
+    assert application.options.isGeneratingClassFiles();
+    // Intentionally empty.
+  }
+
   private void updateStateForConversion(Type from, Type to) {
     state.pop();
     state.push(to);
@@ -1848,6 +1857,9 @@
       case AbstractInsnNode.LINE:
         build((LineNumberNode) insn, builder);
         break;
+      case AbstractInsnNode.FRAME:
+        build((FrameNode) insn, builder);
+        break;
       default:
         throw new Unreachable("Unexpected instruction " + insn);
     }
@@ -2916,6 +2928,11 @@
     builder.addDebugPosition(currentPosition);
   }
 
+  private void build(FrameNode insn, IRBuilder builder) {
+    assert application.options.isGeneratingClassFiles();
+    // Intentionally empty.
+  }
+
   @Override
   public Position getDebugPositionAtOffset(int offset) {
     if (offset == EXCEPTIONAL_SYNC_EXIT_OFFSET) {
diff --git a/src/test/java/com/android/tools/r8/cf/AnnotationTestRunner.java b/src/test/java/com/android/tools/r8/cf/AnnotationTestRunner.java
index 5c48073..aeddc54 100644
--- a/src/test/java/com/android/tools/r8/cf/AnnotationTestRunner.java
+++ b/src/test/java/com/android/tools/r8/cf/AnnotationTestRunner.java
@@ -13,17 +13,17 @@
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.origin.Origin;
 import java.nio.file.Path;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 
 public class AnnotationTestRunner {
   static final Class CLASS = AnnotationTest.class;
-  @Rule public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
+
+  @Rule
+  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
 
   @Test
-  @Ignore
   public void test() throws Exception {
     ProcessResult runInput =
         ToolHelper.runJava(ToolHelper.getClassPathForTests(), CLASS.getCanonicalName());