Class PresizeCollections

java.lang.Object
edu.umd.cs.findbugs.visitclass.BetterVisitor
edu.umd.cs.findbugs.visitclass.PreorderVisitor
edu.umd.cs.findbugs.visitclass.AnnotationVisitor
edu.umd.cs.findbugs.visitclass.DismantleBytecode
edu.umd.cs.findbugs.BytecodeScanningDetector
com.mebigfatguy.fbcontrib.detect.PresizeCollections
All Implemented Interfaces:
edu.umd.cs.findbugs.Detector, edu.umd.cs.findbugs.Priorities, org.apache.bcel.classfile.Visitor

@CustomUserValue public class PresizeCollections extends edu.umd.cs.findbugs.BytecodeScanningDetector
finds methods that create and populate collections, and while knowing the end size of those collections, does not pre allocate the collection to be big enough. This just causes unneeded reallocations putting strain on the garbage collector.
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    (package private) static class 
     
    (package private) static class 
     
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
     
     
    private edu.umd.cs.findbugs.BugReporter
     
    private org.apache.bcel.classfile.JavaClass
     
    private boolean
     
    private static final FQMethod
     
    private static final FQMethod
     
    private static final FQMethod
     
    private static final QMethod
     
    private int
     
     
    private static final Set<String>
     
    private edu.umd.cs.findbugs.OpcodeStack
     
    private static final Set<FQMethod>
     
     
    private static final Set<FQMethod>
     

    Fields inherited from class edu.umd.cs.findbugs.visitclass.DismantleBytecode

    codeBytes, lineNumberTable, M_BR, M_CP, M_INT, M_PAD, M_R, M_UINT

    Fields inherited from interface edu.umd.cs.findbugs.Priorities

    EXP_PRIORITY, HIGH_PRIORITY, IGNORE_PRIORITY, LOW_PRIORITY, NORMAL_PRIORITY
  • Constructor Summary

    Constructors
    Constructor
    Description
    PresizeCollections(edu.umd.cs.findbugs.BugReporter bugReporter)
     
  • Method Summary

    Modifier and Type
    Method
    Description
    private void
    addExceptionRanges(org.apache.bcel.classfile.Code c)
    adds optionalRanges for all try/catch blocks
    private boolean
    returns if the conditional is based on a method call from an object that has no sizing to determine what presize should be.
    private boolean
    hasSinglePossiblySizedBranch(int allocationPos, int addPC)
     
    isSizedSource(edu.umd.cs.findbugs.OpcodeStack.Item itm)
     
    void
    sawOpcode(int seen)
    implements the visitor to look for creation of collections that are then populated with a known number of elements usually based on another collection, but the new collection is not presized.
    void
    visitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext)
    overrides the visitor to initialize the opcode stack
    void
    visitCode(org.apache.bcel.classfile.Code obj)
    implements the visitor to reset the opcode stack

    Methods inherited from class edu.umd.cs.findbugs.BytecodeScanningDetector

    getClassContext, report, shouldVisitCode

    Methods inherited from class edu.umd.cs.findbugs.visitclass.DismantleBytecode

    afterOpcode, areOppositeBranches, atCatchBlock, beforeOpcode, getBranchFallThrough, getBranchOffset, getBranchTarget, getClassConstantOperand, getClassDescriptorOperand, getCodeByte, getConstantRefOperand, getDefaultSwitchOffset, getDottedClassConstantOperand, getFieldDescriptorOperand, getIntConstant, getLongConstant, getMaxPC, getMethodDescriptorOperand, getNameConstantOperand, getNextCodeByte, getNextOpcode, getNextPC, getOpcode, getPC, getPrevOpcode, getRefConstantOperand, getRefFieldIsStatic, getRegisterOperand, getSigConstantOperand, getStringConstantOperand, getSwitchLabels, getSwitchOffsets, getXClassOperand, getXFieldOperand, getXMethodOperand, isBranch, isMethodCall, isRegisterLoad, isRegisterStore, isRegisterStore, isReturn, isShift, isSwitch, isWideOpcode, printOpCode, sawBranchTo, sawClass, sawDouble, sawField, sawFloat, sawIMethod, sawInt, sawLong, sawMethod, sawRegister, sawString, visit

    Methods inherited from class edu.umd.cs.findbugs.visitclass.AnnotationVisitor

    getAnnotationParameterAsEnum, getAnnotationParameterAsString, getAnnotationParameterAsStringArray, visitAnnotation, visitAnnotation, visitParameterAnnotation, visitParameterAnnotation, visitSyntheticParameterAnnotation

    Methods inherited from class edu.umd.cs.findbugs.visitclass.PreorderVisitor

    amVisitingMainMethod, asUnsignedByte, doVisitMethod, getClassDescriptor, getClassName, getCode, getConstantPool, getDottedClassName, getDottedFieldSig, getDottedMethodSig, getDottedSuperclassName, getField, getFieldDescriptor, getFieldIsStatic, getFieldName, getFieldSig, getFullyQualifiedFieldName, getFullyQualifiedMethodName, getMethod, getMethodDescriptor, getMethodName, getMethodSig, getMethodVisitOrder, getNumberArguments, getNumberMethodArguments, getPackageName, getSizeOfSurroundingTryBlock, getSizeOfSurroundingTryBlock, getSourceFile, getStringFromIndex, getSuperclassName, getSurroundingCaughtExceptions, getSurroundingCaughtExceptions, getSurroundingCaughtExceptionTypes, getSurroundingTryBlock, getSurroundingTryBlock, getThisClass, getXClass, getXField, getXMethod, hasInterestingClass, hasInterestingMethod, isVisitMethodsInCallOrder, setupVisitorForClass, setVisitMethodsInCallOrder, shouldVisit, toString, visitAfter, visitAfter, visitAnnotationDefault, visitAnnotationEntry, visitBootstrapMethods, visitConstantInvokeDynamic, visitConstantMethodHandle, visitConstantMethodType, visitConstantModule, visitConstantPackage, visitConstantPool, visitEnclosingMethod, visitingField, visitingMethod, visitInnerClasses, visitJavaClass, visitLineNumberTable, visitLocalVariableTable, visitMethodParameters, visitParameterAnnotationEntry, visitStackMap, visitStackMapEntry

    Methods inherited from class edu.umd.cs.findbugs.visitclass.BetterVisitor

    clone, report, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visitCodeException, visitConstantClass, visitConstantDouble, visitConstantFieldref, visitConstantFloat, visitConstantInteger, visitConstantInterfaceMethodref, visitConstantLong, visitConstantMethodref, visitConstantNameAndType, visitConstantString, visitConstantUtf8, visitConstantValue, visitDeprecated, visitExceptionTable, visitField, visitInnerClass, visitLineNumber, visitLocalVariable, visitLocalVariableTypeTable, visitMethod, visitSignature, visitSourceFile, visitSynthetic, visitUnknown

    Methods inherited from class java.lang.Object

    equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

    Methods inherited from interface org.apache.bcel.classfile.Visitor

    visitConstantDynamic, visitMethodParameter, visitModule, visitModuleExports, visitModuleMainClass, visitModuleOpens, visitModulePackages, visitModuleProvides, visitModuleRequires, visitNestHost, visitNestMembers, visitRecord, visitRecordComponent, visitStackMapType
  • Field Details

    • PRESIZEABLE_COLLECTIONS

      private static final Set<String> PRESIZEABLE_COLLECTIONS
    • STATIC_COLLECTION_FACTORIES

      private static final Set<FQMethod> STATIC_COLLECTION_FACTORIES
    • UNSIZED_SOURCES

      private static final Set<FQMethod> UNSIZED_SOURCES
    • ITERATOR_HASNEXT

      private static final FQMethod ITERATOR_HASNEXT
    • ITERATOR_METHOD

      private static final QMethod ITERATOR_METHOD
    • HASHMAP_SIZED_CTOR

      private static final FQMethod HASHMAP_SIZED_CTOR
    • HASHSET_SIZED_CTOR

      private static final FQMethod HASHSET_SIZED_CTOR
    • bugReporter

      private edu.umd.cs.findbugs.BugReporter bugReporter
    • collectionClass

      private org.apache.bcel.classfile.JavaClass collectionClass
    • guavaOnPath

      private boolean guavaOnPath
    • stack

      private edu.umd.cs.findbugs.OpcodeStack stack
    • nextAllocNumber

      private int nextAllocNumber
    • storeToUserValue

      private Map<Comparable<?>,PresizeCollections.PSCUserValue> storeToUserValue
    • allocLocation

      private Map<Integer,Integer> allocLocation
    • allocToAddPCs

      private Map<Integer,List<Integer>> allocToAddPCs
    • optionalRanges

      private List<PresizeCollections.CodeRange> optionalRanges
  • Constructor Details

    • PresizeCollections

      public PresizeCollections(edu.umd.cs.findbugs.BugReporter bugReporter)
  • Method Details

    • visitClassContext

      public void visitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext)
      overrides the visitor to initialize the opcode stack
      Specified by:
      visitClassContext in interface edu.umd.cs.findbugs.Detector
      Overrides:
      visitClassContext in class edu.umd.cs.findbugs.BytecodeScanningDetector
      Parameters:
      classContext - the context object that holds the JavaClass being parsed
    • visitCode

      public void visitCode(org.apache.bcel.classfile.Code obj)
      implements the visitor to reset the opcode stack
      Specified by:
      visitCode in interface org.apache.bcel.classfile.Visitor
      Overrides:
      visitCode in class edu.umd.cs.findbugs.visitclass.PreorderVisitor
      Parameters:
      obj - the context object of the currently parsed code block
    • sawOpcode

      public void sawOpcode(int seen)
      implements the visitor to look for creation of collections that are then populated with a known number of elements usually based on another collection, but the new collection is not presized.
      Overrides:
      sawOpcode in class edu.umd.cs.findbugs.visitclass.DismantleBytecode
      Parameters:
      seen - the opcode of the currently parsed instruction
    • hasSinglePossiblySizedBranch

      private boolean hasSinglePossiblySizedBranch(int allocationPos, int addPC)
    • addExceptionRanges

      private void addExceptionRanges(org.apache.bcel.classfile.Code c)
      adds optionalRanges for all try/catch blocks
      Parameters:
      c - the currently parsed code object
    • branchBasedOnUnsizedObject

      private boolean branchBasedOnUnsizedObject(int seen)
      returns if the conditional is based on a method call from an object that has no sizing to determine what presize should be. it's possible the correct implementation should just return true, if if ((seen != IFNE) || (stack.getStackDepth() == 0))
      Parameters:
      seen - the current visited opcode
      Returns:
      whether this conditional is based on a unsized object
    • isSizedSource

      @Nullable private PresizeCollections.PSCUserValue isSizedSource(edu.umd.cs.findbugs.OpcodeStack.Item itm)