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();


Reply via email to