/**
  * Checks to see if any of the locals or fields that we are tracking are passed into another
  * method. If they are, we clear out our tracking of them, because we can't easily track their
  * progress into the method.
  *
  * <p>This can be overridden to check for exceptions to this rule, for example, being logged to
  * the console not counting.
  */
 protected void processMethodParms() {
   String sig = getSigConstantOperand();
   int numParms = SignatureUtils.getNumParameters(sig);
   if ((numParms > 0) && (stack.getStackDepth() >= numParms)) {
     for (int i = 0; i < numParms; i++) {
       clearUserValue(stack.getStackItem(i));
     }
   }
 }
 private void sawInvokeInterfaceVirtual() {
   String sig = getSigConstantOperand();
   int numParms = SignatureUtils.getNumParameters(sig);
   if (stack.getStackDepth() > numParms) {
     OpcodeStack.Item item = stack.getStackItem(numParms);
     Object uo = item.getUserValue();
     if (uo != null) {
       String name = getNameConstantOperand();
       if (isMethodThatShouldBeCalled(name)) {
         clearUserValue(item);
       } else if (!"clone".equals(name)) {
         if ((!Values.SIG_VOID.equals(SignatureUtils.getReturnSignature(sig))) && !nextOpIsPop()) {
           clearUserValue(item);
         }
       }
     }
   }
   processMethodParms();
 }