[Fb-contrib-commit] SF.net SVN: fb-contrib: [504] trunk/fb-contrib/src/com/mebigfatguy/fbcontrib/det
Brought to you by:
dbrosius
From: <dbr...@us...> - 2006-04-27 03:27:15
|
Revision: 504 Author: dbrosius Date: 2006-04-26 20:27:09 -0700 (Wed, 26 Apr 2006) ViewCVS: http://svn.sourceforge.net/fb-contrib/?rev=504&view=rev Log Message: ----------- don't report ISB's caused by trinaries inserting a second StringBuffer inside a parent string buffer Modified Paths: -------------- trunk/fb-contrib/src/com/mebigfatguy/fbcontrib/detect/InefficientStringBuffering.java Modified: trunk/fb-contrib/src/com/mebigfatguy/fbcontrib/detect/InefficientStringBuffering.java =================================================================== --- trunk/fb-contrib/src/com/mebigfatguy/fbcontrib/detect/InefficientStringBuffering.java 2006-04-25 20:52:37 UTC (rev 503) +++ trunk/fb-contrib/src/com/mebigfatguy/fbcontrib/detect/InefficientStringBuffering.java 2006-04-27 03:27:09 UTC (rev 504) @@ -24,7 +24,6 @@ import edu.umd.cs.findbugs.BugReporter; import edu.umd.cs.findbugs.BytecodeScanningDetector; import edu.umd.cs.findbugs.OpcodeStack; -import edu.umd.cs.findbugs.OpcodeStack.Item; /** * looks for appending strings inside of calls to StringBuffer or StringBuilder append. @@ -67,22 +66,35 @@ || "java/lang/StringBuilder".equals(calledClass)) && "<init>".equals(getNameConstantOperand()) && "()V".equals(getSigConstantOperand())) { - if (opStack.getStackDepth() > 2) { - Item itm = opStack.getStackItem(2); - String signature = itm.getSignature(); - if ("Ljava/lang/StringBuffer;".equals(signature) - || "Ljava/lang/StringBuilder;".equals(signature)) { - bugReporter.reportBug( - new BugInstance(this, "ISB_INEFFICIENT_STRING_BUFFERING", "toString".equals(getMethodName()) ? LOW_PRIORITY : NORMAL_PRIORITY) - .addClass(this) - .addMethod(this) - .addSourceLine(this)); - } + OpcodeStack.Item itm = getStringBufferItemAt(2); + if ((itm != null) && (itm.getUserValue() == null)) { + bugReporter.reportBug( + new BugInstance(this, "ISB_INEFFICIENT_STRING_BUFFERING", "toString".equals(getMethodName()) ? LOW_PRIORITY : NORMAL_PRIORITY) + .addClass(this) + .addMethod(this) + .addSourceLine(this)); } } + } else if (seen == GOTO) { + OpcodeStack.Item itm = getStringBufferItemAt(1); + if (itm != null) + itm.setUserValue(Boolean.TRUE); } } finally { opStack.sawOpcode(this, seen); } } + + private OpcodeStack.Item getStringBufferItemAt(int depth) { + if (opStack.getStackDepth() > depth) { + OpcodeStack.Item itm = opStack.getStackItem(depth); + String signature = itm.getSignature(); + if ("Ljava/lang/StringBuffer;".equals(signature) + || "Ljava/lang/StringBuilder;".equals(signature)) { + return itm; + } + } + + return null; + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |