Update of /cvsroot/fb-contrib/fb-contrib/src/com/mebigfatguy/fbcontrib/detect
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24186/src/com/mebigfatguy/fbcontrib/detect
Modified Files:
ClassEnvy.java
Log Message:
java 1.5 (at least) replicates code in finally blocks for both the try and catch block, causing method call counts, et.al to be too high. If the LineNumberTable exists, keep track of counts of distinct lines, so that this doesn't happen
Index: ClassEnvy.java
===================================================================
RCS file: /cvsroot/fb-contrib/fb-contrib/src/com/mebigfatguy/fbcontrib/detect/ClassEnvy.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- ClassEnvy.java 14 Oct 2005 07:13:17 -0000 1.10
+++ ClassEnvy.java 14 Oct 2005 07:37:54 -0000 1.11
@@ -28,6 +28,7 @@
import org.apache.bcel.Repository;
import org.apache.bcel.classfile.Code;
import org.apache.bcel.classfile.JavaClass;
+import org.apache.bcel.classfile.LineNumberTable;
import org.apache.bcel.classfile.Method;
import org.apache.bcel.generic.Type;
@@ -43,6 +44,7 @@
{
private static final String ENVY_PERCENT_PROPERTY = "fb-contrib.ce.percent";
private static final String ENVY_MIN_PROPERTY = "fb-contrib.ce.min";
+ private static final Integer ONE = new Integer(1);
private static final Set<String> ignorableInterfaces = new HashSet<String>();
static {
ignorableInterfaces.add("java.io.Serializable");
@@ -54,7 +56,7 @@
private OpcodeStack stack;
private String packageName;
private String clsName;
- private Map<String, Integer> clsAccessCount;
+ private Map<String, Set<Integer>> clsAccessCount;
private int thisClsAccessCount;
private String methodName;
private boolean methodIsStatic;
@@ -97,7 +99,7 @@
@Override
public void visitCode(final Code obj) {
stack.resetForMethodEntry(this);
- clsAccessCount = new HashMap<String, Integer>();
+ clsAccessCount = new HashMap<String, Set<Integer>>();
thisClsAccessCount = 0;
if ("<clinit>".equals(methodName))
return;
@@ -105,16 +107,16 @@
super.visitCode(obj);
if (clsAccessCount.size() > 0) {
- Map.Entry<String, Integer>[]envies = clsAccessCount.entrySet().toArray(new Map.Entry[clsAccessCount.size()]);
- Arrays.sort(envies, new Comparator<Map.Entry<String, Integer>>()
+ Map.Entry<String, Set<Integer>>[]envies = clsAccessCount.entrySet().toArray(new Map.Entry[clsAccessCount.size()]);
+ Arrays.sort(envies, new Comparator<Map.Entry<String, Set<Integer>>>()
{
- public int compare(Map.Entry<String, Integer> entry1, Map.Entry<String, Integer> entry2) {
- return entry2.getValue().intValue() - entry1.getValue().intValue();
+ public int compare(Map.Entry<String, Set<Integer>> entry1, Map.Entry<String, Set<Integer>> entry2) {
+ return entry2.getValue().size() - entry1.getValue().size();
}
});
- Map.Entry<String, Integer> bestEnvyEntry = envies[0];
- int bestEnvyCount = bestEnvyEntry.getValue().intValue();
+ Map.Entry<String, Set<Integer>> bestEnvyEntry = envies[0];
+ int bestEnvyCount = bestEnvyEntry.getValue().size();
if (bestEnvyCount < envyMin)
return;
String bestEnvy = bestEnvyEntry.getKey();
@@ -142,9 +144,6 @@
|| (seen == INVOKESTATIC)
|| (seen == INVOKESPECIAL)) {
String calledClass = getClassConstantOperand().replace('/', '.');
- if (calledClass.startsWith("java.")
- || calledClass.startsWith("javax."))
- return;
if (seen == INVOKEINTERFACE) {
int parmCount = Type.getArgumentTypes(this.getSigConstantOperand()).length;
@@ -212,19 +211,39 @@
thisClsAccessCount++;
else {
String calledPackage = getPackageName(calledClass);
- if (similarPackages(calledPackage, packageName, 2)) {
- Integer cnt = clsAccessCount.get(calledClass);
- if (cnt == null) {
- cnt = new Integer(1);
- clsAccessCount.put(calledClass, cnt);
+ if (similarPackages(calledPackage, packageName, 2) && !generalPurpose(calledClass)) {
+ Set<Integer> lineNumbers = clsAccessCount.get(calledClass);
+ if (lineNumbers == null) {
+ lineNumbers = new HashSet<Integer>();
+ addLineNumber(lineNumbers);
+ clsAccessCount.put(calledClass, lineNumbers);
} else {
- clsAccessCount.put(calledClass, new Integer(cnt.intValue() + 1));
+ addLineNumber(lineNumbers);
}
}
}
}
+ private void addLineNumber(Set<Integer> lineNumbers) {
+ LineNumberTable lnt = getCode().getLineNumberTable();
+ if (lnt == null)
+ lineNumbers.add(new Integer(-lineNumbers.size()));
+ else {
+ int line = lnt.getSourceLine(getPC());
+ if (line < 0)
+ lineNumbers.add(new Integer(lineNumbers.size()));
+ else {
+ lineNumbers.add(new Integer(line));
+ }
+ }
+ }
private boolean generalPurpose(final String className) {
+
+ if (className.startsWith("java.") || className.startsWith("javax."))
+ return true;
+
+// Come back and fix this code, comment out for now
+ /*
try {
JavaClass cls = Repository.lookupClass(className);
JavaClass[] infs = cls.getAllInterfaces();
@@ -255,6 +274,7 @@
bugReporter.reportMissingClass(cfne);
return true;
}
+*/
return false;
}
|