Implement printing of CfFrame in CfCodePrinter

Moving towards reading all stack map frames for populating the initial
type of phi's has the side-effect that printing of CfFrames is necessary

Change-Id: I8717c7b0b2b9411da67ecea379bcdc96d2d65270
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 21a5392..5fb9822 100644
--- a/src/main/java/com/android/tools/r8/cf/CfCodePrinter.java
+++ b/src/main/java/com/android/tools/r8/cf/CfCodePrinter.java
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.cf;
 
+import static com.android.tools.r8.utils.StringUtils.join;
+
 import com.android.tools.r8.cf.code.CfArithmeticBinop;
 import com.android.tools.r8.cf.code.CfArrayLength;
 import com.android.tools.r8.cf.code.CfArrayLoad;
@@ -18,6 +20,7 @@
 import com.android.tools.r8.cf.code.CfDexItemBasedConstString;
 import com.android.tools.r8.cf.code.CfFieldInstruction;
 import com.android.tools.r8.cf.code.CfFrame;
+import com.android.tools.r8.cf.code.CfFrame.FrameType;
 import com.android.tools.r8.cf.code.CfGoto;
 import com.android.tools.r8.cf.code.CfIf;
 import com.android.tools.r8.cf.code.CfIfCmp;
@@ -46,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.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProto;
 import com.android.tools.r8.graph.DexString;
@@ -185,6 +189,23 @@
     return type("ImmutableList", ImmutableList.of("com", "google", "common", "collect"));
   }
 
+  private String int2ReferenceAVLTreeMapType() {
+    return type(
+        "Int2ReferenceAVLTreeMap", ImmutableList.of("it", "unimi", "dsi", "fastutil", "ints"));
+  }
+
+  private String frameTypeType() {
+    return r8Type("FrameType", ImmutableList.of("cf", "code", "CfFrame"));
+  }
+
+  private String dexItemFactoryType() {
+    return r8Type("DexItemFactory", "graph");
+  }
+
+  private String arraysType() {
+    return type("Arrays", ImmutableList.of("java", "util"));
+  }
+
   private String r8Type(String name, String pkg) {
     return r8Type(name, Collections.singletonList(pkg));
   }
@@ -427,7 +448,40 @@
 
   @Override
   public void print(CfFrame frame) {
-    throw new Unimplemented(frame.getClass().getSimpleName());
+    String keys = join(frame.getLocals().keySet(), ",", BraceType.NONE);
+    String values = join(frame.getLocals().values(), ",", BraceType.NONE, this::frameTypeType);
+    String stack = join(frame.getStack(), ",", BraceType.NONE, this::frameTypeType);
+    printNewInstruction(
+        "CfFrame",
+        "new "
+            + int2ReferenceAVLTreeMapType()
+            + "<>("
+            + "new int[] {"
+            + keys
+            + "},"
+            + "new "
+            + frameTypeType()
+            + "[] { "
+            + values
+            + " })",
+        arraysType() + ".asList(" + stack + ")");
+  }
+
+  private String frameTypeType(FrameType frameType) {
+    if (frameType.isTop()) {
+      return frameTypeType() + ".top()";
+    } else if (frameType.isUninitializedThis()) {
+      return frameTypeType() + ".uninitializedThis()";
+    } else if (frameType.isUninitializedNew()) {
+      return frameTypeType() + ".uninitializedNew(new " + cfType("CfLabel") + "())";
+    } else {
+      assert frameType.isInitialized();
+      if (frameType.getInitializedType() == DexItemFactory.nullValueType) {
+        return frameTypeType() + ".initialized(" + dexItemFactoryType() + ".nullValueType)";
+      } else {
+        return frameTypeType() + ".initialized(" + dexType(frameType.getInitializedType()) + ")";
+      }
+    }
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/BackportedMethods.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/BackportedMethods.java
index bc3c320..d28ee6d 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/backports/BackportedMethods.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/BackportedMethods.java
@@ -16,6 +16,8 @@
 import com.android.tools.r8.cf.code.CfCmp;
 import com.android.tools.r8.cf.code.CfConstNumber;
 import com.android.tools.r8.cf.code.CfConstString;
+import com.android.tools.r8.cf.code.CfFrame;
+import com.android.tools.r8.cf.code.CfFrame.FrameType;
 import com.android.tools.r8.cf.code.CfGoto;
 import com.android.tools.r8.cf.code.CfIf;
 import com.android.tools.r8.cf.code.CfIfCmp;
@@ -45,6 +47,8 @@
 import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.utils.InternalOptions;
 import com.google.common.collect.ImmutableList;
+import it.unimi.dsi.fastutil.ints.Int2ReferenceAVLTreeMap;
+import java.util.Arrays;
 
 public final class BackportedMethods {
 
@@ -52,6 +56,7 @@
     factory.createSynthesizedType("Ljava/lang/ArithmeticException;");
     factory.createSynthesizedType("Ljava/lang/AssertionError;");
     factory.createSynthesizedType("Ljava/lang/Double;");
+    factory.createSynthesizedType("Ljava/lang/Exception;");
     factory.createSynthesizedType("Ljava/lang/ExceptionInInitializerError;");
     factory.createSynthesizedType("Ljava/lang/Float;");
     factory.createSynthesizedType("Ljava/lang/IllegalAccessException;");
@@ -97,8 +102,10 @@
     factory.createSynthesizedType("Ljava/util/stream/IntStream;");
     factory.createSynthesizedType("Ljava/util/stream/LongStream;");
     factory.createSynthesizedType("Ljava/util/stream/Stream;");
+    factory.createSynthesizedType("[Ljava/lang/CharSequence;");
     factory.createSynthesizedType("[Ljava/lang/Class;");
     factory.createSynthesizedType("[Ljava/lang/Object;");
+    factory.createSynthesizedType("[Ljava/util/Map$Entry;");
   }
 
   public static CfCode BooleanMethods_compare(InternalOptions options, DexMethod method) {
@@ -119,13 +126,37 @@
             new CfConstNumber(0, ValueType.INT),
             new CfGoto(label3),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 0),
             new CfIf(If.Type.EQ, ValueType.INT, label2),
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label3),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(-1, ValueType.INT),
             label3,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label4),
         ImmutableList.of(),
@@ -148,8 +179,18 @@
             new CfConstNumber(1231, ValueType.INT),
             new CfGoto(label2),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {FrameType.initialized(options.itemFactory.intType)}),
+                Arrays.asList()),
             new CfConstNumber(1237, ValueType.INT),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {FrameType.initialized(options.itemFactory.intType)}),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label3),
         ImmutableList.of(),
@@ -281,6 +322,16 @@
             new CfConstNumber(0, ValueType.INT),
             new CfReturn(ValueType.INT),
             label4,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.charSequenceType),
+                      FrameType.initialized(options.itemFactory.charSequenceType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             new CfStore(ValueType.INT, 4),
             label5,
@@ -298,6 +349,18 @@
                 false),
             new CfStore(ValueType.INT, 5),
             label6,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3, 4, 5},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.charSequenceType),
