void inlineSubroutineCalledFrom(final BasicBlock b) {
      /*
       * The 0th successor of a subroutine caller block is where
       * the subroutine should return to. The 1st successor is
       * the start block of the subroutine.
       */
      subroutineSuccessor = b.getSuccessors().get(0);
      subroutineStart = b.getSuccessors().get(1);

      /*
       * This allocates an initial label and adds the first
       * block to the worklist.
       */
      int newSubStartLabel = mapOrAllocateLabel(subroutineStart);

      for (int label = workList.nextSetBit(0); label >= 0; label = workList.nextSetBit(0)) {
        workList.clear(label);
        int newLabel = origLabelToCopiedLabel.get(label);

        copyBlock(label, newLabel);

        if (isSubroutineCaller(labelToBlock(label))) {
          new SubroutineInliner(labelAllocator, labelToSubroutines)
              .inlineSubroutineCalledFrom(labelToBlock(newLabel));
        }
      }

      /*
       * Replace the original caller block, since we now have a
       * new successor
       */

      addOrReplaceBlockNoDelete(
          new BasicBlock(
              b.getLabel(),
              b.getInsns(),
              IntList.makeImmutable(newSubStartLabel),
              newSubStartLabel),
          labelToSubroutines.get(b.getLabel()));
    }
Inlines a subroutine.

@param b block where {@code jsr} occurred in the original bytecode
android/android_framework/dex-maker/src/main/java/com/android/dx/cf/code/Ropper.java