code: @Override
      public void sawOpcode(int seen) {
          IOIUserValue uvSawType = null;
  
          try {
              switch (seen) {
              case Const.INVOKESPECIAL:
                  uvSawType = processInvokeSpecial();
                  break;
  
              case Const.INVOKESTATIC:
                  processInvokeStatic();
                  break;
  
              case Const.INVOKEVIRTUAL:
                  processInvokeVirtual();
                  break;
  
              case Const.ASTORE:
              case Const.ASTORE_0:
              case Const.ASTORE_1:
              case Const.ASTORE_2:
              case Const.ASTORE_3:
                  processAStore(seen);
                  break;
  
              default:
                  break;
              }
          } catch (ClassNotFoundException cnfe) {
              bugReporter.reportMissingClass(cnfe);
          } finally {
              stack.sawOpcode(this, seen);
              if ((uvSawType != null) && (stack.getStackDepth() > 0)) {
                  OpcodeStack.Item itm = stack.getStackItem(0);
                  itm.setUserValue(uvSawType);
              }
          }
      }
docs: implements the visitor to look for common api copy utilities to copy streams
  where the passed in Stream is Buffered. Since these libraries already handle
  the buffering, you are just slowing them down by the extra copy. Also look
  for copies where the source is a Reader, as this is just wasteful. Can't wrap
  my head around whether a Writer output is sometime valid, might be, so for
  now ignoring that. Also reports uses of java.io.FileInputStream and
  java.io.FileOutputStream on {@code java >= 1.7} as those classes have
  finalize methods that junk up gc.
  
  Also look for uses of Inflater and Deflater that don't call end()
  
  @param seen the currently parsed opcode