+                      FrameType.initialized(options.itemFactory.charSequenceType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 4),
             new CfLoad(ValueType.INT, 5),
             new CfIfCmp(If.Type.GE, ValueType.INT, label12),
@@ -335,9 +398,31 @@
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Sub, NumericType.INT),
             new CfReturn(ValueType.INT),
             label11,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3, 4, 5},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.charSequenceType),
+                      FrameType.initialized(options.itemFactory.charSequenceType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfIinc(4, 1),
             new CfGoto(label6),
             label12,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.charSequenceType),
+                      FrameType.initialized(options.itemFactory.charSequenceType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 2),
             new CfLoad(ValueType.INT, 3),
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Sub, NumericType.INT),
@@ -441,6 +526,14 @@
                 true),
             new CfGoto(label11),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.throwableType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 1),
             new CfInvoke(
                 182,
@@ -482,6 +575,16 @@
             label4,
             new CfGoto(label11),
             label5,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.throwableType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList(
+                    FrameType.initialized(
+                        options.itemFactory.createType("Ljava/lang/Exception;")))),
             new CfStore(ValueType.OBJECT, 2),
             label6,
             new CfNew(options.itemFactory.createType("Ljava/lang/AssertionError;")),
@@ -540,6 +643,14 @@
                 false),
             new CfThrow(),
             label7,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.throwableType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.throwableType))),
             new CfStore(ValueType.OBJECT, 2),
             label8,
             new CfNew(options.itemFactory.createType("Ljava/lang/AssertionError;")),
@@ -598,6 +709,17 @@
                 false),
             new CfThrow(),
             label9,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.throwableType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList(
+                    FrameType.initialized(
+                        options.itemFactory.createType(
+                            "Ljava/lang/reflect/InvocationTargetException;")))),
             new CfStore(ValueType.OBJECT, 2),
             label10,
             new CfLoad(ValueType.OBJECT, 2),
@@ -610,8 +732,24 @@
                 false),
             new CfThrow(),
             label11,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.throwableType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfGoto(label16),
             label12,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.throwableType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.throwableType))),
             new CfStore(ValueType.OBJECT, 2),
             label13,
             new CfLoad(ValueType.OBJECT, 0),
@@ -619,10 +757,36 @@
             new CfLoad(ValueType.OBJECT, 0),
             new CfGoto(label15),
             label14,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.throwableType),
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.throwableType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 2),
             label15,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.throwableType),
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.throwableType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.throwableType))),
             new CfThrow(),
             label16,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.throwableType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfReturnVoid(),
             label17),
         ImmutableList.of(
@@ -706,6 +870,18 @@
             new CfConstNumber(0, ValueType.INT),
             new CfStore(ValueType.INT, 4),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.createType("[Ljava/lang/Object;")),
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/ArrayList;")),
+                      FrameType.initialized(options.itemFactory.createType("[Ljava/lang/Object;")),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 4),
             new CfLoad(ValueType.INT, 3),
             new CfIfCmp(If.Type.GE, ValueType.INT, label5),
@@ -737,6 +913,14 @@
             new CfIinc(4, 1),
             new CfGoto(label2),
             label5,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.createType("[Ljava/lang/Object;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/ArrayList;"))
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 1),
             new CfInvoke(
                 184,
@@ -844,6 +1028,19 @@
             new CfConstNumber(0, ValueType.INT),
             new CfStore(ValueType.INT, 4),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3, 4},
+                    new FrameType[] {
+                      FrameType.initialized(
+                          options.itemFactory.createType("[Ljava/util/Map$Entry;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/HashMap;")),
+                      FrameType.initialized(
+                          options.itemFactory.createType("[Ljava/util/Map$Entry;")),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 4),
             new CfLoad(ValueType.INT, 3),
             new CfIfCmp(If.Type.GE, ValueType.INT, label8),
@@ -949,9 +1146,31 @@
                 false),
             new CfThrow(),
             label7,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3, 4},
+                    new FrameType[] {
+                      FrameType.initialized(
+                          options.itemFactory.createType("[Ljava/util/Map$Entry;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/HashMap;")),
+                      FrameType.initialized(
+                          options.itemFactory.createType("[Ljava/util/Map$Entry;")),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfIinc(4, 1),
             new CfGoto(label2),
             label8,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(
+                          options.itemFactory.createType("[Ljava/util/Map$Entry;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/HashMap;"))
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 1),
             new CfInvoke(
                 184,
@@ -1005,6 +1224,17 @@
             new CfConstNumber(0, ValueType.INT),
             new CfStore(ValueType.INT, 4),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.createType("[Ljava/lang/Object;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/HashSet;")),
+                      FrameType.initialized(options.itemFactory.createType("[Ljava/lang/Object;")),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 4),
             new CfLoad(ValueType.INT, 3),
             new CfIfCmp(If.Type.GE, ValueType.INT, label6),
@@ -1079,9 +1309,28 @@
                 false),
             new CfThrow(),
             label5,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.createType("[Ljava/lang/Object;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/HashSet;")),
+                      FrameType.initialized(options.itemFactory.createType("[Ljava/lang/Object;")),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfIinc(4, 1),
             new CfGoto(label2),
             label6,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.createType("[Ljava/lang/Object;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/HashSet;"))
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 1),
             new CfInvoke(
                 184,
@@ -1143,6 +1392,17 @@
                 true),
             new CfStore(ValueType.OBJECT, 2),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/Collection;")),
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/ArrayList;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/Iterator;"))
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 2),
             new CfInvoke(
                 185,
@@ -1184,6 +1444,15 @@
             label4,
             new CfGoto(label2),
             label5,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/Collection;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/ArrayList;"))
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 1),
             new CfInvoke(
                 184,
@@ -1256,6 +1525,15 @@
                 true),
             new CfStore(ValueType.OBJECT, 2),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/Map;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/HashMap;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/Iterator;"))
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 2),
             new CfInvoke(
                 185,
@@ -1326,6 +1604,14 @@
             label7,
             new CfGoto(label2),
             label8,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/Map;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/HashMap;"))
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 1),
             new CfInvoke(
                 184,
@@ -1387,6 +1673,16 @@
                 true),
             new CfStore(ValueType.OBJECT, 2),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/Collection;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/HashSet;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/Iterator;"))
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 2),
             new CfInvoke(
                 185,
@@ -1428,6 +1724,15 @@
             label4,
             new CfGoto(label2),
             label5,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/Collection;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/HashSet;"))
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 1),
             new CfInvoke(
                 184,
@@ -1601,8 +1906,18 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label2),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {FrameType.initialized(options.itemFactory.doubleType)}),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {FrameType.initialized(options.itemFactory.doubleType)}),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label3),
         ImmutableList.of(),
@@ -1643,8 +1958,18 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label2),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {FrameType.initialized(options.itemFactory.floatType)}),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {FrameType.initialized(options.itemFactory.floatType)}),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label3),
         ImmutableList.of(),
