Package com.mebigfatguy.fbcontrib.detect
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 ClassesModifier and TypeClassDescription(package private) static class(package private) static class -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate edu.umd.cs.findbugs.BugReporterprivate org.apache.bcel.classfile.JavaClassprivate booleanprivate static final FQMethodprivate static final FQMethodprivate static final FQMethodprivate static final QMethodprivate intprivate List<PresizeCollections.CodeRange> private edu.umd.cs.findbugs.OpcodeStackprivate Map<Comparable<?>, PresizeCollections.PSCUserValue> Fields inherited from class edu.umd.cs.findbugs.visitclass.DismantleBytecode
codeBytes, lineNumberTable, M_BR, M_CP, M_INT, M_PAD, M_R, M_UINTFields inherited from interface edu.umd.cs.findbugs.Priorities
EXP_PRIORITY, HIGH_PRIORITY, IGNORE_PRIORITY, LOW_PRIORITY, NORMAL_PRIORITY -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprivate voidaddExceptionRanges(org.apache.bcel.classfile.Code c) adds optionalRanges for all try/catch blocksprivate booleanbranchBasedOnUnsizedObject(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.private booleanhasSinglePossiblySizedBranch(int allocationPos, int addPC) private PresizeCollections.PSCUserValueisSizedSource(edu.umd.cs.findbugs.OpcodeStack.Item itm) voidsawOpcode(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.voidvisitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext) overrides the visitor to initialize the opcode stackvoidvisitCode(org.apache.bcel.classfile.Code obj) implements the visitor to reset the opcode stackMethods inherited from class edu.umd.cs.findbugs.BytecodeScanningDetector
getClassContext, report, shouldVisitCodeMethods 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, visitMethods inherited from class edu.umd.cs.findbugs.visitclass.AnnotationVisitor
getAnnotationParameterAsEnum, getAnnotationParameterAsString, getAnnotationParameterAsStringArray, visitAnnotation, visitAnnotation, visitParameterAnnotation, visitParameterAnnotation, visitSyntheticParameterAnnotationMethods 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, visitStackMapEntryMethods 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, visitUnknownMethods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods 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
-
STATIC_COLLECTION_FACTORIES
-
UNSIZED_SOURCES
-
ITERATOR_HASNEXT
-
ITERATOR_METHOD
-
HASHMAP_SIZED_CTOR
-
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
-
allocLocation
-
allocToAddPCs
-
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:
visitClassContextin interfaceedu.umd.cs.findbugs.Detector- Overrides:
visitClassContextin classedu.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:
visitCodein interfaceorg.apache.bcel.classfile.Visitor- Overrides:
visitCodein classedu.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:
sawOpcodein classedu.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, ifif ((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)
-