code: private void visitFrame(final Frame f) {
          int i, t;
          int nTop = 0;
          int nLocal = 0;
          int nStack = 0;
          int[] locals = f.inputLocals;
          int[] stacks = f.inputStack;
          // computes the number of locals (ignores TOP types that are just after
          // a LONG or a DOUBLE, and all trailing TOP types)
          for (i = 0; i < locals.length; ++i) {
              t = locals[i];
              if (t == Frame.TOP) {
                  ++nTop;
              } else {
                  nLocal += nTop + 1;
                  nTop = 0;
              }
              if (t == Frame.LONG || t == Frame.DOUBLE) {
                  ++i;
              }
          }
          // computes the stack size (ignores TOP types that are just after
          // a LONG or a DOUBLE)
          for (i = 0; i < stacks.length; ++i) {
              t = stacks[i];
              ++nStack;
              if (t == Frame.LONG || t == Frame.DOUBLE) {
                  ++i;
              }
          }
          // visits the frame and its content
          startFrame(f.owner.position, nLocal, nStack);
          for (i = 0; nLocal > 0; ++i, --nLocal) {
              t = locals[i];
              frame[frameIndex++] = t;
              if (t == Frame.LONG || t == Frame.DOUBLE) {
                  ++i;
              }
          }
          for (i = 0; i < stacks.length; ++i) {
              t = stacks[i];
              frame[frameIndex++] = t;
              if (t == Frame.LONG || t == Frame.DOUBLE) {
                  ++i;
              }
          }
          endFrame();
      }
docs: Visits a frame that has been computed from scratch.
  
  @param f the frame that must be visited.