@@ -1669,14 +1994,38 @@
             new CfConstNumber(0, ValueType.INT),
             new CfGoto(label3),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 0),
             new CfLoad(ValueType.INT, 1),
             new CfIfCmp(If.Type.GE, ValueType.INT, label2),
             new CfConstNumber(-1, ValueType.INT),
             new CfGoto(label3),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(1, ValueType.INT),
             label3,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label4),
         ImmutableList.of(),
@@ -1832,6 +2181,14 @@
                 false),
             new CfStore(ValueType.OBJECT, 0),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 0),
             new CfLoad(ValueType.INT, 1),
             new CfInvoke(
@@ -1927,6 +2284,15 @@
                 false),
             new CfThrow(),
             label5,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.LONG, 2),
             new CfNumberConversion(NumericType.LONG, NumericType.INT),
             new CfReturn(ValueType.INT),
@@ -2134,9 +2500,27 @@
             new CfConstNumber(0, ValueType.LONG),
             new CfReturn(ValueType.LONG),
             label5,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4, 6},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(1, ValueType.LONG),
             new CfReturn(ValueType.LONG),
             label6,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.LONG, 0),
             new CfConstNumber(0, ValueType.LONG),
             new CfCmp(Cmp.Bias.NONE, NumericType.LONG),
@@ -2147,6 +2531,14 @@
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Div, NumericType.LONG),
             new CfReturn(ValueType.LONG),
             label8,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.LONG, 0),
             new CfConstNumber(1, ValueType.INT),
             new CfLogicalBinop(CfLogicalBinop.Opcode.Ushr, NumericType.LONG),
@@ -2181,8 +2573,34 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label14),
             label13,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4, 6, 8, 10},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.longType))),
             new CfConstNumber(0, ValueType.INT),
             label14,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4, 6, 8, 10},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList(
+                    FrameType.initialized(options.itemFactory.longType),
+                    FrameType.initialized(options.itemFactory.intType))),
             new CfNumberConversion(NumericType.INT, NumericType.LONG),
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Add, NumericType.LONG),
             new CfReturn(ValueType.LONG),
@@ -2295,6 +2713,15 @@
                 false),
             new CfThrow(),
             label3,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 1),
             new CfConstNumber(2, ValueType.INT),
             new CfIfCmp(If.Type.LT, ValueType.INT, label4),
@@ -2302,6 +2729,15 @@
             new CfConstNumber(36, ValueType.INT),
             new CfIfCmp(If.Type.LE, ValueType.INT, label5),
             label4,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfNew(options.itemFactory.createType("Ljava/lang/NumberFormatException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfConstString(options.itemFactory.createString("illegal radix: ")),
@@ -2332,6 +2768,15 @@
                 false),
             new CfThrow(),
             label5,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(-1, ValueType.LONG),
             new CfLoad(ValueType.INT, 1),
             new CfNumberConversion(NumericType.INT, NumericType.LONG),
@@ -2365,8 +2810,28 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label8),
             label7,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label8,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfStore(ValueType.INT, 5),
             label9,
             new CfConstNumber(0, ValueType.LONG),
@@ -2375,6 +2840,19 @@
             new CfLoad(ValueType.INT, 5),
             new CfStore(ValueType.INT, 8),
             label11,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3, 5, 6, 8},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 8),
             new CfLoad(ValueType.INT, 2),
             new CfIfCmp(If.Type.GE, ValueType.INT, label20),
@@ -2419,6 +2897,20 @@
                 false),
             new CfThrow(),
             label15,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3, 5, 6, 8, 9},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.LONG, 6),
             new CfConstNumber(0, ValueType.LONG),
             new CfCmp(Cmp.Bias.NONE, NumericType.LONG),
@@ -2449,6 +2941,20 @@
             new CfNumberConversion(NumericType.LONG, NumericType.INT),
             new CfIfCmp(If.Type.LE, ValueType.INT, label18),
             label17,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3, 5, 6, 8, 9},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfNew(options.itemFactory.createType("Ljava/lang/NumberFormatException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfConstString(options.itemFactory.createString("Too large for unsigned long: ")),
@@ -2471,6 +2977,20 @@
                 false),
             new CfThrow(),
             label18,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3, 5, 6, 8, 9},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.LONG, 6),
             new CfLoad(ValueType.INT, 1),
             new CfNumberConversion(NumericType.INT, NumericType.LONG),
@@ -2483,6 +3003,18 @@
             new CfIinc(8, 1),
             new CfGoto(label11),
             label20,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3, 5, 6},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.LONG, 6),
             new CfReturn(ValueType.LONG),
             label21),
@@ -2536,11 +3068,29 @@
             new CfLoad(ValueType.LONG, 0),
             new CfReturn(ValueType.LONG),
             label5,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4, 6},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.LONG, 0),
             new CfLoad(ValueType.LONG, 2),
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Sub, NumericType.LONG),
             new CfReturn(ValueType.LONG),
             label6,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.LONG, 0),
             new CfConstNumber(0, ValueType.LONG),
             new CfCmp(Cmp.Bias.NONE, NumericType.LONG),
@@ -2551,6 +3101,14 @@
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Rem, NumericType.LONG),
             new CfReturn(ValueType.LONG),
             label8,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.LONG, 0),
             new CfConstNumber(1, ValueType.INT),
             new CfLogicalBinop(CfLogicalBinop.Opcode.Ushr, NumericType.LONG),
@@ -2585,8 +3143,34 @@
             new CfLoad(ValueType.LONG, 2),
             new CfGoto(label14),
             label13,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4, 6, 8, 10},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.longType))),
             new CfConstNumber(0, ValueType.LONG),
             label14,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4, 6, 8, 10},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList(
+                    FrameType.initialized(options.itemFactory.longType),
+                    FrameType.initialized(options.itemFactory.longType))),
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Sub, NumericType.LONG),
             new CfReturn(ValueType.LONG),
             label15),
@@ -2664,6 +3248,14 @@
             new CfConstString(options.itemFactory.createString("0")),
             new CfReturn(ValueType.OBJECT),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.LONG, 0),
             new CfConstNumber(0, ValueType.LONG),
             new CfCmp(Cmp.Bias.NONE, NumericType.LONG),
@@ -2683,6 +3275,14 @@
                 false),
             new CfReturn(ValueType.OBJECT),
             label4,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 2),
             new CfConstNumber(2, ValueType.INT),
             new CfIfCmp(If.Type.LT, ValueType.INT, label5),
@@ -2690,9 +3290,25 @@
             new CfConstNumber(36, ValueType.INT),
             new CfIfCmp(If.Type.LE, ValueType.INT, label6),
             label5,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(10, ValueType.INT),
             new CfStore(ValueType.INT, 2),
             label6,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(64, ValueType.INT),
             new CfNewArray(options.itemFactory.charArrayType),
             new CfStore(ValueType.OBJECT, 3),
@@ -2724,6 +3340,18 @@
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Sub, NumericType.INT),
             new CfStore(ValueType.INT, 6),
             label11,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 3, 4, 5, 6},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.charArrayType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 3),
             new CfIinc(4, -1),
             new CfLoad(ValueType.INT, 4),
