You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by db...@apache.org on 2013/05/11 19:34:33 UTC
svn commit: r1481383 - in
/commons/proper/bcel/trunk/src/main/java/org/apache/bcel: classfile/
generic/ verifier/structurals/
Author: dbrosius
Date: Sat May 11 17:34:32 2013
New Revision: 1481383
URL: http://svn.apache.org/r1481383
Log:
incorporate changes used by Findbugs from BCEL-163
Modified:
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Constant.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/LineNumber.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ArrayType.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldGen.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldOrMethod.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/InstructionFactory.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/MethodGen.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ObjectType.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ReferenceType.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/Type.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Constant.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Constant.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Constant.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Constant.java Sat May 11 17:34:32 2013
@@ -145,7 +145,7 @@ public abstract class Constant implement
case Constants.CONSTANT_NameAndType:
return new ConstantNameAndType(file);
case Constants.CONSTANT_Utf8:
- return new ConstantUtf8(file);
+ return ConstantUtf8.getInstance(file);
case Constants.CONSTANT_MethodHandle:
return new ConstantMethodHandle(file);
case Constants.CONSTANT_MethodType:
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java Sat May 11 17:34:32 2013
@@ -18,8 +18,12 @@
package org.apache.bcel.classfile;
import java.io.DataInput;
+import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
import org.apache.bcel.Constants;
@@ -35,8 +39,59 @@ import org.apache.bcel.Constants;
public final class ConstantUtf8 extends Constant {
private static final long serialVersionUID = -8709101585611518985L;
- private String bytes;
+ private final String bytes;
+ private static final int MAX_CACHE_ENTRIES = 20000;
+ private static final int INITIAL_CACHE_CAPACITY = (int)(MAX_CACHE_ENTRIES/0.75);
+ private static HashMap<String, ConstantUtf8> cache;
+ private static int considered = 0;
+ private static int hits = 0;
+ private static int skipped = 0;
+ private static int created = 0;
+ final static boolean BCEL_STATISTICS = Boolean.getBoolean("bcel.statistics");
+ final static boolean BCEL_DONT_CACHE = Boolean.getBoolean("bcel.dontCache");
+
+ static {
+ if (BCEL_STATISTICS)
+ Runtime.getRuntime().addShutdownHook(new Thread() {
+ public void run() {
+ System.err.println("Cache hit " + hits + "/" + considered +", "
+ + skipped + " skipped");
+ System.err.println("Total of " + created + " ConstantUtf8 objects created");
+ }
+ });
+ }
+
+ public static synchronized ConstantUtf8 getCachedInstance(String s) {
+ if (BCEL_DONT_CACHE || s.length() > 200) {
+ skipped++;
+ return new ConstantUtf8(s);
+ }
+ considered++;
+ if (cache == null) {
+ cache = new LinkedHashMap<String, ConstantUtf8>(INITIAL_CACHE_CAPACITY, 0.75f, true) {
+ protected boolean removeEldestEntry(Map.Entry eldest) {
+ return size() > MAX_CACHE_ENTRIES;
+ }
+ };
+ }
+ ConstantUtf8 result = cache.get(s);
+ if (result != null) {
+ hits++;
+ return result;
+ }
+ result = new ConstantUtf8(s);
+ cache.put(s, result);
+ return result;
+ }
+
+ public static ConstantUtf8 getInstance(String s) {
+ return getCachedInstance(s);
+ }
+
+ public static ConstantUtf8 getInstance (DataInputStream file) throws IOException {
+ return getInstance(file.readUTF());
+ }
/**
* Initialize from another object.
@@ -55,6 +110,7 @@ public final class ConstantUtf8 extends
ConstantUtf8(DataInput file) throws IOException {
super(Constants.CONSTANT_Utf8);
bytes = file.readUTF();
+ created++;
}
@@ -67,6 +123,7 @@ public final class ConstantUtf8 extends
throw new IllegalArgumentException("bytes must not be null!");
}
this.bytes = bytes;
+ created++;
}
@@ -106,9 +163,10 @@ public final class ConstantUtf8 extends
/**
* @param bytes the raw bytes of this Utf-8
+ * @deprecated
*/
public final void setBytes( String bytes ) {
- this.bytes = bytes;
+ throw new UnsupportedOperationException();
}
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/LineNumber.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/LineNumber.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/LineNumber.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/LineNumber.java Sat May 11 17:34:32 2013
@@ -34,8 +34,8 @@ import java.io.Serializable;
public final class LineNumber implements Cloneable, Node, Serializable {
private static final long serialVersionUID = 169537400672820016L;
- private int start_pc; // Program Counter (PC) corresponds to line
- private int line_number; // number in source file
+ private short start_pc; // Program Counter (PC) corresponds to line
+ private short line_number; // number in source file
/**
@@ -61,8 +61,8 @@ public final class LineNumber implements
* @param line_number line number in source file
*/
public LineNumber(int start_pc, int line_number) {
- this.start_pc = start_pc;
- this.line_number = line_number;
+ this.start_pc = (short) start_pc;
+ this.line_number = (short)line_number;
}
@@ -94,7 +94,7 @@ public final class LineNumber implements
* @return Corresponding source line
*/
public final int getLineNumber() {
- return line_number;
+ return 0xffff & line_number;
}
@@ -102,7 +102,7 @@ public final class LineNumber implements
* @return PC in code
*/
public final int getStartPC() {
- return start_pc;
+ return 0xffff & start_pc;
}
@@ -110,7 +110,7 @@ public final class LineNumber implements
* @param line_number the source line number
*/
public final void setLineNumber( int line_number ) {
- this.line_number = line_number;
+ this.line_number = (short) line_number;
}
@@ -118,7 +118,7 @@ public final class LineNumber implements
* @param start_pc the pc for this line number
*/
public final void setStartPC( int start_pc ) {
- this.start_pc = start_pc;
+ this.start_pc = (short) start_pc;
}
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ArrayType.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ArrayType.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ArrayType.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ArrayType.java Sat May 11 17:34:32 2013
@@ -48,7 +48,7 @@ public final class ArrayType extends Ref
* @param class_name complete name of class (java.lang.String, e.g.)
*/
public ArrayType(String class_name, int dimensions) {
- this(new ObjectType(class_name), dimensions);
+ this(ObjectType.getInstance(class_name), dimensions);
}
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldGen.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldGen.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldGen.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldGen.java Sat May 11 17:34:32 2013
@@ -117,7 +117,7 @@ public class FieldGen extends FieldGenOr
* by the JVM automatically.
*/
public void setInitValue( String str ) {
- checkType(new ObjectType("java.lang.String"));
+ checkType( ObjectType.getInstance("java.lang.String"));
if (str != null) {
value = str;
}
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldOrMethod.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldOrMethod.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldOrMethod.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldOrMethod.java Sat May 11 17:34:32 2013
@@ -100,7 +100,7 @@ public abstract class FieldOrMethod exte
*/
@Deprecated
public ObjectType getClassType( ConstantPoolGen cpg ) {
- return new ObjectType(getClassName(cpg));
+ return ObjectType.getInstance(getClassName(cpg));
}
@@ -121,7 +121,7 @@ public abstract class FieldOrMethod exte
return (ArrayType) Type.getType(className);
} else {
className = className.replace('/', '.');
- return new ObjectType(className);
+ return ObjectType.getInstance(className);
}
}
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/InstructionFactory.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/InstructionFactory.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/InstructionFactory.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/InstructionFactory.java Sat May 11 17:34:32 2013
@@ -622,7 +622,7 @@ public class InstructionFactory implemen
public NEW createNew( String s ) {
- return createNew(new ObjectType(s));
+ return createNew(ObjectType.getInstance(s));
}
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/MethodGen.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/MethodGen.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/MethodGen.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/MethodGen.java Sat May 11 17:34:32 2013
@@ -136,7 +136,7 @@ public class MethodGen extends FieldGenO
/* Add local variables, namely the implicit `this' and the arguments
*/
if (!isStatic() && (class_name != null)) { // Instance method -> `this' is local var 0
- addLocalVariable("this", new ObjectType(class_name), start, end);
+ addLocalVariable("this", ObjectType.getInstance(class_name), start, end);
}
}
if (arg_types != null) {
@@ -197,7 +197,7 @@ public class MethodGen extends FieldGenO
if (type > 0) {
String cen = m.getConstantPool().getConstantString(type,
Constants.CONSTANT_Class);
- c_type = new ObjectType(cen);
+ c_type = ObjectType.getInstance(cen);
}
int end_pc = ce.getEndPC();
int length = m.getCode().getCode().length;
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ObjectType.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ObjectType.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ObjectType.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ObjectType.java Sat May 11 17:34:32 2013
@@ -17,6 +17,10 @@
*/
package org.apache.bcel.generic;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
import org.apache.bcel.Constants;
import org.apache.bcel.Repository;
import org.apache.bcel.classfile.JavaClass;
@@ -30,8 +34,27 @@ import org.apache.bcel.classfile.JavaCla
public class ObjectType extends ReferenceType {
private static final long serialVersionUID = -2819379966444533294L;
- private String class_name; // Class name of type
-
+ private final String class_name; // Class name of type
+ private static final int MAX_CACHE_ENTRIES = 200;
+ private static final int INITIAL_CACHE_CAPACITY = (int)(MAX_CACHE_ENTRIES/0.75);
+ private static HashMap<String, ObjectType> cache;
+
+ public synchronized static ObjectType getInstance(String class_name) {
+ if (cache == null)
+ cache = new LinkedHashMap<String, ObjectType>(INITIAL_CACHE_CAPACITY, 0.75f, true) {
+
+
+ protected boolean removeEldestEntry(Map.Entry eldest) {
+ return size() > MAX_CACHE_ENTRIES;
+ }
+
+ };
+ ObjectType result = cache.get(class_name);
+ if (result != null) return result;
+ result = new ObjectType(class_name);
+ cache.put(class_name, result);
+ return result;
+ }
/**
* @param class_name fully qualified class name, e.g. java.lang.String
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ReferenceType.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ReferenceType.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ReferenceType.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ReferenceType.java Sat May 11 17:34:32 2013
@@ -166,7 +166,7 @@ public abstract class ReferenceType exte
// 'java.io.Serializable'"
if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterfaceExact())) {
for (int ii = 0; ii < Constants.INTERFACES_IMPLEMENTED_BY_ARRAYS.length; ii++) {
- if (T.equals(new ObjectType(Constants.INTERFACES_IMPLEMENTED_BY_ARRAYS[ii]))) {
+ if (T.equals(ObjectType.getInstance(Constants.INTERFACES_IMPLEMENTED_BY_ARRAYS[ii]))) {
return true;
}
}
@@ -252,7 +252,7 @@ public abstract class ReferenceType exte
for (int i = 0; i < t_sups.length; i++) {
for (int j = 0; j < this_sups.length; j++) {
if (this_sups[j].equals(t_sups[i])) {
- return new ObjectType(this_sups[j].getClassName());
+ return ObjectType.getInstance(this_sups[j].getClassName());
}
}
}
@@ -325,7 +325,7 @@ public abstract class ReferenceType exte
for (int i = 0; i < t_sups.length; i++) {
for (int j = 0; j < this_sups.length; j++) {
if (this_sups[j].equals(t_sups[i])) {
- return new ObjectType(this_sups[j].getClassName());
+ return ObjectType.getInstance(this_sups[j].getClassName());
}
}
}
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/Type.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/Type.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/Type.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/Type.java Sat May 11 17:34:32 2013
@@ -34,7 +34,7 @@ import org.apache.bcel.classfile.Utility
public abstract class Type implements java.io.Serializable {
private static final long serialVersionUID = -1985077286871826895L;
- protected byte type;
+ protected final byte type;
protected String signature; // signature for the type
/** Predefined constants
*/
@@ -47,11 +47,11 @@ public abstract class Type implements ja
public static final BasicType DOUBLE = new BasicType(Constants.T_DOUBLE);
public static final BasicType FLOAT = new BasicType(Constants.T_FLOAT);
public static final BasicType CHAR = new BasicType(Constants.T_CHAR);
- public static final ObjectType OBJECT = new ObjectType("java.lang.Object");
- public static final ObjectType CLASS = new ObjectType("java.lang.Class");
- public static final ObjectType STRING = new ObjectType("java.lang.String");
- public static final ObjectType STRINGBUFFER = new ObjectType("java.lang.StringBuffer");
- public static final ObjectType THROWABLE = new ObjectType("java.lang.Throwable");
+ public static final ObjectType OBJECT = ObjectType.getInstance("java.lang.Object");
+ public static final ObjectType CLASS = ObjectType.getInstance("java.lang.Class");
+ public static final ObjectType STRING = ObjectType.getInstance("java.lang.String");
+ public static final ObjectType STRINGBUFFER = ObjectType.getInstance("java.lang.StringBuffer");
+ public static final ObjectType THROWABLE = ObjectType.getInstance("java.lang.Throwable");
public static final Type[] NO_ARGS = new Type[0];
public static final ReferenceType NULL = new ReferenceType() {
@@ -202,7 +202,7 @@ public abstract class Type implements ja
}
//corrected concurrent private static field acess
wrap(consumed_chars, index + 1); // "Lblabla;" `L' and `;' are removed
- return new ObjectType(signature.substring(1, index).replace('/', '.'));
+ return ObjectType.getInstance(signature.substring(1, index).replace('/', '.'));
}
}
@@ -290,7 +290,7 @@ public abstract class Type implements ja
throw new IllegalStateException("Ooops, what primitive type is " + cl);
}
} else { // "Real" class
- return new ObjectType(cl.getName());
+ return ObjectType.getInstance(cl.getName());
}
}
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java Sat May 11 17:34:32 2013
@@ -53,7 +53,7 @@ import org.apache.bcel.verifier.exc.Stru
*/
public class InstConstraintVisitor extends EmptyVisitor{
- private static final ObjectType GENERIC_ARRAY = new ObjectType("org.apache.bcel.verifier.structurals.GenericArray");
+ private static final ObjectType GENERIC_ARRAY = ObjectType.getInstance("org.apache.bcel.verifier.structurals.GenericArray");
/**
* The constructor. Constructs a new instance of this class.
@@ -1276,7 +1276,7 @@ public class InstConstraintVisitor exten
if (f.isProtected()){
ObjectType classtype = o.getClassType(cpg);
- ObjectType curr = new ObjectType(mg.getClassName());
+ ObjectType curr = ObjectType.getInstance(mg.getClassName());
if ( classtype.equals(curr) ||
curr.subclassOf(classtype) ){
@@ -2689,7 +2689,7 @@ public class InstConstraintVisitor exten
if (f.isProtected()){
ObjectType classtype = o.getClassType(cpg);
- ObjectType curr = new ObjectType(mg.getClassName());
+ ObjectType curr = ObjectType.getInstance(mg.getClassName());
if ( classtype.equals(curr) ||
curr.subclassOf(classtype) ){
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java?rev=1481383&r1=1481382&r2=1481383&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java Sat May 11 17:34:32 2013
@@ -356,12 +356,12 @@ public final class Pass3bVerifier extend
Frame f = new Frame(mg.getMaxLocals(),mg.getMaxStack());
if ( !mg.isStatic() ){
if (mg.getName().equals(Constants.CONSTRUCTOR_NAME)){
- Frame._this = new UninitializedObjectType(new ObjectType(jc.getClassName()));
+ Frame._this = new UninitializedObjectType(ObjectType.getInstance(jc.getClassName()));
f.getLocals().set(0, Frame._this);
}
else{
Frame._this = null;
- f.getLocals().set(0, new ObjectType(jc.getClassName()));
+ f.getLocals().set(0, ObjectType.getInstance(jc.getClassName()));
}
}
Type[] argtypes = mg.getArgumentTypes();