private void merge(int insn, Frame<V> frame, Subroutine subroutine) throws AnalyzerException {
    Frame<V> oldFrame = frames[insn];
    Subroutine oldSubroutine = subroutines[insn];
    boolean changes;

    if (oldFrame == null) {
      frames[insn] = newFrame(frame);
      changes = true;
    }
    else {
      changes = oldFrame.merge(frame, interpreter);
    }

    if (oldSubroutine == null) {
      if (subroutine != null) {
        subroutines[insn] = subroutine.copy();
        changes = true;
      }
    }
    else if (subroutine != null) {
      changes |= oldSubroutine.merge(subroutine);
    }
    if (changes && !queued[insn]) {
      queued[insn] = true;
      queue[top++] = insn;
    }

    // delta
    mergeData(insn, interpreter);
  }
private void merge(int insn, Frame<V> frame, Subroutine subroutine)