@@ -2756,6 +3384,16 @@
             label14,
             new CfGoto(label25),
             label15,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 3, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.charArrayType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 2),
             new CfConstNumber(1, ValueType.INT),
             new CfLogicalBinop(CfLogicalBinop.Opcode.And, NumericType.INT),
@@ -2773,6 +3411,16 @@
             label17,
             new CfGoto(label19),
             label18,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 3, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.charArrayType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.LONG, 0),
             new CfLoad(ValueType.INT, 2),
             new CfNumberConversion(NumericType.INT, NumericType.LONG),
@@ -2788,6 +3436,17 @@
                 false),
             new CfStore(ValueType.LONG, 5),
             label19,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 3, 4, 5},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.charArrayType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.LONG, 0),
             new CfLoad(ValueType.LONG, 5),
             new CfLoad(ValueType.INT, 2),
@@ -2817,6 +3476,18 @@
             new CfLoad(ValueType.LONG, 5),
             new CfStore(ValueType.LONG, 0),
             label22,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 3, 4, 5, 7},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.charArrayType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.LONG, 0),
             new CfConstNumber(0, ValueType.LONG),
             new CfCmp(Cmp.Bias.NONE, NumericType.LONG),
@@ -2850,6 +3521,16 @@
             new CfStore(ValueType.LONG, 0),
             new CfGoto(label22),
             label25,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 3, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.charArrayType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfNew(options.itemFactory.stringType),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfLoad(ValueType.OBJECT, 3),
@@ -2908,6 +3589,16 @@
             new CfLoad(ValueType.INT, 4),
             new CfReturn(ValueType.INT),
             label4,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfNew(options.itemFactory.createType("Ljava/lang/ArithmeticException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
@@ -2953,8 +3644,26 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label3),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label3,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfLoad(ValueType.LONG, 0),
             new CfLoad(ValueType.LONG, 4),
             new CfLogicalBinop(CfLogicalBinop.Opcode.Xor, NumericType.LONG),
@@ -2964,14 +3673,43 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label5),
             label4,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfConstNumber(0, ValueType.INT),
             label5,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList(
+                    FrameType.initialized(options.itemFactory.intType),
+                    FrameType.initialized(options.itemFactory.intType))),
             new CfLogicalBinop(CfLogicalBinop.Opcode.Or, NumericType.INT),
             new CfIf(If.Type.EQ, ValueType.INT, label7),
             label6,
             new CfLoad(ValueType.LONG, 4),
             new CfReturn(ValueType.LONG),
             label7,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList()),
             new CfNew(options.itemFactory.createType("Ljava/lang/ArithmeticException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
@@ -3013,6 +3751,11 @@
                 false),
             new CfThrow(),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {FrameType.initialized(options.itemFactory.intType)}),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 0),
             new CfConstNumber(1, ValueType.INT),
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Sub, NumericType.INT),
@@ -3049,6 +3792,11 @@
                 false),
             new CfThrow(),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {FrameType.initialized(options.itemFactory.longType)}),
+                Arrays.asList()),
             new CfLoad(ValueType.LONG, 0),
             new CfConstNumber(1, ValueType.LONG),
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Sub, NumericType.LONG),
@@ -3092,6 +3840,16 @@
             new CfLoad(ValueType.INT, 2),
             new CfReturn(ValueType.INT),
             label4,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(1, ValueType.INT),
             new CfLoad(ValueType.INT, 0),
             new CfLoad(ValueType.INT, 1),
@@ -3108,8 +3866,30 @@
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Sub, NumericType.INT),
             new CfGoto(label7),
             label6,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 2),
             label7,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label8),
         ImmutableList.of(),
@@ -3152,6 +3932,16 @@
             new CfLoad(ValueType.LONG, 4),
             new CfReturn(ValueType.LONG),
             label4,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4, 6},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(1, ValueType.LONG),
             new CfLoad(ValueType.LONG, 0),
             new CfLoad(ValueType.LONG, 2),
@@ -3170,8 +3960,30 @@
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Sub, NumericType.LONG),
             new CfGoto(label7),
             label6,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4, 6, 8},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.LONG, 4),
             label7,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4, 6, 8},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.longType))),
             new CfReturn(ValueType.LONG),
             label8),
         ImmutableList.of(),
@@ -3232,6 +4044,15 @@
             new CfConstNumber(0, ValueType.INT),
             new CfReturn(ValueType.INT),
             label3,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(1, ValueType.INT),
             new CfLoad(ValueType.INT, 0),
             new CfLoad(ValueType.INT, 1),
@@ -3246,10 +4067,30 @@
             new CfLoad(ValueType.INT, 2),
             new CfGoto(label6),
             label5,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 2),
             new CfLoad(ValueType.INT, 1),
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Add, NumericType.INT),
             label6,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label7),
         ImmutableList.of(),
@@ -3284,6 +4125,15 @@
             new CfConstNumber(0, ValueType.LONG),
             new CfReturn(ValueType.LONG),
             label3,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(1, ValueType.LONG),
             new CfLoad(ValueType.LONG, 0),
             new CfLoad(ValueType.LONG, 2),
@@ -3300,10 +4150,30 @@
             new CfLoad(ValueType.LONG, 4),
             new CfGoto(label6),
             label5,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4, 6},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.LONG, 4),
             new CfLoad(ValueType.LONG, 2),
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Add, NumericType.LONG),
             label6,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4, 6},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.longType))),
             new CfReturn(ValueType.LONG),
             label7),
         ImmutableList.of(),
@@ -3365,6 +4235,11 @@
                 false),
             new CfThrow(),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {FrameType.initialized(options.itemFactory.intType)}),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 0),
             new CfConstNumber(1, ValueType.INT),
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Add, NumericType.INT),
@@ -3401,6 +4276,11 @@
                 false),
             new CfThrow(),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {FrameType.initialized(options.itemFactory.longType)}),
+                Arrays.asList()),
             new CfLoad(ValueType.LONG, 0),
             new CfConstNumber(1, ValueType.LONG),
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Add, NumericType.LONG),
@@ -3443,6 +4323,16 @@
             new CfLoad(ValueType.INT, 4),
             new CfReturn(ValueType.INT),
             label4,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfNew(options.itemFactory.createType("Ljava/lang/ArithmeticException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
@@ -3540,6 +4430,15 @@
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Mul, NumericType.LONG),
             new CfReturn(ValueType.LONG),
             label7,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 4),
             new CfConstNumber(64, ValueType.INT),
             new CfIfCmp(If.Type.LT, ValueType.INT, label15),
@@ -3550,8 +4449,26 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label9),
             label8,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label9,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfLoad(ValueType.LONG, 2),
             new CfConstNumber(-9223372036854775808L, ValueType.LONG),
             new CfCmp(Cmp.Bias.NONE, NumericType.LONG),
@@ -3559,8 +4476,28 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label11),
             label10,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfConstNumber(0, ValueType.INT),
             label11,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList(
+                    FrameType.initialized(options.itemFactory.intType),
+                    FrameType.initialized(options.itemFactory.intType))),
             new CfLogicalBinop(CfLogicalBinop.Opcode.Or, NumericType.INT),
             new CfIf(If.Type.EQ, ValueType.INT, label15),
             label12,
