private void addExceptionSetupBlocks() {

    int len = catchInfos.length;
    for (int i = 0; i < len; i++) {
      CatchInfo catches = catchInfos[i];
      if (catches != null) {
        for (ExceptionHandlerSetup one : catches.getSetups()) {
          Insn proto = labelToBlock(i).getFirstInsn();
          SourcePosition pos = proto.getPosition();
          InsnList il = new InsnList(2);

          Insn insn =
              new PlainInsn(
                  Rops.opMoveException(one.getCaughtType()),
                  pos,
                  RegisterSpec.make(maxLocals, one.getCaughtType()),
                  RegisterSpecList.EMPTY);
          il.set(0, insn);

          insn = new PlainInsn(Rops.GOTO, pos, null, RegisterSpecList.EMPTY);
          il.set(1, insn);
          il.setImmutable();

          BasicBlock bb = new BasicBlock(one.getLabel(), il, IntList.makeImmutable(i), i);
          addBlock(bb, startFrames[i].getSubroutines());
        }
      }
    }
  }
Creates the exception handler setup blocks. "maxLocals" below is because that's the register
number corresponding to the sole element on a one-deep stack (which is the situation at the
start of an exception handler block).
android/android_framework/dex-maker/src/main/java/com/android/dx/cf/code/Ropper.java