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

    afterRET.merge(beforeJSR, access);

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

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

    // delta
    mergeData(insn, interpreter);
  }
private void merge(int insn, Frame<V> beforeJSR,
                     Frame<V> afterRET, Subroutine subroutineBeforeJSR,
                     boolean[] access)