@@ -3580,9 +4517,28 @@
             new CfCmp(Cmp.Bias.NONE, NumericType.LONG),
             new CfIf(If.Type.NE, ValueType.INT, label15),
             label14,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4, 5},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.LONG, 5),
             new CfReturn(ValueType.LONG),
             label15,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfNew(options.itemFactory.createType("Ljava/lang/ArithmeticException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
@@ -3776,6 +4732,11 @@
                 false),
             new CfThrow(),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {FrameType.initialized(options.itemFactory.intType)}),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 0),
             new CfNeg(NumericType.INT),
             new CfReturn(ValueType.INT),
@@ -3811,6 +4772,11 @@
                 false),
             new CfThrow(),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {FrameType.initialized(options.itemFactory.longType)}),
+                Arrays.asList()),
             new CfLoad(ValueType.LONG, 0),
             new CfNeg(NumericType.LONG),
             new CfReturn(ValueType.LONG),
@@ -3904,6 +4870,16 @@
             new CfLoad(ValueType.INT, 4),
             new CfReturn(ValueType.INT),
             label4,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfNew(options.itemFactory.createType("Ljava/lang/ArithmeticException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
@@ -3949,8 +4925,26 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label3),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label3,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfLoad(ValueType.LONG, 0),
             new CfLoad(ValueType.LONG, 4),
             new CfLogicalBinop(CfLogicalBinop.Opcode.Xor, NumericType.LONG),
@@ -3960,14 +4954,43 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label5),
             label4,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfConstNumber(0, ValueType.INT),
             label5,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList(
+                    FrameType.initialized(options.itemFactory.intType),
+                    FrameType.initialized(options.itemFactory.intType))),
             new CfLogicalBinop(CfLogicalBinop.Opcode.Or, NumericType.INT),
             new CfIf(If.Type.EQ, ValueType.INT, label7),
             label6,
             new CfLoad(ValueType.LONG, 4),
             new CfReturn(ValueType.LONG),
             label7,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.longType)
+                    }),
+                Arrays.asList()),
             new CfNew(options.itemFactory.createType("Ljava/lang/ArithmeticException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
@@ -4016,6 +5039,14 @@
                 false),
             new CfThrow(),
             label3,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.longType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 2),
             new CfReturn(ValueType.INT),
             label4),
@@ -4047,6 +5078,15 @@
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Sub, NumericType.INT),
             new CfIfCmp(If.Type.LE, ValueType.INT, label2),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfNew(options.itemFactory.createType("Ljava/lang/IndexOutOfBoundsException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfNew(options.itemFactory.stringBuilderType),
@@ -4147,6 +5187,15 @@
                 false),
             new CfThrow(),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 0),
             new CfReturn(ValueType.INT),
             label3),
@@ -4174,6 +5223,15 @@
             new CfLoad(ValueType.INT, 2),
             new CfIfCmp(If.Type.LE, ValueType.INT, label2),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfNew(options.itemFactory.createType("Ljava/lang/IndexOutOfBoundsException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfNew(options.itemFactory.stringBuilderType),
@@ -4256,6 +5314,15 @@
                 false),
             new CfThrow(),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 0),
             new CfReturn(ValueType.INT),
             label3),
@@ -4280,6 +5347,14 @@
             new CfLoad(ValueType.INT, 1),
             new CfIfCmp(If.Type.LT, ValueType.INT, label2),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfNew(options.itemFactory.createType("Ljava/lang/IndexOutOfBoundsException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfNew(options.itemFactory.stringBuilderType),
@@ -4344,6 +5419,14 @@
                 false),
             new CfThrow(),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 0),
             new CfReturn(ValueType.INT),
             label3),
@@ -4368,6 +5451,16 @@
             new CfConstNumber(0, ValueType.INT),
             new CfGoto(label2),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/Comparator;"))
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 2),
             new CfLoad(ValueType.OBJECT, 0),
             new CfLoad(ValueType.OBJECT, 1),
@@ -4382,6 +5475,16 @@
                     options.itemFactory.createString("compare")),
                 true),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/Comparator;"))
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label3),
         ImmutableList.of(),
@@ -4441,11 +5544,27 @@
             new CfConstNumber(1, ValueType.INT),
             new CfReturn(ValueType.INT),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 0),
             new CfIf(If.Type.NE, ValueType.OBJECT, label2),
             new CfConstNumber(0, ValueType.INT),
             new CfReturn(ValueType.INT),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 0),
             new CfInstanceOf(options.itemFactory.booleanArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label6),
@@ -4471,10 +5590,34 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label5),
             label4,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label5,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label6,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 0),
             new CfInstanceOf(options.itemFactory.byteArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label10),
@@ -4500,10 +5643,34 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label9),
             label8,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label9,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label10,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 0),
             new CfInstanceOf(options.itemFactory.charArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label14),
@@ -4529,10 +5696,34 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label13),
             label12,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label13,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label14,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 0),
             new CfInstanceOf(options.itemFactory.doubleArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label18),
@@ -4558,10 +5749,34 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label17),
             label16,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label17,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label18,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 0),
             new CfInstanceOf(options.itemFactory.floatArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label22),
@@ -4587,10 +5802,34 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label21),
             label20,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label21,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label22,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 0),
             new CfInstanceOf(options.itemFactory.intArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label26),
@@ -4616,10 +5855,34 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label25),
             label24,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label25,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label26,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 0),
             new CfInstanceOf(options.itemFactory.longArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label30),
@@ -4645,10 +5908,34 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label29),
             label28,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label29,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label30,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 0),
             new CfInstanceOf(options.itemFactory.shortArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label34),
@@ -4674,10 +5961,34 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label33),
             label32,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label33,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label34,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 0),
             new CfInstanceOf(options.itemFactory.createType("[Ljava/lang/Object;")),
             new CfIf(If.Type.EQ, ValueType.INT, label38),
@@ -4703,10 +6014,34 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label37),
             label36,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label37,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label38,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 0),
             new CfLoad(ValueType.OBJECT, 1),
             new CfInvoke(
@@ -4752,11 +6087,35 @@
                 false),
             new CfIf(If.Type.EQ, ValueType.INT, label2),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label3),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label3,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label4),
         ImmutableList.of(),
@@ -4779,6 +6138,11 @@
             new CfConstNumber(0, ValueType.INT),
             new CfGoto(label2),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {FrameType.initialized(options.itemFactory.objectType)}),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 0),
             new CfInvoke(
                 182,
@@ -4788,6 +6152,11 @@
                     options.itemFactory.createString("hashCode")),
                 false),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {FrameType.initialized(options.itemFactory.objectType)}),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label3),
         ImmutableList.of(),
@@ -4810,8 +6179,18 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label2),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {FrameType.initialized(options.itemFactory.objectType)}),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {FrameType.initialized(options.itemFactory.objectType)}),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label3),
         ImmutableList.of(),
@@ -4834,8 +6213,18 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label2),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {FrameType.initialized(options.itemFactory.objectType)}),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {FrameType.initialized(options.itemFactory.objectType)}),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label3),
         ImmutableList.of(),
@@ -4858,6 +6247,14 @@
             new CfLoad(ValueType.OBJECT, 0),
             new CfReturn(ValueType.OBJECT),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.objectType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 1),
             new CfConstString(options.itemFactory.createString("defaultObj")),
             new CfInvoke(
@@ -4893,6 +6290,15 @@
             new CfLoad(ValueType.OBJECT, 0),
             new CfReturn(ValueType.OBJECT),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/function/Supplier;"))
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 1),
             new CfConstString(options.itemFactory.createString("supplier")),
             new CfInvoke(
@@ -4961,6 +6367,14 @@
                 false),
             new CfThrow(),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.stringType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 0),
             new CfReturn(ValueType.OBJECT),
             label3),
@@ -5011,6 +6425,14 @@
             new CfLoad(ValueType.OBJECT, 1),
             new CfGoto(label2),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.stringType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 0),
             new CfInvoke(
                 182,
@@ -5020,6 +6442,14 @@
                     options.itemFactory.createString("toString")),
                 false),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.objectType),
+                      FrameType.initialized(options.itemFactory.stringType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.stringType))),
             new CfReturn(ValueType.OBJECT),
             label3),
         ImmutableList.of(),
@@ -5067,6 +6497,16 @@
                 true),
             new CfGoto(label3),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/Optional;")),
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/function/Consumer;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/lang/Runnable;"))
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 2),
             new CfInvoke(
                 185,
@@ -5076,6 +6516,16 @@
                     options.itemFactory.createString("run")),
                 true),
             label3,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/Optional;")),
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/function/Consumer;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/lang/Runnable;"))
+                    }),
+                Arrays.asList()),
             new CfReturnVoid(),
             label4),
         ImmutableList.of(),
@@ -5124,6 +6574,17 @@
                 true),
             new CfGoto(label3),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/OptionalDouble;")),
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/function/DoubleConsumer;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/lang/Runnable;"))
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 2),
             new CfInvoke(
                 185,
@@ -5133,6 +6594,17 @@
                     options.itemFactory.createString("run")),
                 true),
             label3,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/OptionalDouble;")),
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/function/DoubleConsumer;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/lang/Runnable;"))
+                    }),
+                Arrays.asList()),
             new CfReturnVoid(),
             label4),
         ImmutableList.of(),
@@ -5181,6 +6653,17 @@
                 true),
             new CfGoto(label3),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/OptionalInt;")),
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/function/IntConsumer;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/lang/Runnable;"))
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 2),
             new CfInvoke(
                 185,
@@ -5190,6 +6673,17 @@
                     options.itemFactory.createString("run")),
                 true),
             label3,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/OptionalInt;")),
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/function/IntConsumer;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/lang/Runnable;"))
+                    }),
+                Arrays.asList()),
             new CfReturnVoid(),
             label4),
         ImmutableList.of(),
@@ -5238,6 +6732,17 @@
                 true),
             new CfGoto(label3),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/OptionalLong;")),
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/function/LongConsumer;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/lang/Runnable;"))
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 2),
             new CfInvoke(
                 185,
@@ -5247,6 +6752,17 @@
                     options.itemFactory.createString("run")),
                 true),
             label3,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/OptionalLong;")),
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/function/LongConsumer;")),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/lang/Runnable;"))
+                    }),
+                Arrays.asList()),
             new CfReturnVoid(),
             label4),
         ImmutableList.of(),
@@ -5276,8 +6792,22 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label2),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/Optional;"))
+                    }),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/Optional;"))
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label3),
         ImmutableList.of(),
@@ -5307,8 +6837,24 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label2),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/OptionalDouble;"))
+                    }),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/OptionalDouble;"))
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label3),
         ImmutableList.of(),
@@ -5338,8 +6884,24 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label2),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/OptionalInt;"))
+                    }),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/OptionalInt;"))
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label3),
         ImmutableList.of(),
@@ -5369,8 +6931,24 @@
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label2),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/OptionalLong;"))
+                    }),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/OptionalLong;"))
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label3),
         ImmutableList.of(),
@@ -5414,6 +6992,15 @@
             new CfLoad(ValueType.OBJECT, 0),
             new CfReturn(ValueType.OBJECT),
             label3,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/Optional;")),
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/function/Supplier;"))
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 1),
             new CfInvoke(
                 185,
@@ -5481,6 +7068,13 @@
                 true),
             new CfReturn(ValueType.OBJECT),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/Optional;"))
+                    }),
+                Arrays.asList()),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
@@ -5535,6 +7129,14 @@
                 true),
             new CfReturn(ValueType.OBJECT),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/OptionalDouble;"))
+                    }),
+                Arrays.asList()),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
@@ -5589,6 +7191,14 @@
                 true),
             new CfReturn(ValueType.OBJECT),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/OptionalInt;"))
+                    }),
+                Arrays.asList()),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
@@ -5643,6 +7253,14 @@
                 true),
             new CfReturn(ValueType.OBJECT),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {
+                      FrameType.initialized(
+                          options.itemFactory.createType("Ljava/util/OptionalLong;"))
+                    }),
+                Arrays.asList()),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
@@ -5757,6 +7375,11 @@
                 true),
             new CfGoto(label2),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {FrameType.initialized(options.itemFactory.objectType)}),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 0),
             new CfInvoke(
                 184,
@@ -5768,6 +7391,13 @@
                     options.itemFactory.createString("of")),
                 true),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {FrameType.initialized(options.itemFactory.objectType)}),
+                Arrays.asList(
+                    FrameType.initialized(
+                        options.itemFactory.createType("Ljava/util/stream/Stream;")))),
             new CfReturn(ValueType.OBJECT),
             label3),
         ImmutableList.of(),
@@ -5804,6 +7434,15 @@
                 false),
             new CfStore(ValueType.INT, 2),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 1),
             new CfLoad(ValueType.INT, 2),
             new CfIfCmp(If.Type.GE, ValueType.INT, label8),
@@ -5834,6 +7473,16 @@
             new CfConstNumber(0, ValueType.INT),
             new CfReturn(ValueType.INT),
             label6,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 1),
             new CfLoad(ValueType.INT, 3),
             new CfInvoke(
@@ -5849,6 +7498,11 @@
             label7,
             new CfGoto(label2),
             label8,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {FrameType.initialized(options.itemFactory.stringType)}),
+                Arrays.asList()),
             new CfConstNumber(1, ValueType.INT),
             new CfReturn(ValueType.INT),
             label9),
@@ -5889,6 +7543,15 @@
                 false),
             new CfThrow(),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.charSequenceType),
+                      FrameType.initialized(
+                          options.itemFactory.createType("[Ljava/lang/CharSequence;"))
+                    }),
+                Arrays.asList()),
             new CfNew(options.itemFactory.stringBuilderType),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
@@ -5922,6 +7585,17 @@
             new CfConstNumber(1, ValueType.INT),
             new CfStore(ValueType.INT, 3),
             label5,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.charSequenceType),
+                      FrameType.initialized(
+                          options.itemFactory.createType("[Ljava/lang/CharSequence;")),
+                      FrameType.initialized(options.itemFactory.stringBuilderType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 3),
             new CfLoad(ValueType.OBJECT, 1),
             new CfArrayLength(),
@@ -5958,6 +7632,16 @@
             new CfIinc(3, 1),
             new CfGoto(label5),
             label9,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.charSequenceType),
+                      FrameType.initialized(
+                          options.itemFactory.createType("[Ljava/lang/CharSequence;")),
+                      FrameType.initialized(options.itemFactory.stringBuilderType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 2),
             new CfInvoke(
                 182,
@@ -6004,6 +7688,14 @@
                 false),
             new CfThrow(),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.charSequenceType),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/lang/Iterable;"))
+                    }),
+                Arrays.asList()),
             new CfNew(options.itemFactory.stringBuilderType),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
@@ -6057,6 +7749,16 @@
                 false),
             new CfStackInstruction(CfStackInstruction.Opcode.Pop),
             label5,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.charSequenceType),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/lang/Iterable;")),
+                      FrameType.initialized(options.itemFactory.stringBuilderType),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/Iterator;"))
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 3),
             new CfInvoke(
                 185,
@@ -6102,6 +7804,16 @@
             new CfStackInstruction(CfStackInstruction.Opcode.Pop),
             new CfGoto(label5),
             label8,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.charSequenceType),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/lang/Iterable;")),
+                      FrameType.initialized(options.itemFactory.stringBuilderType),
+                      FrameType.initialized(options.itemFactory.createType("Ljava/util/Iterator;"))
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 2),
             new CfInvoke(
                 182,
@@ -6186,6 +7898,14 @@
                 false),
             new CfThrow(),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 0),
             new CfInvoke(
                 182,
@@ -6201,9 +7921,27 @@
             new CfLoad(ValueType.INT, 2),
             new CfIf(If.Type.NE, ValueType.INT, label5),
             label4,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfConstString(options.itemFactory.createString("")),
             new CfReturn(ValueType.OBJECT),
             label5,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 1),
             new CfConstNumber(1, ValueType.INT),
             new CfIfCmp(If.Type.NE, ValueType.INT, label7),
@@ -6211,6 +7949,15 @@
             new CfLoad(ValueType.OBJECT, 0),
             new CfReturn(ValueType.OBJECT),
             label7,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfNew(options.itemFactory.stringBuilderType),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfLoad(ValueType.INT, 2),
@@ -6229,6 +7976,17 @@
             new CfConstNumber(0, ValueType.INT),
             new CfStore(ValueType.INT, 4),
             label9,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3, 4},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.stringBuilderType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 4),
             new CfLoad(ValueType.INT, 1),
             new CfIfCmp(If.Type.GE, ValueType.INT, label12),
@@ -6248,6 +8006,16 @@
             new CfIinc(4, 1),
             new CfGoto(label9),
             label12,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.stringBuilderType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 3),
             new CfInvoke(
                 182,
@@ -6298,6 +8066,15 @@
                 false),
             new CfStore(ValueType.INT, 2),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 1),
             new CfLoad(ValueType.INT, 2),
             new CfIfCmp(If.Type.GE, ValueType.INT, label8),
@@ -6327,6 +8104,16 @@
             label5,
             new CfGoto(label8),
             label6,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 1),
             new CfLoad(ValueType.INT, 3),
             new CfInvoke(
@@ -6342,6 +8129,15 @@
             label7,
             new CfGoto(label2),
             label8,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 2),
             new CfLoad(ValueType.INT, 1),
             new CfIfCmp(If.Type.LE, ValueType.INT, label14),
@@ -6373,6 +8169,16 @@
             label11,
             new CfGoto(label14),
             label12,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 2),
             new CfLoad(ValueType.INT, 3),
             new CfInvoke(
@@ -6388,6 +8194,15 @@
             label13,
             new CfGoto(label8),
             label14,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 0),
             new CfLoad(ValueType.INT, 1),
             new CfLoad(ValueType.INT, 2),
@@ -6437,6 +8252,15 @@
                 false),
             new CfStore(ValueType.INT, 2),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 1),
             new CfLoad(ValueType.INT, 2),
             new CfIfCmp(If.Type.GE, ValueType.INT, label8),
@@ -6466,6 +8290,16 @@
             label5,
             new CfGoto(label8),
             label6,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2, 3},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 1),
             new CfLoad(ValueType.INT, 3),
             new CfInvoke(
@@ -6481,6 +8315,15 @@
             label7,
             new CfGoto(label2),
             label8,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 0),
             new CfLoad(ValueType.INT, 1),
             new CfLoad(ValueType.INT, 2),
@@ -6526,6 +8369,14 @@
                 false),
             new CfStore(ValueType.INT, 1),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 1),
             new CfIf(If.Type.LE, ValueType.INT, label7),
             label2,
@@ -6556,6 +8407,15 @@
             label4,
             new CfGoto(label7),
             label5,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 1),
             new CfLoad(ValueType.INT, 2),
             new CfInvoke(
@@ -6571,6 +8431,14 @@
             label6,
             new CfGoto(label1),
             label7,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.stringType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 0),
             new CfConstNumber(0, ValueType.INT),
             new CfLoad(ValueType.INT, 1),
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCfMethods.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCfMethods.java
index a09ea37..daf1ad4 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCfMethods.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCfMethods.java
@@ -12,6 +12,8 @@
 import com.android.tools.r8.cf.code.CfArrayLength;
 import com.android.tools.r8.cf.code.CfArrayStore;
 import com.android.tools.r8.cf.code.CfConstNumber;
+import com.android.tools.r8.cf.code.CfFrame;
+import com.android.tools.r8.cf.code.CfFrame.FrameType;
 import com.android.tools.r8.cf.code.CfGoto;
 import com.android.tools.r8.cf.code.CfIf;
 import com.android.tools.r8.cf.code.CfIfCmp;
@@ -34,6 +36,8 @@
 import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.utils.InternalOptions;
 import com.google.common.collect.ImmutableList;
+import it.unimi.dsi.fastutil.ints.Int2ReferenceAVLTreeMap;
+import java.util.Arrays;
 
 public final class EnumUnboxingCfMethods {
 
@@ -57,6 +61,14 @@
             new CfLoad(ValueType.INT, 1),
             new CfIf(If.Type.NE, ValueType.INT, label2),
             label1,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfNew(options.itemFactory.createType("Ljava/lang/NullPointerException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
@@ -68,6 +80,14 @@
                 false),
             new CfThrow(),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 0),
             new CfLoad(ValueType.INT, 1),
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Sub, NumericType.INT),
@@ -104,14 +124,38 @@
                 false),
             new CfThrow(),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 0),
             new CfLoad(ValueType.INT, 1),
             new CfIfCmp(If.Type.NE, ValueType.INT, label3),
             new CfConstNumber(1, ValueType.INT),
             new CfGoto(label4),
             label3,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfConstNumber(0, ValueType.INT),
             label4,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList(FrameType.initialized(options.itemFactory.intType))),
             new CfReturn(ValueType.INT),
             label5),
         ImmutableList.of(),
@@ -143,6 +187,11 @@
                 false),
             new CfThrow(),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0},
+                    new FrameType[] {FrameType.initialized(options.itemFactory.intType)}),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 0),
             new CfConstNumber(1, ValueType.INT),
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Sub, NumericType.INT),
@@ -173,6 +222,15 @@
             new CfConstNumber(0, ValueType.INT),
             new CfStore(ValueType.INT, 2),
             label2,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1, 2},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intArrayType),
+                      FrameType.initialized(options.itemFactory.intType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.INT, 2),
             new CfLoad(ValueType.OBJECT, 1),
             new CfArrayLength(),
@@ -188,6 +246,14 @@
             new CfIinc(2, 1),
             new CfGoto(label2),
             label5,
+            new CfFrame(
+                new Int2ReferenceAVLTreeMap<>(
+                    new int[] {0, 1},
+                    new FrameType[] {
+                      FrameType.initialized(options.itemFactory.intType),
+                      FrameType.initialized(options.itemFactory.intArrayType)
+                    }),
+                Arrays.asList()),
             new CfLoad(ValueType.OBJECT, 1),
             new CfReturn(ValueType.OBJECT),
             label6),
diff --git a/src/test/java/com/android/tools/r8/cfmethodgeneration/MethodGenerationBase.java b/src/test/java/com/android/tools/r8/cfmethodgeneration/MethodGenerationBase.java
index 164259f..e190074 100644
--- a/src/test/java/com/android/tools/r8/cfmethodgeneration/MethodGenerationBase.java
+++ b/src/test/java/com/android/tools/r8/cfmethodgeneration/MethodGenerationBase.java
@@ -28,6 +28,7 @@
 import java.util.Calendar;
 import java.util.List;
 import java.util.TreeSet;
+import java.util.function.Consumer;
 
 public abstract class MethodGenerationBase extends TestBase {
 
@@ -74,17 +75,18 @@
   }
 
   // Running this method will regenerate / overwrite the content of the generated class.
-  protected void generateMethodsAndWriteThemToFile() throws IOException {
-    FileUtils.writeToFile(getGeneratedFile(), null, generateMethods().getBytes());
+  protected void generateMethodsAndWriteThemToFile(Consumer<InternalOptions> optionsConsumer)
+      throws IOException {
+    FileUtils.writeToFile(getGeneratedFile(), null, generateMethods(optionsConsumer).getBytes());
   }
 
   // Running this method generate the content of the generated class but does not overwrite it.
-  protected String generateMethods() throws IOException {
+  protected String generateMethods(Consumer<InternalOptions> optionsConsumer) throws IOException {
     CfCodePrinter codePrinter = new CfCodePrinter();
 
     File tempFile = File.createTempFile("output-", ".java");
 
-    readMethodTemplatesInto(codePrinter);
+    readMethodTemplatesInto(codePrinter, optionsConsumer);
     generateRawOutput(codePrinter, tempFile.toPath());
     String result = formatRawOutput(tempFile.toPath());
 
@@ -92,8 +94,10 @@
     return result;
   }
 
-  private void readMethodTemplatesInto(CfCodePrinter codePrinter) throws IOException {
+  private void readMethodTemplatesInto(
+      CfCodePrinter codePrinter, Consumer<InternalOptions> optionsConsumer) throws IOException {
     InternalOptions options = new InternalOptions();
+    optionsConsumer.accept(options);
     JarClassFileReader reader =
         new JarClassFileReader(
             new JarApplicationReader(options),
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/GenerateEnumUnboxingMethods.java b/src/test/java/com/android/tools/r8/enumunboxing/GenerateEnumUnboxingMethods.java
index 706cdc7..4abe533 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/GenerateEnumUnboxingMethods.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/GenerateEnumUnboxingMethods.java
@@ -11,6 +11,7 @@
 import com.android.tools.r8.cfmethodgeneration.MethodGenerationBase;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.InternalOptions;
 import com.google.common.collect.ImmutableList;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
@@ -50,16 +51,22 @@
     return METHOD_TEMPLATE_CLASSES;
   }
 
+  private static void setReadInputStackMap(InternalOptions options) {
+    options.testing.readInputStackMaps = true;
+  }
+
   @Test
   public void testEnumUtilityMethodsGenerated() throws Exception {
     ArrayList<Class<?>> sorted = new ArrayList<>(getMethodTemplateClasses());
     sorted.sort(Comparator.comparing(Class::getTypeName));
     assertEquals("Classes should be listed in sorted order", sorted, getMethodTemplateClasses());
     assertEquals(
-        FileUtils.readTextFile(getGeneratedFile(), StandardCharsets.UTF_8), generateMethods());
+        FileUtils.readTextFile(getGeneratedFile(), StandardCharsets.UTF_8),
+        generateMethods(GenerateEnumUnboxingMethods::setReadInputStackMap));
   }
 
   public static void main(String[] args) throws Exception {
-    new GenerateEnumUnboxingMethods(null).generateMethodsAndWriteThemToFile();
+    new GenerateEnumUnboxingMethods(null)
+        .generateMethodsAndWriteThemToFile(GenerateEnumUnboxingMethods::setReadInputStackMap);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/ir/desugar/backports/GenerateBackportMethods.java b/src/test/java/com/android/tools/r8/ir/desugar/backports/GenerateBackportMethods.java
index 05c11c4..cd417d1 100644
--- a/src/test/java/com/android/tools/r8/ir/desugar/backports/GenerateBackportMethods.java
+++ b/src/test/java/com/android/tools/r8/ir/desugar/backports/GenerateBackportMethods.java
@@ -12,6 +12,7 @@
 import com.android.tools.r8.cfmethodgeneration.MethodGenerationBase;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.InternalOptions;
 import com.google.common.collect.ImmutableList;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
@@ -68,16 +69,22 @@
     return METHOD_TEMPLATE_CLASSES;
   }
 
+  private static void setReadInputStackMap(InternalOptions options) {
+    options.testing.readInputStackMaps = true;
+  }
+
   @Test
   public void testBackportsGenerated() throws Exception {
     ArrayList<Class<?>> sorted = new ArrayList<>(getMethodTemplateClasses());
     sorted.sort(Comparator.comparing(Class::getTypeName));
     assertEquals("Classes should be listed in sorted order", sorted, getMethodTemplateClasses());
     assertEquals(
-        FileUtils.readTextFile(getGeneratedFile(), StandardCharsets.UTF_8), generateMethods());
+        FileUtils.readTextFile(getGeneratedFile(), StandardCharsets.UTF_8),
+        generateMethods(GenerateBackportMethods::setReadInputStackMap));
   }
 
   public static void main(String[] args) throws Exception {
-    new GenerateBackportMethods(null).generateMethodsAndWriteThemToFile();
+    new GenerateBackportMethods(null)
+        .generateMethodsAndWriteThemToFile(GenerateBackportMethods::setReadInputStackMap);
   }
 }